@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.
- package/govuk-prototype-kit.config.json +19 -4
- package/moj/_base.scss +2 -0
- package/moj/_base.scss.map +1 -0
- package/moj/all.bundle.js +2523 -0
- package/moj/all.bundle.js.map +1 -0
- package/moj/all.bundle.mjs +2502 -0
- package/moj/all.bundle.mjs.map +1 -0
- package/moj/all.mjs +59 -69
- package/moj/all.mjs.map +1 -1
- package/moj/all.scss +2 -0
- package/moj/all.scss.map +1 -0
- package/moj/components/_all.scss +2 -0
- package/moj/components/_all.scss.map +1 -0
- package/moj/components/action-bar/_action-bar.scss +2 -0
- package/moj/components/action-bar/_action-bar.scss.map +1 -0
- package/moj/components/add-another/_add-another.scss +2 -0
- package/moj/components/add-another/_add-another.scss.map +1 -0
- package/moj/components/add-another/add-another.bundle.js +128 -0
- package/moj/components/add-another/add-another.bundle.js.map +1 -0
- package/moj/components/add-another/add-another.bundle.mjs +120 -0
- package/moj/components/add-another/add-another.bundle.mjs.map +1 -0
- package/moj/components/add-another/add-another.mjs +112 -99
- package/moj/components/add-another/add-another.mjs.map +1 -1
- package/moj/components/alert/_alert.scss +4 -0
- package/moj/components/alert/_alert.scss.map +1 -0
- package/moj/components/alert/alert.bundle.js +330 -0
- package/moj/components/alert/alert.bundle.js.map +1 -0
- package/moj/components/alert/alert.bundle.mjs +322 -0
- package/moj/components/alert/alert.bundle.mjs.map +1 -0
- package/moj/components/alert/alert.mjs +181 -217
- package/moj/components/alert/alert.mjs.map +1 -1
- package/moj/components/alert/{alert.spec.helper.js → alert.spec.helper.bundle.js} +1 -1
- package/moj/components/alert/alert.spec.helper.bundle.js.map +1 -0
- package/moj/components/alert/alert.spec.helper.bundle.mjs +67 -0
- package/moj/components/alert/alert.spec.helper.bundle.mjs.map +1 -0
- package/moj/components/alert/alert.spec.helper.mjs.map +1 -1
- package/moj/components/badge/_badge.scss +2 -0
- package/moj/components/badge/_badge.scss.map +1 -0
- package/moj/components/banner/_banner.scss +2 -0
- package/moj/components/banner/_banner.scss.map +1 -0
- package/moj/components/button-menu/README.md +10 -6
- package/moj/components/button-menu/_button-menu.scss +4 -1
- package/moj/components/button-menu/_button-menu.scss.map +1 -0
- package/moj/components/button-menu/button-menu.bundle.js +299 -0
- package/moj/components/button-menu/button-menu.bundle.js.map +1 -0
- package/moj/components/button-menu/{button-menu.js → button-menu.bundle.mjs} +74 -121
- package/moj/components/button-menu/button-menu.bundle.mjs.map +1 -0
- package/moj/components/button-menu/button-menu.mjs +246 -285
- package/moj/components/button-menu/button-menu.mjs.map +1 -1
- package/moj/components/cookie-banner/_cookie-banner.scss +2 -0
- package/moj/components/cookie-banner/_cookie-banner.scss.map +1 -0
- package/moj/components/currency-input/_currency-input.scss +2 -0
- package/moj/components/currency-input/_currency-input.scss.map +1 -0
- package/moj/components/date-picker/_date-picker.scss +2 -0
- package/moj/components/date-picker/_date-picker.scss.map +1 -0
- package/moj/components/date-picker/date-picker.bundle.js +784 -0
- package/moj/components/date-picker/date-picker.bundle.js.map +1 -0
- package/moj/components/date-picker/{date-picker.js → date-picker.bundle.mjs} +245 -439
- package/moj/components/date-picker/date-picker.bundle.mjs.map +1 -0
- package/moj/components/date-picker/date-picker.mjs +654 -840
- package/moj/components/date-picker/date-picker.mjs.map +1 -1
- package/moj/components/filter/_filter.scss +2 -0
- package/moj/components/filter/_filter.scss.map +1 -0
- package/moj/components/filter-toggle-button/filter-toggle-button.bundle.js +96 -0
- package/moj/components/filter-toggle-button/filter-toggle-button.bundle.js.map +1 -0
- package/moj/components/filter-toggle-button/filter-toggle-button.bundle.mjs +88 -0
- package/moj/components/filter-toggle-button/filter-toggle-button.bundle.mjs.map +1 -0
- package/moj/components/filter-toggle-button/filter-toggle-button.mjs +78 -84
- package/moj/components/filter-toggle-button/filter-toggle-button.mjs.map +1 -1
- package/moj/components/form-validator/form-validator.bundle.js +198 -0
- package/moj/components/form-validator/form-validator.bundle.js.map +1 -0
- package/moj/components/form-validator/form-validator.bundle.mjs +190 -0
- package/moj/components/form-validator/form-validator.bundle.mjs.map +1 -0
- package/moj/components/form-validator/form-validator.mjs +149 -152
- package/moj/components/form-validator/form-validator.mjs.map +1 -1
- package/moj/components/header/_header.scss +2 -0
- package/moj/components/header/_header.scss.map +1 -0
- package/moj/components/identity-bar/_identity-bar.scss +2 -0
- package/moj/components/identity-bar/_identity-bar.scss.map +1 -0
- package/moj/components/interruption-card/_interruption-card.scss +2 -0
- package/moj/components/interruption-card/_interruption-card.scss.map +1 -0
- package/moj/components/messages/_messages.scss +2 -0
- package/moj/components/messages/_messages.scss.map +1 -0
- package/moj/components/multi-file-upload/_multi-file-upload.scss +2 -0
- package/moj/components/multi-file-upload/_multi-file-upload.scss.map +1 -0
- package/moj/components/multi-file-upload/multi-file-upload.bundle.js +223 -0
- package/moj/components/multi-file-upload/multi-file-upload.bundle.js.map +1 -0
- package/moj/components/multi-file-upload/multi-file-upload.bundle.mjs +215 -0
- package/moj/components/multi-file-upload/multi-file-upload.bundle.mjs.map +1 -0
- package/moj/components/multi-file-upload/multi-file-upload.mjs +193 -209
- package/moj/components/multi-file-upload/multi-file-upload.mjs.map +1 -1
- package/moj/components/multi-select/_multi-select.scss +2 -0
- package/moj/components/multi-select/_multi-select.scss.map +1 -0
- package/moj/components/multi-select/multi-select.bundle.js +78 -0
- package/moj/components/multi-select/multi-select.bundle.js.map +1 -0
- package/moj/components/multi-select/multi-select.bundle.mjs +70 -0
- package/moj/components/multi-select/multi-select.bundle.mjs.map +1 -0
- package/moj/components/multi-select/multi-select.mjs +59 -67
- package/moj/components/multi-select/multi-select.mjs.map +1 -1
- package/moj/components/notification-badge/_notification-badge.scss +2 -0
- package/moj/components/notification-badge/_notification-badge.scss.map +1 -0
- package/moj/components/organisation-switcher/_organisation-switcher.scss +2 -0
- package/moj/components/organisation-switcher/_organisation-switcher.scss.map +1 -0
- package/moj/components/page-header-actions/_page-header-actions.scss +2 -0
- package/moj/components/page-header-actions/_page-header-actions.scss.map +1 -0
- package/moj/components/pagination/_pagination.scss +2 -2
- package/moj/components/pagination/_pagination.scss.map +1 -0
- package/moj/components/password-reveal/_password-reveal.scss +2 -0
- package/moj/components/password-reveal/_password-reveal.scss.map +1 -0
- package/moj/components/password-reveal/password-reveal.bundle.js +49 -0
- package/moj/components/password-reveal/password-reveal.bundle.js.map +1 -0
- package/moj/components/password-reveal/password-reveal.bundle.mjs +41 -0
- package/moj/components/password-reveal/password-reveal.bundle.mjs.map +1 -0
- package/moj/components/password-reveal/password-reveal.mjs +36 -31
- package/moj/components/password-reveal/password-reveal.mjs.map +1 -1
- package/moj/components/primary-navigation/_primary-navigation.scss +2 -0
- package/moj/components/primary-navigation/_primary-navigation.scss.map +1 -0
- package/moj/components/progress-bar/_progress-bar.scss +2 -0
- package/moj/components/progress-bar/_progress-bar.scss.map +1 -0
- package/moj/components/rich-text-editor/README.md +15 -9
- package/moj/components/rich-text-editor/_rich-text-editor.scss +2 -0
- package/moj/components/rich-text-editor/_rich-text-editor.scss.map +1 -0
- package/moj/components/rich-text-editor/rich-text-editor.bundle.js +145 -0
- package/moj/components/rich-text-editor/rich-text-editor.bundle.js.map +1 -0
- package/moj/components/rich-text-editor/rich-text-editor.bundle.mjs +137 -0
- package/moj/components/rich-text-editor/rich-text-editor.bundle.mjs.map +1 -0
- package/moj/components/rich-text-editor/rich-text-editor.mjs +124 -145
- package/moj/components/rich-text-editor/rich-text-editor.mjs.map +1 -1
- package/moj/components/search/_search.scss +2 -0
- package/moj/components/search/_search.scss.map +1 -0
- package/moj/components/search-toggle/{search-toggle.scss → _search-toggle.scss} +2 -0
- package/moj/components/search-toggle/_search-toggle.scss.map +1 -0
- package/moj/components/search-toggle/search-toggle.bundle.js +54 -0
- package/moj/components/search-toggle/search-toggle.bundle.js.map +1 -0
- package/moj/components/search-toggle/search-toggle.bundle.mjs +46 -0
- package/moj/components/search-toggle/search-toggle.bundle.mjs.map +1 -0
- package/moj/components/search-toggle/search-toggle.mjs +40 -49
- package/moj/components/search-toggle/search-toggle.mjs.map +1 -1
- package/moj/components/side-navigation/_side-navigation.scss +2 -0
- package/moj/components/side-navigation/_side-navigation.scss.map +1 -0
- package/moj/components/sortable-table/_sortable-table.scss +2 -2
- package/moj/components/sortable-table/_sortable-table.scss.map +1 -0
- package/moj/components/sortable-table/sortable-table.bundle.js +134 -0
- package/moj/components/sortable-table/sortable-table.bundle.js.map +1 -0
- package/moj/components/sortable-table/sortable-table.bundle.mjs +126 -0
- package/moj/components/sortable-table/sortable-table.bundle.mjs.map +1 -0
- package/moj/components/sortable-table/sortable-table.mjs +117 -130
- package/moj/components/sortable-table/sortable-table.mjs.map +1 -1
- package/moj/components/sub-navigation/_sub-navigation.scss +2 -0
- package/moj/components/sub-navigation/_sub-navigation.scss.map +1 -0
- package/moj/components/tag/_tag.scss +2 -0
- package/moj/components/tag/_tag.scss.map +1 -0
- package/moj/components/task-list/_task-list.scss +2 -0
- package/moj/components/task-list/_task-list.scss.map +1 -0
- package/moj/components/ticket-panel/_ticket-panel.scss +2 -0
- package/moj/components/ticket-panel/_ticket-panel.scss.map +1 -0
- package/moj/components/timeline/_timeline.scss +2 -0
- package/moj/components/timeline/_timeline.scss.map +1 -0
- package/moj/filters/all.js +44 -22
- package/moj/helpers/_all.scss +2 -0
- package/moj/helpers/_all.scss.map +1 -0
- package/moj/helpers/_hidden.scss +2 -0
- package/moj/helpers/_hidden.scss.map +1 -0
- package/moj/helpers/_links.scss +2 -0
- package/moj/helpers/_links.scss.map +1 -0
- package/moj/{helpers.js → helpers.bundle.js} +37 -42
- package/moj/helpers.bundle.js.map +1 -0
- package/moj/helpers.bundle.mjs +179 -0
- package/moj/helpers.bundle.mjs.map +1 -0
- package/moj/helpers.mjs +52 -28
- package/moj/helpers.mjs.map +1 -1
- package/moj/init.js +11 -2
- package/moj/moj-frontend.min.css +1 -1
- package/moj/moj-frontend.min.css.map +1 -1
- package/moj/moj-frontend.min.js +1 -1
- package/moj/moj-frontend.min.js.map +1 -1
- package/moj/objects/_all.scss +2 -0
- package/moj/objects/_all.scss.map +1 -0
- package/moj/objects/_button-group.scss +2 -0
- package/moj/objects/_button-group.scss.map +1 -0
- package/moj/objects/_filter-layout.scss +2 -0
- package/moj/objects/_filter-layout.scss.map +1 -0
- package/moj/objects/_scrollable-pane.scss +2 -0
- package/moj/objects/_scrollable-pane.scss.map +1 -0
- package/moj/objects/_width-container.scss +2 -0
- package/moj/objects/_width-container.scss.map +1 -0
- package/moj/settings/_all.scss +2 -0
- package/moj/settings/_all.scss.map +1 -0
- package/moj/settings/_assets.scss +2 -0
- package/moj/settings/_assets.scss.map +1 -0
- package/moj/settings/_colours.scss +2 -0
- package/moj/settings/_colours.scss.map +1 -0
- package/moj/settings/_measurements.scss +2 -0
- package/moj/settings/_measurements.scss.map +1 -0
- package/moj/settings/_typography.scss +2 -0
- package/moj/settings/_typography.scss.map +1 -0
- package/moj/template.njk +13 -0
- package/moj/utilities/_all.scss +2 -0
- package/moj/utilities/_all.scss.map +1 -0
- package/moj/utilities/_hidden.scss +2 -0
- package/moj/utilities/_hidden.scss.map +1 -0
- package/moj/utilities/_width-container.scss +2 -0
- package/moj/utilities/_width-container.scss.map +1 -0
- package/moj/vendor/govuk-frontend/_base.scss +2 -0
- package/moj/vendor/govuk-frontend/_base.scss.map +1 -0
- package/moj/vendor/govuk-frontend/_index.scss +2 -0
- package/moj/vendor/govuk-frontend/_index.scss.map +1 -0
- package/moj/{version.js → version.bundle.js} +1 -1
- package/moj/version.bundle.js.map +1 -0
- package/moj/version.bundle.mjs +4 -0
- package/moj/version.bundle.mjs.map +1 -0
- package/moj/version.mjs.map +1 -1
- package/package.json +5 -6
- package/moj/all.jquery.min.js +0 -1
- package/moj/all.jquery.min.js.map +0 -1
- package/moj/all.js +0 -2662
- package/moj/all.js.map +0 -1
- package/moj/components/add-another/add-another.js +0 -115
- package/moj/components/add-another/add-another.js.map +0 -1
- package/moj/components/alert/alert.js +0 -356
- package/moj/components/alert/alert.js.map +0 -1
- package/moj/components/alert/alert.spec.helper.js.map +0 -1
- package/moj/components/button-menu/button-menu.js.map +0 -1
- package/moj/components/date-picker/date-picker.js.map +0 -1
- package/moj/components/filter-toggle-button/filter-toggle-button.js +0 -102
- package/moj/components/filter-toggle-button/filter-toggle-button.js.map +0 -1
- package/moj/components/form-validator/form-validator.js +0 -205
- package/moj/components/form-validator/form-validator.js.map +0 -1
- package/moj/components/multi-file-upload/multi-file-upload.js +0 -241
- package/moj/components/multi-file-upload/multi-file-upload.js.map +0 -1
- package/moj/components/multi-select/multi-select.js +0 -86
- package/moj/components/multi-select/multi-select.js.map +0 -1
- package/moj/components/password-reveal/password-reveal.js +0 -44
- package/moj/components/password-reveal/password-reveal.js.map +0 -1
- package/moj/components/rich-text-editor/rich-text-editor.js +0 -166
- package/moj/components/rich-text-editor/rich-text-editor.js.map +0 -1
- package/moj/components/search-toggle/search-toggle.js +0 -63
- package/moj/components/search-toggle/search-toggle.js.map +0 -1
- package/moj/components/sortable-table/sortable-table.js +0 -147
- package/moj/components/sortable-table/sortable-table.js.map +0 -1
- package/moj/helpers.js.map +0 -1
- package/moj/vendor/html5shiv.js +0 -326
- package/moj/vendor/jquery.js +0 -9300
- 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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
|
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
|
-
|
|
33
|
-
'
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: $
|
|
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
|
-
|
|
75
|
-
|
|
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
|
-
|
|
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: $
|
|
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: $
|
|
73
|
+
container: $searchToggle.querySelector('.moj-search')
|
|
94
74
|
}
|
|
95
75
|
});
|
|
96
76
|
});
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
122
|
-
new Alert($alert
|
|
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
|
|
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
package/moj/all.scss.map
ADDED
|
@@ -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"]}
|
package/moj/components/_all.scss
CHANGED
|
@@ -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"]}
|
|
@@ -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"]}
|
|
@@ -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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"}
|