@ministryofjustice/frontend 4.0.1 → 5.1.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 (256) 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 +3010 -0
  5. package/moj/all.bundle.js.map +1 -0
  6. package/moj/all.bundle.mjs +3293 -0
  7. package/moj/all.bundle.mjs.map +1 -0
  8. package/moj/all.mjs +17 -110
  9. package/moj/all.mjs.map +1 -1
  10. package/moj/all.scss +3 -0
  11. package/moj/all.scss.map +1 -0
  12. package/moj/common/index.mjs +57 -0
  13. package/moj/common/index.mjs.map +1 -0
  14. package/moj/common/moj-frontend-version.mjs +14 -0
  15. package/moj/common/moj-frontend-version.mjs.map +1 -0
  16. package/moj/components/_all.scss +2 -0
  17. package/moj/components/_all.scss.map +1 -0
  18. package/moj/components/action-bar/_action-bar.scss +2 -0
  19. package/moj/components/action-bar/_action-bar.scss.map +1 -0
  20. package/moj/components/add-another/_add-another.scss +2 -0
  21. package/moj/components/add-another/_add-another.scss.map +1 -0
  22. package/moj/components/add-another/add-another.bundle.js +157 -0
  23. package/moj/components/add-another/add-another.bundle.js.map +1 -0
  24. package/moj/components/add-another/add-another.bundle.mjs +271 -0
  25. package/moj/components/add-another/add-another.bundle.mjs.map +1 -0
  26. package/moj/components/add-another/add-another.mjs +135 -91
  27. package/moj/components/add-another/add-another.mjs.map +1 -1
  28. package/moj/components/alert/_alert.scss +4 -0
  29. package/moj/components/alert/_alert.scss.map +1 -0
  30. package/moj/components/alert/alert.bundle.js +254 -0
  31. package/moj/components/alert/alert.bundle.js.map +1 -0
  32. package/moj/components/alert/alert.bundle.mjs +490 -0
  33. package/moj/components/alert/alert.bundle.mjs.map +1 -0
  34. package/moj/components/alert/alert.mjs +97 -218
  35. package/moj/components/alert/alert.mjs.map +1 -1
  36. package/moj/components/alert/{alert.spec.helper.js → alert.spec.helper.bundle.js} +1 -1
  37. package/moj/components/alert/alert.spec.helper.bundle.js.map +1 -0
  38. package/moj/components/alert/alert.spec.helper.bundle.mjs +67 -0
  39. package/moj/components/alert/alert.spec.helper.bundle.mjs.map +1 -0
  40. package/moj/components/alert/alert.spec.helper.mjs.map +1 -1
  41. package/moj/components/badge/_badge.scss +2 -0
  42. package/moj/components/badge/_badge.scss.map +1 -0
  43. package/moj/components/banner/_banner.scss +2 -0
  44. package/moj/components/banner/_banner.scss.map +1 -0
  45. package/moj/components/button-menu/README.md +12 -6
  46. package/moj/components/button-menu/_button-menu.scss +4 -1
  47. package/moj/components/button-menu/_button-menu.scss.map +1 -0
  48. package/moj/components/button-menu/button-menu.bundle.js +270 -0
  49. package/moj/components/button-menu/button-menu.bundle.js.map +1 -0
  50. package/moj/components/button-menu/button-menu.bundle.mjs +506 -0
  51. package/moj/components/button-menu/button-menu.bundle.mjs.map +1 -0
  52. package/moj/components/button-menu/button-menu.mjs +214 -280
  53. package/moj/components/button-menu/button-menu.mjs.map +1 -1
  54. package/moj/components/cookie-banner/_cookie-banner.scss +2 -0
  55. package/moj/components/cookie-banner/_cookie-banner.scss.map +1 -0
  56. package/moj/components/currency-input/_currency-input.scss +2 -0
  57. package/moj/components/currency-input/_currency-input.scss.map +1 -0
  58. package/moj/components/date-picker/_date-picker.scss +2 -0
  59. package/moj/components/date-picker/_date-picker.scss.map +1 -0
  60. package/moj/components/date-picker/date-picker.bundle.js +804 -0
  61. package/moj/components/date-picker/date-picker.bundle.js.map +1 -0
  62. package/moj/components/date-picker/date-picker.bundle.mjs +1040 -0
  63. package/moj/components/date-picker/date-picker.bundle.mjs.map +1 -0
  64. package/moj/components/date-picker/date-picker.mjs +663 -827
  65. package/moj/components/date-picker/date-picker.mjs.map +1 -1
  66. package/moj/components/filter/_filter.scss +2 -0
  67. package/moj/components/filter/_filter.scss.map +1 -0
  68. package/moj/components/filter/template.njk +1 -1
  69. package/moj/components/filter-toggle-button/filter-toggle-button.bundle.js +185 -0
  70. package/moj/components/filter-toggle-button/filter-toggle-button.bundle.js.map +1 -0
  71. package/moj/components/filter-toggle-button/filter-toggle-button.bundle.mjs +421 -0
  72. package/moj/components/filter-toggle-button/filter-toggle-button.bundle.mjs.map +1 -0
  73. package/moj/components/filter-toggle-button/filter-toggle-button.mjs +166 -81
  74. package/moj/components/filter-toggle-button/filter-toggle-button.mjs.map +1 -1
  75. package/moj/components/form-validator/form-validator.bundle.js +288 -0
  76. package/moj/components/form-validator/form-validator.bundle.js.map +1 -0
  77. package/moj/components/form-validator/form-validator.bundle.mjs +524 -0
  78. package/moj/components/form-validator/form-validator.bundle.mjs.map +1 -0
  79. package/moj/components/form-validator/form-validator.mjs +226 -149
  80. package/moj/components/form-validator/form-validator.mjs.map +1 -1
  81. package/moj/components/header/_header.scss +2 -0
  82. package/moj/components/header/_header.scss.map +1 -0
  83. package/moj/components/identity-bar/_identity-bar.scss +2 -0
  84. package/moj/components/identity-bar/_identity-bar.scss.map +1 -0
  85. package/moj/components/interruption-card/_interruption-card.scss +2 -0
  86. package/moj/components/interruption-card/_interruption-card.scss.map +1 -0
  87. package/moj/components/messages/_messages.scss +2 -0
  88. package/moj/components/messages/_messages.scss.map +1 -0
  89. package/moj/components/multi-file-upload/_multi-file-upload.scss +2 -0
  90. package/moj/components/multi-file-upload/_multi-file-upload.scss.map +1 -0
  91. package/moj/components/multi-file-upload/multi-file-upload.bundle.js +397 -0
  92. package/moj/components/multi-file-upload/multi-file-upload.bundle.js.map +1 -0
  93. package/moj/components/multi-file-upload/multi-file-upload.bundle.mjs +633 -0
  94. package/moj/components/multi-file-upload/multi-file-upload.bundle.mjs.map +1 -0
  95. package/moj/components/multi-file-upload/multi-file-upload.mjs +384 -213
  96. package/moj/components/multi-file-upload/multi-file-upload.mjs.map +1 -1
  97. package/moj/components/multi-file-upload/template.njk +1 -1
  98. package/moj/components/multi-select/_multi-select.scss +2 -0
  99. package/moj/components/multi-select/_multi-select.scss.map +1 -0
  100. package/moj/components/multi-select/multi-select.bundle.js +143 -0
  101. package/moj/components/multi-select/multi-select.bundle.js.map +1 -0
  102. package/moj/components/multi-select/multi-select.bundle.mjs +379 -0
  103. package/moj/components/multi-select/multi-select.bundle.mjs.map +1 -0
  104. package/moj/components/multi-select/multi-select.mjs +123 -64
  105. package/moj/components/multi-select/multi-select.mjs.map +1 -1
  106. package/moj/components/notification-badge/_notification-badge.scss +2 -0
  107. package/moj/components/notification-badge/_notification-badge.scss.map +1 -0
  108. package/moj/components/organisation-switcher/_organisation-switcher.scss +2 -0
  109. package/moj/components/organisation-switcher/_organisation-switcher.scss.map +1 -0
  110. package/moj/components/page-header-actions/_page-header-actions.scss +2 -0
  111. package/moj/components/page-header-actions/_page-header-actions.scss.map +1 -0
  112. package/moj/components/pagination/_pagination.scss +2 -2
  113. package/moj/components/pagination/_pagination.scss.map +1 -0
  114. package/moj/components/password-reveal/_password-reveal.scss +5 -1
  115. package/moj/components/password-reveal/_password-reveal.scss.map +1 -0
  116. package/moj/components/password-reveal/password-reveal.bundle.js +52 -0
  117. package/moj/components/password-reveal/password-reveal.bundle.js.map +1 -0
  118. package/moj/components/password-reveal/password-reveal.bundle.mjs +166 -0
  119. package/moj/components/password-reveal/password-reveal.bundle.mjs.map +1 -0
  120. package/moj/components/password-reveal/password-reveal.mjs +39 -29
  121. package/moj/components/password-reveal/password-reveal.mjs.map +1 -1
  122. package/moj/components/primary-navigation/_primary-navigation.scss +2 -0
  123. package/moj/components/primary-navigation/_primary-navigation.scss.map +1 -0
  124. package/moj/components/progress-bar/_progress-bar.scss +2 -0
  125. package/moj/components/progress-bar/_progress-bar.scss.map +1 -0
  126. package/moj/components/rich-text-editor/README.md +16 -9
  127. package/moj/components/rich-text-editor/_rich-text-editor.scss +2 -0
  128. package/moj/components/rich-text-editor/_rich-text-editor.scss.map +1 -0
  129. package/moj/components/rich-text-editor/rich-text-editor.bundle.js +210 -0
  130. package/moj/components/rich-text-editor/rich-text-editor.bundle.js.map +1 -0
  131. package/moj/components/rich-text-editor/rich-text-editor.bundle.mjs +446 -0
  132. package/moj/components/rich-text-editor/rich-text-editor.bundle.mjs.map +1 -0
  133. package/moj/components/rich-text-editor/rich-text-editor.mjs +186 -140
  134. package/moj/components/rich-text-editor/rich-text-editor.mjs.map +1 -1
  135. package/moj/components/search/_search.scss +2 -0
  136. package/moj/components/search/_search.scss.map +1 -0
  137. package/moj/components/search-toggle/{search-toggle.scss → _search-toggle.scss} +2 -0
  138. package/moj/components/search-toggle/_search-toggle.scss.map +1 -0
  139. package/moj/components/search-toggle/search-toggle.bundle.js +122 -0
  140. package/moj/components/search-toggle/search-toggle.bundle.js.map +1 -0
  141. package/moj/components/search-toggle/search-toggle.bundle.mjs +358 -0
  142. package/moj/components/search-toggle/search-toggle.bundle.mjs.map +1 -0
  143. package/moj/components/search-toggle/search-toggle.mjs +104 -43
  144. package/moj/components/search-toggle/search-toggle.mjs.map +1 -1
  145. package/moj/components/side-navigation/_side-navigation.scss +2 -0
  146. package/moj/components/side-navigation/_side-navigation.scss.map +1 -0
  147. package/moj/components/sortable-table/_sortable-table.scss +2 -2
  148. package/moj/components/sortable-table/_sortable-table.scss.map +1 -0
  149. package/moj/components/sortable-table/sortable-table.bundle.js +202 -0
  150. package/moj/components/sortable-table/sortable-table.bundle.js.map +1 -0
  151. package/moj/components/sortable-table/sortable-table.bundle.mjs +438 -0
  152. package/moj/components/sortable-table/sortable-table.bundle.mjs.map +1 -0
  153. package/moj/components/sortable-table/sortable-table.mjs +179 -122
  154. package/moj/components/sortable-table/sortable-table.mjs.map +1 -1
  155. package/moj/components/sub-navigation/_sub-navigation.scss +2 -0
  156. package/moj/components/sub-navigation/_sub-navigation.scss.map +1 -0
  157. package/moj/components/tag/_tag.scss +2 -0
  158. package/moj/components/tag/_tag.scss.map +1 -0
  159. package/moj/components/task-list/_task-list.scss +2 -0
  160. package/moj/components/task-list/_task-list.scss.map +1 -0
  161. package/moj/components/ticket-panel/_ticket-panel.scss +2 -0
  162. package/moj/components/ticket-panel/_ticket-panel.scss.map +1 -0
  163. package/moj/components/timeline/_timeline.scss +2 -0
  164. package/moj/components/timeline/_timeline.scss.map +1 -0
  165. package/moj/core/_all.scss +3 -0
  166. package/moj/core/_all.scss.map +1 -0
  167. package/moj/core/_moj-frontend-properties.scss +7 -0
  168. package/moj/core/_moj-frontend-properties.scss.map +1 -0
  169. package/moj/filters/all.js +44 -22
  170. package/moj/filters/prototype-kit-13-filters.js +4 -3
  171. package/moj/helpers/_all.scss +2 -0
  172. package/moj/helpers/_all.scss.map +1 -0
  173. package/moj/helpers/_hidden.scss +2 -0
  174. package/moj/helpers/_hidden.scss.map +1 -0
  175. package/moj/helpers/_links.scss +2 -0
  176. package/moj/helpers/_links.scss.map +1 -0
  177. package/moj/helpers.bundle.js +140 -0
  178. package/moj/helpers.bundle.js.map +1 -0
  179. package/moj/helpers.bundle.mjs +128 -0
  180. package/moj/helpers.bundle.mjs.map +1 -0
  181. package/moj/helpers.mjs +50 -77
  182. package/moj/helpers.mjs.map +1 -1
  183. package/moj/init.js +11 -2
  184. package/moj/moj-frontend.min.css +1 -1
  185. package/moj/moj-frontend.min.css.map +1 -1
  186. package/moj/moj-frontend.min.js +1 -1
  187. package/moj/moj-frontend.min.js.map +1 -1
  188. package/moj/objects/_all.scss +2 -0
  189. package/moj/objects/_all.scss.map +1 -0
  190. package/moj/objects/_button-group.scss +2 -0
  191. package/moj/objects/_button-group.scss.map +1 -0
  192. package/moj/objects/_filter-layout.scss +2 -0
  193. package/moj/objects/_filter-layout.scss.map +1 -0
  194. package/moj/objects/_scrollable-pane.scss +2 -0
  195. package/moj/objects/_scrollable-pane.scss.map +1 -0
  196. package/moj/objects/_width-container.scss +2 -0
  197. package/moj/objects/_width-container.scss.map +1 -0
  198. package/moj/settings/_all.scss +2 -0
  199. package/moj/settings/_all.scss.map +1 -0
  200. package/moj/settings/_assets.scss +2 -0
  201. package/moj/settings/_assets.scss.map +1 -0
  202. package/moj/settings/_colours.scss +2 -0
  203. package/moj/settings/_colours.scss.map +1 -0
  204. package/moj/settings/_measurements.scss +2 -0
  205. package/moj/settings/_measurements.scss.map +1 -0
  206. package/moj/settings/_typography.scss +2 -0
  207. package/moj/settings/_typography.scss.map +1 -0
  208. package/moj/template.njk +13 -0
  209. package/moj/utilities/_all.scss +2 -0
  210. package/moj/utilities/_all.scss.map +1 -0
  211. package/moj/utilities/_hidden.scss +2 -0
  212. package/moj/utilities/_hidden.scss.map +1 -0
  213. package/moj/utilities/_width-container.scss +2 -0
  214. package/moj/utilities/_width-container.scss.map +1 -0
  215. package/moj/vendor/govuk-frontend/_base.scss +2 -0
  216. package/moj/vendor/govuk-frontend/_base.scss.map +1 -0
  217. package/moj/vendor/govuk-frontend/_index.scss +2 -0
  218. package/moj/vendor/govuk-frontend/_index.scss.map +1 -0
  219. package/package.json +5 -6
  220. package/moj/all.jquery.min.js +0 -1
  221. package/moj/all.jquery.min.js.map +0 -1
  222. package/moj/all.js +0 -2662
  223. package/moj/all.js.map +0 -1
  224. package/moj/components/add-another/add-another.js +0 -115
  225. package/moj/components/add-another/add-another.js.map +0 -1
  226. package/moj/components/alert/alert.js +0 -356
  227. package/moj/components/alert/alert.js.map +0 -1
  228. package/moj/components/alert/alert.spec.helper.js.map +0 -1
  229. package/moj/components/button-menu/button-menu.js +0 -338
  230. package/moj/components/button-menu/button-menu.js.map +0 -1
  231. package/moj/components/date-picker/date-picker.js +0 -970
  232. package/moj/components/date-picker/date-picker.js.map +0 -1
  233. package/moj/components/filter-toggle-button/filter-toggle-button.js +0 -102
  234. package/moj/components/filter-toggle-button/filter-toggle-button.js.map +0 -1
  235. package/moj/components/form-validator/form-validator.js +0 -205
  236. package/moj/components/form-validator/form-validator.js.map +0 -1
  237. package/moj/components/multi-file-upload/multi-file-upload.js +0 -241
  238. package/moj/components/multi-file-upload/multi-file-upload.js.map +0 -1
  239. package/moj/components/multi-select/multi-select.js +0 -86
  240. package/moj/components/multi-select/multi-select.js.map +0 -1
  241. package/moj/components/password-reveal/password-reveal.js +0 -44
  242. package/moj/components/password-reveal/password-reveal.js.map +0 -1
  243. package/moj/components/rich-text-editor/rich-text-editor.js +0 -166
  244. package/moj/components/rich-text-editor/rich-text-editor.js.map +0 -1
  245. package/moj/components/search-toggle/search-toggle.js +0 -63
  246. package/moj/components/search-toggle/search-toggle.js.map +0 -1
  247. package/moj/components/sortable-table/sortable-table.js +0 -147
  248. package/moj/components/sortable-table/sortable-table.js.map +0 -1
  249. package/moj/helpers.js +0 -200
  250. package/moj/helpers.js.map +0 -1
  251. package/moj/vendor/html5shiv.js +0 -326
  252. package/moj/vendor/jquery.js +0 -9300
  253. package/moj/version.js +0 -12
  254. package/moj/version.js.map +0 -1
  255. package/moj/version.mjs +0 -4
  256. package/moj/version.mjs.map +0 -1
