@ministryofjustice/frontend 4.0.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/govuk-prototype-kit.config.json +19 -4
  2. package/moj/_base.scss +2 -0
  3. package/moj/_base.scss.map +1 -0
  4. package/moj/all.bundle.js +2523 -0
  5. package/moj/all.bundle.js.map +1 -0
  6. package/moj/all.bundle.mjs +2502 -0
  7. package/moj/all.bundle.mjs.map +1 -0
  8. package/moj/all.mjs +59 -69
  9. package/moj/all.mjs.map +1 -1
  10. package/moj/all.scss +2 -0
  11. package/moj/all.scss.map +1 -0
  12. package/moj/components/_all.scss +2 -0
  13. package/moj/components/_all.scss.map +1 -0
  14. package/moj/components/action-bar/_action-bar.scss +2 -0
  15. package/moj/components/action-bar/_action-bar.scss.map +1 -0
  16. package/moj/components/add-another/_add-another.scss +2 -0
  17. package/moj/components/add-another/_add-another.scss.map +1 -0
  18. package/moj/components/add-another/add-another.bundle.js +128 -0
  19. package/moj/components/add-another/add-another.bundle.js.map +1 -0
  20. package/moj/components/add-another/add-another.bundle.mjs +120 -0
  21. package/moj/components/add-another/add-another.bundle.mjs.map +1 -0
  22. package/moj/components/add-another/add-another.mjs +112 -99
  23. package/moj/components/add-another/add-another.mjs.map +1 -1
  24. package/moj/components/alert/_alert.scss +4 -0
  25. package/moj/components/alert/_alert.scss.map +1 -0
  26. package/moj/components/alert/alert.bundle.js +330 -0
  27. package/moj/components/alert/alert.bundle.js.map +1 -0
  28. package/moj/components/alert/alert.bundle.mjs +322 -0
  29. package/moj/components/alert/alert.bundle.mjs.map +1 -0
  30. package/moj/components/alert/alert.mjs +181 -217
  31. package/moj/components/alert/alert.mjs.map +1 -1
  32. package/moj/components/alert/{alert.spec.helper.js → alert.spec.helper.bundle.js} +1 -1
  33. package/moj/components/alert/alert.spec.helper.bundle.js.map +1 -0
  34. package/moj/components/alert/alert.spec.helper.bundle.mjs +67 -0
  35. package/moj/components/alert/alert.spec.helper.bundle.mjs.map +1 -0
  36. package/moj/components/alert/alert.spec.helper.mjs.map +1 -1
  37. package/moj/components/badge/_badge.scss +2 -0
  38. package/moj/components/badge/_badge.scss.map +1 -0
  39. package/moj/components/banner/_banner.scss +2 -0
  40. package/moj/components/banner/_banner.scss.map +1 -0
  41. package/moj/components/button-menu/README.md +10 -6
  42. package/moj/components/button-menu/_button-menu.scss +4 -1
  43. package/moj/components/button-menu/_button-menu.scss.map +1 -0
  44. package/moj/components/button-menu/button-menu.bundle.js +299 -0
  45. package/moj/components/button-menu/button-menu.bundle.js.map +1 -0
  46. package/moj/components/button-menu/{button-menu.js → button-menu.bundle.mjs} +74 -121
  47. package/moj/components/button-menu/button-menu.bundle.mjs.map +1 -0
  48. package/moj/components/button-menu/button-menu.mjs +246 -285
  49. package/moj/components/button-menu/button-menu.mjs.map +1 -1
  50. package/moj/components/cookie-banner/_cookie-banner.scss +2 -0
  51. package/moj/components/cookie-banner/_cookie-banner.scss.map +1 -0
  52. package/moj/components/currency-input/_currency-input.scss +2 -0
  53. package/moj/components/currency-input/_currency-input.scss.map +1 -0
  54. package/moj/components/date-picker/_date-picker.scss +2 -0
  55. package/moj/components/date-picker/_date-picker.scss.map +1 -0
  56. package/moj/components/date-picker/date-picker.bundle.js +784 -0
  57. package/moj/components/date-picker/date-picker.bundle.js.map +1 -0
  58. package/moj/components/date-picker/{date-picker.js → date-picker.bundle.mjs} +245 -439
  59. package/moj/components/date-picker/date-picker.bundle.mjs.map +1 -0
  60. package/moj/components/date-picker/date-picker.mjs +654 -840
  61. package/moj/components/date-picker/date-picker.mjs.map +1 -1
  62. package/moj/components/filter/_filter.scss +2 -0
  63. package/moj/components/filter/_filter.scss.map +1 -0
  64. package/moj/components/filter-toggle-button/filter-toggle-button.bundle.js +96 -0
  65. package/moj/components/filter-toggle-button/filter-toggle-button.bundle.js.map +1 -0
  66. package/moj/components/filter-toggle-button/filter-toggle-button.bundle.mjs +88 -0
  67. package/moj/components/filter-toggle-button/filter-toggle-button.bundle.mjs.map +1 -0
  68. package/moj/components/filter-toggle-button/filter-toggle-button.mjs +78 -84
  69. package/moj/components/filter-toggle-button/filter-toggle-button.mjs.map +1 -1
  70. package/moj/components/form-validator/form-validator.bundle.js +198 -0
  71. package/moj/components/form-validator/form-validator.bundle.js.map +1 -0
  72. package/moj/components/form-validator/form-validator.bundle.mjs +190 -0
  73. package/moj/components/form-validator/form-validator.bundle.mjs.map +1 -0
  74. package/moj/components/form-validator/form-validator.mjs +149 -152
  75. package/moj/components/form-validator/form-validator.mjs.map +1 -1
  76. package/moj/components/header/_header.scss +2 -0
  77. package/moj/components/header/_header.scss.map +1 -0
  78. package/moj/components/identity-bar/_identity-bar.scss +2 -0
  79. package/moj/components/identity-bar/_identity-bar.scss.map +1 -0
  80. package/moj/components/interruption-card/_interruption-card.scss +2 -0
  81. package/moj/components/interruption-card/_interruption-card.scss.map +1 -0
  82. package/moj/components/messages/_messages.scss +2 -0
  83. package/moj/components/messages/_messages.scss.map +1 -0
  84. package/moj/components/multi-file-upload/_multi-file-upload.scss +2 -0
  85. package/moj/components/multi-file-upload/_multi-file-upload.scss.map +1 -0
  86. package/moj/components/multi-file-upload/multi-file-upload.bundle.js +223 -0
  87. package/moj/components/multi-file-upload/multi-file-upload.bundle.js.map +1 -0
  88. package/moj/components/multi-file-upload/multi-file-upload.bundle.mjs +215 -0
  89. package/moj/components/multi-file-upload/multi-file-upload.bundle.mjs.map +1 -0
  90. package/moj/components/multi-file-upload/multi-file-upload.mjs +193 -209
  91. package/moj/components/multi-file-upload/multi-file-upload.mjs.map +1 -1
  92. package/moj/components/multi-select/_multi-select.scss +2 -0
  93. package/moj/components/multi-select/_multi-select.scss.map +1 -0
  94. package/moj/components/multi-select/multi-select.bundle.js +78 -0
  95. package/moj/components/multi-select/multi-select.bundle.js.map +1 -0
  96. package/moj/components/multi-select/multi-select.bundle.mjs +70 -0
  97. package/moj/components/multi-select/multi-select.bundle.mjs.map +1 -0
  98. package/moj/components/multi-select/multi-select.mjs +59 -67
  99. package/moj/components/multi-select/multi-select.mjs.map +1 -1
  100. package/moj/components/notification-badge/_notification-badge.scss +2 -0
  101. package/moj/components/notification-badge/_notification-badge.scss.map +1 -0
  102. package/moj/components/organisation-switcher/_organisation-switcher.scss +2 -0
  103. package/moj/components/organisation-switcher/_organisation-switcher.scss.map +1 -0
  104. package/moj/components/page-header-actions/_page-header-actions.scss +2 -0
  105. package/moj/components/page-header-actions/_page-header-actions.scss.map +1 -0
  106. package/moj/components/pagination/_pagination.scss +2 -2
  107. package/moj/components/pagination/_pagination.scss.map +1 -0
  108. package/moj/components/password-reveal/_password-reveal.scss +2 -0
  109. package/moj/components/password-reveal/_password-reveal.scss.map +1 -0
  110. package/moj/components/password-reveal/password-reveal.bundle.js +49 -0
  111. package/moj/components/password-reveal/password-reveal.bundle.js.map +1 -0
  112. package/moj/components/password-reveal/password-reveal.bundle.mjs +41 -0
  113. package/moj/components/password-reveal/password-reveal.bundle.mjs.map +1 -0
  114. package/moj/components/password-reveal/password-reveal.mjs +36 -31
  115. package/moj/components/password-reveal/password-reveal.mjs.map +1 -1
  116. package/moj/components/primary-navigation/_primary-navigation.scss +2 -0
  117. package/moj/components/primary-navigation/_primary-navigation.scss.map +1 -0
  118. package/moj/components/progress-bar/_progress-bar.scss +2 -0
  119. package/moj/components/progress-bar/_progress-bar.scss.map +1 -0
  120. package/moj/components/rich-text-editor/README.md +15 -9
  121. package/moj/components/rich-text-editor/_rich-text-editor.scss +2 -0
  122. package/moj/components/rich-text-editor/_rich-text-editor.scss.map +1 -0
  123. package/moj/components/rich-text-editor/rich-text-editor.bundle.js +145 -0
  124. package/moj/components/rich-text-editor/rich-text-editor.bundle.js.map +1 -0
  125. package/moj/components/rich-text-editor/rich-text-editor.bundle.mjs +137 -0
  126. package/moj/components/rich-text-editor/rich-text-editor.bundle.mjs.map +1 -0
  127. package/moj/components/rich-text-editor/rich-text-editor.mjs +124 -145
  128. package/moj/components/rich-text-editor/rich-text-editor.mjs.map +1 -1
  129. package/moj/components/search/_search.scss +2 -0
  130. package/moj/components/search/_search.scss.map +1 -0
  131. package/moj/components/search-toggle/{search-toggle.scss → _search-toggle.scss} +2 -0
  132. package/moj/components/search-toggle/_search-toggle.scss.map +1 -0
  133. package/moj/components/search-toggle/search-toggle.bundle.js +54 -0
  134. package/moj/components/search-toggle/search-toggle.bundle.js.map +1 -0
  135. package/moj/components/search-toggle/search-toggle.bundle.mjs +46 -0
  136. package/moj/components/search-toggle/search-toggle.bundle.mjs.map +1 -0
  137. package/moj/components/search-toggle/search-toggle.mjs +40 -49
  138. package/moj/components/search-toggle/search-toggle.mjs.map +1 -1
  139. package/moj/components/side-navigation/_side-navigation.scss +2 -0
  140. package/moj/components/side-navigation/_side-navigation.scss.map +1 -0
  141. package/moj/components/sortable-table/_sortable-table.scss +2 -2
  142. package/moj/components/sortable-table/_sortable-table.scss.map +1 -0
  143. package/moj/components/sortable-table/sortable-table.bundle.js +134 -0
  144. package/moj/components/sortable-table/sortable-table.bundle.js.map +1 -0
  145. package/moj/components/sortable-table/sortable-table.bundle.mjs +126 -0
  146. package/moj/components/sortable-table/sortable-table.bundle.mjs.map +1 -0
  147. package/moj/components/sortable-table/sortable-table.mjs +117 -130
  148. package/moj/components/sortable-table/sortable-table.mjs.map +1 -1
  149. package/moj/components/sub-navigation/_sub-navigation.scss +2 -0
  150. package/moj/components/sub-navigation/_sub-navigation.scss.map +1 -0
  151. package/moj/components/tag/_tag.scss +2 -0
  152. package/moj/components/tag/_tag.scss.map +1 -0
  153. package/moj/components/task-list/_task-list.scss +2 -0
  154. package/moj/components/task-list/_task-list.scss.map +1 -0
  155. package/moj/components/ticket-panel/_ticket-panel.scss +2 -0
  156. package/moj/components/ticket-panel/_ticket-panel.scss.map +1 -0
  157. package/moj/components/timeline/_timeline.scss +2 -0
  158. package/moj/components/timeline/_timeline.scss.map +1 -0
  159. package/moj/filters/all.js +44 -22
  160. package/moj/helpers/_all.scss +2 -0
  161. package/moj/helpers/_all.scss.map +1 -0
  162. package/moj/helpers/_hidden.scss +2 -0
  163. package/moj/helpers/_hidden.scss.map +1 -0
  164. package/moj/helpers/_links.scss +2 -0
  165. package/moj/helpers/_links.scss.map +1 -0
  166. package/moj/{helpers.js → helpers.bundle.js} +37 -42
  167. package/moj/helpers.bundle.js.map +1 -0
  168. package/moj/helpers.bundle.mjs +179 -0
  169. package/moj/helpers.bundle.mjs.map +1 -0
  170. package/moj/helpers.mjs +52 -28
  171. package/moj/helpers.mjs.map +1 -1
  172. package/moj/init.js +11 -2
  173. package/moj/moj-frontend.min.css +1 -1
  174. package/moj/moj-frontend.min.css.map +1 -1
  175. package/moj/moj-frontend.min.js +1 -1
  176. package/moj/moj-frontend.min.js.map +1 -1
  177. package/moj/objects/_all.scss +2 -0
  178. package/moj/objects/_all.scss.map +1 -0
  179. package/moj/objects/_button-group.scss +2 -0
  180. package/moj/objects/_button-group.scss.map +1 -0
  181. package/moj/objects/_filter-layout.scss +2 -0
  182. package/moj/objects/_filter-layout.scss.map +1 -0
  183. package/moj/objects/_scrollable-pane.scss +2 -0
  184. package/moj/objects/_scrollable-pane.scss.map +1 -0
  185. package/moj/objects/_width-container.scss +2 -0
  186. package/moj/objects/_width-container.scss.map +1 -0
  187. package/moj/settings/_all.scss +2 -0
  188. package/moj/settings/_all.scss.map +1 -0
  189. package/moj/settings/_assets.scss +2 -0
  190. package/moj/settings/_assets.scss.map +1 -0
  191. package/moj/settings/_colours.scss +2 -0
  192. package/moj/settings/_colours.scss.map +1 -0
  193. package/moj/settings/_measurements.scss +2 -0
  194. package/moj/settings/_measurements.scss.map +1 -0
  195. package/moj/settings/_typography.scss +2 -0
  196. package/moj/settings/_typography.scss.map +1 -0
  197. package/moj/template.njk +13 -0
  198. package/moj/utilities/_all.scss +2 -0
  199. package/moj/utilities/_all.scss.map +1 -0
  200. package/moj/utilities/_hidden.scss +2 -0
  201. package/moj/utilities/_hidden.scss.map +1 -0
  202. package/moj/utilities/_width-container.scss +2 -0
  203. package/moj/utilities/_width-container.scss.map +1 -0
  204. package/moj/vendor/govuk-frontend/_base.scss +2 -0
  205. package/moj/vendor/govuk-frontend/_base.scss.map +1 -0
  206. package/moj/vendor/govuk-frontend/_index.scss +2 -0
  207. package/moj/vendor/govuk-frontend/_index.scss.map +1 -0
  208. package/moj/{version.js → version.bundle.js} +1 -1
  209. package/moj/version.bundle.js.map +1 -0
  210. package/moj/version.bundle.mjs +4 -0
  211. package/moj/version.bundle.mjs.map +1 -0
  212. package/moj/version.mjs.map +1 -1
  213. package/package.json +5 -6
  214. package/moj/all.jquery.min.js +0 -1
  215. package/moj/all.jquery.min.js.map +0 -1
  216. package/moj/all.js +0 -2662
  217. package/moj/all.js.map +0 -1
  218. package/moj/components/add-another/add-another.js +0 -115
  219. package/moj/components/add-another/add-another.js.map +0 -1
  220. package/moj/components/alert/alert.js +0 -356
  221. package/moj/components/alert/alert.js.map +0 -1
  222. package/moj/components/alert/alert.spec.helper.js.map +0 -1
  223. package/moj/components/button-menu/button-menu.js.map +0 -1
  224. package/moj/components/date-picker/date-picker.js.map +0 -1
  225. package/moj/components/filter-toggle-button/filter-toggle-button.js +0 -102
  226. package/moj/components/filter-toggle-button/filter-toggle-button.js.map +0 -1
  227. package/moj/components/form-validator/form-validator.js +0 -205
  228. package/moj/components/form-validator/form-validator.js.map +0 -1
  229. package/moj/components/multi-file-upload/multi-file-upload.js +0 -241
  230. package/moj/components/multi-file-upload/multi-file-upload.js.map +0 -1
  231. package/moj/components/multi-select/multi-select.js +0 -86
  232. package/moj/components/multi-select/multi-select.js.map +0 -1
  233. package/moj/components/password-reveal/password-reveal.js +0 -44
  234. package/moj/components/password-reveal/password-reveal.js.map +0 -1
  235. package/moj/components/rich-text-editor/rich-text-editor.js +0 -166
  236. package/moj/components/rich-text-editor/rich-text-editor.js.map +0 -1
  237. package/moj/components/search-toggle/search-toggle.js +0 -63
  238. package/moj/components/search-toggle/search-toggle.js.map +0 -1
  239. package/moj/components/sortable-table/sortable-table.js +0 -147
  240. package/moj/components/sortable-table/sortable-table.js.map +0 -1
  241. package/moj/helpers.js.map +0 -1
  242. package/moj/vendor/html5shiv.js +0 -326
  243. package/moj/vendor/jquery.js +0 -9300
  244. package/moj/version.js.map +0 -1
