@ministryofjustice/frontend 4.0.0 → 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 +10 -3
- 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/page-header-actions/template.njk +1 -1
- 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 +17 -1
- 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
|
@@ -1,59 +1,44 @@
|
|
|
1
|
-
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.MOJFrontend = global.MOJFrontend || {}));
|
|
5
|
-
})(this, (function (exports) { 'use strict';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @typedef {object} ButtonMenuConfig
|
|
9
|
-
* @property {string} [buttonText=Actions] - Label for the toggle button
|
|
10
|
-
* @property {"left" | "right"} [alignMenu=left] - the alignment of the menu
|
|
11
|
-
* @property {string} [buttonClasses=govuk-button--secondary] - css classes applied to the toggle button
|
|
12
|
-
*/
|
|
13
|
-
|
|
1
|
+
class ButtonMenu {
|
|
14
2
|
/**
|
|
15
|
-
* @param {
|
|
16
|
-
* @param {ButtonMenuConfig} config
|
|
17
|
-
* @class
|
|
3
|
+
* @param {Element | null} $module - HTML element to use for button menu
|
|
4
|
+
* @param {ButtonMenuConfig} [config] - Button menu config
|
|
18
5
|
*/
|
|
19
|
-
|
|
20
|
-
if (!$module) {
|
|
21
|
-
return this
|
|
6
|
+
constructor($module, config = {}) {
|
|
7
|
+
if (!$module || !($module instanceof HTMLElement)) {
|
|
8
|
+
return this;
|
|
22
9
|
}
|
|
23
|
-
|
|
24
10
|
const schema = Object.freeze({
|
|
25
11
|
properties: {
|
|
26
|
-
buttonText: {
|
|
27
|
-
|
|
28
|
-
|
|
12
|
+
buttonText: {
|
|
13
|
+
type: 'string'
|
|
14
|
+
},
|
|
15
|
+
buttonClasses: {
|
|
16
|
+
type: 'string'
|
|
17
|
+
},
|
|
18
|
+
alignMenu: {
|
|
19
|
+
type: 'string'
|
|
20
|
+
}
|
|
29
21
|
}
|
|
30
22
|
});
|
|
31
|
-
|
|
32
23
|
const defaults = {
|
|
33
24
|
buttonText: 'Actions',
|
|
34
25
|
alignMenu: 'left',
|
|
35
26
|
buttonClasses: ''
|
|
36
27
|
};
|
|
37
28
|
// data attributes override JS config, which overrides defaults
|
|
38
|
-
this.config = this.mergeConfigs(
|
|
39
|
-
defaults,
|
|
40
|
-
config,
|
|
41
|
-
this.parseDataset(schema, $module.dataset)
|
|
42
|
-
);
|
|
43
|
-
|
|
29
|
+
this.config = this.mergeConfigs(defaults, config, this.parseDataset(schema, $module.dataset));
|
|
44
30
|
this.$module = $module;
|
|
45
|
-
}
|
|
46
31
|
|
|
47
|
-
ButtonMenu.prototype.init = function () {
|
|
48
32
|
// If only one button is provided, don't initiate a menu and toggle button
|
|
49
33
|
// if classes have been provided for the toggleButton, apply them to the single item
|
|
50
34
|
if (this.$module.children.length === 1) {
|
|
51
35
|
const button = this.$module.children[0];
|
|
52
|
-
button.classList.forEach(
|
|
36
|
+
button.classList.forEach(className => {
|
|
53
37
|
if (className.startsWith('govuk-button-')) {
|
|
54
38
|
button.classList.remove(className);
|
|
55
39
|
}
|
|
56
40
|
button.classList.remove('moj-button-menu__item');
|
|
41
|
+
button.classList.add('moj-button-menu__single-button');
|
|
57
42
|
});
|
|
58
43
|
if (this.config.buttonClasses) {
|
|
59
44
|
button.classList.add(...this.config.buttonClasses.split(' '));
|
|
@@ -63,32 +48,26 @@
|
|
|
63
48
|
if (this.$module.children.length > 1) {
|
|
64
49
|
this.initMenu();
|
|
65
50
|
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
ButtonMenu.prototype.initMenu = function () {
|
|
51
|
+
}
|
|
52
|
+
initMenu() {
|
|
69
53
|
this.$menu = this.createMenu();
|
|
70
54
|
this.$module.insertAdjacentHTML('afterbegin', this.toggleTemplate());
|
|
71
55
|
this.setupMenuItems();
|
|
72
|
-
|
|
73
56
|
this.$menuToggle = this.$module.querySelector(':scope > button');
|
|
74
57
|
this.items = this.$menu.querySelectorAll('a, button');
|
|
75
|
-
|
|
76
|
-
this.$menuToggle.addEventListener('click', (event) => {
|
|
58
|
+
this.$menuToggle.addEventListener('click', event => {
|
|
77
59
|
this.toggleMenu(event);
|
|
78
60
|
});
|
|
79
|
-
|
|
80
|
-
this.$module.addEventListener('keydown', (event) => {
|
|
61
|
+
this.$module.addEventListener('keydown', event => {
|
|
81
62
|
this.handleKeyDown(event);
|
|
82
63
|
});
|
|
83
|
-
|
|
84
|
-
document.addEventListener('click', (event) => {
|
|
64
|
+
document.addEventListener('click', event => {
|
|
85
65
|
if (!this.$module.contains(event.target)) {
|
|
86
66
|
this.closeMenu(false);
|
|
87
67
|
}
|
|
88
68
|
});
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
ButtonMenu.prototype.createMenu = function () {
|
|
69
|
+
}
|
|
70
|
+
createMenu() {
|
|
92
71
|
const $menu = document.createElement('ul');
|
|
93
72
|
$menu.setAttribute('role', 'list');
|
|
94
73
|
$menu.hidden = true;
|
|
@@ -96,44 +75,37 @@
|
|
|
96
75
|
if (this.config.alignMenu === 'right') {
|
|
97
76
|
$menu.classList.add('moj-button-menu__wrapper--right');
|
|
98
77
|
}
|
|
99
|
-
|
|
100
78
|
this.$module.appendChild($menu);
|
|
101
79
|
while (this.$module.firstChild !== $menu) {
|
|
102
80
|
$menu.appendChild(this.$module.firstChild);
|
|
103
81
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
ButtonMenu.prototype.setupMenuItems = function () {
|
|
109
|
-
Array.from(this.$menu.children).forEach((item) => {
|
|
82
|
+
return $menu;
|
|
83
|
+
}
|
|
84
|
+
setupMenuItems() {
|
|
85
|
+
Array.from(this.$menu.children).forEach(item => {
|
|
110
86
|
// wrap item in li tag
|
|
111
87
|
const listItem = document.createElement('li');
|
|
112
88
|
this.$menu.insertBefore(listItem, item);
|
|
113
89
|
listItem.appendChild(item);
|
|
114
|
-
|
|
115
|
-
item.setAttribute('tabindex', -1);
|
|
116
|
-
|
|
90
|
+
item.setAttribute('tabindex', '-1');
|
|
117
91
|
if (item.tagName === 'BUTTON') {
|
|
118
92
|
item.setAttribute('type', 'button');
|
|
119
93
|
}
|
|
120
|
-
|
|
121
|
-
item.classList.forEach((className) => {
|
|
94
|
+
item.classList.forEach(className => {
|
|
122
95
|
if (className.startsWith('govuk-button')) {
|
|
123
96
|
item.classList.remove(className);
|
|
124
97
|
}
|
|
125
98
|
});
|
|
126
99
|
|
|
127
100
|
// add a slight delay after click before closing the menu, makes it *feel* better
|
|
128
|
-
item.addEventListener('click', (
|
|
101
|
+
item.addEventListener('click', () => {
|
|
129
102
|
setTimeout(() => {
|
|
130
103
|
this.closeMenu(false);
|
|
131
104
|
}, 50);
|
|
132
105
|
});
|
|
133
106
|
});
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
ButtonMenu.prototype.toggleTemplate = function () {
|
|
107
|
+
}
|
|
108
|
+
toggleTemplate() {
|
|
137
109
|
return `
|
|
138
110
|
<button type="button" class="govuk-button moj-button-menu__toggle-button ${this.config.buttonClasses || ''}" aria-haspopup="true" aria-expanded="false">
|
|
139
111
|
<span>
|
|
@@ -142,92 +114,85 @@
|
|
|
142
114
|
<path d="M5.5 0L11 5L0 5L5.5 0Z" fill="currentColor"/>
|
|
143
115
|
</svg>
|
|
144
116
|
</span>
|
|
145
|
-
</button
|
|
146
|
-
}
|
|
117
|
+
</button>`;
|
|
118
|
+
}
|
|
147
119
|
|
|
148
120
|
/**
|
|
149
121
|
* @returns {boolean}
|
|
150
122
|
*/
|
|
151
|
-
|
|
152
|
-
return this.$menuToggle.getAttribute('aria-expanded') === 'true'
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
ButtonMenu.prototype.toggleMenu = function (event) {
|
|
123
|
+
isOpen() {
|
|
124
|
+
return this.$menuToggle.getAttribute('aria-expanded') === 'true';
|
|
125
|
+
}
|
|
126
|
+
toggleMenu(event) {
|
|
156
127
|
event.preventDefault();
|
|
157
128
|
|
|
158
129
|
// If menu is triggered with mouse don't move focus to first item
|
|
159
130
|
const keyboardEvent = event.detail === 0;
|
|
160
131
|
const focusIndex = keyboardEvent ? 0 : -1;
|
|
161
|
-
|
|
162
132
|
if (this.isOpen()) {
|
|
163
133
|
this.closeMenu();
|
|
164
134
|
} else {
|
|
165
135
|
this.openMenu(focusIndex);
|
|
166
136
|
}
|
|
167
|
-
}
|
|
137
|
+
}
|
|
168
138
|
|
|
169
139
|
/**
|
|
170
140
|
* Opens the menu and optionally sets the focus to the item with given index
|
|
171
141
|
*
|
|
172
142
|
* @param {number} focusIndex - The index of the item to focus
|
|
173
143
|
*/
|
|
174
|
-
|
|
144
|
+
openMenu(focusIndex = 0) {
|
|
175
145
|
this.$menu.hidden = false;
|
|
176
146
|
this.$menuToggle.setAttribute('aria-expanded', 'true');
|
|
177
147
|
if (focusIndex !== -1) {
|
|
178
148
|
this.focusItem(focusIndex);
|
|
179
149
|
}
|
|
180
|
-
}
|
|
150
|
+
}
|
|
181
151
|
|
|
182
152
|
/**
|
|
183
153
|
* Closes the menu and optionally returns focus back to menuToggle
|
|
184
154
|
*
|
|
185
155
|
* @param {boolean} moveFocus - whether to return focus to the toggle button
|
|
186
156
|
*/
|
|
187
|
-
|
|
157
|
+
closeMenu(moveFocus = true) {
|
|
188
158
|
this.$menu.hidden = true;
|
|
189
159
|
this.$menuToggle.setAttribute('aria-expanded', 'false');
|
|
190
160
|
if (moveFocus) {
|
|
191
161
|
this.$menuToggle.focus();
|
|
192
162
|
}
|
|
193
|
-
}
|
|
163
|
+
}
|
|
194
164
|
|
|
195
165
|
/**
|
|
196
166
|
* Focuses the menu item at the specified index
|
|
197
167
|
*
|
|
198
168
|
* @param {number} index - the index of the item to focus
|
|
199
169
|
*/
|
|
200
|
-
|
|
170
|
+
focusItem(index) {
|
|
201
171
|
if (index >= this.items.length) index = 0;
|
|
202
172
|
if (index < 0) index = this.items.length - 1;
|
|
203
|
-
|
|
204
173
|
const menuItem = this.items.item(index);
|
|
205
174
|
if (menuItem) {
|
|
206
175
|
menuItem.focus();
|
|
207
176
|
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
ButtonMenu.prototype.currentFocusIndex = function () {
|
|
177
|
+
}
|
|
178
|
+
currentFocusIndex() {
|
|
211
179
|
const activeElement = document.activeElement;
|
|
212
180
|
const menuItems = Array.from(this.items);
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
ButtonMenu.prototype.handleKeyDown = function (event) {
|
|
181
|
+
return menuItems.indexOf(activeElement);
|
|
182
|
+
}
|
|
183
|
+
handleKeyDown(event) {
|
|
218
184
|
if (event.target === this.$menuToggle) {
|
|
219
185
|
switch (event.key) {
|
|
220
186
|
case 'ArrowDown':
|
|
221
187
|
event.preventDefault();
|
|
222
188
|
this.openMenu();
|
|
223
|
-
break
|
|
189
|
+
break;
|
|
224
190
|
case 'ArrowUp':
|
|
225
191
|
event.preventDefault();
|
|
226
192
|
this.openMenu(this.items.length - 1);
|
|
227
|
-
break
|
|
193
|
+
break;
|
|
228
194
|
}
|
|
229
195
|
}
|
|
230
|
-
|
|
231
196
|
if (this.$menu.contains(event.target) && this.isOpen()) {
|
|
232
197
|
switch (event.key) {
|
|
233
198
|
case 'ArrowDown':
|
|
@@ -235,31 +200,30 @@
|
|
|
235
200
|
if (this.currentFocusIndex() !== -1) {
|
|
236
201
|
this.focusItem(this.currentFocusIndex() + 1);
|
|
237
202
|
}
|
|
238
|
-
break
|
|
203
|
+
break;
|
|
239
204
|
case 'ArrowUp':
|
|
240
205
|
event.preventDefault();
|
|
241
206
|
if (this.currentFocusIndex() !== -1) {
|
|
242
207
|
this.focusItem(this.currentFocusIndex() - 1);
|
|
243
208
|
}
|
|
244
|
-
break
|
|
209
|
+
break;
|
|
245
210
|
case 'Home':
|
|
246
211
|
event.preventDefault();
|
|
247
212
|
this.focusItem(0);
|
|
248
|
-
break
|
|
213
|
+
break;
|
|
249
214
|
case 'End':
|
|
250
215
|
event.preventDefault();
|
|
251
216
|
this.focusItem(this.items.length - 1);
|
|
252
|
-
break
|
|
217
|
+
break;
|
|
253
218
|
}
|
|
254
219
|
}
|
|
255
|
-
|
|
256
220
|
if (event.key === 'Escape' && this.isOpen()) {
|
|
257
221
|
this.closeMenu();
|
|
258
222
|
}
|
|
259
223
|
if (event.key === 'Tab' && this.isOpen()) {
|
|
260
224
|
this.closeMenu(false);
|
|
261
225
|
}
|
|
262
|
-
}
|
|
226
|
+
}
|
|
263
227
|
|
|
264
228
|
/**
|
|
265
229
|
* Parse dataset
|
|
@@ -271,19 +235,17 @@
|
|
|
271
235
|
* @param {DOMStringMap} dataset - HTML element dataset
|
|
272
236
|
* @returns {object} Normalised dataset
|
|
273
237
|
*/
|
|
274
|
-
|
|
238
|
+
parseDataset(schema, dataset) {
|
|
275
239
|
const parsed = {};
|
|
276
|
-
|
|
277
|
-
for (const [field, ,] of Object.entries(schema.properties)) {
|
|
240
|
+
for (const [field,,] of Object.entries(schema.properties)) {
|
|
278
241
|
if (field in dataset) {
|
|
279
242
|
if (dataset[field]) {
|
|
280
243
|
parsed[field] = dataset[field];
|
|
281
244
|
}
|
|
282
245
|
}
|
|
283
246
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
};
|
|
247
|
+
return parsed;
|
|
248
|
+
}
|
|
287
249
|
|
|
288
250
|
/**
|
|
289
251
|
* Config merging function
|
|
@@ -294,7 +256,7 @@
|
|
|
294
256
|
* @param {...{ [key: string]: unknown }} configObjects - Config objects to merge
|
|
295
257
|
* @returns {{ [key: string]: unknown }} A merged config object
|
|
296
258
|
*/
|
|
297
|
-
|
|
259
|
+
mergeConfigs(...configObjects) {
|
|
298
260
|
const formattedConfigObject = {};
|
|
299
261
|
|
|
300
262
|
// Loop through each of the passed objects
|
|
@@ -314,25 +276,16 @@
|
|
|
314
276
|
}
|
|
315
277
|
}
|
|
316
278
|
}
|
|
279
|
+
return formattedConfigObject;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
317
282
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
* @typedef {object} Schema
|
|
325
|
-
* @property {{ [field: string]: SchemaProperty | undefined }} properties - Schema properties
|
|
326
|
-
*/
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Schema property for component config
|
|
330
|
-
*
|
|
331
|
-
* @typedef {object} SchemaProperty
|
|
332
|
-
* @property {'string' | 'boolean' | 'number' | 'object'} type - Property type
|
|
333
|
-
*/
|
|
334
|
-
|
|
335
|
-
exports.ButtonMenu = ButtonMenu;
|
|
283
|
+
/**
|
|
284
|
+
* @typedef {object} ButtonMenuConfig
|
|
285
|
+
* @property {string} [buttonText='Actions'] - Label for the toggle button
|
|
286
|
+
* @property {"left" | "right"} [alignMenu='left'] - the alignment of the menu
|
|
287
|
+
* @property {string} [buttonClasses='govuk-button--secondary'] - css classes applied to the toggle button
|
|
288
|
+
*/
|
|
336
289
|
|
|
337
|
-
}
|
|
338
|
-
//# sourceMappingURL=button-menu.
|
|
290
|
+
export { ButtonMenu };
|
|
291
|
+
//# sourceMappingURL=button-menu.bundle.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-menu.bundle.mjs","sources":["../../../../src/moj/components/button-menu/button-menu.mjs"],"sourcesContent":["export class ButtonMenu {\n /**\n * @param {Element | null} $module - HTML element to use for button menu\n * @param {ButtonMenuConfig} [config] - Button menu config\n */\n constructor($module, config = {}) {\n if (!$module || !($module instanceof HTMLElement)) {\n return this\n }\n\n const schema = Object.freeze({\n properties: {\n buttonText: { type: 'string' },\n buttonClasses: { type: 'string' },\n alignMenu: { type: 'string' }\n }\n })\n\n const defaults = {\n buttonText: 'Actions',\n alignMenu: 'left',\n buttonClasses: ''\n }\n // data attributes override JS config, which overrides defaults\n this.config = this.mergeConfigs(\n defaults,\n config,\n this.parseDataset(schema, $module.dataset)\n )\n\n this.$module = $module\n\n // If only one button is provided, don't initiate a menu and toggle button\n // if classes have been provided for the toggleButton, apply them to the single item\n if (this.$module.children.length === 1) {\n const button = this.$module.children[0]\n button.classList.forEach((className) => {\n if (className.startsWith('govuk-button-')) {\n button.classList.remove(className)\n }\n button.classList.remove('moj-button-menu__item')\n button.classList.add('moj-button-menu__single-button')\n })\n if (this.config.buttonClasses) {\n button.classList.add(...this.config.buttonClasses.split(' '))\n }\n }\n // Otherwise intialise a button menu\n if (this.$module.children.length > 1) {\n this.initMenu()\n }\n }\n\n initMenu() {\n this.$menu = this.createMenu()\n this.$module.insertAdjacentHTML('afterbegin', this.toggleTemplate())\n this.setupMenuItems()\n\n this.$menuToggle = this.$module.querySelector(':scope > button')\n this.items = this.$menu.querySelectorAll('a, button')\n\n this.$menuToggle.addEventListener('click', (event) => {\n this.toggleMenu(event)\n })\n\n this.$module.addEventListener('keydown', (event) => {\n this.handleKeyDown(event)\n })\n\n document.addEventListener('click', (event) => {\n if (!this.$module.contains(event.target)) {\n this.closeMenu(false)\n }\n })\n }\n\n createMenu() {\n const $menu = document.createElement('ul')\n $menu.setAttribute('role', 'list')\n $menu.hidden = true\n $menu.classList.add('moj-button-menu__wrapper')\n if (this.config.alignMenu === 'right') {\n $menu.classList.add('moj-button-menu__wrapper--right')\n }\n\n this.$module.appendChild($menu)\n while (this.$module.firstChild !== $menu) {\n $menu.appendChild(this.$module.firstChild)\n }\n\n return $menu\n }\n\n setupMenuItems() {\n Array.from(this.$menu.children).forEach((item) => {\n // wrap item in li tag\n const listItem = document.createElement('li')\n this.$menu.insertBefore(listItem, item)\n listItem.appendChild(item)\n\n item.setAttribute('tabindex', '-1')\n\n if (item.tagName === 'BUTTON') {\n item.setAttribute('type', 'button')\n }\n\n item.classList.forEach((className) => {\n if (className.startsWith('govuk-button')) {\n item.classList.remove(className)\n }\n })\n\n // add a slight delay after click before closing the menu, makes it *feel* better\n item.addEventListener('click', () => {\n setTimeout(() => {\n this.closeMenu(false)\n }, 50)\n })\n })\n }\n\n toggleTemplate() {\n return `\n <button type=\"button\" class=\"govuk-button moj-button-menu__toggle-button ${this.config.buttonClasses || ''}\" aria-haspopup=\"true\" aria-expanded=\"false\">\n <span>\n ${this.config.buttonText}\n <svg width=\"11\" height=\"5\" viewBox=\"0 0 11 5\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5.5 0L11 5L0 5L5.5 0Z\" fill=\"currentColor\"/>\n </svg>\n </span>\n </button>`\n }\n\n /**\n * @returns {boolean}\n */\n isOpen() {\n return this.$menuToggle.getAttribute('aria-expanded') === 'true'\n }\n\n toggleMenu(event) {\n event.preventDefault()\n\n // If menu is triggered with mouse don't move focus to first item\n const keyboardEvent = event.detail === 0\n const focusIndex = keyboardEvent ? 0 : -1\n\n if (this.isOpen()) {\n this.closeMenu()\n } else {\n this.openMenu(focusIndex)\n }\n }\n\n /**\n * Opens the menu and optionally sets the focus to the item with given index\n *\n * @param {number} focusIndex - The index of the item to focus\n */\n openMenu(focusIndex = 0) {\n this.$menu.hidden = false\n this.$menuToggle.setAttribute('aria-expanded', 'true')\n if (focusIndex !== -1) {\n this.focusItem(focusIndex)\n }\n }\n\n /**\n * Closes the menu and optionally returns focus back to menuToggle\n *\n * @param {boolean} moveFocus - whether to return focus to the toggle button\n */\n closeMenu(moveFocus = true) {\n this.$menu.hidden = true\n this.$menuToggle.setAttribute('aria-expanded', 'false')\n if (moveFocus) {\n this.$menuToggle.focus()\n }\n }\n\n /**\n * Focuses the menu item at the specified index\n *\n * @param {number} index - the index of the item to focus\n */\n focusItem(index) {\n if (index >= this.items.length) index = 0\n if (index < 0) index = this.items.length - 1\n\n const menuItem = this.items.item(index)\n if (menuItem) {\n menuItem.focus()\n }\n }\n\n currentFocusIndex() {\n const activeElement = document.activeElement\n const menuItems = Array.from(this.items)\n\n return menuItems.indexOf(activeElement)\n }\n\n handleKeyDown(event) {\n if (event.target === this.$menuToggle) {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n this.openMenu()\n break\n case 'ArrowUp':\n event.preventDefault()\n this.openMenu(this.items.length - 1)\n break\n }\n }\n\n if (this.$menu.contains(event.target) && this.isOpen()) {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n if (this.currentFocusIndex() !== -1) {\n this.focusItem(this.currentFocusIndex() + 1)\n }\n break\n case 'ArrowUp':\n event.preventDefault()\n if (this.currentFocusIndex() !== -1) {\n this.focusItem(this.currentFocusIndex() - 1)\n }\n break\n case 'Home':\n event.preventDefault()\n this.focusItem(0)\n break\n case 'End':\n event.preventDefault()\n this.focusItem(this.items.length - 1)\n break\n }\n }\n\n if (event.key === 'Escape' && this.isOpen()) {\n this.closeMenu()\n }\n if (event.key === 'Tab' && this.isOpen()) {\n this.closeMenu(false)\n }\n }\n\n /**\n * Parse dataset\n *\n * Loop over an object and normalise each value using {@link normaliseString},\n * optionally expanding nested `i18n.field`\n *\n * @param {Schema} schema - component schema\n * @param {DOMStringMap} dataset - HTML element dataset\n * @returns {object} Normalised dataset\n */\n parseDataset(schema, dataset) {\n const parsed = {}\n\n for (const [field, ,] of Object.entries(schema.properties)) {\n if (field in dataset) {\n if (dataset[field]) {\n parsed[field] = dataset[field]\n }\n }\n }\n\n return parsed\n }\n\n /**\n * Config merging function\n *\n * Takes any number of objects and combines them together, with\n * greatest priority on the LAST item passed in.\n *\n * @param {...{ [key: string]: unknown }} configObjects - Config objects to merge\n * @returns {{ [key: string]: unknown }} A merged config object\n */\n mergeConfigs(...configObjects) {\n const formattedConfigObject = {}\n\n // Loop through each of the passed objects\n for (const configObject of configObjects) {\n for (const key of Object.keys(configObject)) {\n const option = formattedConfigObject[key]\n const override = configObject[key]\n\n // Push their keys one-by-one into formattedConfigObject. Any duplicate\n // keys with object values will be merged, otherwise the new value will\n // override the existing value.\n if (typeof option === 'object' && typeof override === 'object') {\n // @ts-expect-error Index signature for type 'string' is missing\n formattedConfigObject[key] = this.mergeConfigs(option, override)\n } else {\n formattedConfigObject[key] = override\n }\n }\n }\n\n return formattedConfigObject\n }\n}\n\n/**\n * @typedef {object} ButtonMenuConfig\n * @property {string} [buttonText='Actions'] - Label for the toggle button\n * @property {\"left\" | \"right\"} [alignMenu='left'] - the alignment of the menu\n * @property {string} [buttonClasses='govuk-button--secondary'] - css classes applied to the toggle button\n */\n"],"names":["ButtonMenu","constructor","$module","config","HTMLElement","schema","Object","freeze","properties","buttonText","type","buttonClasses","alignMenu","defaults","mergeConfigs","parseDataset","dataset","children","length","button","classList","forEach","className","startsWith","remove","add","split","initMenu","$menu","createMenu","insertAdjacentHTML","toggleTemplate","setupMenuItems","$menuToggle","querySelector","items","querySelectorAll","addEventListener","event","toggleMenu","handleKeyDown","document","contains","target","closeMenu","createElement","setAttribute","hidden","appendChild","firstChild","Array","from","item","listItem","insertBefore","tagName","setTimeout","isOpen","getAttribute","preventDefault","keyboardEvent","detail","focusIndex","openMenu","focusItem","moveFocus","focus","index","menuItem","currentFocusIndex","activeElement","menuItems","indexOf","key","parsed","field","entries","configObjects","formattedConfigObject","configObject","keys","option","override"],"mappings":"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"}
|