package/moj/all.mjs CHANGED
@@ -1,127 +1,34 @@
1
+ import { createAll } from 'govuk-frontend';
2
+ export { version } from './common/moj-frontend-version.mjs';
1
3
  import { AddAnother } from './components/add-another/add-another.mjs';
2
4
  import { Alert } from './components/alert/alert.mjs';
3
5
  import { ButtonMenu } from './components/button-menu/button-menu.mjs';
4
6
  import { DatePicker } from './components/date-picker/date-picker.mjs';
5
7
  export { FilterToggleButton } from './components/filter-toggle-button/filter-toggle-button.mjs';
8
+ export { FormValidator } from './components/form-validator/form-validator.mjs';
6
9
  export { MultiFileUpload } from './components/multi-file-upload/multi-file-upload.mjs';
7
10
  import { MultiSelect } from './components/multi-select/multi-select.mjs';
8
11
  import { PasswordReveal } from './components/password-reveal/password-reveal.mjs';
9
12
  import { RichTextEditor } from './components/rich-text-editor/rich-text-editor.mjs';
10
13
  import { SearchToggle } from './components/search-toggle/search-toggle.mjs';
11
14
  import { SortableTable } from './components/sortable-table/sortable-table.mjs';
12
- import { nodeListForEach } from './helpers.mjs';
13
- export { version } from './version.mjs';
14
15
 