@@ -1,356 +0,0 @@
1
- (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
3
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.MOJFrontend = global.MOJFrontend || {}));
5
- })(this, (function (exports) { 'use strict';
6
-
7
- /**
8
- * Find an elements preceding sibling
9
- *
10
- * Utility function to find an elements previous sibling matching the provided
11
- * selector.
12
- *
13
- * @param {HTMLElement} $element - Element to find siblings for
14
- * @param {string} selector - selector for required sibling
15
- */
16
- function getPreviousSibling($element, selector) {
17
- if (!$element) return
18
- // Get the previous sibling element
19
- let $sibling = $element.previousElementSibling;
20
-
21
- // If the sibling matches our selector, use it
22
- // If not, jump to the next sibling and continue the loop
23
- while ($sibling) {
24
- if ($sibling.matches(selector)) return $sibling
25
- $sibling = $sibling.previousElementSibling;
26
- }
27
- }
28
-
29
- function findNearestMatchingElement($element, selector) {
30
- // If no element or selector is provided, return null
31
- if (!$element) return
32
-
33
- // Start with the current element
34
- let $currentElement = $element;
35
-
36
- while ($currentElement) {
37
- // First check the current element
38
- if ($currentElement.matches(selector)) {
39
- return $currentElement
40
- }
41
-
42
- // Check all previous siblings
43
- let $sibling = $currentElement.previousElementSibling;
44
- while ($sibling) {
45
- // Check if the sibling itself is a heading
46
- if ($sibling.matches(selector)) {
47
- return $sibling
48
- }
49
- $sibling = $sibling.previousElementSibling;
50
- }
51
-
52
- // If no match found in siblings, move up to parent
53
- $currentElement = $currentElement.parentElement;
54
- }
55
- }
56
-
57
- /**
58
- * Move focus to element
59
- *
60
- * Sets tabindex to -1 to make the element programmatically focusable,
61
- * but removes it on blur as the element doesn't need to be focused again.
62
- *
63
- * @param {HTMLElement} $element - HTML element
64
- * @param {object} [options] - Handler options
65
- * @param {function(this: HTMLElement): void} [options.onBeforeFocus] - Callback before focus
66
- * @param {function(this: HTMLElement): void} [options.onBlur] - Callback on blur
67
- */
68
- function setFocus($element, options = {}) {
69
- const isFocusable = $element.getAttribute('tabindex');
70
-
71
- if (!isFocusable) {
72
- $element.setAttribute('tabindex', '-1');
73
- }
74
-
75
- /**
76
- * Handle element focus
77
- */
78
- function onFocus() {
79
- $element.addEventListener('blur', onBlur, { once: true });
80
- }
81
-
82
- /**
83
- * Handle element blur
84
- */
85
- function onBlur() {
86
- if (options.onBlur) {
87
- options.onBlur.call($element);
88
- }
89
-
90
- if (!isFocusable) {
91
- $element.removeAttribute('tabindex');
92
- }
93
- }
94
-
95
- // Add listener to reset element on blur, after focus
96
- $element.addEventListener('focus', onFocus, { once: true });
97
-
98
- // Focus element
99
- if (options.onBeforeFocus) {
100
- options.onBeforeFocus.call($element);
101
- }
102
- $element.focus();
103
- }
104
-
105
- /**
106
- * @typedef {object} AlertConfig
107
- * @property {boolean} [dismissible=false] - Can the alert be dismissed by the user
108
- * @property {string} [dismissText=Dismiss] - the label text for the dismiss button
109
- * @property {boolean} [disableAutoFocus=false] - whether the alert will be autofocused
110
- * @property {string} [focusOnDismissSelector] - CSS Selector for element to be focused on dismiss
111
- */
112
-
113
- /**
114
- * @param {HTMLElement} $module - the Alert element
115
- * @param {AlertConfig} config - configuration options
116
- * @class
117
- */
118
- function Alert($module, config = {}) {
119
- if (!$module) {
120
- return this
121
- }
122
-
123
- const schema = Object.freeze({
124
- properties: {
125
- dismissible: { type: 'boolean' },
126
- dismissText: { type: 'string' },
127
- disableAutoFocus: { type: 'boolean' },
128
- focusOnDismissSelector: { type: 'string' }
129
- }
130
- });
131
-
132
- const defaults = {
133
- dismissible: false,
134
- dismissText: 'Dismiss',
135
- disableAutoFocus: false
136
- };
137
-
138
- // data attributes override JS config, which overrides defaults
139
- this.config = this.mergeConfigs(
140
- defaults,
141
- config,
142
- this.parseDataset(schema, $module.dataset)
143
- );
144
-
145
- this.$module = $module;
146
- }
147
-
148
- Alert.prototype.init = function () {
149
- /**
150
- * Focus the alert
151
- *
152
- * If `role="alert"` is set, focus the element to help some assistive
153
- * technologies prioritise announcing it.
154
- *
155
- * You can turn off the auto-focus functionality by setting
156
- * `data-disable-auto-focus="true"` in the component HTML. You might wish to
157
- * do this based on user research findings, or to avoid a clash with another
158
- * element which should be focused when the page loads.
159
- */
160
- if (
161
- this.$module.getAttribute('role') === 'alert' &&
162
- !this.config.disableAutoFocus
163
- ) {
164
- setFocus(this.$module);
165
- }
166
-
167
- this.$dismissButton = this.$module.querySelector('.moj-alert__dismiss');
168
-
169
- if (this.config.dismissible && this.$dismissButton) {
170
- this.$dismissButton.innerHTML = this.config.dismissText;
171
- this.$dismissButton.removeAttribute('hidden');
172
-
173
- this.$module.addEventListener('click', (event) => {
174
- if (this.$dismissButton.contains(event.target)) {
175
- this.dimiss();
176
- }
177
- });
178
- }
179
- };
180
-
181
- /**
182
- * Handle dismissing the alert
183
- */
184
- Alert.prototype.dimiss = function () {
185
- let $elementToRecieveFocus;
186
-
187
- // If a selector has been provided, attempt to find that element
188
- if (this.config.focusOnDismissSelector) {
189
- $elementToRecieveFocus = document.querySelector(
190
- this.config.focusOnDismissSelector
191
- );
192
- }
193
-
194
- // Is the next sibling another alert
195
- if (!$elementToRecieveFocus) {
196
- const $nextSibling = this.$module.nextElementSibling;
197
- if ($nextSibling && $nextSibling.matches('.moj-alert')) {
198
- $elementToRecieveFocus = $nextSibling;
199
- }
200
- }
201
-
202
- // Else try to find any preceding sibling alert or heading
203
- if (!$elementToRecieveFocus) {
204
- $elementToRecieveFocus = getPreviousSibling(
205
- this.$module,
206
- '.moj-alert, h1, h2, h3, h4, h5, h6'
207
- );
208
- }
209
-
210
- // Else find the closest ancestor heading, or fallback to main, or last resort
211
- // use the body element
212
- if (!$elementToRecieveFocus) {
213
- $elementToRecieveFocus = findNearestMatchingElement(
214
- this.$module,
215
- 'h1, h2, h3, h4, h5, h6, main, body'
216
- );
217
- }
218
-
219
- // If we have an element, place focus on it
220
- if ($elementToRecieveFocus) {
221
- setFocus($elementToRecieveFocus);
222
- }
223
-
224
- // Remove the alert
225
- this.$module.remove();
226
- };
227
-
228
- /**
229
- * Normalise string
230
- *
231
- * 'If it looks like a duck, and it quacks like a duck…' 🦆
232
- *
233
- * If the passed value looks like a boolean or a number, convert it to a boolean
234
- * or number.
235
- *
236
- * Designed to be used to convert config passed via data attributes (which are
237
- * always strings) into something sensible.
238
- *
239
- * @internal
240
- * @param {DOMStringMap[string]} value - The value to normalise
241
- * @param {SchemaProperty} [property] - Component schema property
242
- * @returns {string | boolean | number | undefined} Normalised data
243
- */
244
- Alert.prototype.normaliseString = function (value, property) {
245
- const trimmedValue = value ? value.trim() : '';
246
-
247
- let output;
248
- let outputType;
249
- if (property && property.type) {
250
- outputType = property.type;
251
- }
252
-
253
- // No schema type set? Determine automatically
254
- if (!outputType) {
255
- if (['true', 'false'].includes(trimmedValue)) {
256
- outputType = 'boolean';
257
- }
258
-
259
- // Empty / whitespace-only strings are considered finite so we need to check
260
- // the length of the trimmed string as well
261
- if (trimmedValue.length > 0 && isFinite(Number(trimmedValue))) {
262
- outputType = 'number';
263
- }
264
- }
265
-
266
- switch (outputType) {
267
- case 'boolean':
268
- output = trimmedValue === 'true';
269
- break
270
-
271
- case 'number':
272
- output = Number(trimmedValue);
273
- break
274
-
275
- default:
276
- output = value;
277
- }
278
-
279
- return output
280
- };
281
-
282
- /**
283
- * Parse dataset
284
- *
285
- * Loop over an object and normalise each value using {@link normaliseString},
286
- * optionally expanding nested `i18n.field`
287
- *
288
- * @param {Schema} schema - component schema
289
- * @param {DOMStringMap} dataset - HTML element dataset
290
- * @returns {object} Normalised dataset
291
- */
292
- Alert.prototype.parseDataset = function (schema, dataset) {
293
- const parsed = {};
294
-
295
- for (const [field, property] of Object.entries(schema.properties)) {
296
- if (field in dataset) {
297
- if (dataset[field]) {
298
- parsed[field] = this.normaliseString(dataset[field], property);
299
- }
300
- }
301
- }
302
-
303
- return parsed
304
- };
305
-
306
- /**
307
- * Config merging function
308
- *
309
- * Takes any number of objects and combines them together, with
310
- * greatest priority on the LAST item passed in.
311
- *
312
- * @param {...{ [key: string]: unknown }} configObjects - Config objects to merge
313
- * @returns {{ [key: string]: unknown }} A merged config object
314
- */
315
- Alert.prototype.mergeConfigs = function (...configObjects) {
316
- const formattedConfigObject = {};
317
-
318
- // Loop through each of the passed objects
319
- for (const configObject of configObjects) {
320
- for (const key of Object.keys(configObject)) {
321
- const option = formattedConfigObject[key];
322
- const override = configObject[key];
323
-
324
- // Push their keys one-by-one into formattedConfigObject. Any duplicate
325
- // keys with object values will be merged, otherwise the new value will
326
- // override the existing value.
327
- if (typeof option === 'object' && typeof override === 'object') {
328
- // @ts-expect-error Index signature for type 'string' is missing
329
- formattedConfigObject[key] = this.mergeConfigs(option, override);
330
- } else {
331
- formattedConfigObject[key] = override;
332
- }
333
- }
334
- }
335
-
336
- return formattedConfigObject
337
- };
338
-
339
- /**
340
- * Schema for component config
341
- *
342
- * @typedef {object} Schema
343
- * @property {{ [field: string]: SchemaProperty | undefined }} properties - Schema properties
344
- */
345
-
346
- /**
347
- * Schema property for component config
348
- *
349
- * @typedef {object} SchemaProperty
350
- * @property {'string' | 'boolean' | 'number' | 'object'} type - Property type
351
- */
352
-
353
- exports.Alert = Alert;
354
-
355
- }));
356
- //# sourceMappingURL=alert.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"alert.js","sources":["../../../../src/moj/helpers.mjs","../../../../src/moj/components/alert/alert.mjs"],"sourcesContent":["export function removeAttributeValue(el, attr, value) {\n let re, m\n if (el.getAttribute(attr)) {\n if (el.getAttribute(attr) === value) {\n el.removeAttribute(attr)\n } else {\n re = new RegExp(`(^|\\\\s)${value}(\\\\s|$)`)\n m = el.getAttribute(attr).match(re)\n if (m && m.length === 3) {\n el.setAttribute(\n attr,\n el.getAttribute(attr).replace(re, m[1] && m[2] ? ' ' : '')\n )\n }\n }\n }\n}\n\nexport function addAttributeValue(el, attr, value) {\n let re\n if (!el.getAttribute(attr)) {\n el.setAttribute(attr, value)\n } else {\n re = new RegExp(`(^|\\\\s)${value}(\\\\s|$)`)\n if (!re.test(el.getAttribute(attr))) {\n el.setAttribute(attr, `${el.getAttribute(attr)} ${value}`)\n }\n }\n}\n\nexport function dragAndDropSupported() {\n const div = document.createElement('div')\n return typeof div.ondrop !== 'undefined'\n}\n\nexport function formDataSupported() {\n return typeof FormData === 'function'\n}\n\nexport function fileApiSupported() {\n const input = document.createElement('input')\n input.type = 'file'\n return typeof input.files !== 'undefined'\n}\n\nexport function nodeListForEach(nodes, callback) {\n if (window.NodeList.prototype.forEach) {\n return nodes.forEach(callback)\n }\n for (let i = 0; i < nodes.length; i++) {\n callback.call(window, nodes[i], i, nodes)\n }\n}\n\n/**\n * Find an elements next sibling\n *\n * Utility function to find an elements next sibling matching the provided\n * selector.\n *\n * @param {HTMLElement} $element - Element to find siblings for\n * @param {string} selector - selector for required sibling\n */\nexport function getNextSibling($element, selector) {\n if (!$element) return\n // Get the next sibling element\n let $sibling = $element.nextElementSibling\n\n // If there's no selector, return the first sibling\n if (!selector) return $sibling\n\n // If the sibling matches our selector, use it\n // If not, jump to the next sibling and continue the loop\n while ($sibling) {\n if ($sibling.matches(selector)) return $sibling\n $sibling = $sibling.nextElementSibling\n }\n}\n\n/**\n * Find an elements preceding sibling\n *\n * Utility function to find an elements previous sibling matching the provided\n * selector.\n *\n * @param {HTMLElement} $element - Element to find siblings for\n * @param {string} selector - selector for required sibling\n */\nexport function getPreviousSibling($element, selector) {\n if (!$element) return\n // Get the previous sibling element\n let $sibling = $element.previousElementSibling\n\n // If there's no selector, return the first sibling\n if (!selector) return $sibling\n\n // If the sibling matches our selector, use it\n // If not, jump to the next sibling and continue the loop\n while ($sibling) {\n if ($sibling.matches(selector)) return $sibling\n $sibling = $sibling.previousElementSibling\n }\n}\n\nexport function findNearestMatchingElement($element, selector) {\n // If no element or selector is provided, return null\n if (!$element) return\n if (!selector) return\n\n // Start with the current element\n let $currentElement = $element\n\n while ($currentElement) {\n // First check the current element\n if ($currentElement.matches(selector)) {\n return $currentElement\n }\n\n // Check all previous siblings\n let $sibling = $currentElement.previousElementSibling\n while ($sibling) {\n // Check if the sibling itself is a heading\n if ($sibling.matches(selector)) {\n return $sibling\n }\n $sibling = $sibling.previousElementSibling\n }\n\n // If no match found in siblings, move up to parent\n $currentElement = $currentElement.parentElement\n }\n}\n\n/**\n * Move focus to element\n *\n * Sets tabindex to -1 to make the element programmatically focusable,\n * but removes it on blur as the element doesn't need to be focused again.\n *\n * @param {HTMLElement} $element - HTML element\n * @param {object} [options] - Handler options\n * @param {function(this: HTMLElement): void} [options.onBeforeFocus] - Callback before focus\n * @param {function(this: HTMLElement): void} [options.onBlur] - Callback on blur\n */\nexport function setFocus($element, options = {}) {\n const isFocusable = $element.getAttribute('tabindex')\n\n if (!isFocusable) {\n $element.setAttribute('tabindex', '-1')\n }\n\n /**\n * Handle element focus\n */\n function onFocus() {\n $element.addEventListener('blur', onBlur, { once: true })\n }\n\n /**\n * Handle element blur\n */\n function onBlur() {\n if (options.onBlur) {\n options.onBlur.call($element)\n }\n\n if (!isFocusable) {\n $element.removeAttribute('tabindex')\n }\n }\n\n // Add listener to reset element on blur, after focus\n $element.addEventListener('focus', onFocus, { once: true })\n\n // Focus element\n if (options.onBeforeFocus) {\n options.onBeforeFocus.call($element)\n }\n $element.focus()\n}\n","import {\n findNearestMatchingElement,\n getPreviousSibling,\n setFocus\n} from '../../helpers.mjs'\n\n/**\n * @typedef {object} AlertConfig\n * @property {boolean} [dismissible=false] - Can the alert be dismissed by the user\n * @property {string} [dismissText=Dismiss] - the label text for the dismiss button\n * @property {boolean} [disableAutoFocus=false] - whether the alert will be autofocused\n * @property {string} [focusOnDismissSelector] - CSS Selector for element to be focused on dismiss\n */\n\n/**\n * @param {HTMLElement} $module - the Alert element\n * @param {AlertConfig} config - configuration options\n * @class\n */\nexport function Alert($module, config = {}) {\n if (!$module) {\n return this\n }\n\n const schema = Object.freeze({\n properties: {\n dismissible: { type: 'boolean' },\n dismissText: { type: 'string' },\n disableAutoFocus: { type: 'boolean' },\n focusOnDismissSelector: { type: 'string' }\n }\n })\n\n const defaults = {\n dismissible: false,\n dismissText: 'Dismiss',\n disableAutoFocus: false\n }\n\n // data attributes override JS config, which overrides defaults\n this.config = this.mergeConfigs(\n defaults,\n config,\n this.parseDataset(schema, $module.dataset)\n )\n\n this.$module = $module\n}\n\nAlert.prototype.init = function () {\n /**\n * Focus the alert\n *\n * If `role=\"alert\"` is set, focus the element to help some assistive\n * technologies prioritise announcing it.\n *\n * You can turn off the auto-focus functionality by setting\n * `data-disable-auto-focus=\"true\"` in the component HTML. You might wish to\n * do this based on user research findings, or to avoid a clash with another\n * element which should be focused when the page loads.\n */\n if (\n this.$module.getAttribute('role') === 'alert' &&\n !this.config.disableAutoFocus\n ) {\n setFocus(this.$module)\n }\n\n this.$dismissButton = this.$module.querySelector('.moj-alert__dismiss')\n\n if (this.config.dismissible && this.$dismissButton) {\n this.$dismissButton.innerHTML = this.config.dismissText\n this.$dismissButton.removeAttribute('hidden')\n\n this.$module.addEventListener('click', (event) => {\n if (this.$dismissButton.contains(event.target)) {\n this.dimiss()\n }\n })\n }\n}\n\n/**\n * Handle dismissing the alert\n */\nAlert.prototype.dimiss = function () {\n let $elementToRecieveFocus\n\n // If a selector has been provided, attempt to find that element\n if (this.config.focusOnDismissSelector) {\n $elementToRecieveFocus = document.querySelector(\n this.config.focusOnDismissSelector\n )\n }\n\n // Is the next sibling another alert\n if (!$elementToRecieveFocus) {\n const $nextSibling = this.$module.nextElementSibling\n if ($nextSibling && $nextSibling.matches('.moj-alert')) {\n $elementToRecieveFocus = $nextSibling\n }\n }\n\n // Else try to find any preceding sibling alert or heading\n if (!$elementToRecieveFocus) {\n $elementToRecieveFocus = getPreviousSibling(\n this.$module,\n '.moj-alert, h1, h2, h3, h4, h5, h6'\n )\n }\n\n // Else find the closest ancestor heading, or fallback to main, or last resort\n // use the body element\n if (!$elementToRecieveFocus) {\n $elementToRecieveFocus = findNearestMatchingElement(\n this.$module,\n 'h1, h2, h3, h4, h5, h6, main, body'\n )\n }\n\n // If we have an element, place focus on it\n if ($elementToRecieveFocus) {\n setFocus($elementToRecieveFocus)\n }\n\n // Remove the alert\n this.$module.remove()\n}\n\n/**\n * Normalise string\n *\n * 'If it looks like a duck, and it quacks like a duck…' 🦆\n *\n * If the passed value looks like a boolean or a number, convert it to a boolean\n * or number.\n *\n * Designed to be used to convert config passed via data attributes (which are\n * always strings) into something sensible.\n *\n * @internal\n * @param {DOMStringMap[string]} value - The value to normalise\n * @param {SchemaProperty} [property] - Component schema property\n * @returns {string | boolean | number | undefined} Normalised data\n */\nAlert.prototype.normaliseString = function (value, property) {\n const trimmedValue = value ? value.trim() : ''\n\n let output\n let outputType\n if (property && property.type) {\n outputType = property.type\n }\n\n // No schema type set? Determine automatically\n if (!outputType) {\n if (['true', 'false'].includes(trimmedValue)) {\n outputType = 'boolean'\n }\n\n // Empty / whitespace-only strings are considered finite so we need to check\n // the length of the trimmed string as well\n if (trimmedValue.length > 0 && isFinite(Number(trimmedValue))) {\n outputType = 'number'\n }\n }\n\n switch (outputType) {\n case 'boolean':\n output = trimmedValue === 'true'\n break\n\n case 'number':\n output = Number(trimmedValue)\n break\n\n default:\n output = value\n }\n\n return output\n}\n\n/**\n * Parse dataset\n *\n * Loop over an object and normalise each value using {@link normaliseString},\n * optionally expanding nested `i18n.field`\n *\n * @param {Schema} schema - component schema\n * @param {DOMStringMap} dataset - HTML element dataset\n * @returns {object} Normalised dataset\n */\nAlert.prototype.parseDataset = function (schema, dataset) {\n const parsed = {}\n\n for (const [field, property] of Object.entries(schema.properties)) {\n if (field in dataset) {\n if (dataset[field]) {\n parsed[field] = this.normaliseString(dataset[field], property)\n }\n }\n }\n\n return parsed\n}\n\n/**\n * Config merging function\n *\n * Takes any number of objects and combines them together, with\n * greatest priority on the LAST item passed in.\n *\n * @param {...{ [key: string]: unknown }} configObjects - Config objects to merge\n * @returns {{ [key: string]: unknown }} A merged config object\n */\nAlert.prototype.mergeConfigs = function (...configObjects) {\n const formattedConfigObject = {}\n\n // Loop through each of the passed objects\n for (const configObject of configObjects) {\n for (const key of Object.keys(configObject)) {\n const option = formattedConfigObject[key]\n const override = configObject[key]\n\n // Push their keys one-by-one into formattedConfigObject. Any duplicate\n // keys with object values will be merged, otherwise the new value will\n // override the existing value.\n if (typeof option === 'object' && typeof override === 'object') {\n // @ts-expect-error Index signature for type 'string' is missing\n formattedConfigObject[key] = this.mergeConfigs(option, override)\n } else {\n formattedConfigObject[key] = override\n }\n }\n }\n\n return formattedConfigObject\n}\n\n/**\n * Schema for component config\n *\n * @typedef {object} Schema\n * @property {{ [field: string]: SchemaProperty | undefined }} properties - Schema properties\n */\n\n/**\n * Schema property for component config\n *\n * @typedef {object} SchemaProperty\n * @property {'string' | 'boolean' | 'number' | 'object'} type - Property type\n */\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"alert.spec.helper.js","sources":["../../../../src/moj/components/alert/alert.spec.helper.mjs"],"sourcesContent":["export const pageTemplate = `\n <main>\n <div id=\"alert-1\" role=\"region\" class=\"moj-alert moj-alert--information moj-alert--with-heading\" aria-label=\"information: This contains information\" data-module=\"moj-alert\" data-dismissible=\"true\">\n <div>\n <svg class=\"moj-alert__icon\" role=\"presentation\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 30 30\" height=\"30\" width=\"30\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.2165 3.45151C11.733 2.82332 13.3585 2.5 15 2.5C16.6415 2.5 18.267 2.82332 19.7835 3.45151C21.3001 4.07969 22.6781 5.00043 23.8388 6.16117C24.9996 7.3219 25.9203 8.69989 26.5485 10.2165C27.1767 11.733 27.5 13.3585 27.5 15C27.5 18.3152 26.183 21.4946 23.8388 23.8388C21.4946 26.183 18.3152 27.5 15 27.5C13.3585 27.5 11.733 27.1767 10.2165 26.5485C8.69989 25.9203 7.3219 24.9996 6.16117 23.8388C3.81696 21.4946 2.5 18.3152 2.5 15C2.5 11.6848 3.81696 8.50537 6.16117 6.16117C7.3219 5.00043 8.69989 4.07969 10.2165 3.45151ZM16.3574 22.4121H13.6621V12.95H16.3574V22.4121ZM13.3789 9.20898C13.3789 8.98763 13.4212 8.7793 13.5059 8.58398C13.5905 8.38216 13.7044 8.20964 13.8477 8.06641C13.9974 7.91667 14.1699 7.79948 14.3652 7.71484C14.5605 7.63021 14.7721 7.58789 15 7.58789C15.2214 7.58789 15.4297 7.63021 15.625 7.71484C15.8268 7.79948 15.9993 7.91667 16.1426 8.06641C16.2923 8.20964 16.4095 8.38216 16.4941 8.58398C16.5788 8.7793 16.6211 8.98763 16.6211 9.20898C16.6211 9.43685 16.5788 9.64844 16.4941 9.84375C16.4095 10.0391 16.2923 10.2116 16.1426 10.3613C15.9993 10.5046 15.8268 10.6185 15.625 10.7031C15.4297 10.7878 15.2214 10.8301 15 10.8301C14.7721 10.8301 14.5605 10.7878 14.3652 10.7031C14.1699 10.6185 13.9974 10.5046 13.8477 10.3613C13.7044 10.2116 13.5905 10.0391 13.5059 9.84375C13.4212 9.64844 13.3789 9.43685 13.3789 9.20898Z\" fill=\"currentColor\"/></svg>\n </div>\n <div class=\"moj-alert__content\">\n <h2 class=\"govuk-heading-m\">This contains information</h2>\n Content that informs you of a thing. It really is so very informative, that&#39;s why it needs so much content and is really, exceedingly verbose.\n </div>\n <div class=\"moj-alert__action\">\n <button class=\"moj-alert__dismiss\" hidden>Dismiss</button>\n </div>\n </div>\n\n <h1 id=\"h1\">Heading 1</h1>\n <section>\n <h2 id=\"h2\">heading 2</h2>\n <div id=\"alert-2\" role=\"region\" class=\"moj-alert moj-alert--information\" aria-label=\"information: You might like to know\" data-module=\"moj-alert\" data-dismissible=\"true\">\n <div>\n <svg class=\"moj-alert__icon\" role=\"presentation\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 30 30\" height=\"30\" width=\"30\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.2165 3.45151C11.733 2.82332 13.3585 2.5 15 2.5C16.6415 2.5 18.267 2.82332 19.7835 3.45151C21.3001 4.07969 22.6781 5.00043 23.8388 6.16117C24.9996 7.3219 25.9203 8.69989 26.5485 10.2165C27.1767 11.733 27.5 13.3585 27.5 15C27.5 18.3152 26.183 21.4946 23.8388 23.8388C21.4946 26.183 18.3152 27.5 15 27.5C13.3585 27.5 11.733 27.1767 10.2165 26.5485C8.69989 25.9203 7.3219 24.9996 6.16117 23.8388C3.81696 21.4946 2.5 18.3152 2.5 15C2.5 11.6848 3.81696 8.50537 6.16117 6.16117C7.3219 5.00043 8.69989 4.07969 10.2165 3.45151ZM16.3574 22.4121H13.6621V12.95H16.3574V22.4121ZM13.3789 9.20898C13.3789 8.98763 13.4212 8.7793 13.5059 8.58398C13.5905 8.38216 13.7044 8.20964 13.8477 8.06641C13.9974 7.91667 14.1699 7.79948 14.3652 7.71484C14.5605 7.63021 14.7721 7.58789 15 7.58789C15.2214 7.58789 15.4297 7.63021 15.625 7.71484C15.8268 7.79948 15.9993 7.91667 16.1426 8.06641C16.2923 8.20964 16.4095 8.38216 16.4941 8.58398C16.5788 8.7793 16.6211 8.98763 16.6211 9.20898C16.6211 9.43685 16.5788 9.64844 16.4941 9.84375C16.4095 10.0391 16.2923 10.2116 16.1426 10.3613C15.9993 10.5046 15.8268 10.6185 15.625 10.7031C15.4297 10.7878 15.2214 10.8301 15 10.8301C14.7721 10.8301 14.5605 10.7878 14.3652 10.7031C14.1699 10.6185 13.9974 10.5046 13.8477 10.3613C13.7044 10.2116 13.5905 10.0391 13.5059 9.84375C13.4212 9.64844 13.3789 9.43685 13.3789 9.20898Z\" fill=\"currentColor\"/></svg>\n </div>\n <div class=\"moj-alert__content\">Content that informs you of a thing. <a href=\"#\">More information</a></div>\n <div class=\"moj-alert__action\">\n <button class=\"moj-alert__dismiss\" hidden>Dismiss</button>\n </div>\n </div>\n\n\n <div id=\"alert-3\"role=\"region\" class=\"moj-alert moj-alert--success\" aria-label=\"success: Woohoo!\" data-module=\"moj-alert\" data-dismissible=\"true\">\n <div>\n <svg class=\"moj-alert__icon\" role=\"presentation\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 30 30\" height=\"30\" width=\"30\"><path d=\"M11.2869 24.6726L2.00415 15.3899L4.62189 12.7722L11.2869 19.4186L25.3781 5.32739L27.9958 7.96369L11.2869 24.6726Z\" fill=\"currentColor\"/>\n </svg>\n </div>\n <div class=\"moj-alert__content\">That thing just successfully occurred. <a href=\"#\">Celebrate here</a></div>\n <div class=\"moj-alert__action\">\n <button class=\"moj-alert__dismiss\" hidden>Dismiss</button>\n </div>\n </div>\n\n <div id=\"alert-4\" role=\"region\" class=\"moj-alert moj-alert--warning\" aria-label=\"warning: Something&#39;s not quite right\" data-module=\"moj-alert\" data-dismissible=\"true\">\n <div>\n <svg class=\"moj-alert__icon\" role=\"presentation\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 30 30\" height=\"30\" width=\"30\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15 2.44922L28.75 26.1992H1.25L15 2.44922ZM13.5107 9.49579H16.4697L16.2431 17.7678H13.7461L13.5107 9.49579ZM13.1299 21.82C13.1299 21.5661 13.1787 21.3285 13.2764 21.1071C13.374 20.8793 13.5075 20.6807 13.6768 20.5114C13.8525 20.3421 14.0544 20.2087 14.2822 20.111C14.5101 20.0134 14.7542 19.9645 15.0146 19.9645C15.2686 19.9645 15.5062 20.0134 15.7275 20.111C15.9554 20.2087 16.154 20.3421 16.3232 20.5114C16.4925 20.6807 16.626 20.8793 16.7236 21.1071C16.8213 21.3285 16.8701 21.5661 16.8701 21.82C16.8701 22.0804 16.8213 22.3246 16.7236 22.5524C16.626 22.7803 16.4925 22.9789 16.3232 23.1481C16.154 23.3174 15.9554 23.4509 15.7275 23.5485C15.5062 23.6462 15.2686 23.695 15.0146 23.695C14.7542 23.695 14.5101 23.6462 14.2822 23.5485C14.0544 23.4509 13.8525 23.3174 13.6768 23.1481C13.5075 22.9789 13.374 22.7803 13.2764 22.5524C13.1787 22.3246 13.1299 22.0804 13.1299 21.82Z\" fill=\"currentColor\"/></svg>\n </div>\n <div class=\"moj-alert__content\">You should be aware of this thing. <a href=\"#\">More information</a></div>\n <div class=\"moj-alert__action\">\n <button class=\"moj-alert__dismiss\" hidden>Dismiss</button>\n </div>\n </div>\n\n <div id=\"alert-5\" role=\"region\" class=\"moj-alert moj-alert--error\" aria-label=\"error: Woah, hold up!\" data-module=\"moj-alert\" data-dismissible=\"true\" data-dismissible=\"true\" data-focus-on-dismiss-selector=\"#focusOnMe\">\n <div>\n <svg class=\"moj-alert__icon\" role=\"presentation\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 30 30\" height=\"30\" width=\"30\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M20.1777 2.5H9.82233L2.5 9.82233V20.1777L9.82233 27.5H20.1777L27.5 20.1777V9.82233L20.1777 2.5ZM10.9155 8.87769L15.0001 12.9623L19.0847 8.87771L21.1224 10.9154L17.0378 15L21.1224 19.0846L19.0847 21.1222L15.0001 17.0376L10.9155 21.1223L8.87782 19.0846L12.9624 15L8.87783 10.9153L10.9155 8.87769Z\" fill=\"currentColor\"/></svg>\n </div>\n <div class=\"moj-alert__content\">Bad things happened. <a href=\"#\">Contact us</a></div>\n <div class=\"moj-alert__action\">\n <button class=\"moj-alert__dismiss\" hidden>Dismiss</button>\n </div>\n </div>\n\n <div id=\"focusOnMe\">I will receive focus</div>\n </section>\n</main>\n`\n"],"names":[],"mappings":";;;;;;AAAY,QAAC,YAAY,GAAG;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"button-menu.js","sources":["../../../../src/moj/components/button-menu/button-menu.mjs"],"sourcesContent":["/**\n * @typedef {object} ButtonMenuConfig\n * @property {string} [buttonText=Actions] - Label for the toggle button\n * @property {\"left\" | \"right\"} [alignMenu=left] - the alignment of the menu\n * @property {string} [buttonClasses=govuk-button--secondary] - css classes applied to the toggle button\n */\n\n/**\n * @param {HTMLElement} $module\n * @param {ButtonMenuConfig} config\n * @class\n */\nexport function ButtonMenu($module, config = {}) {\n if (!$module) {\n return this\n }\n\n const schema = Object.freeze({\n properties: {\n buttonText: { type: 'string' },\n buttonClasses: { type: 'string' },\n alignMenu: { type: 'string' }\n }\n })\n\n const defaults = {\n buttonText: 'Actions',\n alignMenu: 'left',\n buttonClasses: ''\n }\n // data attributes override JS config, which overrides defaults\n this.config = this.mergeConfigs(\n defaults,\n config,\n this.parseDataset(schema, $module.dataset)\n )\n\n this.$module = $module\n}\n\nButtonMenu.prototype.init = function () {\n // If only one button is provided, don't initiate a menu and toggle button\n // if classes have been provided for the toggleButton, apply them to the single item\n if (this.$module.children.length === 1) {\n const button = this.$module.children[0]\n button.classList.forEach((className) => {\n if (className.startsWith('govuk-button-')) {\n button.classList.remove(className)\n }\n button.classList.remove('moj-button-menu__item')\n })\n if (this.config.buttonClasses) {\n button.classList.add(...this.config.buttonClasses.split(' '))\n }\n }\n // Otherwise intialise a button menu\n if (this.$module.children.length > 1) {\n this.initMenu()\n }\n}\n\nButtonMenu.prototype.initMenu = function () {\n this.$menu = this.createMenu()\n this.$module.insertAdjacentHTML('afterbegin', this.toggleTemplate())\n this.setupMenuItems()\n\n this.$menuToggle = this.$module.querySelector(':scope > button')\n this.items = this.$menu.querySelectorAll('a, button')\n\n this.$menuToggle.addEventListener('click', (event) => {\n this.toggleMenu(event)\n })\n\n this.$module.addEventListener('keydown', (event) => {\n this.handleKeyDown(event)\n })\n\n document.addEventListener('click', (event) => {\n if (!this.$module.contains(event.target)) {\n this.closeMenu(false)\n }\n })\n}\n\nButtonMenu.prototype.createMenu = function () {\n const $menu = document.createElement('ul')\n $menu.setAttribute('role', 'list')\n $menu.hidden = true\n $menu.classList.add('moj-button-menu__wrapper')\n if (this.config.alignMenu === 'right') {\n $menu.classList.add('moj-button-menu__wrapper--right')\n }\n\n this.$module.appendChild($menu)\n while (this.$module.firstChild !== $menu) {\n $menu.appendChild(this.$module.firstChild)\n }\n\n return $menu\n}\n\nButtonMenu.prototype.setupMenuItems = function () {\n Array.from(this.$menu.children).forEach((item) => {\n // wrap item in li tag\n const listItem = document.createElement('li')\n this.$menu.insertBefore(listItem, item)\n listItem.appendChild(item)\n\n item.setAttribute('tabindex', -1)\n\n if (item.tagName === 'BUTTON') {\n item.setAttribute('type', 'button')\n }\n\n item.classList.forEach((className) => {\n if (className.startsWith('govuk-button')) {\n item.classList.remove(className)\n }\n })\n\n // add a slight delay after click before closing the menu, makes it *feel* better\n item.addEventListener('click', (event) => {\n setTimeout(() => {\n this.closeMenu(false)\n }, 50)\n })\n })\n}\n\nButtonMenu.prototype.toggleTemplate = function () {\n return `\n <button type=\"button\" class=\"govuk-button moj-button-menu__toggle-button ${this.config.buttonClasses || ''}\" aria-haspopup=\"true\" aria-expanded=\"false\">\n <span>\n ${this.config.buttonText}\n <svg width=\"11\" height=\"5\" viewBox=\"0 0 11 5\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.5 0L11 5L0 5L5.5 0Z\" fill=\"currentColor\"/>\n </svg>\n </span>\n </button>`\n}\n\n/**\n * @returns {boolean}\n */\nButtonMenu.prototype.isOpen = function () {\n return this.$menuToggle.getAttribute('aria-expanded') === 'true'\n}\n\nButtonMenu.prototype.toggleMenu = function (event) {\n event.preventDefault()\n\n // If menu is triggered with mouse don't move focus to first item\n const keyboardEvent = event.detail === 0\n const focusIndex = keyboardEvent ? 0 : -1\n\n if (this.isOpen()) {\n this.closeMenu()\n } else {\n this.openMenu(focusIndex)\n }\n}\n\n/**\n * Opens the menu and optionally sets the focus to the item with given index\n *\n * @param {number} focusIndex - The index of the item to focus\n */\nButtonMenu.prototype.openMenu = function (focusIndex = 0) {\n this.$menu.hidden = false\n this.$menuToggle.setAttribute('aria-expanded', 'true')\n if (focusIndex !== -1) {\n this.focusItem(focusIndex)\n }\n}\n\n/**\n * Closes the menu and optionally returns focus back to menuToggle\n *\n * @param {boolean} moveFocus - whether to return focus to the toggle button\n */\nButtonMenu.prototype.closeMenu = function (moveFocus = true) {\n this.$menu.hidden = true\n this.$menuToggle.setAttribute('aria-expanded', 'false')\n if (moveFocus) {\n this.$menuToggle.focus()\n }\n}\n\n/**\n * Focuses the menu item at the specified index\n *\n * @param {number} index - the index of the item to focus\n */\nButtonMenu.prototype.focusItem = function (index) {\n if (index >= this.items.length) index = 0\n if (index < 0) index = this.items.length - 1\n\n const menuItem = this.items.item(index)\n if (menuItem) {\n menuItem.focus()\n }\n}\n\nButtonMenu.prototype.currentFocusIndex = function () {\n const activeElement = document.activeElement\n const menuItems = Array.from(this.items)\n\n return menuItems.indexOf(activeElement)\n}\n\nButtonMenu.prototype.handleKeyDown = function (event) {\n if (event.target === this.$menuToggle) {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n this.openMenu()\n break\n case 'ArrowUp':\n event.preventDefault()\n this.openMenu(this.items.length - 1)\n break\n }\n }\n\n if (this.$menu.contains(event.target) && this.isOpen()) {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n if (this.currentFocusIndex() !== -1) {\n this.focusItem(this.currentFocusIndex() + 1)\n }\n break\n case 'ArrowUp':\n event.preventDefault()\n if (this.currentFocusIndex() !== -1) {\n this.focusItem(this.currentFocusIndex() - 1)\n }\n break\n case 'Home':\n event.preventDefault()\n this.focusItem(0)\n break\n case 'End':\n event.preventDefault()\n this.focusItem(this.items.length - 1)\n break\n }\n }\n\n if (event.key === 'Escape' && this.isOpen()) {\n this.closeMenu()\n }\n if (event.key === 'Tab' && this.isOpen()) {\n this.closeMenu(false)\n }\n}\n\n/**\n * Parse dataset\n *\n * Loop over an object and normalise each value using {@link normaliseString},\n * optionally expanding nested `i18n.field`\n *\n * @param {Schema} schema - component schema\n * @param {DOMStringMap} dataset - HTML element dataset\n * @returns {object} Normalised dataset\n */\nButtonMenu.prototype.parseDataset = function (schema, dataset) {\n const parsed = {}\n\n for (const [field, ,] of Object.entries(schema.properties)) {\n if (field in dataset) {\n if (dataset[field]) {\n parsed[field] = dataset[field]\n }\n }\n }\n\n return parsed\n}\n\n/**\n * Config merging function\n *\n * Takes any number of objects and combines them together, with\n * greatest priority on the LAST item passed in.\n *\n * @param {...{ [key: string]: unknown }} configObjects - Config objects to merge\n * @returns {{ [key: string]: unknown }} A merged config object\n */\nButtonMenu.prototype.mergeConfigs = function (...configObjects) {\n const formattedConfigObject = {}\n\n // Loop through each of the passed objects\n for (const configObject of configObjects) {\n for (const key of Object.keys(configObject)) {\n const option = formattedConfigObject[key]\n const override = configObject[key]\n\n // Push their keys one-by-one into formattedConfigObject. Any duplicate\n // keys with object values will be merged, otherwise the new value will\n // override the existing value.\n if (typeof option === 'object' && typeof override === 'object') {\n // @ts-expect-error Index signature for type 'string' is missing\n formattedConfigObject[key] = this.mergeConfigs(option, override)\n } else {\n formattedConfigObject[key] = override\n }\n }\n }\n\n return formattedConfigObject\n}\n\n/**\n * Schema for component config\n *\n * @typedef {object} Schema\n * @property {{ [field: string]: SchemaProperty | undefined }} properties - Schema properties\n */\n\n/**\n * Schema property for component config\n *\n * @typedef {object} SchemaProperty\n * @property {'string' | 'boolean' | 'number' | 'object'} type - Property type\n */\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"date-picker.js","sources":["../../../../src/moj/components/date-picker/date-picker.mjs"],"sourcesContent":["/**\n * Date picker config\n *\n * @typedef {object} DatePickerConfig\n * @property {string} [excludedDates] - Dates that cannot be selected\n * @property {string} [excludedDays] - Days that cannot be selected\n * @property {boolean} [leadingZeroes] - Whether to add leading zeroes when populating the field\n * @property {string} [minDate] - The earliest available date\n * @property {string} [maxDate] - The latest available date\n * @property {string} [weekStartDay] - First day of the week in calendar view\n */\n\n/**\n * @param {HTMLElement} $module - HTML element\n * @param {DatePickerConfig} config - config object\n * @class\n */\nexport function DatePicker($module, config = {}) {\n if (!$module) {\n return this\n }\n\n const schema = Object.freeze({\n properties: {\n excludedDates: { type: 'string' },\n excludedDays: { type: 'string' },\n leadingZeros: { type: 'string' },\n maxDate: { type: 'string' },\n minDate: { type: 'string' },\n weekStartDay: { type: 'string' }\n }\n })\n\n const defaults = {\n leadingZeros: false,\n weekStartDay: 'monday'\n }\n\n // data attributes override JS config, which overrides defaults\n this.config = this.mergeConfigs(\n defaults,\n config,\n this.parseDataset(schema, $module.dataset)\n )\n\n this.dayLabels = [\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n 'Sunday'\n ]\n\n this.monthLabels = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n ]\n\n this.currentDate = new Date()\n this.currentDate.setHours(0, 0, 0, 0)\n this.calendarDays = []\n this.excludedDates = []\n this.excludedDays = []\n\n this.buttonClass = 'moj-datepicker__button'\n this.selectedDayButtonClass = 'moj-datepicker__button--selected'\n this.currentDayButtonClass = 'moj-datepicker__button--current'\n this.todayButtonClass = 'moj-datepicker__button--today'\n\n this.$module = $module\n this.$input = $module.querySelector('.moj-js-datepicker-input')\n}\n\nDatePicker.prototype.init = function () {\n // Check that required elements are present\n if (!this.$input) {\n return\n }\n if (this.$module.dataset.initialized) {\n return\n }\n\n this.setOptions()\n this.initControls()\n this.$module.setAttribute('data-initialized', 'true')\n}\n\nDatePicker.prototype.initControls = function () {\n this.id = `datepicker-${this.$input.id}`\n\n this.$dialog = this.createDialog()\n this.createCalendarHeaders()\n\n const $componentWrapper = document.createElement('div')\n const $inputWrapper = document.createElement('div')\n $componentWrapper.classList.add('moj-datepicker__wrapper')\n $inputWrapper.classList.add('govuk-input__wrapper')\n\n this.$input.parentNode.insertBefore($componentWrapper, this.$input)\n $componentWrapper.appendChild($inputWrapper)\n $inputWrapper.appendChild(this.$input)\n\n $inputWrapper.insertAdjacentHTML('beforeend', this.toggleTemplate())\n $componentWrapper.insertAdjacentElement('beforeend', this.$dialog)\n\n this.$calendarButton = this.$module.querySelector('.moj-js-datepicker-toggle')\n this.$dialogTitle = this.$dialog.querySelector(\n '.moj-js-datepicker-month-year'\n )\n\n this.createCalendar()\n\n this.$prevMonthButton = this.$dialog.querySelector(\n '.moj-js-datepicker-prev-month'\n )\n this.$prevYearButton = this.$dialog.querySelector(\n '.moj-js-datepicker-prev-year'\n )\n this.$nextMonthButton = this.$dialog.querySelector(\n '.moj-js-datepicker-next-month'\n )\n this.$nextYearButton = this.$dialog.querySelector(\n '.moj-js-datepicker-next-year'\n )\n this.$cancelButton = this.$dialog.querySelector('.moj-js-datepicker-cancel')\n this.$okButton = this.$dialog.querySelector('.moj-js-datepicker-ok')\n\n // add event listeners\n this.$prevMonthButton.addEventListener('click', (event) =>\n this.focusPreviousMonth(event, false)\n )\n this.$prevYearButton.addEventListener('click', (event) =>\n this.focusPreviousYear(event, false)\n )\n this.$nextMonthButton.addEventListener('click', (event) =>\n this.focusNextMonth(event, false)\n )\n this.$nextYearButton.addEventListener('click', (event) =>\n this.focusNextYear(event, false)\n )\n this.$cancelButton.addEventListener('click', (event) => {\n event.preventDefault()\n this.closeDialog(event)\n })\n this.$okButton.addEventListener('click', () => {\n this.selectDate(this.currentDate)\n })\n\n const dialogButtons = this.$dialog.querySelectorAll(\n 'button:not([disabled=\"true\"])'\n )\n // eslint-disable-next-line prefer-destructuring\n this.$firstButtonInDialog = dialogButtons[0]\n this.$lastButtonInDialog = dialogButtons[dialogButtons.length - 1]\n this.$firstButtonInDialog.addEventListener('keydown', (event) =>\n this.firstButtonKeydown(event)\n )\n this.$lastButtonInDialog.addEventListener('keydown', (event) =>\n this.lastButtonKeydown(event)\n )\n\n this.$calendarButton.addEventListener('click', (event) =>\n this.toggleDialog(event)\n )\n\n this.$dialog.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n this.closeDialog()\n event.preventDefault()\n event.stopPropagation()\n }\n })\n\n document.body.addEventListener('mouseup', (event) =>\n this.backgroundClick(event)\n )\n\n // populates calendar with initial dates, avoids Wave errors about null buttons\n this.updateCalendar()\n}\n\nDatePicker.prototype.createDialog = function () {\n const titleId = `datepicker-title-${this.$input.id}`\n const $dialog = document.createElement('div')\n\n $dialog.id = this.id\n $dialog.setAttribute('class', 'moj-datepicker__dialog')\n $dialog.setAttribute('role', 'dialog')\n $dialog.setAttribute('aria-modal', 'true')\n $dialog.setAttribute('aria-labelledby', titleId)\n $dialog.innerHTML = this.dialogTemplate(titleId)\n $dialog.hidden = true\n\n return $dialog\n}\n\nDatePicker.prototype.createCalendar = function () {\n const $tbody = this.$dialog.querySelector('tbody')\n let dayCount = 0\n for (let i = 0; i < 6; i++) {\n // create row\n const $row = $tbody.insertRow(i)\n\n for (let j = 0; j < 7; j++) {\n // create cell (day)\n const $cell = document.createElement('td')\n const $dateButton = document.createElement('button')\n\n $cell.appendChild($dateButton)\n $row.appendChild($cell)\n\n const calendarDay = new DSCalendarDay($dateButton, dayCount, i, j, this)\n calendarDay.init()\n this.calendarDays.push(calendarDay)\n dayCount++\n }\n }\n}\n\nDatePicker.prototype.toggleTemplate = function () {\n return `<button class=\"moj-datepicker__toggle moj-js-datepicker-toggle\" type=\"button\" aria-haspopup=\"dialog\" aria-controls=\"${this.id}\" aria-expanded=\"false\">\n <span class=\"govuk-visually-hidden\">Choose date</span>\n <svg width=\"32\" height=\"24\" focusable=\"false\" class=\"moj-datepicker-icon\" aria-hidden=\"true\" role=\"img\" viewBox=\"0 0 22 22\">\n <path\n fill=\"currentColor\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M16.1333 2.93333H5.86668V4.4C5.86668 5.21002 5.21003 5.86667 4.40002 5.86667C3.59 5.86667 2.93335 5.21002 2.93335 4.4V2.93333H2C0.895431 2.93333 0 3.82877 0 4.93334V19.2667C0 20.3712 0.89543 21.2667 2 21.2667H20C21.1046 21.2667 22 20.3712 22 19.2667V4.93333C22 3.82876 21.1046 2.93333 20 2.93333H19.0667V4.4C19.0667 5.21002 18.41 5.86667 17.6 5.86667C16.79 5.86667 16.1333 5.21002 16.1333 4.4V2.93333ZM20.5333 8.06667H1.46665V18.8C1.46665 19.3523 1.91436 19.8 2.46665 19.8H19.5333C20.0856 19.8 20.5333 19.3523 20.5333 18.8V8.06667Z\"\n ></path>\n <rect x=\"3.66669\" width=\"1.46667\" height=\"5.13333\" rx=\"0.733333\" fill=\"currentColor\"></rect>\n <rect x=\"16.8667\" width=\"1.46667\" height=\"5.13333\" rx=\"0.733333\" fill=\"currentColor\"></rect>\n </svg>\n </button>`\n}\n\n/**\n * HTML template for calendar dialog\n *\n * @param {string} [titleId] - Id attribute for dialog title\n * @returns {string}\n */\nDatePicker.prototype.dialogTemplate = function (titleId) {\n return `<div class=\"moj-datepicker__dialog-header\">\n <div class=\"moj-datepicker__dialog-navbuttons\">\n <button class=\"moj-datepicker__button moj-js-datepicker-prev-year\">\n <span class=\"govuk-visually-hidden\">Previous year</span>\n <svg width=\"44\" height=\"40\" viewBox=\"0 0 44 40\" fill=\"none\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\" role=\"img\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M23.1643 20L28.9572 14.2071L27.5429 12.7929L20.3358 20L27.5429 27.2071L28.9572 25.7929L23.1643 20Z\" fill=\"currentColor\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M17.1643 20L22.9572 14.2071L21.5429 12.7929L14.3358 20L21.5429 27.2071L22.9572 25.7929L17.1643 20Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n\n <button class=\"moj-datepicker__button moj-js-datepicker-prev-month\">\n <span class=\"govuk-visually-hidden\">Previous month</span>\n <svg width=\"44\" height=\"40\" viewBox=\"0 0 44 40\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\" role=\"img\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M20.5729 20L25.7865 14.2071L24.5137 12.7929L18.0273 20L24.5137 27.2071L25.7865 25.7929L20.5729 20Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n </div>\n\n <h2 id=\"${titleId}\" class=\"moj-datepicker__dialog-title moj-js-datepicker-month-year\" aria-live=\"polite\">June 2020</h2>\n\n <div class=\"moj-datepicker__dialog-navbuttons\">\n <button class=\"moj-datepicker__button moj-js-datepicker-next-month\">\n <span class=\"govuk-visually-hidden\">Next month</span>\n <svg width=\"44\" height=\"40\" viewBox=\"0 0 44 40\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\" role=\"img\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M23.4271 20L18.2135 14.2071L19.4863 12.7929L25.9727 20L19.4863 27.2071L18.2135 25.7929L23.4271 20Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n\n <button class=\"moj-datepicker__button moj-js-datepicker-next-year\">\n <span class=\"govuk-visually-hidden\">Next year</span>\n <svg width=\"44\" height=\"40\" viewBox=\"0 0 44 40\" fill=\"none\" fill=\"none\" focusable=\"false\" aria-hidden=\"true\" role=\"img\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M20.8357 20L15.0428 14.2071L16.4571 12.7929L23.6642 20L16.4571 27.2071L15.0428 25.7929L20.8357 20Z\" fill=\"currentColor\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M26.8357 20L21.0428 14.2071L22.4571 12.7929L29.6642 20L22.4571 27.2071L21.0428 25.7929L26.8357 20Z\" fill=\"currentColor\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <table class=\"moj-datepicker__calendar moj-js-datepicker-grid\" role=\"grid\" aria-labelledby=\"${titleId}\">\n <thead>\n <tr></tr>\n </thead>\n\n <tbody></tbody>\n </table>\n\n <div class=\"govuk-button-group\">\n <button type=\"button\" class=\"govuk-button moj-js-datepicker-ok\">Select</button>\n <button type=\"button\" class=\"govuk-button govuk-button--secondary moj-js-datepicker-cancel\">Close</button>\n </div>`\n}\n\nDatePicker.prototype.createCalendarHeaders = function () {\n this.dayLabels.forEach((day) => {\n const html = `<th scope=\"col\"><span aria-hidden=\"true\">${day.substring(0, 3)}</span><span class=\"govuk-visually-hidden\">${day}</span></th>`\n const $headerRow = this.$dialog.querySelector('thead > tr')\n $headerRow.insertAdjacentHTML('beforeend', html)\n })\n}\n\n/**\n * Pads given number with leading zeros\n *\n * @param {number} value - The value to be padded\n * @param {number} length - The length in characters of the output\n * @returns {string}\n */\nDatePicker.prototype.leadingZeros = function (value, length = 2) {\n let ret = value.toString()\n\n while (ret.length < length) {\n ret = `0${ret}`\n }\n\n return ret\n}\n\nDatePicker.prototype.setOptions = function () {\n this.setMinAndMaxDatesOnCalendar()\n this.setExcludedDates()\n this.setExcludedDays()\n this.setLeadingZeros()\n this.setWeekStartDay()\n}\n\nDatePicker.prototype.setMinAndMaxDatesOnCalendar = function () {\n if (this.config.minDate) {\n this.minDate = this.formattedDateFromString(this.config.minDate, null)\n if (this.minDate && this.currentDate < this.minDate) {\n this.currentDate = this.minDate\n }\n }\n\n if (this.config.maxDate) {\n this.maxDate = this.formattedDateFromString(this.config.maxDate, null)\n if (this.maxDate && this.currentDate > this.maxDate) {\n this.currentDate = this.maxDate\n }\n }\n}\n\nDatePicker.prototype.setExcludedDates = function () {\n if (this.config.excludedDates) {\n this.excludedDates = this.config.excludedDates\n .replace(/\\s+/, ' ')\n .split(' ')\n .map((item) => {\n return item.includes('-')\n ? this.parseDateRangeString(item)\n : this.formattedDateFromString(item)\n })\n .flat()\n .filter((item) => item)\n }\n}\n\n/*\n * Parses a daterange string into an array of dates\n * @param {String} datestring - A daterange string in the format \"dd/mm/yyyy-dd/mm/yyyy\"\n * @returns {Date[]}\n */\nDatePicker.prototype.parseDateRangeString = function (datestring) {\n const dates = []\n const [startDate, endDate] = datestring\n .split('-')\n .map((d) => this.formattedDateFromString(d, null))\n\n if (startDate && endDate) {\n const date = new Date(startDate.getTime())\n /* eslint-disable no-unmodified-loop-condition */\n while (date <= endDate) {\n dates.push(new Date(date))\n date.setDate(date.getDate() + 1)\n }\n /* eslint-enable no-unmodified-loop-condition */\n }\n return dates\n}\n\nDatePicker.prototype.setExcludedDays = function () {\n if (this.config.excludedDays) {\n // lowercase and arrange dayLabels to put indexOf sunday == 0 for comparison\n // with getDay() function\n const weekDays = this.dayLabels.map((item) => item.toLowerCase())\n if (this.config.weekStartDay === 'monday') {\n weekDays.unshift(weekDays.pop())\n }\n\n this.excludedDays = this.config.excludedDays\n .replace(/\\s+/, ' ')\n .toLowerCase()\n .split(' ')\n .map((item) => weekDays.indexOf(item))\n .filter((item) => item !== -1)\n }\n}\n\nDatePicker.prototype.setLeadingZeros = function () {\n if (typeof this.config.leadingZeros !== 'boolean') {\n if (this.config.leadingZeros.toLowerCase() === 'true') {\n this.config.leadingZeros = true\n return\n }\n if (this.config.leadingZeros.toLowerCase() === 'false') {\n this.config.leadingZeros = false\n }\n }\n}\n\nDatePicker.prototype.setWeekStartDay = function () {\n const weekStartDayParam = this.config.weekStartDay\n if (weekStartDayParam && weekStartDayParam.toLowerCase() === 'sunday') {\n this.config.weekStartDay = 'sunday'\n // Rotate dayLabels array to put Sunday as the first item\n this.dayLabels.unshift(this.dayLabels.pop())\n } else {\n this.config.weekStartDay = 'monday'\n }\n}\n\n/**\n * Determine if a date is selecteable\n *\n * @param {Date} date - the date to check\n * @returns {boolean}\n */\nDatePicker.prototype.isExcludedDate = function (date) {\n // This comparison does not work correctly - it will exclude the mindate itself\n // see: https://github.com/ministryofjustice/moj-frontend/issues/923\n if (this.minDate && this.minDate > date) {\n return true\n }\n\n // This comparison works as expected - the maxdate will not be excluded\n if (this.maxDate && this.maxDate < date) {\n return true\n }\n\n for (const excludedDate of this.excludedDates) {\n if (date.toDateString() === excludedDate.toDateString()) {\n return true\n }\n }\n\n if (this.excludedDays.includes(date.getDay())) {\n return true\n }\n\n return false\n}\n\n/**\n * Get a Date object from a string\n *\n * @param {string} dateString - string in the format d/m/yyyy dd/mm/yyyy\n * @param {Date} fallback - date object to return if formatting fails\n * @returns {Date}\n */\nDatePicker.prototype.formattedDateFromString = function (\n dateString,\n fallback = new Date()\n) {\n let formattedDate = null\n // Accepts d/m/yyyy and dd/mm/yyyy\n const dateFormatPattern = /(\\d{1,2})([-/,. ])(\\d{1,2})\\2(\\d{4})/\n\n if (!dateFormatPattern.test(dateString)) return fallback\n\n const match = dateString.match(dateFormatPattern)\n const day = match[1]\n const month = match[3]\n const year = match[4]\n\n formattedDate = new Date(`${year}-${month}-${day}`)\n if (formattedDate instanceof Date && !isNaN(formattedDate)) {\n return formattedDate\n }\n return fallback\n}\n\n/**\n * Get a formatted date string from a Date object\n *\n * @param {Date} date - date to format to a string\n * @returns {string}\n */\nDatePicker.prototype.formattedDateFromDate = function (date) {\n if (this.config.leadingZeros) {\n return `${this.leadingZeros(date.getDate())}/${this.leadingZeros(date.getMonth() + 1)}/${date.getFullYear()}`\n }\n\n return `${date.getDate()}/${date.getMonth() + 1}/${date.getFullYear()}`\n}\n\n/**\n * Get a human readable date in the format Monday 2 March 2024\n *\n * @param {Date} date - date to format\n * @returns {string}\n */\nDatePicker.prototype.formattedDateHuman = function (date) {\n return `${this.dayLabels[(date.getDay() + 6) % 7]} ${date.getDate()} ${this.monthLabels[date.getMonth()]} ${date.getFullYear()}`\n}\n\nDatePicker.prototype.backgroundClick = function (event) {\n if (\n this.isOpen() &&\n !this.$dialog.contains(event.target) &&\n !this.$input.contains(event.target) &&\n !this.$calendarButton.contains(event.target)\n ) {\n event.preventDefault()\n this.closeDialog()\n }\n}\n\nDatePicker.prototype.firstButtonKeydown = function (event) {\n if (event.key === 'Tab' && event.shiftKey) {\n this.$lastButtonInDialog.focus()\n event.preventDefault()\n }\n}\n\nDatePicker.prototype.lastButtonKeydown = function (event) {\n if (event.key === 'Tab' && !event.shiftKey) {\n this.$firstButtonInDialog.focus()\n event.preventDefault()\n }\n}\n\n// render calendar\nDatePicker.prototype.updateCalendar = function () {\n this.$dialogTitle.innerHTML = `${this.monthLabels[this.currentDate.getMonth()]} ${this.currentDate.getFullYear()}`\n\n const day = this.currentDate\n const firstOfMonth = new Date(day.getFullYear(), day.getMonth(), 1)\n let dayOfWeek\n\n if (this.config.weekStartDay === 'monday') {\n dayOfWeek = firstOfMonth.getDay() === 0 ? 6 : firstOfMonth.getDay() - 1 // Change logic to make Monday first day of week, i.e. 0\n } else {\n dayOfWeek = firstOfMonth.getDay()\n }\n\n firstOfMonth.setDate(firstOfMonth.getDate() - dayOfWeek)\n\n const thisDay = new Date(firstOfMonth)\n\n // loop through our days\n for (let i = 0; i < this.calendarDays.length; i++) {\n const hidden = thisDay.getMonth() !== day.getMonth()\n const disabled = this.isExcludedDate(thisDay)\n\n this.calendarDays[i].update(thisDay, hidden, disabled)\n\n thisDay.setDate(thisDay.getDate() + 1)\n }\n}\n\nDatePicker.prototype.setCurrentDate = function (focus = true) {\n const { currentDate } = this\n this.calendarDays.forEach((calendarDay) => {\n calendarDay.button.classList.add('moj-datepicker__button')\n calendarDay.button.classList.add('moj-datepicker__calendar-day')\n calendarDay.button.setAttribute('tabindex', -1)\n calendarDay.button.classList.remove(this.selectedDayButtonClass)\n const calendarDayDate = calendarDay.date\n calendarDayDate.setHours(0, 0, 0, 0)\n\n const today = new Date()\n today.setHours(0, 0, 0, 0)\n\n if (\n calendarDayDate.getTime() ===\n currentDate.getTime() /* && !calendarDay.button.disabled */\n ) {\n if (focus) {\n calendarDay.button.setAttribute('tabindex', 0)\n calendarDay.button.focus()\n calendarDay.button.classList.add(this.selectedDayButtonClass)\n }\n }\n\n if (\n this.inputDate &&\n calendarDayDate.getTime() === this.inputDate.getTime()\n ) {\n calendarDay.button.classList.add(this.currentDayButtonClass)\n calendarDay.button.setAttribute('aria-current', 'date')\n } else {\n calendarDay.button.classList.remove(this.currentDayButtonClass)\n calendarDay.button.removeAttribute('aria-current')\n }\n\n if (calendarDayDate.getTime() === today.getTime()) {\n calendarDay.button.classList.add(this.todayButtonClass)\n } else {\n calendarDay.button.classList.remove(this.todayButtonClass)\n }\n })\n\n // if no date is tab-able, make the first non-disabled date tab-able\n if (!focus) {\n const enabledDays = this.calendarDays.filter((calendarDay) => {\n return (\n window.getComputedStyle(calendarDay.button).display === 'block' &&\n !calendarDay.button.disabled\n )\n })\n\n enabledDays[0].button.setAttribute('tabindex', 0)\n\n this.currentDate = enabledDays[0].date\n }\n}\n\nDatePicker.prototype.selectDate = function (date) {\n if (this.isExcludedDate(date)) {\n return\n }\n\n this.$calendarButton.querySelector('span').innerText =\n `Choose date. Selected date is ${this.formattedDateHuman(date)}`\n this.$input.value = this.formattedDateFromDate(date)\n\n const changeEvent = new Event('change', { bubbles: true, cancelable: true })\n this.$input.dispatchEvent(changeEvent)\n\n this.closeDialog()\n}\n\nDatePicker.prototype.isOpen = function () {\n return this.$dialog.classList.contains('moj-datepicker__dialog--open')\n}\n\nDatePicker.prototype.toggleDialog = function (event) {\n event.preventDefault()\n if (this.isOpen()) {\n this.closeDialog()\n } else {\n this.setMinAndMaxDatesOnCalendar()\n this.openDialog()\n }\n}\n\nDatePicker.prototype.openDialog = function () {\n this.$dialog.hidden = false\n this.$dialog.classList.add('moj-datepicker__dialog--open')\n this.$calendarButton.setAttribute('aria-expanded', 'true')\n\n // position the dialog\n // if input is wider than dialog pin it to the right\n if (this.$input.offsetWidth > this.$dialog.offsetWidth) {\n this.$dialog.style.right = `0px`\n }\n this.$dialog.style.top = `${this.$input.offsetHeight + 3}px`\n\n // get the date from the input element\n this.inputDate = this.formattedDateFromString(this.$input.value)\n this.currentDate = this.inputDate\n this.currentDate.setHours(0, 0, 0, 0)\n\n this.updateCalendar()\n this.setCurrentDate()\n}\n\nDatePicker.prototype.closeDialog = function () {\n this.$dialog.hidden = true\n this.$dialog.classList.remove('moj-datepicker__dialog--open')\n this.$calendarButton.setAttribute('aria-expanded', 'false')\n this.$calendarButton.focus()\n}\n\nDatePicker.prototype.goToDate = function (date, focus) {\n const current = this.currentDate\n this.currentDate = date\n\n if (\n current.getMonth() !== this.currentDate.getMonth() ||\n current.getFullYear() !== this.currentDate.getFullYear()\n ) {\n this.updateCalendar()\n }\n\n this.setCurrentDate(focus)\n}\n\n// day navigation\nDatePicker.prototype.focusNextDay = function () {\n const date = new Date(this.currentDate)\n date.setDate(date.getDate() + 1)\n this.goToDate(date)\n}\n\nDatePicker.prototype.focusPreviousDay = function () {\n const date = new Date(this.currentDate)\n date.setDate(date.getDate() - 1)\n this.goToDate(date)\n}\n\n// week navigation\nDatePicker.prototype.focusNextWeek = function () {\n const date = new Date(this.currentDate)\n date.setDate(date.getDate() + 7)\n this.goToDate(date)\n}\n\nDatePicker.prototype.focusPreviousWeek = function () {\n const date = new Date(this.currentDate)\n date.setDate(date.getDate() - 7)\n this.goToDate(date)\n}\n\nDatePicker.prototype.focusFirstDayOfWeek = function () {\n const date = new Date(this.currentDate)\n const firstDayOfWeekIndex = this.config.weekStartDay === 'sunday' ? 0 : 1\n const dayOfWeek = date.getDay()\n const diff =\n dayOfWeek >= firstDayOfWeekIndex\n ? dayOfWeek - firstDayOfWeekIndex\n : 6 - dayOfWeek\n\n date.setDate(date.getDate() - diff)\n date.setHours(0, 0, 0, 0)\n\n this.goToDate(date)\n}\n\nDatePicker.prototype.focusLastDayOfWeek = function () {\n const date = new Date(this.currentDate)\n const lastDayOfWeekIndex = this.config.weekStartDay === 'sunday' ? 6 : 0\n const dayOfWeek = date.getDay()\n const diff =\n dayOfWeek <= lastDayOfWeekIndex\n ? lastDayOfWeekIndex - dayOfWeek\n : 7 - dayOfWeek\n\n date.setDate(date.getDate() + diff)\n date.setHours(0, 0, 0, 0)\n\n this.goToDate(date)\n}\n\n// month navigation\nDatePicker.prototype.focusNextMonth = function (event, focus = true) {\n event.preventDefault()\n const date = new Date(this.currentDate)\n date.setMonth(date.getMonth() + 1, 1)\n this.goToDate(date, focus)\n}\n\nDatePicker.prototype.focusPreviousMonth = function (event, focus = true) {\n event.preventDefault()\n const date = new Date(this.currentDate)\n date.setMonth(date.getMonth() - 1, 1)\n this.goToDate(date, focus)\n}\n\n// year navigation\nDatePicker.prototype.focusNextYear = function (event, focus = true) {\n event.preventDefault()\n const date = new Date(this.currentDate)\n date.setFullYear(date.getFullYear() + 1, date.getMonth(), 1)\n this.goToDate(date, focus)\n}\n\nDatePicker.prototype.focusPreviousYear = function (event, focus = true) {\n event.preventDefault()\n const date = new Date(this.currentDate)\n date.setFullYear(date.getFullYear() - 1, date.getMonth(), 1)\n this.goToDate(date, focus)\n}\n\n/**\n * Parse dataset\n *\n * @param {Schema} schema - Component class\n * @param {DOMStringMap} dataset - HTML element dataset\n * @returns {object} Normalised dataset\n */\nDatePicker.prototype.parseDataset = function (schema, dataset) {\n const parsed = {}\n\n for (const [field, ,] of Object.entries(schema.properties)) {\n if (field in dataset) {\n parsed[field] = dataset[field]\n }\n }\n\n return parsed\n}\n\n/**\n * Config merging function\n *\n * Takes any number of objects and combines them together, with\n * greatest priority on the LAST item passed in.\n *\n * @param {...{ [key: string]: unknown }} configObjects - Config objects to merge\n * @returns {{ [key: string]: unknown }} A merged config object\n */\nDatePicker.prototype.mergeConfigs = function (...configObjects) {\n const formattedConfigObject = {}\n\n // Loop through each of the passed objects\n for (const configObject of configObjects) {\n for (const key of Object.keys(configObject)) {\n const option = formattedConfigObject[key]\n const override = configObject[key]\n\n // Push their keys one-by-one into formattedConfigObject. Any duplicate\n // keys with object values will be merged, otherwise the new value will\n // override the existing value.\n if (typeof option === 'object' && typeof override === 'object') {\n // @ts-expect-error Index signature for type 'string' is missing\n formattedConfigObject[key] = this.mergeConfigs(option, override)\n } else {\n formattedConfigObject[key] = override\n }\n }\n }\n\n return formattedConfigObject\n}\n\n/**\n *\n * @param {HTMLElement} button\n * @param {number} index\n * @param {number} row\n * @param {number} column\n * @param {DatePicker} picker\n * @class\n */\nfunction DSCalendarDay(button, index, row, column, picker) {\n this.index = index\n this.row = row\n this.column = column\n this.button = button\n this.picker = picker\n\n this.date = new Date()\n}\n\nDSCalendarDay.prototype.init = function () {\n this.button.addEventListener('keydown', this.keyPress.bind(this))\n this.button.addEventListener('click', this.click.bind(this))\n}\n\n/**\n * @param {Date} day - the Date for the calendar day\n * @param {boolean} hidden - visibility of the day\n * @param {boolean} disabled - is the day selectable or excluded\n */\nDSCalendarDay.prototype.update = function (day, hidden, disabled) {\n const label = day.getDate()\n let accessibleLabel = this.picker.formattedDateHuman(day)\n\n if (disabled) {\n this.button.setAttribute('aria-disabled', true)\n accessibleLabel = `Excluded date, ${accessibleLabel}`\n } else {\n this.button.removeAttribute('aria-disabled')\n }\n\n if (hidden) {\n this.button.style.display = 'none'\n } else {\n this.button.style.display = 'block'\n }\n this.button.setAttribute(\n 'data-testid',\n this.picker.formattedDateFromDate(day)\n )\n\n this.button.innerHTML = `<span class=\"govuk-visually-hidden\">${accessibleLabel}</span><span aria-hidden=\"true\">${label}</span>`\n this.date = new Date(day)\n}\n\nDSCalendarDay.prototype.click = function (event) {\n this.picker.goToDate(this.date)\n this.picker.selectDate(this.date)\n\n event.stopPropagation()\n event.preventDefault()\n}\n\nDSCalendarDay.prototype.keyPress = function (event) {\n let calendarNavKey = true\n\n switch (event.key) {\n case 'ArrowLeft':\n this.picker.focusPreviousDay()\n break\n case 'ArrowRight':\n this.picker.focusNextDay()\n break\n case 'ArrowUp':\n this.picker.focusPreviousWeek()\n break\n case 'ArrowDown':\n this.picker.focusNextWeek()\n break\n case 'Home':\n this.picker.focusFirstDayOfWeek()\n break\n case 'End':\n this.picker.focusLastDayOfWeek()\n break\n case 'PageUp':\n // eslint-disable-next-line no-unused-expressions\n event.shiftKey\n ? this.picker.focusPreviousYear(event)\n : this.picker.focusPreviousMonth(event)\n break\n case 'PageDown':\n // eslint-disable-next-line no-unused-expressions\n event.shiftKey\n ? this.picker.focusNextYear(event)\n : this.picker.focusNextMonth(event)\n break\n default:\n calendarNavKey = false\n break\n }\n\n if (calendarNavKey) {\n event.preventDefault()\n event.stopPropagation()\n }\n}\n\n/**\n * Schema for component config\n *\n * @typedef {object} Schema\n * @property {{ [field: string]: SchemaProperty | undefined }} properties - Schema properties\n */\n\n/**\n * Schema property for component config\n *\n * @typedef {object} SchemaProperty\n * @property {'string' | 'boolean' | 'number' | 'object'} type - Property type\n */\n"],"names":[],"mappings":"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"}