@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
package/moj/all.mjs CHANGED
@@ -3,125 +3,115 @@ import { Alert } from './components/alert/alert.mjs';
3
3
  import { ButtonMenu } from './components/button-menu/button-menu.mjs';
4
4
  import { DatePicker } from './components/date-picker/date-picker.mjs';
5
5
  export { FilterToggleButton } from './components/filter-toggle-button/filter-toggle-button.mjs';
6
+ export { FormValidator } from './components/form-validator/form-validator.mjs';
6
7
  export { MultiFileUpload } from './components/multi-file-upload/multi-file-upload.mjs';
7
8
  import { MultiSelect } from './components/multi-select/multi-select.mjs';
8
9
  import { PasswordReveal } from './components/password-reveal/password-reveal.mjs';
9
10
  import { RichTextEditor } from './components/rich-text-editor/rich-text-editor.mjs';
10
11
  import { SearchToggle } from './components/search-toggle/search-toggle.mjs';
11
12
  import { SortableTable } from './components/sortable-table/sortable-table.mjs';
12
- import { nodeListForEach } from './helpers.mjs';
13
13
  export { version } from './version.mjs';
14
14
 
15
15
  /* eslint-disable no-new */
16
16
 
17
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 : {};
18
+ /**
19
+ * @param {Config} [config]
20
+ */
21
+ function initAll(config) {
22
+ // Set the config to an empty object by default if no config is passed.
23
+ config = typeof config !== 'undefined' ? config : {};
21
24
 
22
25
  // Allow the user to initialise MOJ Frontend in only certain sections of the page
23
26
  // Defaults to the entire document if nothing is set.
24
- const scope = typeof options.scope !== 'undefined' ? options.scope : document;
25
-
27
+ const scope = typeof config.scope !== 'undefined' ? config.scope : document;
26
28
  const $addAnothers = scope.querySelectorAll('[data-module="moj-add-another"]');
27
-
28
- nodeListForEach($addAnothers, function ($addAnother) {
29
+ $addAnothers.forEach($addAnother => {
29
30
  new AddAnother($addAnother);
30
31
  });
31
-
32
- const $multiSelects = scope.querySelectorAll(
33
- '[data-module="moj-multi-select"]'
34
- );
35
-
36
- nodeListForEach($multiSelects, function ($multiSelect) {
32
+ const $multiSelects = scope.querySelectorAll('[data-module="moj-multi-select"]');
33
+ $multiSelects.forEach($multiSelect => {
34
+ const containerSelector = $multiSelect.getAttribute('data-multi-select-checkbox');
35
+ if (!($multiSelect instanceof HTMLElement) || !containerSelector) {
36
+ return;
37
+ }
37
38
  new MultiSelect({
38
- container: $multiSelect.querySelector(
39
- $multiSelect.getAttribute('data-multi-select-checkbox')
40
- ),
41
- checkboxes: $multiSelect.querySelectorAll(
42
- 'tbody .govuk-checkboxes__input'
43
- ),
39
+ container: $multiSelect.querySelector(containerSelector),
40
+ checkboxes: $multiSelect.querySelectorAll('tbody .govuk-checkboxes__input'),
44
41
  id_prefix: $multiSelect.getAttribute('data-multi-select-idprefix')
45
42
  });
46
43
  });
47
-
48
- const $passwordReveals = scope.querySelectorAll(
49
- '[data-module="moj-password-reveal"]'
50
- );
51
-
52
- nodeListForEach($passwordReveals, function ($passwordReveal) {
44
+ const $passwordReveals = scope.querySelectorAll('[data-module="moj-password-reveal"]');
45
+ $passwordReveals.forEach($passwordReveal => {
53
46
  new PasswordReveal($passwordReveal);
54
47
  });
55
-
56
- const $richTextEditors = scope.querySelectorAll(
57
- '[data-module="moj-rich-text-editor"]'
58
- );
59
-
60
- nodeListForEach($richTextEditors, function ($richTextEditor) {
48
+ const $richTextEditors = scope.querySelectorAll('[data-module="moj-rich-text-editor"]');
49
+ $richTextEditors.forEach($richTextEditor => {
61
50
  const options = {
62
- textarea: $($richTextEditor)
51
+ textarea: $richTextEditor
63
52
  };
64
-
65
- const toolbarAttr = $richTextEditor.getAttribute(
66
- 'data-moj-rich-text-editor-toolbar'
67
- );
68
-
53
+ const toolbarAttr = $richTextEditor.getAttribute('data-moj-rich-text-editor-toolbar');
69
54
  if (toolbarAttr) {
70
55
  const toolbar = toolbarAttr.split(',');
71
-
72
56
  options.toolbar = {};
73
-
74
- for (const item in toolbar) {
75
- options.toolbar[toolbar[item]] = true;
57
+ for (const option of toolbar) {
58
+ if (option === 'bold' || option === 'italic' || option === 'underline' || option === 'bullets' || option === 'numbers') {
59
+ options.toolbar[option] = true;
60
+ }
76
61
  }
77
62
  }
78
-
79
63
  new RichTextEditor(options);
80
64
  });
81
-
82
- const $searchToggles = scope.querySelectorAll(
83
- '[data-module="moj-search-toggle"]'
84
- );
85
-
86
- nodeListForEach($searchToggles, function ($searchToggle) {
65
+ const $searchToggles = scope.querySelectorAll('[data-module="moj-search-toggle"]');
66
+ $searchToggles.forEach($searchToggle => {
87
67
  new SearchToggle({
88
68
  toggleButton: {
89
- container: $($searchToggle.querySelector('.moj-search-toggle__toggle')),
69
+ container: $searchToggle.querySelector('.moj-search-toggle__toggle'),
90
70
  text: $searchToggle.getAttribute('data-moj-search-toggle-text')
91
71
  },
92
72
  search: {
93
- container: $($searchToggle.querySelector('.moj-search'))
73
+ container: $searchToggle.querySelector('.moj-search')
94
74
  }
95
75
  });
96
76
  });
97
-
98
- const $sortableTables = scope.querySelectorAll(
99
- '[data-module="moj-sortable-table"]'
100
- );
101
-
102
- nodeListForEach($sortableTables, function ($table) {
77
+ const $sortableTables = scope.querySelectorAll('[data-module="moj-sortable-table"]');
78
+ $sortableTables.forEach($table => {
103
79
  new SortableTable({
104
80
  table: $table
105
81
  });
106
82
  });
107
-
108
- const $datepickers = scope.querySelectorAll('[data-module="moj-date-picker"]');
109
-
110
- nodeListForEach($datepickers, function ($datepicker) {
111
- new DatePicker($datepicker, {}).init();
83
+ const $datePickers = scope.querySelectorAll('[data-module="moj-date-picker"]');
84
+ $datePickers.forEach($datePicker => {
85
+ new DatePicker($datePicker);
112
86
  });
113
-
114
87
  const $buttonMenus = scope.querySelectorAll('[data-module="moj-button-menu"]');
115
-
116
- nodeListForEach($buttonMenus, function ($buttonmenu) {
117
- new ButtonMenu($buttonmenu, {}).init();
88
+ $buttonMenus.forEach($buttonmenu => {
89
+ new ButtonMenu($buttonmenu);
118
90
  });
119
-
120
91
  const $alerts = scope.querySelectorAll('[data-module="moj-alert"]');
121
- nodeListForEach($alerts, function ($alert) {
122
- new Alert($alert, {}).init();
92
+ $alerts.forEach($alert => {
93
+ new Alert($alert);
123
94
  });
124
95
  }
125
96
 
97
+ /**
98
+ * @typedef {object} Config
99
+ * @property {Element} [scope=document] - Scope to query for components
100
+ */
101
+
102
+ /**
103
+ * Schema for component config
104
+ *
105
+ * @typedef {object} Schema
106
+ * @property {{ [field: string]: SchemaProperty | undefined }} properties - Schema properties
107
+ */
108
+
109
+ /**
110
+ * Schema property for component config
111
+ *
112
+ * @typedef {object} SchemaProperty
113
+ * @property {'string' | 'boolean' | 'number' | 'object'} type - Property type
114
+ */
115
+
126
116
  export { AddAnother, Alert, ButtonMenu, DatePicker, MultiSelect, PasswordReveal, RichTextEditor, SearchToggle, SortableTable, initAll };
127
117
  //# 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":";;;;;;;;;;;;;;AAAA;;;AAkBA,SAAA,OAAA,CAAA,OAAA,EAAA;AACA;AACA,EAAA,OAAA,GAAA,OAAA,OAAA,KAAA,WAAA,GAAA,OAAA,GAAA;;AAEA;AACA;AACA,EAAA,MAAA,KAAA,GAAA,OAAA,OAAA,CAAA,KAAA,KAAA,WAAA,GAAA,OAAA,CAAA,KAAA,GAAA;;AAEA,EAAA,MAAA,YAAA,GAAA,KAAA,CAAA,gBAAA,CAAA,iCAAA;;AAEA,EAAA,eAAA,CAAA,YAAA,EAAA,UAAA,WAAA,EAAA;AACA,IAAA,IAAA,UAAA,CAAA,WAAA;AACA,GAAA;;AAEA,EAAA,MAAA,aAAA,GAAA,KAAA,CAAA,gBAAA;AACA,IAAA;AACA;;AAEA,EAAA,eAAA,CAAA,aAAA,EAAA,UAAA,YAAA,EAAA;AACA,IAAA,IAAA,WAAA,CAAA;AACA,MAAA,SAAA,EAAA,YAAA,CAAA,aAAA;AACA,QAAA,YAAA,CAAA,YAAA,CAAA,4BAAA;AACA,OAAA;AACA,MAAA,UAAA,EAAA,YAAA,CAAA,gBAAA;AACA,QAAA;AACA,OAAA;AACA,MAAA,SAAA,EAAA,YAAA,CAAA,YAAA,CAAA,4BAAA;AACA,KAAA;AACA,GAAA;;AAEA,EAAA,MAAA,gBAAA,GAAA,KAAA,CAAA,gBAAA;AACA,IAAA;AACA;;AAEA,EAAA,eAAA,CAAA,gBAAA,EAAA,UAAA,eAAA,EAAA;AACA,IAAA,IAAA,cAAA,CAAA,eAAA;AACA,GAAA;;AAEA,EAAA,MAAA,gBAAA,GAAA,KAAA,CAAA,gBAAA;AACA,IAAA;AACA;;AAEA,EAAA,eAAA,CAAA,gBAAA,EAAA,UAAA,eAAA,EAAA;AACA,IAAA,MAAA,OAAA,GAAA;AACA,MAAA,QAAA,EAAA,CAAA,CAAA,eAAA;AACA;;AAEA,IAAA,MAAA,WAAA,GAAA,eAAA,CAAA,YAAA;AACA,MAAA;AACA;;AAEA,IAAA,IAAA,WAAA,EAAA;AACA,MAAA,MAAA,OAAA,GAAA,WAAA,CAAA,KAAA,CAAA,GAAA;;AAEA,MAAA,OAAA,CAAA,OAAA,GAAA;;AAEA,MAAA,KAAA,MAAA,IAAA,IAAA,OAAA,EAAA;AACA,QAAA,OAAA,CAAA,OAAA,CAAA,OAAA,CAAA,IAAA,CAAA,CAAA,GAAA;AACA;AACA;;AAEA,IAAA,IAAA,cAAA,CAAA,OAAA;AACA,GAAA;;AAEA,EAAA,MAAA,cAAA,GAAA,KAAA,CAAA,gBAAA;AACA,IAAA;AACA;;AAEA,EAAA,eAAA,CAAA,cAAA,EAAA,UAAA,aAAA,EAAA;AACA,IAAA,IAAA,YAAA,CAAA;AACA,MAAA,YAAA,EAAA;AACA,QAAA,SAAA,EAAA,CAAA,CAAA,aAAA,CAAA,aAAA,CAAA,4BAAA,CAAA,CAAA;AACA,QAAA,IAAA,EAAA,aAAA,CAAA,YAAA,CAAA,6BAAA;AACA,OAAA;AACA,MAAA,MAAA,EAAA;AACA,QAAA,SAAA,EAAA,CAAA,CAAA,aAAA,CAAA,aAAA,CAAA,aAAA,CAAA;AACA;AACA,KAAA;AACA,GAAA;;AAEA,EAAA,MAAA,eAAA,GAAA,KAAA,CAAA,gBAAA;AACA,IAAA;AACA;;AAEA,EAAA,eAAA,CAAA,eAAA,EAAA,UAAA,MAAA,EAAA;AACA,IAAA,IAAA,aAAA,CAAA;AACA,MAAA,KAAA,EAAA;AACA,KAAA;AACA,GAAA;;AAEA,EAAA,MAAA,YAAA,GAAA,KAAA,CAAA,gBAAA,CAAA,iCAAA;;AAEA,EAAA,eAAA,CAAA,YAAA,EAAA,UAAA,WAAA,EAAA;AACA,IAAA,IAAA,UAAA,CAAA,WAAA,EAAA,EAAA,CAAA,CAAA,IAAA;AACA,GAAA;;AAEA,EAAA,MAAA,YAAA,GAAA,KAAA,CAAA,gBAAA,CAAA,iCAAA;;AAEA,EAAA,eAAA,CAAA,YAAA,EAAA,UAAA,WAAA,EAAA;AACA,IAAA,IAAA,UAAA,CAAA,WAAA,EAAA,EAAA,CAAA,CAAA,IAAA;AACA,GAAA;;AAEA,EAAA,MAAA,OAAA,GAAA,KAAA,CAAA,gBAAA,CAAA,2BAAA;AACA,EAAA,eAAA,CAAA,OAAA,EAAA,UAAA,MAAA,EAAA;AACA,IAAA,IAAA,KAAA,CAAA,MAAA,EAAA,EAAA,CAAA,CAAA,IAAA;AACA,GAAA;AACA;;;;"}
1
+ {"version":3,"file":"all.mjs","sources":["../../src/moj/all.mjs"],"sourcesContent":["/* eslint-disable no-new */\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 { 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'\nimport { version } from './version.mjs'\n\n/**\n * @param {Config} [config]\n */\nfunction initAll(config) {\n // Set the config to an empty object by default if no config is passed.\n config = typeof config !== 'undefined' ? config : {}\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 config.scope !== 'undefined' ? config.scope : document\n\n const $addAnothers = scope.querySelectorAll('[data-module=\"moj-add-another\"]')\n\n $addAnothers.forEach(($addAnother) => {\n new AddAnother($addAnother)\n })\n\n const $multiSelects = scope.querySelectorAll(\n '[data-module=\"moj-multi-select\"]'\n )\n\n $multiSelects.forEach(($multiSelect) => {\n const containerSelector = $multiSelect.getAttribute(\n 'data-multi-select-checkbox'\n )\n\n if (!($multiSelect instanceof HTMLElement) || !containerSelector) {\n return\n }\n\n new MultiSelect({\n container: $multiSelect.querySelector(containerSelector),\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 $passwordReveals.forEach(($passwordReveal) => {\n new PasswordReveal($passwordReveal)\n })\n\n const $richTextEditors = scope.querySelectorAll(\n '[data-module=\"moj-rich-text-editor\"]'\n )\n\n $richTextEditors.forEach(($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 option of toolbar) {\n if (\n option === 'bold' ||\n option === 'italic' ||\n option === 'underline' ||\n option === 'bullets' ||\n option === 'numbers'\n ) {\n options.toolbar[option] = true\n }\n }\n }\n\n new RichTextEditor(options)\n })\n\n const $searchToggles = scope.querySelectorAll(\n '[data-module=\"moj-search-toggle\"]'\n )\n\n $searchToggles.forEach(($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 $sortableTables.forEach(($table) => {\n new SortableTable({\n table: $table\n })\n })\n\n const $datePickers = scope.querySelectorAll('[data-module=\"moj-date-picker\"]')\n\n $datePickers.forEach(($datePicker) => {\n new DatePicker($datePicker)\n })\n\n const $buttonMenus = scope.querySelectorAll('[data-module=\"moj-button-menu\"]')\n\n $buttonMenus.forEach(($buttonmenu) => {\n new ButtonMenu($buttonmenu)\n })\n\n const $alerts = scope.querySelectorAll('[data-module=\"moj-alert\"]')\n $alerts.forEach(($alert) => {\n new Alert($alert)\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 {object} Config\n * @property {Element} [scope=document] - Scope to query for components\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":["initAll","config","scope","document","$addAnothers","querySelectorAll","forEach","$addAnother","AddAnother","$multiSelects","$multiSelect","containerSelector","getAttribute","HTMLElement","MultiSelect","container","querySelector","checkboxes","id_prefix","$passwordReveals","$passwordReveal","PasswordReveal","$richTextEditors","$richTextEditor","options","textarea","toolbarAttr","toolbar","split","option","RichTextEditor","$searchToggles","$searchToggle","SearchToggle","toggleButton","text","search","$sortableTables","$table","SortableTable","table","$datePickers","$datePicker","DatePicker","$buttonMenus","$buttonmenu","ButtonMenu","$alerts","$alert","Alert"],"mappings":"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"}
package/moj/all.scss CHANGED
@@ -2,3 +2,5 @@
2
2
  @forward "objects/all";
3
3
  @forward "components/all";
4
4
  @forward "utilities/all";
5
+
6
+ /*# sourceMappingURL=all.scss.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/moj/all.scss"],"names":[],"mappings":"AAAA,eAAe;AACf,sBAAsB;AACtB,yBAAyB;AACzB,wBAAwB","file":"all.scss","sourcesContent":["@forward \"base\";\n@forward \"objects/all\";\n@forward \"components/all\";\n@forward \"utilities/all\";\n"]}
@@ -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,128 @@
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
+ class AddAnother {
8
+ constructor(container) {
9
+ this.container = container;
10
+ if (this.container.hasAttribute('data-moj-add-another-init')) {
11
+ return this;
12
+ }
13
+ this.container.setAttribute('data-moj-add-another-init', '');
14
+ this.container.addEventListener('click', this.onRemoveButtonClick.bind(this));
15
+ this.container.addEventListener('click', this.onAddButtonClick.bind(this));
16
+ const buttons = this.container.querySelectorAll('.moj-add-another__add-button, moj-add-another__remove-button');
17
+ buttons.forEach(button => {
18
+ if (!(button instanceof HTMLButtonElement)) {
19
+ return;
20
+ }
21
+ button.type = 'button';
22
+ });
23
+ }
24
+ onAddButtonClick(event) {
25
+ const button = event.target;
26
+ if (!button || !(button instanceof HTMLButtonElement) || !button.classList.contains('moj-add-another__add-button')) {
27
+ return;
28
+ }
29
+ const items = this.getItems();
30
+ const item = this.getNewItem();
31
+ if (!item || !(item instanceof HTMLElement)) {
32
+ return;
33
+ }
34
+ this.updateAttributes(item, items.length);
35
+ this.resetItem(item);
36
+ const firstItem = items[0];
37
+ if (!this.hasRemoveButton(firstItem)) {
38
+ this.createRemoveButton(firstItem);
39
+ }
40
+ items[items.length - 1].after(item);
41
+ const input = item.querySelector('input, textarea, select');
42
+ if (input && input instanceof HTMLInputElement) {
43
+ input.focus();
44
+ }
45
+ }
46
+ hasRemoveButton(item) {
47
+ return item.querySelectorAll('.moj-add-another__remove-button').length;
48
+ }
49
+ getItems() {
50
+ if (!this.container) {
51
+ return [];
52
+ }
53
+ const items = Array.from(this.container.querySelectorAll('.moj-add-another__item'));
54
+ return items.filter(item => item instanceof HTMLElement);
55
+ }
56
+ getNewItem() {
57
+ const items = this.getItems();
58
+ const item = items[0].cloneNode(true);
59
+ if (!item || !(item instanceof HTMLElement)) {
60
+ return;
61
+ }
62
+ if (!this.hasRemoveButton(item)) {
63
+ this.createRemoveButton(item);
64
+ }
65
+ return item;
66
+ }
67
+ updateAttributes(item, index) {
68
+ item.querySelectorAll('[data-name]').forEach(el => {
69
+ if (!(el instanceof HTMLInputElement)) {
70
+ return;
71
+ }
72
+ const name = el.getAttribute('data-name') || '';
73
+ const id = el.getAttribute('data-id') || '';
74
+ const originalId = el.id;
75
+ el.name = name.replace(/%index%/, `${index}`);
76
+ el.id = id.replace(/%index%/, `${index}`);
77
+ const label = el.parentElement.querySelector('label') || el.closest('label') || item.querySelector(`[for="${originalId}"]`);
78
+ if (label && label instanceof HTMLLabelElement) {
79
+ label.htmlFor = el.id;
80
+ }
81
+ });
82
+ }
83
+ createRemoveButton(item) {
84
+ const button = document.createElement('button');
85
+ button.type = 'button';
86
+ button.classList.add('govuk-button', 'govuk-button--secondary', 'moj-add-another__remove-button');
87
+ button.textContent = 'Remove';
88
+ item.append(button);
89
+ }
90
+ resetItem(item) {
91
+ item.querySelectorAll('[data-name], [data-id]').forEach(el => {
92
+ if (!(el instanceof HTMLInputElement)) {
93
+ return;
94
+ }
95
+ if (el.type === 'checkbox' || el.type === 'radio') {
96
+ el.checked = false;
97
+ } else {
98
+ el.value = '';
99
+ }
100
+ });
101
+ }
102
+ onRemoveButtonClick(event) {
103
+ const button = event.target;
104
+ if (!button || !(button instanceof HTMLButtonElement) || !button.classList.contains('moj-add-another__remove-button')) {
105
+ return;
106
+ }
107
+ button.closest('.moj-add-another__item').remove();
108
+ const items = this.getItems();
109
+ if (items.length === 1) {
110
+ items[0].querySelector('.moj-add-another__remove-button').remove();
111
+ }
112
+ items.forEach((el, index) => {
113
+ this.updateAttributes(el, index);
114
+ });
115
+ this.focusHeading();
116
+ }
117
+ focusHeading() {
118
+ const heading = this.container.querySelector('.moj-add-another__heading');
119
+ if (heading && heading instanceof HTMLElement) {
120
+ heading.focus();
121
+ }
122
+ }
123
+ }
124
+
125
+ exports.AddAnother = AddAnother;
126
+
127
+ }));
128
+ //# 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":["export class AddAnother {\n constructor(container) {\n this.container = container\n\n if (this.container.hasAttribute('data-moj-add-another-init')) {\n return this\n }\n\n this.container.setAttribute('data-moj-add-another-init', '')\n\n this.container.addEventListener(\n 'click',\n this.onRemoveButtonClick.bind(this)\n )\n this.container.addEventListener('click', this.onAddButtonClick.bind(this))\n\n const buttons = this.container.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 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 hasRemoveButton(item) {\n return item.querySelectorAll('.moj-add-another__remove-button').length\n }\n\n getItems() {\n if (!this.container) {\n return []\n }\n\n const items = Array.from(\n this.container.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 updateAttributes(item, index) {\n item.querySelectorAll('[data-name]').forEach((el) => {\n if (!(el instanceof HTMLInputElement)) {\n return\n }\n\n const name = el.getAttribute('data-name') || ''\n const id = el.getAttribute('data-id') || ''\n const originalId = el.id\n\n el.name = name.replace(/%index%/, `${index}`)\n el.id = id.replace(/%index%/, `${index}`)\n\n const label =\n el.parentElement.querySelector('label') ||\n el.closest('label') ||\n item.querySelector(`[for=\"${originalId}\"]`)\n\n if (label && label instanceof HTMLLabelElement) {\n label.htmlFor = el.id\n }\n })\n }\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 resetItem(item) {\n item.querySelectorAll('[data-name], [data-id]').forEach((el) => {\n if (!(el instanceof HTMLInputElement)) {\n return\n }\n\n if (el.type === 'checkbox' || el.type === 'radio') {\n el.checked = false\n } else {\n el.value = ''\n }\n })\n }\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((el, index) => {\n this.updateAttributes(el, index)\n })\n\n this.focusHeading()\n }\n\n focusHeading() {\n const heading = this.container.querySelector('.moj-add-another__heading')\n\n if (heading && heading instanceof HTMLElement) {\n heading.focus()\n }\n }\n}\n"],"names":["AddAnother","constructor","container","hasAttribute","setAttribute","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","cloneNode","index","el","name","getAttribute","id","originalId","replace","label","parentElement","closest","HTMLLabelElement","htmlFor","document","createElement","add","textContent","append","checked","value","remove","focusHeading","heading"],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ class AddAnother {
2
+ constructor(container) {
3
+ this.container = container;
4
+ if (this.container.hasAttribute('data-moj-add-another-init')) {
5
+ return this;
6
+ }
7
+ this.container.setAttribute('data-moj-add-another-init', '');
8
+ this.container.addEventListener('click', this.onRemoveButtonClick.bind(this));
9
+ this.container.addEventListener('click', this.onAddButtonClick.bind(this));
10
+ const buttons = this.container.querySelectorAll('.moj-add-another__add-button, moj-add-another__remove-button');
11
+ buttons.forEach(button => {
12
+ if (!(button instanceof HTMLButtonElement)) {
13
+ return;
14
+ }
15
+ button.type = 'button';
16
+ });
17
+ }
18
+ onAddButtonClick(event) {
19
+ const button = event.target;
20
+ if (!button || !(button instanceof HTMLButtonElement) || !button.classList.contains('moj-add-another__add-button')) {
21
+ return;
22
+ }
23
+ const items = this.getItems();
24
+ const item = this.getNewItem();
25
+ if (!item || !(item instanceof HTMLElement)) {
26
+ return;
27
+ }
28
+ this.updateAttributes(item, items.length);
29
+ this.resetItem(item);
30
+ const firstItem = items[0];
31
+ if (!this.hasRemoveButton(firstItem)) {
32
+ this.createRemoveButton(firstItem);
33
+ }
34
+ items[items.length - 1].after(item);
35
+ const input = item.querySelector('input, textarea, select');
36
+ if (input && input instanceof HTMLInputElement) {
37
+ input.focus();
38
+ }
39
+ }
40
+ hasRemoveButton(item) {
41
+ return item.querySelectorAll('.moj-add-another__remove-button').length;
42
+ }
43
+ getItems() {
44
+ if (!this.container) {
45
+ return [];
46
+ }
47
+ const items = Array.from(this.container.querySelectorAll('.moj-add-another__item'));
48
+ return items.filter(item => item instanceof HTMLElement);
49
+ }
50
+ getNewItem() {
51
+ const items = this.getItems();
52
+ const item = items[0].cloneNode(true);
53
+ if (!item || !(item instanceof HTMLElement)) {
54
+ return;
55
+ }
56
+ if (!this.hasRemoveButton(item)) {
57
+ this.createRemoveButton(item);
58
+ }
59
+ return item;
60
+ }
61
+ updateAttributes(item, index) {
62
+ item.querySelectorAll('[data-name]').forEach(el => {
63
+ if (!(el instanceof HTMLInputElement)) {
64
+ return;
65
+ }
66
+ const name = el.getAttribute('data-name') || '';
67
+ const id = el.getAttribute('data-id') || '';
68
+ const originalId = el.id;
69
+ el.name = name.replace(/%index%/, `${index}`);
70
+ el.id = id.replace(/%index%/, `${index}`);
71
+ const label = el.parentElement.querySelector('label') || el.closest('label') || item.querySelector(`[for="${originalId}"]`);
72
+ if (label && label instanceof HTMLLabelElement) {
73
+ label.htmlFor = el.id;
74
+ }
75
+ });
76
+ }
77
+ createRemoveButton(item) {
78
+ const button = document.createElement('button');
79
+ button.type = 'button';
80
+ button.classList.add('govuk-button', 'govuk-button--secondary', 'moj-add-another__remove-button');
81
+ button.textContent = 'Remove';
82
+ item.append(button);
83
+ }
84
+ resetItem(item) {
85
+ item.querySelectorAll('[data-name], [data-id]').forEach(el => {
86
+ if (!(el instanceof HTMLInputElement)) {
87
+ return;
88
+ }
89
+ if (el.type === 'checkbox' || el.type === 'radio') {
90
+ el.checked = false;
91
+ } else {
92
+ el.value = '';
93
+ }
94
+ });
95
+ }
96
+ onRemoveButtonClick(event) {
97
+ const button = event.target;
98
+ if (!button || !(button instanceof HTMLButtonElement) || !button.classList.contains('moj-add-another__remove-button')) {
99
+ return;
100
+ }
101
+ button.closest('.moj-add-another__item').remove();
102
+ const items = this.getItems();
103
+ if (items.length === 1) {
104
+ items[0].querySelector('.moj-add-another__remove-button').remove();
105
+ }
106
+ items.forEach((el, index) => {
107
+ this.updateAttributes(el, index);
108
+ });
109
+ this.focusHeading();
110
+ }
111
+ focusHeading() {
112
+ const heading = this.container.querySelector('.moj-add-another__heading');
113
+ if (heading && heading instanceof HTMLElement) {
114
+ heading.focus();
115
+ }
116
+ }
117
+ }
118
+
119
+ export { AddAnother };
120
+ //# sourceMappingURL=add-another.bundle.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-another.bundle.mjs","sources":["../../../../src/moj/components/add-another/add-another.mjs"],"sourcesContent":["export class AddAnother {\n constructor(container) {\n this.container = container\n\n if (this.container.hasAttribute('data-moj-add-another-init')) {\n return this\n }\n\n this.container.setAttribute('data-moj-add-another-init', '')\n\n this.container.addEventListener(\n 'click',\n this.onRemoveButtonClick.bind(this)\n )\n this.container.addEventListener('click', this.onAddButtonClick.bind(this))\n\n const buttons = this.container.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 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 hasRemoveButton(item) {\n return item.querySelectorAll('.moj-add-another__remove-button').length\n }\n\n getItems() {\n if (!this.container) {\n return []\n }\n\n const items = Array.from(\n this.container.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 updateAttributes(item, index) {\n item.querySelectorAll('[data-name]').forEach((el) => {\n if (!(el instanceof HTMLInputElement)) {\n return\n }\n\n const name = el.getAttribute('data-name') || ''\n const id = el.getAttribute('data-id') || ''\n const originalId = el.id\n\n el.name = name.replace(/%index%/, `${index}`)\n el.id = id.replace(/%index%/, `${index}`)\n\n const label =\n el.parentElement.querySelector('label') ||\n el.closest('label') ||\n item.querySelector(`[for=\"${originalId}\"]`)\n\n if (label && label instanceof HTMLLabelElement) {\n label.htmlFor = el.id\n }\n })\n }\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 resetItem(item) {\n item.querySelectorAll('[data-name], [data-id]').forEach((el) => {\n if (!(el instanceof HTMLInputElement)) {\n return\n }\n\n if (el.type === 'checkbox' || el.type === 'radio') {\n el.checked = false\n } else {\n el.value = ''\n }\n })\n }\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((el, index) => {\n this.updateAttributes(el, index)\n })\n\n this.focusHeading()\n }\n\n focusHeading() {\n const heading = this.container.querySelector('.moj-add-another__heading')\n\n if (heading && heading instanceof HTMLElement) {\n heading.focus()\n }\n }\n}\n"],"names":["AddAnother","constructor","container","hasAttribute","setAttribute","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","cloneNode","index","el","name","getAttribute","id","originalId","replace","label","parentElement","closest","HTMLLabelElement","htmlFor","document","createElement","add","textContent","append","checked","value","remove","focusHeading","heading"],"mappings":"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"}