15
- /* eslint-disable no-new */
16
-
17
-
18
- function initAll(options) {
19
- // Set the options to an empty object by default if no options are passed.
20
- options = typeof options !== 'undefined' ? options : {};
21
-
22
- // Allow the user to initialise MOJ Frontend in only certain sections of the page
23
- // Defaults to the entire document if nothing is set.
24
- const scope = typeof options.scope !== 'undefined' ? options.scope : document;
25
-
26
- const $addAnothers = scope.querySelectorAll('[data-module="moj-add-another"]');
27
-
28
- nodeListForEach($addAnothers, function ($addAnother) {
29
- new AddAnother($addAnother);
30
- });
31
-
32
- const $multiSelects = scope.querySelectorAll(
33
- '[data-module="moj-multi-select"]'
34
- );
35
-
36
- nodeListForEach($multiSelects, function ($multiSelect) {
37
- new MultiSelect({
38
- container: $multiSelect.querySelector(
39
- $multiSelect.getAttribute('data-multi-select-checkbox')
40
- ),
41
- checkboxes: $multiSelect.querySelectorAll(
42
- 'tbody .govuk-checkboxes__input'
43
- ),
44
- id_prefix: $multiSelect.getAttribute('data-multi-select-idprefix')
45
- });
46
- });
47
-
48
- const $passwordReveals = scope.querySelectorAll(
49
- '[data-module="moj-password-reveal"]'
50
- );
51
-
52
- nodeListForEach($passwordReveals, function ($passwordReveal) {
53
- new PasswordReveal($passwordReveal);
54
- });
55
-
56
- const $richTextEditors = scope.querySelectorAll(
57
- '[data-module="moj-rich-text-editor"]'
58
- );
59
-
60
- nodeListForEach($richTextEditors, function ($richTextEditor) {
61
- const options = {
62
- textarea: $($richTextEditor)
63
- };
64
-
65
- const toolbarAttr = $richTextEditor.getAttribute(
66
- 'data-moj-rich-text-editor-toolbar'
67
- );
68
-
69
- if (toolbarAttr) {
70
- const toolbar = toolbarAttr.split(',');
71
-
72
- options.toolbar = {};
73
-
74
- for (const item in toolbar) {
75
- options.toolbar[toolbar[item]] = true;
76
- }
77
- }
78
-
79
- new RichTextEditor(options);
80
- });
81
-
82
- const $searchToggles = scope.querySelectorAll(
83
- '[data-module="moj-search-toggle"]'
84
- );
85
-
86
- nodeListForEach($searchToggles, function ($searchToggle) {
87
- new SearchToggle({
88
- toggleButton: {
89
- container: $($searchToggle.querySelector('.moj-search-toggle__toggle')),
90
- text: $searchToggle.getAttribute('data-moj-search-toggle-text')
91
- },
92
- search: {
93
- container: $($searchToggle.querySelector('.moj-search'))
94
- }
95
- });
96
- });
97
-
98
- const $sortableTables = scope.querySelectorAll(
99
- '[data-module="moj-sortable-table"]'
100
- );
101
-
102
- nodeListForEach($sortableTables, function ($table) {
103
- new SortableTable({
104
- table: $table
105
- });
106
- });
107
-
108
- const $datepickers = scope.querySelectorAll('[data-module="moj-date-picker"]');
109
-
110
- nodeListForEach($datepickers, function ($datepicker) {
111
- new DatePicker($datepicker, {}).init();
112
- });
113
-
114
- const $buttonMenus = scope.querySelectorAll('[data-module="moj-button-menu"]');
16
+ /**
17
+ * @param {Config} [config]
18
+ */
19
+ function initAll(config) {
20
+ for (const Component of [AddAnother, Alert, ButtonMenu, DatePicker, MultiSelect, PasswordReveal, RichTextEditor, SearchToggle, SortableTable]) {
21
+ createAll(Component, undefined, config);
22
+ }
23
+ }
115
24
 
116
- nodeListForEach($buttonMenus, function ($buttonmenu) {
117
- new ButtonMenu($buttonmenu, {}).init();
118
- });
25
+ /**
26
+ * @typedef {Parameters<typeof GOVUKFrontend.initAll>[0]} Config
27
+ */
119
28
 
120
- const $alerts = scope.querySelectorAll('[data-module="moj-alert"]');
121
- nodeListForEach($alerts, function ($alert) {
122
- new Alert($alert, {}).init();
123
- });
124
- }
29
+ /**
30
+ * @import * as GOVUKFrontend from 'govuk-frontend'
31
+ */
125
32
 
126
33
  export { AddAnother, Alert, ButtonMenu, DatePicker, MultiSelect, PasswordReveal, RichTextEditor, SearchToggle, SortableTable, initAll };
127
34
  //# sourceMappingURL=all.mjs.map
package/moj/all.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"all.mjs","sources":["../../src/moj/all.mjs"],"sourcesContent":["/* eslint-disable no-new */\n\nimport $ from 'jquery'\n\nimport { AddAnother } from './components/add-another/add-another.mjs'\nimport { Alert } from './components/alert/alert.mjs'\nimport { ButtonMenu } from './components/button-menu/button-menu.mjs'\nimport { DatePicker } from './components/date-picker/date-picker.mjs'\nimport { FilterToggleButton } from './components/filter-toggle-button/filter-toggle-button.mjs'\nimport { MultiFileUpload } from './components/multi-file-upload/multi-file-upload.mjs'\nimport { MultiSelect } from './components/multi-select/multi-select.mjs'\nimport { PasswordReveal } from './components/password-reveal/password-reveal.mjs'\nimport { RichTextEditor } from './components/rich-text-editor/rich-text-editor.mjs'\nimport { SearchToggle } from './components/search-toggle/search-toggle.mjs'\nimport { SortableTable } from './components/sortable-table/sortable-table.mjs'\nimport { nodeListForEach } from './helpers.mjs'\nimport { version } from './version.mjs'\n\nfunction initAll(options) {\n // Set the options to an empty object by default if no options are passed.\n options = typeof options !== 'undefined' ? options : {}\n\n // Allow the user to initialise MOJ Frontend in only certain sections of the page\n // Defaults to the entire document if nothing is set.\n const scope = typeof options.scope !== 'undefined' ? options.scope : document\n\n const $addAnothers = scope.querySelectorAll('[data-module=\"moj-add-another\"]')\n\n nodeListForEach($addAnothers, function ($addAnother) {\n new AddAnother($addAnother)\n })\n\n const $multiSelects = scope.querySelectorAll(\n '[data-module=\"moj-multi-select\"]'\n )\n\n nodeListForEach($multiSelects, function ($multiSelect) {\n new MultiSelect({\n container: $multiSelect.querySelector(\n $multiSelect.getAttribute('data-multi-select-checkbox')\n ),\n checkboxes: $multiSelect.querySelectorAll(\n 'tbody .govuk-checkboxes__input'\n ),\n id_prefix: $multiSelect.getAttribute('data-multi-select-idprefix')\n })\n })\n\n const $passwordReveals = scope.querySelectorAll(\n '[data-module=\"moj-password-reveal\"]'\n )\n\n nodeListForEach($passwordReveals, function ($passwordReveal) {\n new PasswordReveal($passwordReveal)\n })\n\n const $richTextEditors = scope.querySelectorAll(\n '[data-module=\"moj-rich-text-editor\"]'\n )\n\n nodeListForEach($richTextEditors, function ($richTextEditor) {\n const options = {\n textarea: $($richTextEditor)\n }\n\n const toolbarAttr = $richTextEditor.getAttribute(\n 'data-moj-rich-text-editor-toolbar'\n )\n\n if (toolbarAttr) {\n const toolbar = toolbarAttr.split(',')\n\n options.toolbar = {}\n\n for (const item in toolbar) {\n options.toolbar[toolbar[item]] = true\n }\n }\n\n new RichTextEditor(options)\n })\n\n const $searchToggles = scope.querySelectorAll(\n '[data-module=\"moj-search-toggle\"]'\n )\n\n nodeListForEach($searchToggles, function ($searchToggle) {\n new SearchToggle({\n toggleButton: {\n container: $($searchToggle.querySelector('.moj-search-toggle__toggle')),\n text: $searchToggle.getAttribute('data-moj-search-toggle-text')\n },\n search: {\n container: $($searchToggle.querySelector('.moj-search'))\n }\n })\n })\n\n const $sortableTables = scope.querySelectorAll(\n '[data-module=\"moj-sortable-table\"]'\n )\n\n nodeListForEach($sortableTables, function ($table) {\n new SortableTable({\n table: $table\n })\n })\n\n const $datepickers = scope.querySelectorAll('[data-module=\"moj-date-picker\"]')\n\n nodeListForEach($datepickers, function ($datepicker) {\n new DatePicker($datepicker, {}).init()\n })\n\n const $buttonMenus = scope.querySelectorAll('[data-module=\"moj-button-menu\"]')\n\n nodeListForEach($buttonMenus, function ($buttonmenu) {\n new ButtonMenu($buttonmenu, {}).init()\n })\n\n const $alerts = scope.querySelectorAll('[data-module=\"moj-alert\"]')\n nodeListForEach($alerts, function ($alert) {\n new Alert($alert, {}).init()\n })\n}\n\nexport {\n initAll,\n version,\n\n // Components\n AddAnother,\n Alert,\n ButtonMenu,\n DatePicker,\n FilterToggleButton,\n MultiFileUpload,\n MultiSelect,\n PasswordReveal,\n RichTextEditor,\n SearchToggle,\n SortableTable\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"all.mjs","sources":["../../src/moj/all.mjs"],"sourcesContent":["import { createAll } from 'govuk-frontend'\n\nimport { version } from './common/moj-frontend-version.mjs'\nimport { AddAnother } from './components/add-another/add-another.mjs'\nimport { Alert } from './components/alert/alert.mjs'\nimport { ButtonMenu } from './components/button-menu/button-menu.mjs'\nimport { DatePicker } from './components/date-picker/date-picker.mjs'\nimport { FilterToggleButton } from './components/filter-toggle-button/filter-toggle-button.mjs'\nimport { FormValidator } from './components/form-validator/form-validator.mjs'\nimport { MultiFileUpload } from './components/multi-file-upload/multi-file-upload.mjs'\nimport { MultiSelect } from './components/multi-select/multi-select.mjs'\nimport { PasswordReveal } from './components/password-reveal/password-reveal.mjs'\nimport { RichTextEditor } from './components/rich-text-editor/rich-text-editor.mjs'\nimport { SearchToggle } from './components/search-toggle/search-toggle.mjs'\nimport { SortableTable } from './components/sortable-table/sortable-table.mjs'\n\n/**\n * @param {Config} [config]\n */\nfunction initAll(config) {\n for (const Component of [\n AddAnother,\n Alert,\n ButtonMenu,\n DatePicker,\n MultiSelect,\n PasswordReveal,\n RichTextEditor,\n SearchToggle,\n SortableTable\n ]) {\n createAll(Component, undefined, config)\n }\n}\n\nexport {\n initAll,\n version,\n\n // Components\n AddAnother,\n Alert,\n ButtonMenu,\n DatePicker,\n FilterToggleButton,\n FormValidator,\n MultiFileUpload,\n MultiSelect,\n PasswordReveal,\n RichTextEditor,\n SearchToggle,\n SortableTable\n}\n\n/**\n * @typedef {Parameters<typeof GOVUKFrontend.initAll>[0]} Config\n */\n\n/**\n * @import * as GOVUKFrontend from 'govuk-frontend'\n */\n"],"names":["initAll","config","Component","AddAnother","Alert","ButtonMenu","DatePicker","MultiSelect","PasswordReveal","RichTextEditor","SearchToggle","SortableTable","createAll","undefined"],"mappings":";;;;;;;;;;;;;;;AAgBA;AACA;AACA;AACA,SAASA,OAAOA,CAACC,MAAM,EAAE;EACvB,KAAK,MAAMC,SAAS,IAAI,CACtBC,UAAU,EACVC,KAAK,EACLC,UAAU,EACVC,UAAU,EACVC,WAAW,EACXC,cAAc,EACdC,cAAc,EACdC,YAAY,EACZC,aAAa,CACd,EAAE;AACDC,IAAAA,SAAS,CAACV,SAAS,EAAEW,SAAS,EAAEZ,MAAM,CAAC;AACzC;AACF;;AAqBA;AACA;AACA;;AAEA;AACA;AACA;;;;"}
package/moj/all.scss CHANGED
@@ -1,4 +1,7 @@
1
1
  @forward "base";
2
+ @forward "core/all";
2
3
  @forward "objects/all";
3
4
  @forward "components/all";
4
5
  @forward "utilities/all";
6
+
7
+ /*# sourceMappingURL=all.scss.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/moj/all.scss"],"names":[],"mappings":"AAAA,eAAe;AACf,mBAAmB;AACnB,sBAAsB;AACtB,yBAAyB;AACzB,wBAAwB","file":"all.scss","sourcesContent":["@forward \"base\";\n@forward \"core/all\";\n@forward \"objects/all\";\n@forward \"components/all\";\n@forward \"utilities/all\";\n"]}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * GOV.UK Frontend helpers
3
+ *
4
+ * @todo Import from GOV.UK Frontend
5
+ */
6
+
7
+ /**
8
+ * Move focus to element
9
+ *
10
+ * Sets tabindex to -1 to make the element programmatically focusable,
11
+ * but removes it on blur as the element doesn't need to be focused again.
12
+ *
13
+ * @template {HTMLElement} FocusElement
14
+ * @param {FocusElement} $element - HTML element
15
+ * @param {object} [options] - Handler options
16
+ * @param {function(this: FocusElement): void} [options.onBeforeFocus] - Callback before focus
17
+ * @param {function(this: FocusElement): void} [options.onBlur] - Callback on blur
18
+ */
19
+ function setFocus($element, options = {}) {
20
+ var _options$onBeforeFocu;
21
+ const isFocusable = $element.getAttribute('tabindex');
22
+ if (!isFocusable) {
23
+ $element.setAttribute('tabindex', '-1');
24
+ }
25
+
26
+ /**
27
+ * Handle element focus
28
+ */
29
+ function onFocus() {
30
+ $element.addEventListener('blur', onBlur, {
31
+ once: true
32
+ });
33
+ }
34
+
35
+ /**
36
+ * Handle element blur
37
+ */
38
+ function onBlur() {
39
+ var _options$onBlur;
40
+ (_options$onBlur = options.onBlur) == null || _options$onBlur.call($element);
41
+ if (!isFocusable) {
42
+ $element.removeAttribute('tabindex');
43
+ }
44
+ }
45
+
46
+ // Add listener to reset element on blur, after focus
47
+ $element.addEventListener('focus', onFocus, {
48
+ once: true
49
+ });
50
+
51
+ // Focus element
52
+ (_options$onBeforeFocu = options.onBeforeFocus) == null || _options$onBeforeFocu.call($element);
53
+ $element.focus();
54
+ }
55
+
56
+ export { setFocus };
57
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/moj/common/index.mjs"],"sourcesContent":["/**\n * GOV.UK Frontend helpers\n *\n * @todo Import from GOV.UK Frontend\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 * @template {HTMLElement} FocusElement\n * @param {FocusElement} $element - HTML element\n * @param {object} [options] - Handler options\n * @param {function(this: FocusElement): void} [options.onBeforeFocus] - Callback before focus\n * @param {function(this: FocusElement): 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 options.onBlur?.call($element)\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 options.onBeforeFocus?.call($element)\n $element.focus()\n}\n"],"names":["setFocus","$element","options","_options$onBeforeFocu","isFocusable","getAttribute","setAttribute","onFocus","addEventListener","onBlur","once","_options$onBlur","call","removeAttribute","onBeforeFocus","focus"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,QAAQA,CAACC,QAAQ,EAAEC,OAAO,GAAG,EAAE,EAAE;AAAA,EAAA,IAAAC,qBAAA;AAC/C,EAAA,MAAMC,WAAW,GAAGH,QAAQ,CAACI,YAAY,CAAC,UAAU,CAAC;EAErD,IAAI,CAACD,WAAW,EAAE;AAChBH,IAAAA,QAAQ,CAACK,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC;AACzC;;AAEA;AACF;AACA;EACE,SAASC,OAAOA,GAAG;AACjBN,IAAAA,QAAQ,CAACO,gBAAgB,CAAC,MAAM,EAAEC,MAAM,EAAE;AAAEC,MAAAA,IAAI,EAAE;AAAK,KAAC,CAAC;AAC3D;;AAEA;AACF;AACA;EACE,SAASD,MAAMA,GAAG;AAAA,IAAA,IAAAE,eAAA;IAChB,CAAAA,eAAA,GAAAT,OAAO,CAACO,MAAM,KAAdE,IAAAA,IAAAA,eAAA,CAAgBC,IAAI,CAACX,QAAQ,CAAC;IAE9B,IAAI,CAACG,WAAW,EAAE;AAChBH,MAAAA,QAAQ,CAACY,eAAe,CAAC,UAAU,CAAC;AACtC;AACF;;AAEA;AACAZ,EAAAA,QAAQ,CAACO,gBAAgB,CAAC,OAAO,EAAED,OAAO,EAAE;AAAEG,IAAAA,IAAI,EAAE;AAAK,GAAC,CAAC;;AAE3D;EACA,CAAAP,qBAAA,GAAAD,OAAO,CAACY,aAAa,KAArBX,IAAAA,IAAAA,qBAAA,CAAuBS,IAAI,CAACX,QAAQ,CAAC;EACrCA,QAAQ,CAACc,KAAK,EAAE;AAClB;;;;"}
@@ -0,0 +1,14 @@
1
+ /*
2
+ * This variable is automatically overwritten during builds and releases.
3
+ * It doesn't need to be updated manually.
4
+ */
5
+
6
+ /**
7
+ * MoJ Frontend release version
8
+ *
9
+ * {@link https://github.com/ministryofjustice/moj-frontend/releases}
10
+ */
11
+ const version = '5.1.0';
12
+
13
+ export { version };
14
+ //# sourceMappingURL=moj-frontend-version.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moj-frontend-version.mjs","sources":["../../../src/moj/common/moj-frontend-version.mjs"],"sourcesContent":["/*\n * This variable is automatically overwritten during builds and releases.\n * It doesn't need to be updated manually.\n */\n\n/**\n * MoJ Frontend release version\n *\n * {@link https://github.com/ministryofjustice/moj-frontend/releases}\n */\nexport const version = 'development'\n"],"names":["version"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO,MAAMA,OAAO,GAAG;;;;"}
@@ -31,3 +31,5 @@
31
31
  @forward "task-list/task-list";
32
32
  @forward "timeline/timeline";
33
33
  @forward "ticket-panel/ticket-panel";
34
+
35
+ /*# sourceMappingURL=_all.scss.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/moj/components/_all.scss"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,kCAAkC;AAClC,sBAAsB;AACtB,sBAAsB;AACtB,wBAAwB;AACxB,kCAAkC;AAClC,sCAAsC;AACtC,wCAAwC;AACxC,kCAAkC;AAClC,wBAAwB;AACxB,wBAAwB;AACxB,oCAAoC;AACpC,8CAA8C;AAC9C,4BAA4B;AAC5B,8CAA8C;AAC9C,oCAAoC;AACpC,gDAAgD;AAChD,sDAAsD;AACtD,kDAAkD;AAClD,gCAAgC;AAChC,0CAA0C;AAC1C,gDAAgD;AAChD,oCAAoC;AACpC,4CAA4C;AAC5C,sCAAsC;AACtC,wBAAwB;AACxB,0CAA0C;AAC1C,wCAAwC;AACxC,wCAAwC;AACxC,kBAAkB;AAClB,8BAA8B;AAC9B,4BAA4B;AAC5B,oCAAoC","file":"_all.scss","sourcesContent":["@forward \"action-bar/action-bar\";\n@forward \"add-another/add-another\";\n@forward \"alert/alert\";\n@forward \"badge/badge\";\n@forward \"banner/banner\";\n@forward \"button-menu/button-menu\";\n@forward \"cookie-banner/cookie-banner\";\n@forward \"currency-input/currency-input\";\n@forward \"date-picker/date-picker\";\n@forward \"filter/filter\";\n@forward \"header/header\";\n@forward \"identity-bar/identity-bar\";\n@forward \"interruption-card/interruption-card\";\n@forward \"messages/messages\";\n@forward \"multi-file-upload/multi-file-upload\";\n@forward \"multi-select/multi-select\";\n@forward \"notification-badge/notification-badge\";\n@forward \"organisation-switcher/organisation-switcher\";\n@forward \"page-header-actions/page-header-actions\";\n@forward \"pagination/pagination\";\n@forward \"password-reveal/password-reveal\";\n@forward \"primary-navigation/primary-navigation\";\n@forward \"progress-bar/progress-bar\";\n@forward \"rich-text-editor/rich-text-editor\";\n@forward \"search-toggle/search-toggle\";\n@forward \"search/search\";\n@forward \"side-navigation/side-navigation\";\n@forward \"sortable-table/sortable-table\";\n@forward \"sub-navigation/sub-navigation\";\n@forward \"tag/tag\";\n@forward \"task-list/task-list\";\n@forward \"timeline/timeline\";\n@forward \"ticket-panel/ticket-panel\";\n"]}
@@ -31,3 +31,5 @@
31
31
  vertical-align: baseline;
32
32
  }
33
33
  }
34
+
35
+ /*# sourceMappingURL=_action-bar.scss.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/moj/components/action-bar/_action-bar.scss"],"names":[],"mappings":"AAAA,uCAAuC;;AAEvC;EACE,YAAY,EAAE,qBAAqB;AACrC;;AAEA;EACE,qBAAqB;EACrB,kBAAkB;;EAElB;IACE,YAAY;EACd;;EAEA;IACE,8BAA8B;IAC9B,qCAAqC,EAAE,kCAAkC;;IAEzE;MACE,WAAW;MACX,kBAAkB;MAClB,MAAM;MACN,QAAQ;MACR,UAAU;MACV,YAAY;MACZ,4CAA4C;IAC9C;EACF;;EAEA;IACE,wBAAwB;EAC1B;AACF","file":"_action-bar.scss","sourcesContent":["@use \"../../vendor/govuk-frontend\" as *;\n\n.moj-action-bar {\n font-size: 0; // Removes white space\n}\n\n.moj-action-bar__filter {\n display: inline-block;\n position: relative;\n\n @include govuk-media-query($until: desktop) {\n float: right;\n }\n\n @include govuk-media-query($from: desktop) {\n margin-right: govuk-spacing(2);\n padding-right: govuk-spacing(2) + 2px; // Takes into account divider width\n\n &::after {\n content: \"\";\n position: absolute;\n top: 0;\n right: 0;\n width: 2px;\n height: 40px;\n background-color: govuk-colour(\"light-grey\");\n }\n }\n\n > .govuk-button {\n vertical-align: baseline;\n }\n}\n"]}
@@ -46,3 +46,5 @@
46
46
  0 -2px $govuk-focus-colour,
47
47
  0 4px $govuk-focus-text-colour;
48
48
  }
49
+
50
+ /*# sourceMappingURL=_add-another.scss.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/moj/components/add-another/_add-another.scss"],"names":[],"mappings":"AAAA,uCAAuC;;AAEvC;;+EAE+E;;AAE/E;EACE;IACE,kBAAkB;IAClB,SAAS;IACT,4BAA4B;IAC5B,UAAU;;IAEV;MACE,aAAa;IACf;EACF;;EAEA;IACE,WAAW;IACX,wBAAwB;IACxB,WAAW;;IAEX;MACE,WAAW;IACb;EACF;;EAEA;IACE,kBAAkB;IAClB,MAAM;IACN,QAAQ;IACR,WAAW;EACb;;EAEA;IACE,cAAc;EAChB;AACF;;AAEA;EACE,aAAa;EACb,+BAA+B;EAC/B,qCAAqC;EACrC;;kCAEgC;AAClC","file":"_add-another.scss","sourcesContent":["@use \"../../vendor/govuk-frontend\" as *;\n\n/* ==========================================================================\n #ADD ANOTHER\n ========================================================================== */\n\n.moj-add-another {\n &__item {\n position: relative;\n margin: 0;\n margin-top: govuk-spacing(6);\n padding: 0;\n\n &:first-of-type {\n margin-top: 0;\n }\n }\n\n &__title {\n width: 100%;\n padding: 4px 100px 4px 0;\n float: left;\n\n & + .govuk-form-group {\n clear: left;\n }\n }\n\n &__remove-button {\n position: absolute;\n top: 0;\n right: 0;\n width: auto;\n }\n\n &__add-button {\n display: block;\n }\n}\n\n.moj-add-another__heading:focus {\n outline: none;\n color: $govuk-focus-text-colour;\n background-color: $govuk-focus-colour;\n box-shadow:\n 0 -2px $govuk-focus-colour,\n 0 4px $govuk-focus-text-colour;\n}\n"]}
@@ -0,0 +1,157 @@
1
+ (function (global, factory) {
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('govuk-frontend')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'govuk-frontend'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.MOJFrontend = global.MOJFrontend || {}, global.GOVUKFrontend));
5
+ })(this, (function (exports, govukFrontend) { 'use strict';
6
+
7
+ class AddAnother extends govukFrontend.Component {
8
+ /**
9
+ * @param {Element | null} $root - HTML element to use for add another
10
+ */
11
+ constructor($root) {
12
+ super($root);
13
+ this.$root.addEventListener('click', this.onRemoveButtonClick.bind(this));
14
+ this.$root.addEventListener('click', this.onAddButtonClick.bind(this));
15
+ const $buttons = this.$root.querySelectorAll('.moj-add-another__add-button, moj-add-another__remove-button');
16
+ $buttons.forEach($button => {
17
+ if (!($button instanceof HTMLButtonElement)) {
18
+ return;
19
+ }
20
+ $button.type = 'button';
21
+ });
22
+ }
23
+
24
+ /**
25
+ * @param {MouseEvent} event - Click event
26
+ */
27
+ onAddButtonClick(event) {
28
+ const $button = event.target;
29
+ if (!$button || !($button instanceof HTMLButtonElement) || !$button.classList.contains('moj-add-another__add-button')) {
30
+ return;
31
+ }
32
+ const $items = this.getItems();
33
+ const $item = this.getNewItem();
34
+ if (!$item || !($item instanceof HTMLElement)) {
35
+ return;
36
+ }
37
+ this.updateAttributes($item, $items.length);
38
+ this.resetItem($item);
39
+ const $firstItem = $items[0];
40
+ if (!this.hasRemoveButton($firstItem)) {
41
+ this.createRemoveButton($firstItem);
42
+ }
43
+ $items[$items.length - 1].after($item);
44
+ const $input = $item.querySelector('input, textarea, select');
45
+ if ($input && $input instanceof HTMLInputElement) {
46
+ $input.focus();
47
+ }
48
+ }
49
+
50
+ /**
51
+ * @param {HTMLElement} $item - Add another item
52
+ */
53
+ hasRemoveButton($item) {
54
+ return $item.querySelectorAll('.moj-add-another__remove-button').length;
55
+ }
56
+ getItems() {
57
+ if (!this.$root) {
58
+ return [];
59
+ }
60
+ const $items = Array.from(this.$root.querySelectorAll('.moj-add-another__item'));
61
+ return $items.filter(item => item instanceof HTMLElement);
62
+ }
63
+ getNewItem() {
64
+ const $items = this.getItems();
65
+ const $item = $items[0].cloneNode(true);
66
+ if (!$item || !($item instanceof HTMLElement)) {
67
+ return;
68
+ }
69
+ if (!this.hasRemoveButton($item)) {
70
+ this.createRemoveButton($item);
71
+ }
72
+ return $item;
73
+ }
74
+
75
+ /**
76
+ * @param {HTMLElement} $item - Add another item
77
+ * @param {number} index - Add another item index
78
+ */
79
+ updateAttributes($item, index) {
80
+ $item.querySelectorAll('[data-name]').forEach($input => {
81
+ if (!($input instanceof HTMLInputElement)) {
82
+ return;
83
+ }
84
+ const name = $input.getAttribute('data-name') || '';
85
+ const id = $input.getAttribute('data-id') || '';
86
+ const originalId = $input.id;
87
+ $input.name = name.replace(/%index%/, `${index}`);
88
+ $input.id = id.replace(/%index%/, `${index}`);
89
+ const $label = $input.parentElement.querySelector('label') || $input.closest('label') || $item.querySelector(`[for="${originalId}"]`);
90
+ if ($label && $label instanceof HTMLLabelElement) {
91
+ $label.htmlFor = $input.id;
92
+ }
93
+ });
94
+ }
95
+
96
+ /**
97
+ * @param {HTMLElement} $item - Add another item
98
+ */
99
+ createRemoveButton($item) {
100
+ const $button = document.createElement('button');
101
+ $button.type = 'button';
102
+ $button.classList.add('govuk-button', 'govuk-button--secondary', 'moj-add-another__remove-button');
103
+ $button.textContent = 'Remove';
104
+ $item.append($button);
105
+ }
106
+
107
+ /**
108
+ * @param {HTMLElement} $item - Add another item
109
+ */
110
+ resetItem($item) {
111
+ $item.querySelectorAll('[data-name], [data-id]').forEach($input => {
112
+ if (!($input instanceof HTMLInputElement)) {
113
+ return;
114
+ }
115
+ if ($input.type === 'checkbox' || $input.type === 'radio') {
116
+ $input.checked = false;
117
+ } else {
118
+ $input.value = '';
119
+ }
120
+ });
121
+ }
122
+
123
+ /**
124
+ * @param {MouseEvent} event - Click event
125
+ */
126
+ onRemoveButtonClick(event) {
127
+ const $button = event.target;
128
+ if (!$button || !($button instanceof HTMLButtonElement) || !$button.classList.contains('moj-add-another__remove-button')) {
129
+ return;
130
+ }
131
+ $button.closest('.moj-add-another__item').remove();
132
+ const $items = this.getItems();
133
+ if ($items.length === 1) {
134
+ $items[0].querySelector('.moj-add-another__remove-button').remove();
135
+ }
136
+ $items.forEach(($item, index) => {
137
+ this.updateAttributes($item, index);
138
+ });
139
+ this.focusHeading();
140
+ }
141
+ focusHeading() {
142
+ const $heading = this.$root.querySelector('.moj-add-another__heading');
143
+ if ($heading && $heading instanceof HTMLElement) {
144
+ $heading.focus();
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Name for the component used when initialising using data-module attributes.
150
+ */
151
+ }
152
+ AddAnother.moduleName = 'moj-add-another';
153
+
154
+ exports.AddAnother = AddAnother;
155
+
156
+ }));
157
+ //# sourceMappingURL=add-another.bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-another.bundle.js","sources":["../../../../src/moj/components/add-another/add-another.mjs"],"sourcesContent":["import { Component } from 'govuk-frontend'\n\nexport class AddAnother extends Component {\n /**\n * @param {Element | null} $root - HTML element to use for add another\n */\n constructor($root) {\n super($root)\n\n this.$root.addEventListener('click', this.onRemoveButtonClick.bind(this))\n this.$root.addEventListener('click', this.onAddButtonClick.bind(this))\n\n const $buttons = this.$root.querySelectorAll(\n '.moj-add-another__add-button, moj-add-another__remove-button'\n )\n\n $buttons.forEach(($button) => {\n if (!($button instanceof HTMLButtonElement)) {\n return\n }\n\n $button.type = 'button'\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onAddButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__add-button')\n ) {\n return\n }\n\n const $items = this.getItems()\n const $item = this.getNewItem()\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n this.updateAttributes($item, $items.length)\n this.resetItem($item)\n\n const $firstItem = $items[0]\n if (!this.hasRemoveButton($firstItem)) {\n this.createRemoveButton($firstItem)\n }\n\n $items[$items.length - 1].after($item)\n\n const $input = $item.querySelector('input, textarea, select')\n if ($input && $input instanceof HTMLInputElement) {\n $input.focus()\n }\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n hasRemoveButton($item) {\n return $item.querySelectorAll('.moj-add-another__remove-button').length\n }\n\n getItems() {\n if (!this.$root) {\n return []\n }\n\n const $items = Array.from(\n this.$root.querySelectorAll('.moj-add-another__item')\n )\n\n return $items.filter((item) => item instanceof HTMLElement)\n }\n\n getNewItem() {\n const $items = this.getItems()\n const $item = $items[0].cloneNode(true)\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n if (!this.hasRemoveButton($item)) {\n this.createRemoveButton($item)\n }\n\n return $item\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n * @param {number} index - Add another item index\n */\n updateAttributes($item, index) {\n $item.querySelectorAll('[data-name]').forEach(($input) => {\n if (!($input instanceof HTMLInputElement)) {\n return\n }\n\n const name = $input.getAttribute('data-name') || ''\n const id = $input.getAttribute('data-id') || ''\n const originalId = $input.id\n\n $input.name = name.replace(/%index%/, `${index}`)\n $input.id = id.replace(/%index%/, `${index}`)\n\n const $label =\n $input.parentElement.querySelector('label') ||\n $input.closest('label') ||\n $item.querySelector(`[for=\"${originalId}\"]`)\n\n if ($label && $label instanceof HTMLLabelElement) {\n $label.htmlFor = $input.id\n }\n })\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n createRemoveButton($item) {\n const $button = document.createElement('button')\n $button.type = 'button'\n\n $button.classList.add(\n 'govuk-button',\n 'govuk-button--secondary',\n 'moj-add-another__remove-button'\n )\n\n $button.textContent = 'Remove'\n\n $item.append($button)\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n resetItem($item) {\n $item.querySelectorAll('[data-name], [data-id]').forEach(($input) => {\n if (!($input instanceof HTMLInputElement)) {\n return\n }\n\n if ($input.type === 'checkbox' || $input.type === 'radio') {\n $input.checked = false\n } else {\n $input.value = ''\n }\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onRemoveButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__remove-button')\n ) {\n return\n }\n\n $button.closest('.moj-add-another__item').remove()\n\n const $items = this.getItems()\n\n if ($items.length === 1) {\n $items[0].querySelector('.moj-add-another__remove-button').remove()\n }\n\n $items.forEach(($item, index) => {\n this.updateAttributes($item, index)\n })\n\n this.focusHeading()\n }\n\n focusHeading() {\n const $heading = this.$root.querySelector('.moj-add-another__heading')\n\n if ($heading && $heading instanceof HTMLElement) {\n $heading.focus()\n }\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'moj-add-another'\n}\n"],"names":["AddAnother","Component","constructor","$root","addEventListener","onRemoveButtonClick","bind","onAddButtonClick","$buttons","querySelectorAll","forEach","$button","HTMLButtonElement","type","event","target","classList","contains","$items","getItems","$item","getNewItem","HTMLElement","updateAttributes","length","resetItem","$firstItem","hasRemoveButton","createRemoveButton","after","$input","querySelector","HTMLInputElement","focus","Array","from","filter","item","cloneNode","index","name","getAttribute","id","originalId","replace","$label","parentElement","closest","HTMLLabelElement","htmlFor","document","createElement","add","textContent","append","checked","value","remove","focusHeading","$heading","moduleName"],"mappings":"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"}