@ministryofjustice/frontend 5.2.0 → 6.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 (76) hide show
  1. package/moj/all.bundle.js +16 -8
  2. package/moj/all.bundle.js.map +1 -1
  3. package/moj/all.bundle.mjs +71 -34
  4. package/moj/all.bundle.mjs.map +1 -1
  5. package/moj/all.mjs +13 -5
  6. package/moj/all.mjs.map +1 -1
  7. package/moj/common/index.mjs.map +1 -1
  8. package/moj/common/moj-frontend-version.mjs +1 -1
  9. package/moj/components/add-another/add-another.bundle.js.map +1 -1
  10. package/moj/components/add-another/add-another.bundle.mjs +10 -2
  11. package/moj/components/add-another/add-another.bundle.mjs.map +1 -1
  12. package/moj/components/add-another/add-another.mjs.map +1 -1
  13. package/moj/components/alert/alert.bundle.js +1 -1
  14. package/moj/components/alert/alert.bundle.js.map +1 -1
  15. package/moj/components/alert/alert.bundle.mjs +5 -3
  16. package/moj/components/alert/alert.bundle.mjs.map +1 -1
  17. package/moj/components/alert/alert.mjs.map +1 -1
  18. package/moj/components/button-menu/button-menu.bundle.js.map +1 -1
  19. package/moj/components/button-menu/button-menu.bundle.mjs +4 -2
  20. package/moj/components/button-menu/button-menu.bundle.mjs.map +1 -1
  21. package/moj/components/button-menu/button-menu.mjs.map +1 -1
  22. package/moj/components/date-picker/date-picker.bundle.js +1 -1
  23. package/moj/components/date-picker/date-picker.bundle.js.map +1 -1
  24. package/moj/components/date-picker/date-picker.bundle.mjs +5 -3
  25. package/moj/components/date-picker/date-picker.bundle.mjs.map +1 -1
  26. package/moj/components/date-picker/date-picker.mjs +1 -1
  27. package/moj/components/date-picker/date-picker.mjs.map +1 -1
  28. package/moj/components/domain-specific/probation/header/header.bundle.js.map +1 -1
  29. package/moj/components/domain-specific/probation/header/header.bundle.mjs +10 -2
  30. package/moj/components/domain-specific/probation/header/header.bundle.mjs.map +1 -1
  31. package/moj/components/domain-specific/probation/header/header.mjs.map +1 -1
  32. package/moj/components/filter-toggle-button/filter-toggle-button.bundle.js.map +1 -1
  33. package/moj/components/filter-toggle-button/filter-toggle-button.bundle.mjs +4 -2
  34. package/moj/components/filter-toggle-button/filter-toggle-button.bundle.mjs.map +1 -1
  35. package/moj/components/filter-toggle-button/filter-toggle-button.mjs.map +1 -1
  36. package/moj/components/form-validator/form-validator.bundle.js.map +1 -1
  37. package/moj/components/form-validator/form-validator.bundle.mjs +4 -2
  38. package/moj/components/form-validator/form-validator.bundle.mjs.map +1 -1
  39. package/moj/components/form-validator/form-validator.mjs.map +1 -1
  40. package/moj/components/multi-file-upload/multi-file-upload.bundle.js.map +1 -1
  41. package/moj/components/multi-file-upload/multi-file-upload.bundle.mjs +4 -2
  42. package/moj/components/multi-file-upload/multi-file-upload.bundle.mjs.map +1 -1
  43. package/moj/components/multi-file-upload/multi-file-upload.mjs.map +1 -1
  44. package/moj/components/multi-select/multi-select.bundle.js.map +1 -1
  45. package/moj/components/multi-select/multi-select.bundle.mjs +4 -2
  46. package/moj/components/multi-select/multi-select.bundle.mjs.map +1 -1
  47. package/moj/components/multi-select/multi-select.mjs.map +1 -1
  48. package/moj/components/notification-badge/_notification-badge.scss +10 -6
  49. package/moj/components/notification-badge/_notification-badge.scss.map +1 -1
  50. package/moj/components/notification-badge/template.njk +11 -5
  51. package/moj/components/password-reveal/password-reveal.bundle.js.map +1 -1
  52. package/moj/components/password-reveal/password-reveal.bundle.mjs +10 -2
  53. package/moj/components/password-reveal/password-reveal.bundle.mjs.map +1 -1
  54. package/moj/components/password-reveal/password-reveal.mjs.map +1 -1
  55. package/moj/components/rich-text-editor/rich-text-editor.bundle.js.map +1 -1
  56. package/moj/components/rich-text-editor/rich-text-editor.bundle.mjs +4 -2
  57. package/moj/components/rich-text-editor/rich-text-editor.bundle.mjs.map +1 -1
  58. package/moj/components/rich-text-editor/rich-text-editor.mjs.map +1 -1
  59. package/moj/components/search-toggle/search-toggle.bundle.js.map +1 -1
  60. package/moj/components/search-toggle/search-toggle.bundle.mjs +4 -2
  61. package/moj/components/search-toggle/search-toggle.bundle.mjs.map +1 -1
  62. package/moj/components/search-toggle/search-toggle.mjs.map +1 -1
  63. package/moj/components/sortable-table/sortable-table.bundle.js.map +1 -1
  64. package/moj/components/sortable-table/sortable-table.bundle.mjs +4 -2
  65. package/moj/components/sortable-table/sortable-table.bundle.mjs.map +1 -1
  66. package/moj/components/sortable-table/sortable-table.mjs.map +1 -1
  67. package/moj/core/_moj-frontend-properties.scss +1 -1
  68. package/moj/helpers.bundle.js.map +1 -1
  69. package/moj/helpers.bundle.mjs.map +1 -1
  70. package/moj/helpers.mjs +1 -1
  71. package/moj/helpers.mjs.map +1 -1
  72. package/moj/moj-frontend.min.css +1 -1
  73. package/moj/moj-frontend.min.css.map +1 -1
  74. package/moj/moj-frontend.min.js +1 -1
  75. package/moj/moj-frontend.min.js.map +1 -1
  76. package/package.json +2 -2
package/moj/all.mjs CHANGED
@@ -15,16 +15,24 @@ import { SearchToggle } from './components/search-toggle/search-toggle.mjs';
15
15
  import { SortableTable } from './components/sortable-table/sortable-table.mjs';
16
16
 
17
17
  /**
18
- * @param {Config} [config]
18
+ * Initialise all components
19
+ *
20
+ * Use the `data-module` attributes to find, instantiate and init all of the
21
+ * components provided as part of MOJ Frontend.
22
+ *
23
+ * @param {Config | Element | Document | null} [scopeOrConfig]
19
24
  */
20
- function initAll(config) {
21
- for (const Component of [AddAnother, Alert, ButtonMenu, DatePicker, MultiSelect, PasswordReveal, RichTextEditor, SearchToggle, SortableTable, PdsHeader]) {
22
- createAll(Component, undefined, config);
25
+ function initAll(scopeOrConfig) {
26
+ for (const Component of [AddAnother, Alert, ButtonMenu, DatePicker, MultiSelect, PasswordReveal, PdsHeader, RichTextEditor, SearchToggle, SortableTable]) {
27
+ createAll(Component, undefined, scopeOrConfig);
23
28
  }
24
29
  }
25
30
 
26
31
  /**
27
- * @typedef {Parameters<typeof GOVUKFrontend.initAll>[0]} Config
32
+ * Config for all components via `initAll()`
33
+ *
34
+ * @typedef {object} Config
35
+ * @property {Element | Document | null } scope - the scope to search for components in
28
36
  */
29
37
 
30
38
  /**
package/moj/all.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"all.mjs","sources":["../../src/moj/all.mjs"],"sourcesContent":["import { createAll } from 'govuk-frontend'\n\nimport { version } from './common/moj-frontend-version.mjs'\nimport { AddAnother } from './components/add-another/add-another.mjs'\nimport { Alert } from './components/alert/alert.mjs'\nimport { ButtonMenu } from './components/button-menu/button-menu.mjs'\nimport { DatePicker } from './components/date-picker/date-picker.mjs'\nimport { PdsHeader } from './components/domain-specific/probation/header/header.mjs'\nimport { FilterToggleButton } from './components/filter-toggle-button/filter-toggle-button.mjs'\nimport { FormValidator } from './components/form-validator/form-validator.mjs'\nimport { MultiFileUpload } from './components/multi-file-upload/multi-file-upload.mjs'\nimport { MultiSelect } from './components/multi-select/multi-select.mjs'\nimport { PasswordReveal } from './components/password-reveal/password-reveal.mjs'\nimport { RichTextEditor } from './components/rich-text-editor/rich-text-editor.mjs'\nimport { SearchToggle } from './components/search-toggle/search-toggle.mjs'\nimport { SortableTable } from './components/sortable-table/sortable-table.mjs'\n\n/**\n * @param {Config} [config]\n */\nfunction initAll(config) {\n for (const Component of [\n AddAnother,\n Alert,\n ButtonMenu,\n DatePicker,\n MultiSelect,\n PasswordReveal,\n RichTextEditor,\n SearchToggle,\n SortableTable,\n PdsHeader\n ]) {\n createAll(Component, undefined, config)\n }\n}\n\nexport {\n initAll,\n version,\n\n // Components\n AddAnother,\n Alert,\n ButtonMenu,\n DatePicker,\n FilterToggleButton,\n FormValidator,\n MultiFileUpload,\n MultiSelect,\n PasswordReveal,\n RichTextEditor,\n SearchToggle,\n SortableTable,\n PdsHeader\n}\n\n/**\n * @typedef {Parameters<typeof GOVUKFrontend.initAll>[0]} Config\n */\n\n/**\n * @import * as GOVUKFrontend from 'govuk-frontend'\n */\n"],"names":["initAll","config","Component","AddAnother","Alert","ButtonMenu","DatePicker","MultiSelect","PasswordReveal","RichTextEditor","SearchToggle","SortableTable","PdsHeader","createAll","undefined"],"mappings":";;;;;;;;;;;;;;;;AAiBA;AACA;AACA;AACA,SAASA,OAAOA,CAACC,MAAM,EAAE;EACvB,KAAK,MAAMC,SAAS,IAAI,CACtBC,UAAU,EACVC,KAAK,EACLC,UAAU,EACVC,UAAU,EACVC,WAAW,EACXC,cAAc,EACdC,cAAc,EACdC,YAAY,EACZC,aAAa,EACbC,SAAS,CACV,EAAE;AACDC,IAAAA,SAAS,CAACX,SAAS,EAAEY,SAAS,EAAEb,MAAM,CAAC;AACzC;AACF;;AAsBA;AACA;AACA;;AAEA;AACA;AACA;;;;"}
1
+ {"version":3,"file":"all.mjs","sources":["../../src/moj/all.mjs"],"sourcesContent":["import { createAll } from 'govuk-frontend'\n\nimport { version } from './common/moj-frontend-version.mjs'\nimport { AddAnother } from './components/add-another/add-another.mjs'\nimport { Alert } from './components/alert/alert.mjs'\nimport { ButtonMenu } from './components/button-menu/button-menu.mjs'\nimport { DatePicker } from './components/date-picker/date-picker.mjs'\nimport { PdsHeader } from './components/domain-specific/probation/header/header.mjs'\nimport { FilterToggleButton } from './components/filter-toggle-button/filter-toggle-button.mjs'\nimport { FormValidator } from './components/form-validator/form-validator.mjs'\nimport { MultiFileUpload } from './components/multi-file-upload/multi-file-upload.mjs'\nimport { MultiSelect } from './components/multi-select/multi-select.mjs'\nimport { PasswordReveal } from './components/password-reveal/password-reveal.mjs'\nimport { RichTextEditor } from './components/rich-text-editor/rich-text-editor.mjs'\nimport { SearchToggle } from './components/search-toggle/search-toggle.mjs'\nimport { SortableTable } from './components/sortable-table/sortable-table.mjs'\n\n/**\n * Initialise all components\n *\n * Use the `data-module` attributes to find, instantiate and init all of the\n * components provided as part of MOJ Frontend.\n *\n * @param {Config | Element | Document | null} [scopeOrConfig]\n */\nfunction initAll(scopeOrConfig) {\n for (const Component of [\n AddAnother,\n Alert,\n ButtonMenu,\n DatePicker,\n MultiSelect,\n PasswordReveal,\n PdsHeader,\n RichTextEditor,\n SearchToggle,\n SortableTable\n ]) {\n createAll(Component, undefined, scopeOrConfig)\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 PdsHeader,\n RichTextEditor,\n SearchToggle,\n SortableTable\n}\n\n/**\n * Config for all components via `initAll()`\n *\n * @typedef {object} Config\n * @property {Element | Document | null } scope - the scope to search for components in\n */\n\n/**\n * @import * as GOVUKFrontend from 'govuk-frontend'\n */\n"],"names":["initAll","scopeOrConfig","Component","AddAnother","Alert","ButtonMenu","DatePicker","MultiSelect","PasswordReveal","PdsHeader","RichTextEditor","SearchToggle","SortableTable","createAll","undefined"],"mappings":";;;;;;;;;;;;;;;;AAiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,OAAOA,CAACC,aAAa,EAAE;EAC9B,KAAK,MAAMC,SAAS,IAAI,CACtBC,UAAU,EACVC,KAAK,EACLC,UAAU,EACVC,UAAU,EACVC,WAAW,EACXC,cAAc,EACdC,SAAS,EACTC,cAAc,EACdC,YAAY,EACZC,aAAa,CACd,EAAE;AACDC,IAAAA,SAAS,CAACX,SAAS,EAAEY,SAAS,EAAEb,aAAa,CAAC;AAChD,EAAA;AACF;;AAsBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/moj/common/index.mjs"],"sourcesContent":["/**\n * GOV.UK Frontend helpers\n *\n * @todo Import from GOV.UK Frontend\n */\n\n/**\n * Move focus to element\n *\n * Sets tabindex to -1 to make the element programmatically focusable,\n * but removes it on blur as the element doesn't need to be focused again.\n *\n * @template {HTMLElement} FocusElement\n * @param {FocusElement} $element - HTML element\n * @param {object} [options] - Handler options\n * @param {function(this: FocusElement): void} [options.onBeforeFocus] - Callback before focus\n * @param {function(this: FocusElement): void} [options.onBlur] - Callback on blur\n */\nexport function setFocus($element, options = {}) {\n const isFocusable = $element.getAttribute('tabindex')\n\n if (!isFocusable) {\n $element.setAttribute('tabindex', '-1')\n }\n\n /**\n * Handle element focus\n */\n function onFocus() {\n $element.addEventListener('blur', onBlur, { once: true })\n }\n\n /**\n * Handle element blur\n */\n function onBlur() {\n options.onBlur?.call($element)\n\n if (!isFocusable) {\n $element.removeAttribute('tabindex')\n }\n }\n\n // Add listener to reset element on blur, after focus\n $element.addEventListener('focus', onFocus, { once: true })\n\n // Focus element\n options.onBeforeFocus?.call($element)\n $element.focus()\n}\n"],"names":["setFocus","$element","options","_options$onBeforeFocu","isFocusable","getAttribute","setAttribute","onFocus","addEventListener","onBlur","once","_options$onBlur","call","removeAttribute","onBeforeFocus","focus"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,QAAQA,CAACC,QAAQ,EAAEC,OAAO,GAAG,EAAE,EAAE;AAAA,EAAA,IAAAC,qBAAA;AAC/C,EAAA,MAAMC,WAAW,GAAGH,QAAQ,CAACI,YAAY,CAAC,UAAU,CAAC;EAErD,IAAI,CAACD,WAAW,EAAE;AAChBH,IAAAA,QAAQ,CAACK,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC;AACzC;;AAEA;AACF;AACA;EACE,SAASC,OAAOA,GAAG;AACjBN,IAAAA,QAAQ,CAACO,gBAAgB,CAAC,MAAM,EAAEC,MAAM,EAAE;AAAEC,MAAAA,IAAI,EAAE;AAAK,KAAC,CAAC;AAC3D;;AAEA;AACF;AACA;EACE,SAASD,MAAMA,GAAG;AAAA,IAAA,IAAAE,eAAA;IAChB,CAAAA,eAAA,GAAAT,OAAO,CAACO,MAAM,KAAdE,IAAAA,IAAAA,eAAA,CAAgBC,IAAI,CAACX,QAAQ,CAAC;IAE9B,IAAI,CAACG,WAAW,EAAE;AAChBH,MAAAA,QAAQ,CAACY,eAAe,CAAC,UAAU,CAAC;AACtC;AACF;;AAEA;AACAZ,EAAAA,QAAQ,CAACO,gBAAgB,CAAC,OAAO,EAAED,OAAO,EAAE;AAAEG,IAAAA,IAAI,EAAE;AAAK,GAAC,CAAC;;AAE3D;EACA,CAAAP,qBAAA,GAAAD,OAAO,CAACY,aAAa,KAArBX,IAAAA,IAAAA,qBAAA,CAAuBS,IAAI,CAACX,QAAQ,CAAC;EACrCA,QAAQ,CAACc,KAAK,EAAE;AAClB;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/moj/common/index.mjs"],"sourcesContent":["/**\n * GOV.UK Frontend helpers\n *\n * @todo Import from GOV.UK Frontend\n */\n\n/**\n * Move focus to element\n *\n * Sets tabindex to -1 to make the element programmatically focusable,\n * but removes it on blur as the element doesn't need to be focused again.\n *\n * @template {HTMLElement} FocusElement\n * @param {FocusElement} $element - HTML element\n * @param {object} [options] - Handler options\n * @param {function(this: FocusElement): void} [options.onBeforeFocus] - Callback before focus\n * @param {function(this: FocusElement): void} [options.onBlur] - Callback on blur\n */\nexport function setFocus($element, options = {}) {\n const isFocusable = $element.getAttribute('tabindex')\n\n if (!isFocusable) {\n $element.setAttribute('tabindex', '-1')\n }\n\n /**\n * Handle element focus\n */\n function onFocus() {\n $element.addEventListener('blur', onBlur, { once: true })\n }\n\n /**\n * Handle element blur\n */\n function onBlur() {\n options.onBlur?.call($element)\n\n if (!isFocusable) {\n $element.removeAttribute('tabindex')\n }\n }\n\n // Add listener to reset element on blur, after focus\n $element.addEventListener('focus', onFocus, { once: true })\n\n // Focus element\n options.onBeforeFocus?.call($element)\n $element.focus()\n}\n"],"names":["setFocus","$element","options","_options$onBeforeFocu","isFocusable","getAttribute","setAttribute","onFocus","addEventListener","onBlur","once","_options$onBlur","call","removeAttribute","onBeforeFocus","focus"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,QAAQA,CAACC,QAAQ,EAAEC,OAAO,GAAG,EAAE,EAAE;AAAA,EAAA,IAAAC,qBAAA;AAC/C,EAAA,MAAMC,WAAW,GAAGH,QAAQ,CAACI,YAAY,CAAC,UAAU,CAAC;EAErD,IAAI,CAACD,WAAW,EAAE;AAChBH,IAAAA,QAAQ,CAACK,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC;AACzC,EAAA;;AAEA;AACF;AACA;EACE,SAASC,OAAOA,GAAG;AACjBN,IAAAA,QAAQ,CAACO,gBAAgB,CAAC,MAAM,EAAEC,MAAM,EAAE;AAAEC,MAAAA,IAAI,EAAE;AAAK,KAAC,CAAC;AAC3D,EAAA;;AAEA;AACF;AACA;EACE,SAASD,MAAMA,GAAG;AAAA,IAAA,IAAAE,eAAA;IAChB,CAAAA,eAAA,GAAAT,OAAO,CAACO,MAAM,KAAA,IAAA,IAAdE,eAAA,CAAgBC,IAAI,CAACX,QAAQ,CAAC;IAE9B,IAAI,CAACG,WAAW,EAAE;AAChBH,MAAAA,QAAQ,CAACY,eAAe,CAAC,UAAU,CAAC;AACtC,IAAA;AACF,EAAA;;AAEA;AACAZ,EAAAA,QAAQ,CAACO,gBAAgB,CAAC,OAAO,EAAED,OAAO,EAAE;AAAEG,IAAAA,IAAI,EAAE;AAAK,GAAC,CAAC;;AAE3D;EACA,CAAAP,qBAAA,GAAAD,OAAO,CAACY,aAAa,KAAA,IAAA,IAArBX,qBAAA,CAAuBS,IAAI,CAACX,QAAQ,CAAC;EACrCA,QAAQ,CAACc,KAAK,EAAE;AAClB;;;;"}
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * {@link https://github.com/ministryofjustice/moj-frontend/releases}
10
10
  */
11
- const version = '5.2.0';
11
+ const version = '6.0.0';
12
12
 
13
13
  export { version };
14
14
  //# sourceMappingURL=moj-frontend-version.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"add-another.bundle.js","sources":["../../../../src/moj/components/add-another/add-another.mjs"],"sourcesContent":["import { Component } from 'govuk-frontend'\n\nexport class AddAnother extends Component {\n /**\n * @param {Element | null} $root - HTML element to use for add another\n */\n constructor($root) {\n super($root)\n\n this.$root.addEventListener('click', this.onRemoveButtonClick.bind(this))\n this.$root.addEventListener('click', this.onAddButtonClick.bind(this))\n\n const $buttons = this.$root.querySelectorAll(\n '.moj-add-another__add-button, moj-add-another__remove-button'\n )\n\n $buttons.forEach(($button) => {\n if (!($button instanceof HTMLButtonElement)) {\n return\n }\n\n $button.type = 'button'\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onAddButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__add-button')\n ) {\n return\n }\n\n const $items = this.getItems()\n const $item = this.getNewItem()\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n this.updateAttributes($item, $items.length)\n this.resetItem($item)\n\n const $firstItem = $items[0]\n if (!this.hasRemoveButton($firstItem)) {\n this.createRemoveButton($firstItem)\n }\n\n $items[$items.length - 1].after($item)\n\n const $input = $item.querySelector('input, textarea, select')\n if ($input && $input instanceof HTMLInputElement) {\n $input.focus()\n }\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n hasRemoveButton($item) {\n return $item.querySelectorAll('.moj-add-another__remove-button').length\n }\n\n getItems() {\n if (!this.$root) {\n return []\n }\n\n const $items = Array.from(\n this.$root.querySelectorAll('.moj-add-another__item')\n )\n\n return $items.filter((item) => item instanceof HTMLElement)\n }\n\n getNewItem() {\n const $items = this.getItems()\n const $item = $items[0].cloneNode(true)\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n if (!this.hasRemoveButton($item)) {\n this.createRemoveButton($item)\n }\n\n return $item\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n * @param {number} index - Add another item index\n */\n updateAttributes($item, index) {\n $item.querySelectorAll('[data-name]').forEach(($input) => {\n if (!this.isValidInputElement($input)) {\n return\n }\n\n const name = $input.getAttribute('data-name') || ''\n const id = $input.getAttribute('data-id') || ''\n const originalId = $input.id\n\n $input.name = name.replace(/%index%/, `${index}`)\n $input.id = id.replace(/%index%/, `${index}`)\n\n const $label =\n $input.parentElement.querySelector('label') ||\n $input.closest('label') ||\n $item.querySelector(`[for=\"${originalId}\"]`)\n\n if ($label && $label instanceof HTMLLabelElement) {\n $label.htmlFor = $input.id\n }\n })\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n createRemoveButton($item) {\n const $button = document.createElement('button')\n $button.type = 'button'\n\n $button.classList.add(\n 'govuk-button',\n 'govuk-button--secondary',\n 'moj-add-another__remove-button'\n )\n\n $button.textContent = 'Remove'\n\n $item.append($button)\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n resetItem($item) {\n $item.querySelectorAll('[data-name], [data-id]').forEach(($input) => {\n if (!this.isValidInputElement($input)) {\n return\n }\n\n if ($input instanceof HTMLSelectElement) {\n $input.selectedIndex = -1\n $input.value = ''\n } else if ($input instanceof HTMLTextAreaElement) {\n $input.value = ''\n } else {\n switch ($input.type) {\n case 'checkbox':\n case 'radio':\n $input.checked = false\n break\n default:\n $input.value = ''\n }\n }\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onRemoveButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__remove-button')\n ) {\n return\n }\n\n $button.closest('.moj-add-another__item').remove()\n\n const $items = this.getItems()\n\n if ($items.length === 1) {\n $items[0].querySelector('.moj-add-another__remove-button').remove()\n }\n\n $items.forEach(($item, index) => {\n this.updateAttributes($item, index)\n })\n\n this.focusHeading()\n }\n\n focusHeading() {\n const $heading = this.$root.querySelector('.moj-add-another__heading')\n\n if ($heading && $heading instanceof HTMLElement) {\n $heading.focus()\n }\n }\n\n /**\n * @param {Element} $input - the input to validate\n */\n isValidInputElement($input) {\n return (\n $input instanceof HTMLInputElement ||\n $input instanceof HTMLSelectElement ||\n $input instanceof HTMLTextAreaElement\n )\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'moj-add-another'\n}\n"],"names":["AddAnother","Component","constructor","$root","addEventListener","onRemoveButtonClick","bind","onAddButtonClick","$buttons","querySelectorAll","forEach","$button","HTMLButtonElement","type","event","target","classList","contains","$items","getItems","$item","getNewItem","HTMLElement","updateAttributes","length","resetItem","$firstItem","hasRemoveButton","createRemoveButton","after","$input","querySelector","HTMLInputElement","focus","Array","from","filter","item","cloneNode","index","isValidInputElement","name","getAttribute","id","originalId","replace","$label","parentElement","closest","HTMLLabelElement","htmlFor","document","createElement","add","textContent","append","HTMLSelectElement","selectedIndex","value","HTMLTextAreaElement","checked","remove","focusHeading","$heading","moduleName"],"mappings":"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"}
1
+ {"version":3,"file":"add-another.bundle.js","sources":["../../../../src/moj/components/add-another/add-another.mjs"],"sourcesContent":["import { Component } from 'govuk-frontend'\n\nexport class AddAnother extends Component {\n /**\n * @param {Element | null} $root - HTML element to use for add another\n */\n constructor($root) {\n super($root)\n\n this.$root.addEventListener('click', this.onRemoveButtonClick.bind(this))\n this.$root.addEventListener('click', this.onAddButtonClick.bind(this))\n\n const $buttons = this.$root.querySelectorAll(\n '.moj-add-another__add-button, moj-add-another__remove-button'\n )\n\n $buttons.forEach(($button) => {\n if (!($button instanceof HTMLButtonElement)) {\n return\n }\n\n $button.type = 'button'\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onAddButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__add-button')\n ) {\n return\n }\n\n const $items = this.getItems()\n const $item = this.getNewItem()\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n this.updateAttributes($item, $items.length)\n this.resetItem($item)\n\n const $firstItem = $items[0]\n if (!this.hasRemoveButton($firstItem)) {\n this.createRemoveButton($firstItem)\n }\n\n $items[$items.length - 1].after($item)\n\n const $input = $item.querySelector('input, textarea, select')\n if ($input && $input instanceof HTMLInputElement) {\n $input.focus()\n }\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n hasRemoveButton($item) {\n return $item.querySelectorAll('.moj-add-another__remove-button').length\n }\n\n getItems() {\n if (!this.$root) {\n return []\n }\n\n const $items = Array.from(\n this.$root.querySelectorAll('.moj-add-another__item')\n )\n\n return $items.filter((item) => item instanceof HTMLElement)\n }\n\n getNewItem() {\n const $items = this.getItems()\n const $item = $items[0].cloneNode(true)\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n if (!this.hasRemoveButton($item)) {\n this.createRemoveButton($item)\n }\n\n return $item\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n * @param {number} index - Add another item index\n */\n updateAttributes($item, index) {\n $item.querySelectorAll('[data-name]').forEach(($input) => {\n if (!this.isValidInputElement($input)) {\n return\n }\n\n const name = $input.getAttribute('data-name') || ''\n const id = $input.getAttribute('data-id') || ''\n const originalId = $input.id\n\n $input.name = name.replace(/%index%/, `${index}`)\n $input.id = id.replace(/%index%/, `${index}`)\n\n const $label =\n $input.parentElement.querySelector('label') ||\n $input.closest('label') ||\n $item.querySelector(`[for=\"${originalId}\"]`)\n\n if ($label && $label instanceof HTMLLabelElement) {\n $label.htmlFor = $input.id\n }\n })\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n createRemoveButton($item) {\n const $button = document.createElement('button')\n $button.type = 'button'\n\n $button.classList.add(\n 'govuk-button',\n 'govuk-button--secondary',\n 'moj-add-another__remove-button'\n )\n\n $button.textContent = 'Remove'\n\n $item.append($button)\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n resetItem($item) {\n $item.querySelectorAll('[data-name], [data-id]').forEach(($input) => {\n if (!this.isValidInputElement($input)) {\n return\n }\n\n if ($input instanceof HTMLSelectElement) {\n $input.selectedIndex = -1\n $input.value = ''\n } else if ($input instanceof HTMLTextAreaElement) {\n $input.value = ''\n } else {\n switch ($input.type) {\n case 'checkbox':\n case 'radio':\n $input.checked = false\n break\n default:\n $input.value = ''\n }\n }\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onRemoveButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__remove-button')\n ) {\n return\n }\n\n $button.closest('.moj-add-another__item').remove()\n\n const $items = this.getItems()\n\n if ($items.length === 1) {\n $items[0].querySelector('.moj-add-another__remove-button').remove()\n }\n\n $items.forEach(($item, index) => {\n this.updateAttributes($item, index)\n })\n\n this.focusHeading()\n }\n\n focusHeading() {\n const $heading = this.$root.querySelector('.moj-add-another__heading')\n\n if ($heading && $heading instanceof HTMLElement) {\n $heading.focus()\n }\n }\n\n /**\n * @param {Element} $input - the input to validate\n */\n isValidInputElement($input) {\n return (\n $input instanceof HTMLInputElement ||\n $input instanceof HTMLSelectElement ||\n $input instanceof HTMLTextAreaElement\n )\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'moj-add-another'\n}\n"],"names":["AddAnother","Component","constructor","$root","addEventListener","onRemoveButtonClick","bind","onAddButtonClick","$buttons","querySelectorAll","forEach","$button","HTMLButtonElement","type","event","target","classList","contains","$items","getItems","$item","getNewItem","HTMLElement","updateAttributes","length","resetItem","$firstItem","hasRemoveButton","createRemoveButton","after","$input","querySelector","HTMLInputElement","focus","Array","from","filter","item","cloneNode","index","isValidInputElement","name","getAttribute","id","originalId","replace","$label","parentElement","closest","HTMLLabelElement","htmlFor","document","createElement","add","textContent","append","HTMLSelectElement","selectedIndex","value","HTMLTextAreaElement","checked","remove","focusHeading","$heading","moduleName"],"mappings":"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"}
@@ -17,6 +17,12 @@ function isSupported($scope = document.body) {
17
17
  }
18
18
  return $scope.classList.contains('govuk-frontend-supported');
19
19
  }
20
+ function isArray(option) {
21
+ return Array.isArray(option);
22
+ }
23
+ function isObject(option) {
24
+ return !!option && typeof option === 'object' && !isArray(option);
25
+ }
20
26
  function formatErrorMessage(Component, message) {
21
27
  return `${Component.moduleName}: ${message}`;
22
28
  }
@@ -42,7 +48,7 @@ class SupportError extends GOVUKFrontendError {
42
48
  class ElementError extends GOVUKFrontendError {
43
49
  constructor(messageOrOptions) {
44
50
  let message = typeof messageOrOptions === 'string' ? messageOrOptions : '';
45
- if (typeof messageOrOptions === 'object') {
51
+ if (isObject(messageOrOptions)) {
46
52
  const {
47
53
  component,
48
54
  identifier,
@@ -51,7 +57,9 @@ class ElementError extends GOVUKFrontendError {
51
57
  } = messageOrOptions;
52
58
  message = identifier;
53
59
  message += element ? ` is not of type ${expectedType != null ? expectedType : 'HTMLElement'}` : ' not found';
54
- message = formatErrorMessage(component, message);
60
+ if (component) {
61
+ message = formatErrorMessage(component, message);
62
+ }
55
63
  }
56
64
  super(message);
57
65
  this.name = 'ElementError';
@@ -1 +1 @@
1
- {"version":3,"file":"add-another.bundle.mjs","sources":["../../../../node_modules/govuk-frontend/dist/govuk/common/index.mjs","../../../../node_modules/govuk-frontend/dist/govuk/errors/index.mjs","../../../../node_modules/govuk-frontend/dist/govuk/component.mjs","../../../../src/moj/components/add-another/add-another.mjs"],"sourcesContent":["function getFragmentFromUrl(url) {\n if (!url.includes('#')) {\n return undefined;\n }\n return url.split('#').pop();\n}\nfunction getBreakpoint(name) {\n const property = `--govuk-frontend-breakpoint-${name}`;\n const value = window.getComputedStyle(document.documentElement).getPropertyValue(property);\n return {\n property,\n value: value || undefined\n };\n}\nfunction setFocus($element, options = {}) {\n var _options$onBeforeFocu;\n const isFocusable = $element.getAttribute('tabindex');\n if (!isFocusable) {\n $element.setAttribute('tabindex', '-1');\n }\n function onFocus() {\n $element.addEventListener('blur', onBlur, {\n once: true\n });\n }\n function onBlur() {\n var _options$onBlur;\n (_options$onBlur = options.onBlur) == null || _options$onBlur.call($element);\n if (!isFocusable) {\n $element.removeAttribute('tabindex');\n }\n }\n $element.addEventListener('focus', onFocus, {\n once: true\n });\n (_options$onBeforeFocu = options.onBeforeFocus) == null || _options$onBeforeFocu.call($element);\n $element.focus();\n}\nfunction isInitialised($root, moduleName) {\n return $root instanceof HTMLElement && $root.hasAttribute(`data-${moduleName}-init`);\n}\n\n/**\n * Checks if GOV.UK Frontend is supported on this page\n *\n * Some browsers will load and run our JavaScript but GOV.UK Frontend\n * won't be supported.\n *\n * @param {HTMLElement | null} [$scope] - (internal) `<body>` HTML element checked for browser support\n * @returns {boolean} Whether GOV.UK Frontend is supported on this page\n */\nfunction isSupported($scope = document.body) {\n if (!$scope) {\n return false;\n }\n return $scope.classList.contains('govuk-frontend-supported');\n}\nfunction isArray(option) {\n return Array.isArray(option);\n}\nfunction isObject(option) {\n return !!option && typeof option === 'object' && !isArray(option);\n}\nfunction formatErrorMessage(Component, message) {\n return `${Component.moduleName}: ${message}`;\n}\n/**\n * @typedef ComponentWithModuleName\n * @property {string} moduleName - Name of the component\n */\n/**\n * @import { ObjectNested } from './configuration.mjs'\n */\n\nexport { formatErrorMessage, getBreakpoint, getFragmentFromUrl, isInitialised, isObject, isSupported, setFocus };\n//# sourceMappingURL=index.mjs.map\n","import { formatErrorMessage } from '../common/index.mjs';\n\nclass GOVUKFrontendError extends Error {\n constructor(...args) {\n super(...args);\n this.name = 'GOVUKFrontendError';\n }\n}\nclass SupportError extends GOVUKFrontendError {\n /**\n * Checks if GOV.UK Frontend is supported on this page\n *\n * @param {HTMLElement | null} [$scope] - HTML element `<body>` checked for browser support\n */\n constructor($scope = document.body) {\n const supportMessage = 'noModule' in HTMLScriptElement.prototype ? 'GOV.UK Frontend initialised without `<body class=\"govuk-frontend-supported\">` from template `<script>` snippet' : 'GOV.UK Frontend is not supported in this browser';\n super($scope ? supportMessage : 'GOV.UK Frontend initialised without `<script type=\"module\">`');\n this.name = 'SupportError';\n }\n}\nclass ConfigError extends GOVUKFrontendError {\n constructor(...args) {\n super(...args);\n this.name = 'ConfigError';\n }\n}\nclass ElementError extends GOVUKFrontendError {\n constructor(messageOrOptions) {\n let message = typeof messageOrOptions === 'string' ? messageOrOptions : '';\n if (typeof messageOrOptions === 'object') {\n const {\n component,\n identifier,\n element,\n expectedType\n } = messageOrOptions;\n message = identifier;\n message += element ? ` is not of type ${expectedType != null ? expectedType : 'HTMLElement'}` : ' not found';\n message = formatErrorMessage(component, message);\n }\n super(message);\n this.name = 'ElementError';\n }\n}\nclass InitError extends GOVUKFrontendError {\n constructor(componentOrMessage) {\n const message = typeof componentOrMessage === 'string' ? componentOrMessage : formatErrorMessage(componentOrMessage, `Root element (\\`$root\\`) already initialised`);\n super(message);\n this.name = 'InitError';\n }\n}\n/**\n * @import { ComponentWithModuleName } from '../common/index.mjs'\n */\n\nexport { ConfigError, ElementError, GOVUKFrontendError, InitError, SupportError };\n//# sourceMappingURL=index.mjs.map\n","import { isInitialised, isSupported } from './common/index.mjs';\nimport { InitError, ElementError, SupportError } from './errors/index.mjs';\n\nclass Component {\n /**\n * Returns the root element of the component\n *\n * @protected\n * @returns {RootElementType} - the root element of component\n */\n get $root() {\n return this._$root;\n }\n constructor($root) {\n this._$root = void 0;\n const childConstructor = this.constructor;\n if (typeof childConstructor.moduleName !== 'string') {\n throw new InitError(`\\`moduleName\\` not defined in component`);\n }\n if (!($root instanceof childConstructor.elementType)) {\n throw new ElementError({\n element: $root,\n component: childConstructor,\n identifier: 'Root element (`$root`)',\n expectedType: childConstructor.elementType.name\n });\n } else {\n this._$root = $root;\n }\n childConstructor.checkSupport();\n this.checkInitialised();\n const moduleName = childConstructor.moduleName;\n this.$root.setAttribute(`data-${moduleName}-init`, '');\n }\n checkInitialised() {\n const constructor = this.constructor;\n const moduleName = constructor.moduleName;\n if (moduleName && isInitialised(this.$root, moduleName)) {\n throw new InitError(constructor);\n }\n }\n static checkSupport() {\n if (!isSupported()) {\n throw new SupportError();\n }\n }\n}\n\n/**\n * @typedef ChildClass\n * @property {string} moduleName - The module name that'll be looked for in the DOM when initialising the component\n */\n\n/**\n * @typedef {typeof Component & ChildClass} ChildClassConstructor\n */\nComponent.elementType = HTMLElement;\n\nexport { Component };\n//# sourceMappingURL=component.mjs.map\n","import { Component } from 'govuk-frontend'\n\nexport class AddAnother extends Component {\n /**\n * @param {Element | null} $root - HTML element to use for add another\n */\n constructor($root) {\n super($root)\n\n this.$root.addEventListener('click', this.onRemoveButtonClick.bind(this))\n this.$root.addEventListener('click', this.onAddButtonClick.bind(this))\n\n const $buttons = this.$root.querySelectorAll(\n '.moj-add-another__add-button, moj-add-another__remove-button'\n )\n\n $buttons.forEach(($button) => {\n if (!($button instanceof HTMLButtonElement)) {\n return\n }\n\n $button.type = 'button'\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onAddButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__add-button')\n ) {\n return\n }\n\n const $items = this.getItems()\n const $item = this.getNewItem()\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n this.updateAttributes($item, $items.length)\n this.resetItem($item)\n\n const $firstItem = $items[0]\n if (!this.hasRemoveButton($firstItem)) {\n this.createRemoveButton($firstItem)\n }\n\n $items[$items.length - 1].after($item)\n\n const $input = $item.querySelector('input, textarea, select')\n if ($input && $input instanceof HTMLInputElement) {\n $input.focus()\n }\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n hasRemoveButton($item) {\n return $item.querySelectorAll('.moj-add-another__remove-button').length\n }\n\n getItems() {\n if (!this.$root) {\n return []\n }\n\n const $items = Array.from(\n this.$root.querySelectorAll('.moj-add-another__item')\n )\n\n return $items.filter((item) => item instanceof HTMLElement)\n }\n\n getNewItem() {\n const $items = this.getItems()\n const $item = $items[0].cloneNode(true)\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n if (!this.hasRemoveButton($item)) {\n this.createRemoveButton($item)\n }\n\n return $item\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n * @param {number} index - Add another item index\n */\n updateAttributes($item, index) {\n $item.querySelectorAll('[data-name]').forEach(($input) => {\n if (!this.isValidInputElement($input)) {\n return\n }\n\n const name = $input.getAttribute('data-name') || ''\n const id = $input.getAttribute('data-id') || ''\n const originalId = $input.id\n\n $input.name = name.replace(/%index%/, `${index}`)\n $input.id = id.replace(/%index%/, `${index}`)\n\n const $label =\n $input.parentElement.querySelector('label') ||\n $input.closest('label') ||\n $item.querySelector(`[for=\"${originalId}\"]`)\n\n if ($label && $label instanceof HTMLLabelElement) {\n $label.htmlFor = $input.id\n }\n })\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n createRemoveButton($item) {\n const $button = document.createElement('button')\n $button.type = 'button'\n\n $button.classList.add(\n 'govuk-button',\n 'govuk-button--secondary',\n 'moj-add-another__remove-button'\n )\n\n $button.textContent = 'Remove'\n\n $item.append($button)\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n resetItem($item) {\n $item.querySelectorAll('[data-name], [data-id]').forEach(($input) => {\n if (!this.isValidInputElement($input)) {\n return\n }\n\n if ($input instanceof HTMLSelectElement) {\n $input.selectedIndex = -1\n $input.value = ''\n } else if ($input instanceof HTMLTextAreaElement) {\n $input.value = ''\n } else {\n switch ($input.type) {\n case 'checkbox':\n case 'radio':\n $input.checked = false\n break\n default:\n $input.value = ''\n }\n }\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onRemoveButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__remove-button')\n ) {\n return\n }\n\n $button.closest('.moj-add-another__item').remove()\n\n const $items = this.getItems()\n\n if ($items.length === 1) {\n $items[0].querySelector('.moj-add-another__remove-button').remove()\n }\n\n $items.forEach(($item, index) => {\n this.updateAttributes($item, index)\n })\n\n this.focusHeading()\n }\n\n focusHeading() {\n const $heading = this.$root.querySelector('.moj-add-another__heading')\n\n if ($heading && $heading instanceof HTMLElement) {\n $heading.focus()\n }\n }\n\n /**\n * @param {Element} $input - the input to validate\n */\n isValidInputElement($input) {\n return (\n $input instanceof HTMLInputElement ||\n $input instanceof HTMLSelectElement ||\n $input instanceof HTMLTextAreaElement\n )\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'moj-add-another'\n}\n"],"names":["isInitialised","$root","moduleName","HTMLElement","hasAttribute","isSupported","$scope","document","body","classList","contains","formatErrorMessage","Component","message","GOVUKFrontendError","Error","constructor","args","name","SupportError","supportMessage","HTMLScriptElement","prototype","ElementError","messageOrOptions","component","identifier","element","expectedType","InitError","componentOrMessage","_$root","childConstructor","elementType","checkSupport","checkInitialised","setAttribute","AddAnother","addEventListener","onRemoveButtonClick","bind","onAddButtonClick","$buttons","querySelectorAll","forEach","$button","HTMLButtonElement","type","event","target","$items","getItems","$item","getNewItem","updateAttributes","length","resetItem","$firstItem","hasRemoveButton","createRemoveButton","after","$input","querySelector","HTMLInputElement","focus","Array","from","filter","item","cloneNode","index","isValidInputElement","getAttribute","id","originalId","replace","$label","parentElement","closest","HTMLLabelElement","htmlFor","createElement","add","textContent","append","HTMLSelectElement","selectedIndex","value","HTMLTextAreaElement","checked","remove","focusHeading","$heading"],"mappings":"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","x_google_ignoreList":[0,1,2]}
1
+ {"version":3,"file":"add-another.bundle.mjs","sources":["../../../../node_modules/govuk-frontend/dist/govuk/common/index.mjs","../../../../node_modules/govuk-frontend/dist/govuk/errors/index.mjs","../../../../node_modules/govuk-frontend/dist/govuk/component.mjs","../../../../src/moj/components/add-another/add-another.mjs"],"sourcesContent":["function getBreakpoint(name) {\n const property = `--govuk-breakpoint-${name}`;\n const value = window.getComputedStyle(document.documentElement).getPropertyValue(property);\n return {\n property,\n value: value || undefined\n };\n}\nfunction setFocus($element, options = {}) {\n var _options$onBeforeFocu;\n const isFocusable = $element.getAttribute('tabindex');\n if (!isFocusable) {\n $element.setAttribute('tabindex', '-1');\n }\n function onFocus() {\n $element.addEventListener('blur', onBlur, {\n once: true\n });\n }\n function onBlur() {\n var _options$onBlur;\n (_options$onBlur = options.onBlur) == null || _options$onBlur.call($element);\n if (!isFocusable) {\n $element.removeAttribute('tabindex');\n }\n }\n $element.addEventListener('focus', onFocus, {\n once: true\n });\n (_options$onBeforeFocu = options.onBeforeFocus) == null || _options$onBeforeFocu.call($element);\n $element.focus();\n}\nfunction isInitialised($root, moduleName) {\n return $root instanceof HTMLElement && $root.hasAttribute(`data-${moduleName}-init`);\n}\n\n/**\n * Checks if GOV.UK Frontend is supported on this page\n *\n * Some browsers will load and run our JavaScript but GOV.UK Frontend\n * won't be supported.\n *\n * @param {HTMLElement | null} [$scope] - (internal) `<body>` HTML element checked for browser support\n * @returns {boolean} Whether GOV.UK Frontend is supported on this page\n */\nfunction isSupported($scope = document.body) {\n if (!$scope) {\n return false;\n }\n return $scope.classList.contains('govuk-frontend-supported');\n}\nfunction isArray(option) {\n return Array.isArray(option);\n}\nfunction isObject(option) {\n return !!option && typeof option === 'object' && !isArray(option);\n}\nfunction isScope($scope) {\n return !!$scope && ($scope instanceof Element || $scope instanceof Document);\n}\nfunction formatErrorMessage(Component, message) {\n return `${Component.moduleName}: ${message}`;\n}\n/**\n * @typedef ComponentWithModuleName\n * @property {string} moduleName - Name of the component\n */\n\nexport { formatErrorMessage, getBreakpoint, isInitialised, isObject, isScope, isSupported, setFocus };\n//# sourceMappingURL=index.mjs.map\n","import { isObject, formatErrorMessage } from '../common/index.mjs';\n\nclass GOVUKFrontendError extends Error {\n constructor(...args) {\n super(...args);\n this.name = 'GOVUKFrontendError';\n }\n}\nclass SupportError extends GOVUKFrontendError {\n /**\n * Checks if GOV.UK Frontend is supported on this page\n *\n * @param {HTMLElement | null} [$scope] - HTML element `<body>` checked for browser support\n */\n constructor($scope = document.body) {\n const supportMessage = 'noModule' in HTMLScriptElement.prototype ? 'GOV.UK Frontend initialised without `<body class=\"govuk-frontend-supported\">` from template `<script>` snippet' : 'GOV.UK Frontend is not supported in this browser';\n super($scope ? supportMessage : 'GOV.UK Frontend initialised without `<script type=\"module\">`');\n this.name = 'SupportError';\n }\n}\nclass ConfigError extends GOVUKFrontendError {\n constructor(...args) {\n super(...args);\n this.name = 'ConfigError';\n }\n}\nclass ElementError extends GOVUKFrontendError {\n constructor(messageOrOptions) {\n let message = typeof messageOrOptions === 'string' ? messageOrOptions : '';\n if (isObject(messageOrOptions)) {\n const {\n component,\n identifier,\n element,\n expectedType\n } = messageOrOptions;\n message = identifier;\n message += element ? ` is not of type ${expectedType != null ? expectedType : 'HTMLElement'}` : ' not found';\n if (component) {\n message = formatErrorMessage(component, message);\n }\n }\n super(message);\n this.name = 'ElementError';\n }\n}\nclass InitError extends GOVUKFrontendError {\n constructor(componentOrMessage) {\n const message = typeof componentOrMessage === 'string' ? componentOrMessage : formatErrorMessage(componentOrMessage, `Root element (\\`$root\\`) already initialised`);\n super(message);\n this.name = 'InitError';\n }\n}\n/**\n * @import { ComponentWithModuleName } from '../common/index.mjs'\n */\n\nexport { ConfigError, ElementError, GOVUKFrontendError, InitError, SupportError };\n//# sourceMappingURL=index.mjs.map\n","import { isInitialised, isSupported } from './common/index.mjs';\nimport { InitError, ElementError, SupportError } from './errors/index.mjs';\n\nclass Component {\n /**\n * Returns the root element of the component\n *\n * @protected\n * @returns {RootElementType} - the root element of component\n */\n get $root() {\n return this._$root;\n }\n constructor($root) {\n this._$root = void 0;\n const childConstructor = this.constructor;\n if (typeof childConstructor.moduleName !== 'string') {\n throw new InitError(`\\`moduleName\\` not defined in component`);\n }\n if (!($root instanceof childConstructor.elementType)) {\n throw new ElementError({\n element: $root,\n component: childConstructor,\n identifier: 'Root element (`$root`)',\n expectedType: childConstructor.elementType.name\n });\n } else {\n this._$root = $root;\n }\n childConstructor.checkSupport();\n this.checkInitialised();\n const moduleName = childConstructor.moduleName;\n this.$root.setAttribute(`data-${moduleName}-init`, '');\n }\n checkInitialised() {\n const constructor = this.constructor;\n const moduleName = constructor.moduleName;\n if (moduleName && isInitialised(this.$root, moduleName)) {\n throw new InitError(constructor);\n }\n }\n static checkSupport() {\n if (!isSupported()) {\n throw new SupportError();\n }\n }\n}\n\n/**\n * @typedef ChildClass\n * @property {string} moduleName - The module name that'll be looked for in the DOM when initialising the component\n */\n\n/**\n * @typedef {typeof Component & ChildClass} ChildClassConstructor\n */\nComponent.elementType = HTMLElement;\n\nexport { Component };\n//# sourceMappingURL=component.mjs.map\n","import { Component } from 'govuk-frontend'\n\nexport class AddAnother extends Component {\n /**\n * @param {Element | null} $root - HTML element to use for add another\n */\n constructor($root) {\n super($root)\n\n this.$root.addEventListener('click', this.onRemoveButtonClick.bind(this))\n this.$root.addEventListener('click', this.onAddButtonClick.bind(this))\n\n const $buttons = this.$root.querySelectorAll(\n '.moj-add-another__add-button, moj-add-another__remove-button'\n )\n\n $buttons.forEach(($button) => {\n if (!($button instanceof HTMLButtonElement)) {\n return\n }\n\n $button.type = 'button'\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onAddButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__add-button')\n ) {\n return\n }\n\n const $items = this.getItems()\n const $item = this.getNewItem()\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n this.updateAttributes($item, $items.length)\n this.resetItem($item)\n\n const $firstItem = $items[0]\n if (!this.hasRemoveButton($firstItem)) {\n this.createRemoveButton($firstItem)\n }\n\n $items[$items.length - 1].after($item)\n\n const $input = $item.querySelector('input, textarea, select')\n if ($input && $input instanceof HTMLInputElement) {\n $input.focus()\n }\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n hasRemoveButton($item) {\n return $item.querySelectorAll('.moj-add-another__remove-button').length\n }\n\n getItems() {\n if (!this.$root) {\n return []\n }\n\n const $items = Array.from(\n this.$root.querySelectorAll('.moj-add-another__item')\n )\n\n return $items.filter((item) => item instanceof HTMLElement)\n }\n\n getNewItem() {\n const $items = this.getItems()\n const $item = $items[0].cloneNode(true)\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n if (!this.hasRemoveButton($item)) {\n this.createRemoveButton($item)\n }\n\n return $item\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n * @param {number} index - Add another item index\n */\n updateAttributes($item, index) {\n $item.querySelectorAll('[data-name]').forEach(($input) => {\n if (!this.isValidInputElement($input)) {\n return\n }\n\n const name = $input.getAttribute('data-name') || ''\n const id = $input.getAttribute('data-id') || ''\n const originalId = $input.id\n\n $input.name = name.replace(/%index%/, `${index}`)\n $input.id = id.replace(/%index%/, `${index}`)\n\n const $label =\n $input.parentElement.querySelector('label') ||\n $input.closest('label') ||\n $item.querySelector(`[for=\"${originalId}\"]`)\n\n if ($label && $label instanceof HTMLLabelElement) {\n $label.htmlFor = $input.id\n }\n })\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n createRemoveButton($item) {\n const $button = document.createElement('button')\n $button.type = 'button'\n\n $button.classList.add(\n 'govuk-button',\n 'govuk-button--secondary',\n 'moj-add-another__remove-button'\n )\n\n $button.textContent = 'Remove'\n\n $item.append($button)\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n resetItem($item) {\n $item.querySelectorAll('[data-name], [data-id]').forEach(($input) => {\n if (!this.isValidInputElement($input)) {\n return\n }\n\n if ($input instanceof HTMLSelectElement) {\n $input.selectedIndex = -1\n $input.value = ''\n } else if ($input instanceof HTMLTextAreaElement) {\n $input.value = ''\n } else {\n switch ($input.type) {\n case 'checkbox':\n case 'radio':\n $input.checked = false\n break\n default:\n $input.value = ''\n }\n }\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onRemoveButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__remove-button')\n ) {\n return\n }\n\n $button.closest('.moj-add-another__item').remove()\n\n const $items = this.getItems()\n\n if ($items.length === 1) {\n $items[0].querySelector('.moj-add-another__remove-button').remove()\n }\n\n $items.forEach(($item, index) => {\n this.updateAttributes($item, index)\n })\n\n this.focusHeading()\n }\n\n focusHeading() {\n const $heading = this.$root.querySelector('.moj-add-another__heading')\n\n if ($heading && $heading instanceof HTMLElement) {\n $heading.focus()\n }\n }\n\n /**\n * @param {Element} $input - the input to validate\n */\n isValidInputElement($input) {\n return (\n $input instanceof HTMLInputElement ||\n $input instanceof HTMLSelectElement ||\n $input instanceof HTMLTextAreaElement\n )\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'moj-add-another'\n}\n"],"names":["isInitialised","$root","moduleName","HTMLElement","hasAttribute","isSupported","$scope","document","body","classList","contains","isArray","option","Array","isObject","formatErrorMessage","Component","message","GOVUKFrontendError","Error","constructor","args","name","SupportError","supportMessage","HTMLScriptElement","prototype","ElementError","messageOrOptions","component","identifier","element","expectedType","InitError","componentOrMessage","_$root","childConstructor","elementType","checkSupport","checkInitialised","setAttribute","AddAnother","addEventListener","onRemoveButtonClick","bind","onAddButtonClick","$buttons","querySelectorAll","forEach","$button","HTMLButtonElement","type","event","target","$items","getItems","$item","getNewItem","updateAttributes","length","resetItem","$firstItem","hasRemoveButton","createRemoveButton","after","$input","querySelector","HTMLInputElement","focus","from","filter","item","cloneNode","index","isValidInputElement","getAttribute","id","originalId","replace","$label","parentElement","closest","HTMLLabelElement","htmlFor","createElement","add","textContent","append","HTMLSelectElement","selectedIndex","value","HTMLTextAreaElement","checked","remove","focusHeading","$heading"],"mappings":"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","x_google_ignoreList":[0,1,2]}
@@ -1 +1 @@
1
- {"version":3,"file":"add-another.mjs","sources":["../../../../src/moj/components/add-another/add-another.mjs"],"sourcesContent":["import { Component } from 'govuk-frontend'\n\nexport class AddAnother extends Component {\n /**\n * @param {Element | null} $root - HTML element to use for add another\n */\n constructor($root) {\n super($root)\n\n this.$root.addEventListener('click', this.onRemoveButtonClick.bind(this))\n this.$root.addEventListener('click', this.onAddButtonClick.bind(this))\n\n const $buttons = this.$root.querySelectorAll(\n '.moj-add-another__add-button, moj-add-another__remove-button'\n )\n\n $buttons.forEach(($button) => {\n if (!($button instanceof HTMLButtonElement)) {\n return\n }\n\n $button.type = 'button'\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onAddButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__add-button')\n ) {\n return\n }\n\n const $items = this.getItems()\n const $item = this.getNewItem()\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n this.updateAttributes($item, $items.length)\n this.resetItem($item)\n\n const $firstItem = $items[0]\n if (!this.hasRemoveButton($firstItem)) {\n this.createRemoveButton($firstItem)\n }\n\n $items[$items.length - 1].after($item)\n\n const $input = $item.querySelector('input, textarea, select')\n if ($input && $input instanceof HTMLInputElement) {\n $input.focus()\n }\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n hasRemoveButton($item) {\n return $item.querySelectorAll('.moj-add-another__remove-button').length\n }\n\n getItems() {\n if (!this.$root) {\n return []\n }\n\n const $items = Array.from(\n this.$root.querySelectorAll('.moj-add-another__item')\n )\n\n return $items.filter((item) => item instanceof HTMLElement)\n }\n\n getNewItem() {\n const $items = this.getItems()\n const $item = $items[0].cloneNode(true)\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n if (!this.hasRemoveButton($item)) {\n this.createRemoveButton($item)\n }\n\n return $item\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n * @param {number} index - Add another item index\n */\n updateAttributes($item, index) {\n $item.querySelectorAll('[data-name]').forEach(($input) => {\n if (!this.isValidInputElement($input)) {\n return\n }\n\n const name = $input.getAttribute('data-name') || ''\n const id = $input.getAttribute('data-id') || ''\n const originalId = $input.id\n\n $input.name = name.replace(/%index%/, `${index}`)\n $input.id = id.replace(/%index%/, `${index}`)\n\n const $label =\n $input.parentElement.querySelector('label') ||\n $input.closest('label') ||\n $item.querySelector(`[for=\"${originalId}\"]`)\n\n if ($label && $label instanceof HTMLLabelElement) {\n $label.htmlFor = $input.id\n }\n })\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n createRemoveButton($item) {\n const $button = document.createElement('button')\n $button.type = 'button'\n\n $button.classList.add(\n 'govuk-button',\n 'govuk-button--secondary',\n 'moj-add-another__remove-button'\n )\n\n $button.textContent = 'Remove'\n\n $item.append($button)\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n resetItem($item) {\n $item.querySelectorAll('[data-name], [data-id]').forEach(($input) => {\n if (!this.isValidInputElement($input)) {\n return\n }\n\n if ($input instanceof HTMLSelectElement) {\n $input.selectedIndex = -1\n $input.value = ''\n } else if ($input instanceof HTMLTextAreaElement) {\n $input.value = ''\n } else {\n switch ($input.type) {\n case 'checkbox':\n case 'radio':\n $input.checked = false\n break\n default:\n $input.value = ''\n }\n }\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onRemoveButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__remove-button')\n ) {\n return\n }\n\n $button.closest('.moj-add-another__item').remove()\n\n const $items = this.getItems()\n\n if ($items.length === 1) {\n $items[0].querySelector('.moj-add-another__remove-button').remove()\n }\n\n $items.forEach(($item, index) => {\n this.updateAttributes($item, index)\n })\n\n this.focusHeading()\n }\n\n focusHeading() {\n const $heading = this.$root.querySelector('.moj-add-another__heading')\n\n if ($heading && $heading instanceof HTMLElement) {\n $heading.focus()\n }\n }\n\n /**\n * @param {Element} $input - the input to validate\n */\n isValidInputElement($input) {\n return (\n $input instanceof HTMLInputElement ||\n $input instanceof HTMLSelectElement ||\n $input instanceof HTMLTextAreaElement\n )\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'moj-add-another'\n}\n"],"names":["AddAnother","Component","constructor","$root","addEventListener","onRemoveButtonClick","bind","onAddButtonClick","$buttons","querySelectorAll","forEach","$button","HTMLButtonElement","type","event","target","classList","contains","$items","getItems","$item","getNewItem","HTMLElement","updateAttributes","length","resetItem","$firstItem","hasRemoveButton","createRemoveButton","after","$input","querySelector","HTMLInputElement","focus","Array","from","filter","item","cloneNode","index","isValidInputElement","name","getAttribute","id","originalId","replace","$label","parentElement","closest","HTMLLabelElement","htmlFor","document","createElement","add","textContent","append","HTMLSelectElement","selectedIndex","value","HTMLTextAreaElement","checked","remove","focusHeading","$heading","moduleName"],"mappings":";;AAEO,MAAMA,UAAU,SAASC,SAAS,CAAC;AACxC;AACF;AACA;EACEC,WAAWA,CAACC,KAAK,EAAE;IACjB,KAAK,CAACA,KAAK,CAAC;AAEZ,IAAA,IAAI,CAACA,KAAK,CAACC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACC,mBAAmB,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzE,IAAA,IAAI,CAACH,KAAK,CAACC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAACG,gBAAgB,CAACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEtE,MAAME,QAAQ,GAAG,IAAI,CAACL,KAAK,CAACM,gBAAgB,CAC1C,8DACF,CAAC;AAEDD,IAAAA,QAAQ,CAACE,OAAO,CAAEC,OAAO,IAAK;AAC5B,MAAA,IAAI,EAAEA,OAAO,YAAYC,iBAAiB,CAAC,EAAE;AAC3C,QAAA;AACF;MAEAD,OAAO,CAACE,IAAI,GAAG,QAAQ;AACzB,KAAC,CAAC;AACJ;;AAEA;AACF;AACA;EACEN,gBAAgBA,CAACO,KAAK,EAAE;AACtB,IAAA,MAAMH,OAAO,GAAGG,KAAK,CAACC,MAAM;AAE5B,IAAA,IACE,CAACJ,OAAO,IACR,EAAEA,OAAO,YAAYC,iBAAiB,CAAC,IACvC,CAACD,OAAO,CAACK,SAAS,CAACC,QAAQ,CAAC,6BAA6B,CAAC,EAC1D;AACA,MAAA;AACF;AAEA,IAAA,MAAMC,MAAM,GAAG,IAAI,CAACC,QAAQ,EAAE;AAC9B,IAAA,MAAMC,KAAK,GAAG,IAAI,CAACC,UAAU,EAAE;IAE/B,IAAI,CAACD,KAAK,IAAI,EAAEA,KAAK,YAAYE,WAAW,CAAC,EAAE;AAC7C,MAAA;AACF;IAEA,IAAI,CAACC,gBAAgB,CAACH,KAAK,EAAEF,MAAM,CAACM,MAAM,CAAC;AAC3C,IAAA,IAAI,CAACC,SAAS,CAACL,KAAK,CAAC;AAErB,IAAA,MAAMM,UAAU,GAAGR,MAAM,CAAC,CAAC,CAAC;AAC5B,IAAA,IAAI,CAAC,IAAI,CAACS,eAAe,CAACD,UAAU,CAAC,EAAE;AACrC,MAAA,IAAI,CAACE,kBAAkB,CAACF,UAAU,CAAC;AACrC;IAEAR,MAAM,CAACA,MAAM,CAACM,MAAM,GAAG,CAAC,CAAC,CAACK,KAAK,CAACT,KAAK,CAAC;AAEtC,IAAA,MAAMU,MAAM,GAAGV,KAAK,CAACW,aAAa,CAAC,yBAAyB,CAAC;AAC7D,IAAA,IAAID,MAAM,IAAIA,MAAM,YAAYE,gBAAgB,EAAE;MAChDF,MAAM,CAACG,KAAK,EAAE;AAChB;AACF;;AAEA;AACF;AACA;EACEN,eAAeA,CAACP,KAAK,EAAE;AACrB,IAAA,OAAOA,KAAK,CAACX,gBAAgB,CAAC,iCAAiC,CAAC,CAACe,MAAM;AACzE;AAEAL,EAAAA,QAAQA,GAAG;AACT,IAAA,IAAI,CAAC,IAAI,CAAChB,KAAK,EAAE;AACf,MAAA,OAAO,EAAE;AACX;AAEA,IAAA,MAAMe,MAAM,GAAGgB,KAAK,CAACC,IAAI,CACvB,IAAI,CAAChC,KAAK,CAACM,gBAAgB,CAAC,wBAAwB,CACtD,CAAC;IAED,OAAOS,MAAM,CAACkB,MAAM,CAAEC,IAAI,IAAKA,IAAI,YAAYf,WAAW,CAAC;AAC7D;AAEAD,EAAAA,UAAUA,GAAG;AACX,IAAA,MAAMH,MAAM,GAAG,IAAI,CAACC,QAAQ,EAAE;IAC9B,MAAMC,KAAK,GAAGF,MAAM,CAAC,CAAC,CAAC,CAACoB,SAAS,CAAC,IAAI,CAAC;IAEvC,IAAI,CAAClB,KAAK,IAAI,EAAEA,KAAK,YAAYE,WAAW,CAAC,EAAE;AAC7C,MAAA;AACF;AAEA,IAAA,IAAI,CAAC,IAAI,CAACK,eAAe,CAACP,KAAK,CAAC,EAAE;AAChC,MAAA,IAAI,CAACQ,kBAAkB,CAACR,KAAK,CAAC;AAChC;AAEA,IAAA,OAAOA,KAAK;AACd;;AAEA;AACF;AACA;AACA;AACEG,EAAAA,gBAAgBA,CAACH,KAAK,EAAEmB,KAAK,EAAE;IAC7BnB,KAAK,CAACX,gBAAgB,CAAC,aAAa,CAAC,CAACC,OAAO,CAAEoB,MAAM,IAAK;AACxD,MAAA,IAAI,CAAC,IAAI,CAACU,mBAAmB,CAACV,MAAM,CAAC,EAAE;AACrC,QAAA;AACF;MAEA,MAAMW,IAAI,GAAGX,MAAM,CAACY,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE;MACnD,MAAMC,EAAE,GAAGb,MAAM,CAACY,YAAY,CAAC,SAAS,CAAC,IAAI,EAAE;AAC/C,MAAA,MAAME,UAAU,GAAGd,MAAM,CAACa,EAAE;AAE5Bb,MAAAA,MAAM,CAACW,IAAI,GAAGA,IAAI,CAACI,OAAO,CAAC,SAAS,EAAE,CAAA,EAAGN,KAAK,CAAA,CAAE,CAAC;AACjDT,MAAAA,MAAM,CAACa,EAAE,GAAGA,EAAE,CAACE,OAAO,CAAC,SAAS,EAAE,CAAA,EAAGN,KAAK,CAAA,CAAE,CAAC;MAE7C,MAAMO,MAAM,GACVhB,MAAM,CAACiB,aAAa,CAAChB,aAAa,CAAC,OAAO,CAAC,IAC3CD,MAAM,CAACkB,OAAO,CAAC,OAAO,CAAC,IACvB5B,KAAK,CAACW,aAAa,CAAC,CAAA,MAAA,EAASa,UAAU,CAAA,EAAA,CAAI,CAAC;AAE9C,MAAA,IAAIE,MAAM,IAAIA,MAAM,YAAYG,gBAAgB,EAAE;AAChDH,QAAAA,MAAM,CAACI,OAAO,GAAGpB,MAAM,CAACa,EAAE;AAC5B;AACF,KAAC,CAAC;AACJ;;AAEA;AACF;AACA;EACEf,kBAAkBA,CAACR,KAAK,EAAE;AACxB,IAAA,MAAMT,OAAO,GAAGwC,QAAQ,CAACC,aAAa,CAAC,QAAQ,CAAC;IAChDzC,OAAO,CAACE,IAAI,GAAG,QAAQ;IAEvBF,OAAO,CAACK,SAAS,CAACqC,GAAG,CACnB,cAAc,EACd,yBAAyB,EACzB,gCACF,CAAC;IAED1C,OAAO,CAAC2C,WAAW,GAAG,QAAQ;AAE9BlC,IAAAA,KAAK,CAACmC,MAAM,CAAC5C,OAAO,CAAC;AACvB;;AAEA;AACF;AACA;EACEc,SAASA,CAACL,KAAK,EAAE;IACfA,KAAK,CAACX,gBAAgB,CAAC,wBAAwB,CAAC,CAACC,OAAO,CAAEoB,MAAM,IAAK;AACnE,MAAA,IAAI,CAAC,IAAI,CAACU,mBAAmB,CAACV,MAAM,CAAC,EAAE;AACrC,QAAA;AACF;MAEA,IAAIA,MAAM,YAAY0B,iBAAiB,EAAE;AACvC1B,QAAAA,MAAM,CAAC2B,aAAa,GAAG,EAAE;QACzB3B,MAAM,CAAC4B,KAAK,GAAG,EAAE;AACnB,OAAC,MAAM,IAAI5B,MAAM,YAAY6B,mBAAmB,EAAE;QAChD7B,MAAM,CAAC4B,KAAK,GAAG,EAAE;AACnB,OAAC,MAAM;QACL,QAAQ5B,MAAM,CAACjB,IAAI;AACjB,UAAA,KAAK,UAAU;AACf,UAAA,KAAK,OAAO;YACViB,MAAM,CAAC8B,OAAO,GAAG,KAAK;AACtB,YAAA;AACF,UAAA;YACE9B,MAAM,CAAC4B,KAAK,GAAG,EAAE;AACrB;AACF;AACF,KAAC,CAAC;AACJ;;AAEA;AACF;AACA;EACErD,mBAAmBA,CAACS,KAAK,EAAE;AACzB,IAAA,MAAMH,OAAO,GAAGG,KAAK,CAACC,MAAM;AAE5B,IAAA,IACE,CAACJ,OAAO,IACR,EAAEA,OAAO,YAAYC,iBAAiB,CAAC,IACvC,CAACD,OAAO,CAACK,SAAS,CAACC,QAAQ,CAAC,gCAAgC,CAAC,EAC7D;AACA,MAAA;AACF;IAEAN,OAAO,CAACqC,OAAO,CAAC,wBAAwB,CAAC,CAACa,MAAM,EAAE;AAElD,IAAA,MAAM3C,MAAM,GAAG,IAAI,CAACC,QAAQ,EAAE;AAE9B,IAAA,IAAID,MAAM,CAACM,MAAM,KAAK,CAAC,EAAE;MACvBN,MAAM,CAAC,CAAC,CAAC,CAACa,aAAa,CAAC,iCAAiC,CAAC,CAAC8B,MAAM,EAAE;AACrE;AAEA3C,IAAAA,MAAM,CAACR,OAAO,CAAC,CAACU,KAAK,EAAEmB,KAAK,KAAK;AAC/B,MAAA,IAAI,CAAChB,gBAAgB,CAACH,KAAK,EAAEmB,KAAK,CAAC;AACrC,KAAC,CAAC;IAEF,IAAI,CAACuB,YAAY,EAAE;AACrB;AAEAA,EAAAA,YAAYA,GAAG;IACb,MAAMC,QAAQ,GAAG,IAAI,CAAC5D,KAAK,CAAC4B,aAAa,CAAC,2BAA2B,CAAC;AAEtE,IAAA,IAAIgC,QAAQ,IAAIA,QAAQ,YAAYzC,WAAW,EAAE;MAC/CyC,QAAQ,CAAC9B,KAAK,EAAE;AAClB;AACF;;AAEA;AACF;AACA;EACEO,mBAAmBA,CAACV,MAAM,EAAE;IAC1B,OACEA,MAAM,YAAYE,gBAAgB,IAClCF,MAAM,YAAY0B,iBAAiB,IACnC1B,MAAM,YAAY6B,mBAAmB;AAEzC;;AAEA;AACF;AACA;AAEA;AA3Na3D,UAAU,CA0NdgE,UAAU,GAAG,iBAAiB;;;;"}
1
+ {"version":3,"file":"add-another.mjs","sources":["../../../../src/moj/components/add-another/add-another.mjs"],"sourcesContent":["import { Component } from 'govuk-frontend'\n\nexport class AddAnother extends Component {\n /**\n * @param {Element | null} $root - HTML element to use for add another\n */\n constructor($root) {\n super($root)\n\n this.$root.addEventListener('click', this.onRemoveButtonClick.bind(this))\n this.$root.addEventListener('click', this.onAddButtonClick.bind(this))\n\n const $buttons = this.$root.querySelectorAll(\n '.moj-add-another__add-button, moj-add-another__remove-button'\n )\n\n $buttons.forEach(($button) => {\n if (!($button instanceof HTMLButtonElement)) {\n return\n }\n\n $button.type = 'button'\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onAddButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__add-button')\n ) {\n return\n }\n\n const $items = this.getItems()\n const $item = this.getNewItem()\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n this.updateAttributes($item, $items.length)\n this.resetItem($item)\n\n const $firstItem = $items[0]\n if (!this.hasRemoveButton($firstItem)) {\n this.createRemoveButton($firstItem)\n }\n\n $items[$items.length - 1].after($item)\n\n const $input = $item.querySelector('input, textarea, select')\n if ($input && $input instanceof HTMLInputElement) {\n $input.focus()\n }\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n hasRemoveButton($item) {\n return $item.querySelectorAll('.moj-add-another__remove-button').length\n }\n\n getItems() {\n if (!this.$root) {\n return []\n }\n\n const $items = Array.from(\n this.$root.querySelectorAll('.moj-add-another__item')\n )\n\n return $items.filter((item) => item instanceof HTMLElement)\n }\n\n getNewItem() {\n const $items = this.getItems()\n const $item = $items[0].cloneNode(true)\n\n if (!$item || !($item instanceof HTMLElement)) {\n return\n }\n\n if (!this.hasRemoveButton($item)) {\n this.createRemoveButton($item)\n }\n\n return $item\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n * @param {number} index - Add another item index\n */\n updateAttributes($item, index) {\n $item.querySelectorAll('[data-name]').forEach(($input) => {\n if (!this.isValidInputElement($input)) {\n return\n }\n\n const name = $input.getAttribute('data-name') || ''\n const id = $input.getAttribute('data-id') || ''\n const originalId = $input.id\n\n $input.name = name.replace(/%index%/, `${index}`)\n $input.id = id.replace(/%index%/, `${index}`)\n\n const $label =\n $input.parentElement.querySelector('label') ||\n $input.closest('label') ||\n $item.querySelector(`[for=\"${originalId}\"]`)\n\n if ($label && $label instanceof HTMLLabelElement) {\n $label.htmlFor = $input.id\n }\n })\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n createRemoveButton($item) {\n const $button = document.createElement('button')\n $button.type = 'button'\n\n $button.classList.add(\n 'govuk-button',\n 'govuk-button--secondary',\n 'moj-add-another__remove-button'\n )\n\n $button.textContent = 'Remove'\n\n $item.append($button)\n }\n\n /**\n * @param {HTMLElement} $item - Add another item\n */\n resetItem($item) {\n $item.querySelectorAll('[data-name], [data-id]').forEach(($input) => {\n if (!this.isValidInputElement($input)) {\n return\n }\n\n if ($input instanceof HTMLSelectElement) {\n $input.selectedIndex = -1\n $input.value = ''\n } else if ($input instanceof HTMLTextAreaElement) {\n $input.value = ''\n } else {\n switch ($input.type) {\n case 'checkbox':\n case 'radio':\n $input.checked = false\n break\n default:\n $input.value = ''\n }\n }\n })\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onRemoveButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.classList.contains('moj-add-another__remove-button')\n ) {\n return\n }\n\n $button.closest('.moj-add-another__item').remove()\n\n const $items = this.getItems()\n\n if ($items.length === 1) {\n $items[0].querySelector('.moj-add-another__remove-button').remove()\n }\n\n $items.forEach(($item, index) => {\n this.updateAttributes($item, index)\n })\n\n this.focusHeading()\n }\n\n focusHeading() {\n const $heading = this.$root.querySelector('.moj-add-another__heading')\n\n if ($heading && $heading instanceof HTMLElement) {\n $heading.focus()\n }\n }\n\n /**\n * @param {Element} $input - the input to validate\n */\n isValidInputElement($input) {\n return (\n $input instanceof HTMLInputElement ||\n $input instanceof HTMLSelectElement ||\n $input instanceof HTMLTextAreaElement\n )\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'moj-add-another'\n}\n"],"names":["AddAnother","Component","constructor","$root","addEventListener","onRemoveButtonClick","bind","onAddButtonClick","$buttons","querySelectorAll","forEach","$button","HTMLButtonElement","type","event","target","classList","contains","$items","getItems","$item","getNewItem","HTMLElement","updateAttributes","length","resetItem","$firstItem","hasRemoveButton","createRemoveButton","after","$input","querySelector","HTMLInputElement","focus","Array","from","filter","item","cloneNode","index","isValidInputElement","name","getAttribute","id","originalId","replace","$label","parentElement","closest","HTMLLabelElement","htmlFor","document","createElement","add","textContent","append","HTMLSelectElement","selectedIndex","value","HTMLTextAreaElement","checked","remove","focusHeading","$heading","moduleName"],"mappings":"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"}
@@ -96,7 +96,7 @@
96
96
  */
97
97
  function findNearestMatchingElement($element, selector) {
98
98
  // If no element or selector is provided, return
99
- if (!$element || !($element instanceof HTMLElement) || false) {
99
+ if (!$element || !($element instanceof HTMLElement) || !selector) {
100
100
  return;
101
101
  }
102
102
 
@@ -1 +1 @@
1
- {"version":3,"file":"alert.bundle.js","sources":["../../../../src/moj/common/index.mjs","../../../../src/moj/helpers.mjs","../../../../src/moj/components/alert/alert.mjs"],"sourcesContent":["/**\n * GOV.UK Frontend helpers\n *\n * @todo Import from GOV.UK Frontend\n */\n\n/**\n * Move focus to element\n *\n * Sets tabindex to -1 to make the element programmatically focusable,\n * but removes it on blur as the element doesn't need to be focused again.\n *\n * @template {HTMLElement} FocusElement\n * @param {FocusElement} $element - HTML element\n * @param {object} [options] - Handler options\n * @param {function(this: FocusElement): void} [options.onBeforeFocus] - Callback before focus\n * @param {function(this: FocusElement): void} [options.onBlur] - Callback on blur\n */\nexport function setFocus($element, options = {}) {\n const isFocusable = $element.getAttribute('tabindex')\n\n if (!isFocusable) {\n $element.setAttribute('tabindex', '-1')\n }\n\n /**\n * Handle element focus\n */\n function onFocus() {\n $element.addEventListener('blur', onBlur, { once: true })\n }\n\n /**\n * Handle element blur\n */\n function onBlur() {\n options.onBlur?.call($element)\n\n if (!isFocusable) {\n $element.removeAttribute('tabindex')\n }\n }\n\n // Add listener to reset element on blur, after focus\n $element.addEventListener('focus', onFocus, { once: true })\n\n // Focus element\n options.onBeforeFocus?.call($element)\n $element.focus()\n}\n","/**\n * @param {Element} $element - Element to remove attribute value from\n * @param {string} attr - Attribute name\n * @param {string} value - Attribute value\n */\nexport function removeAttributeValue($element, attr, value) {\n let re, m\n if ($element.getAttribute(attr)) {\n if ($element.getAttribute(attr) === value) {\n $element.removeAttribute(attr)\n } else {\n re = new RegExp(`(^|\\\\s)${value}(\\\\s|$)`)\n m = $element.getAttribute(attr).match(re)\n if (m && m.length === 3) {\n $element.setAttribute(\n attr,\n $element.getAttribute(attr).replace(re, m[1] && m[2] ? ' ' : '')\n )\n }\n }\n }\n}\n\n/**\n * @param {Element} $element - Element to add attribute value to\n * @param {string} attr - Attribute name\n * @param {string} value - Attribute value\n */\nexport function addAttributeValue($element, attr, value) {\n let re\n if (!$element.getAttribute(attr)) {\n $element.setAttribute(attr, value)\n } else {\n re = new RegExp(`(^|\\\\s)${value}(\\\\s|$)`)\n if (!re.test($element.getAttribute(attr))) {\n $element.setAttribute(attr, `${$element.getAttribute(attr)} ${value}`)\n }\n }\n}\n\n/**\n * Find an elements next sibling\n *\n * Utility function to find an elements next sibling matching the provided\n * selector.\n *\n * @param {Element | null} $element - Element to find siblings for\n * @param {string} [selector] - selector for required sibling\n */\nexport function getNextSibling($element, selector) {\n if (!$element || !($element instanceof HTMLElement)) {\n return\n }\n\n // Get the next sibling element\n let $sibling = $element.nextElementSibling\n\n // If there's no selector, return the first sibling\n if (!selector) return $sibling\n\n // If the sibling matches our selector, use it\n // If not, jump to the next sibling and continue the loop\n while ($sibling) {\n if ($sibling.matches(selector)) return $sibling\n $sibling = $sibling.nextElementSibling\n }\n}\n\n/**\n * Find an elements preceding sibling\n *\n * Utility function to find an elements previous sibling matching the provided\n * selector.\n *\n * @param {Element | null} $element - Element to find siblings for\n * @param {string} [selector] - selector for required sibling\n */\nexport function getPreviousSibling($element, selector) {\n if (!$element || !($element instanceof HTMLElement)) {\n return\n }\n\n // Get the previous sibling element\n let $sibling = $element.previousElementSibling\n\n // If there's no selector, return the first sibling\n if (!selector) return $sibling\n\n // If the sibling matches our selector, use it\n // If not, jump to the next sibling and continue the loop\n while ($sibling) {\n if ($sibling.matches(selector)) return $sibling\n $sibling = $sibling.previousElementSibling\n }\n}\n\n/**\n * @param {Element | null} $element\n * @param {string} [selector]\n */\nexport function findNearestMatchingElement($element, selector) {\n // If no element or selector is provided, return\n if (!$element || !($element instanceof HTMLElement) || !selector) {\n return\n }\n\n // Start with the current element\n let $currentElement = $element\n\n while ($currentElement) {\n // First check the current element\n if ($currentElement.matches(selector)) {\n return $currentElement\n }\n\n // Check all previous siblings\n let $sibling = $currentElement.previousElementSibling\n while ($sibling) {\n // Check if the sibling itself is a heading\n if ($sibling.matches(selector)) {\n return $sibling\n }\n $sibling = $sibling.previousElementSibling\n }\n\n // If no match found in siblings, move up to parent\n $currentElement = $currentElement.parentElement\n }\n}\n","import { ConfigurableComponent } from 'govuk-frontend'\n\nimport { setFocus } from '../../common/index.mjs'\nimport {\n findNearestMatchingElement,\n getPreviousSibling\n} from '../../helpers.mjs'\n\n/**\n * @augments {ConfigurableComponent<AlertConfig>}\n */\nexport class Alert extends ConfigurableComponent {\n /**\n * @param {Element | null} $root - HTML element to use for alert\n * @param {AlertConfig} [config] - Alert config\n */\n constructor($root, config = {}) {\n super($root, config)\n\n /**\n * Focus the alert\n *\n * If `role=\"alert\"` is set, focus the element to help some assistive\n * technologies prioritise announcing it.\n *\n * You can turn off the auto-focus functionality by setting\n * `data-disable-auto-focus=\"true\"` in the component HTML. You might wish to\n * do this based on user research findings, or to avoid a clash with another\n * element which should be focused when the page loads.\n */\n if (\n this.$root.getAttribute('role') === 'alert' &&\n !this.config.disableAutoFocus\n ) {\n setFocus(this.$root)\n }\n\n this.$dismissButton = this.$root.querySelector('.moj-alert__dismiss')\n\n if (this.config.dismissible && this.$dismissButton) {\n this.$dismissButton.innerHTML = this.config.dismissText\n this.$dismissButton.removeAttribute('hidden')\n\n this.$root.addEventListener('click', (event) => {\n if (\n event.target instanceof Node &&\n this.$dismissButton.contains(event.target)\n ) {\n this.dimiss()\n }\n })\n }\n }\n\n /**\n * Handle dismissing the alert\n */\n dimiss() {\n let $elementToRecieveFocus\n\n // If a selector has been provided, attempt to find that element\n if (this.config.focusOnDismissSelector) {\n $elementToRecieveFocus = document.querySelector(\n this.config.focusOnDismissSelector\n )\n }\n\n // Is the next sibling another alert\n if (!$elementToRecieveFocus) {\n const $nextSibling = this.$root.nextElementSibling\n if ($nextSibling && $nextSibling.matches('.moj-alert')) {\n $elementToRecieveFocus = $nextSibling\n }\n }\n\n // Else try to find any preceding sibling alert or heading\n if (!$elementToRecieveFocus) {\n $elementToRecieveFocus = getPreviousSibling(\n this.$root,\n '.moj-alert, h1, h2, h3, h4, h5, h6'\n )\n }\n\n // Else find the closest ancestor heading, or fallback to main, or last resort\n // use the body element\n if (!$elementToRecieveFocus) {\n $elementToRecieveFocus = findNearestMatchingElement(\n this.$root,\n 'h1, h2, h3, h4, h5, h6, main, body'\n )\n }\n\n // If we have an element, place focus on it\n if ($elementToRecieveFocus instanceof HTMLElement) {\n setFocus($elementToRecieveFocus)\n }\n\n // Remove the alert\n this.$root.remove()\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'moj-alert'\n\n /**\n * Alert default config\n *\n * @type {AlertConfig}\n */\n static defaults = Object.freeze({\n dismissible: false,\n dismissText: 'Dismiss',\n disableAutoFocus: false\n })\n\n /**\n * Alert config schema\n *\n * @satisfies {Schema<AlertConfig>}\n */\n static schema = Object.freeze(\n /** @type {const} */ ({\n properties: {\n dismissible: { type: 'boolean' },\n dismissText: { type: 'string' },\n disableAutoFocus: { type: 'boolean' },\n focusOnDismissSelector: { type: 'string' }\n }\n })\n )\n}\n\n/**\n * @typedef {object} AlertConfig\n * @property {boolean} [dismissible=false] - Can the alert be dismissed by the user\n * @property {string} [dismissText=Dismiss] - the label text for the dismiss button\n * @property {boolean} [disableAutoFocus=false] - whether the alert will be autofocused\n * @property {string} [focusOnDismissSelector] - CSS Selector for element to be focused on dismiss\n */\n\n/**\n * @import { Schema } from 'govuk-frontend/dist/govuk/common/configuration.mjs'\n */\n"],"names":["setFocus","$element","options","_options$onBeforeFocu","isFocusable","getAttribute","setAttribute","onFocus","addEventListener","onBlur","once","_options$onBlur","call","removeAttribute","onBeforeFocus","focus","getPreviousSibling","selector","HTMLElement","$sibling","previousElementSibling","matches","findNearestMatchingElement","$currentElement","parentElement","Alert","ConfigurableComponent","constructor","$root","config","disableAutoFocus","$dismissButton","querySelector","dismissible","innerHTML","dismissText","event","target","Node","contains","dimiss","$elementToRecieveFocus","focusOnDismissSelector","document","$nextSibling","nextElementSibling","remove","moduleName","defaults","Object","freeze","schema","properties","type"],"mappings":"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"}
1
+ {"version":3,"file":"alert.bundle.js","sources":["../../../../src/moj/common/index.mjs","../../../../src/moj/helpers.mjs","../../../../src/moj/components/alert/alert.mjs"],"sourcesContent":["/**\n * GOV.UK Frontend helpers\n *\n * @todo Import from GOV.UK Frontend\n */\n\n/**\n * Move focus to element\n *\n * Sets tabindex to -1 to make the element programmatically focusable,\n * but removes it on blur as the element doesn't need to be focused again.\n *\n * @template {HTMLElement} FocusElement\n * @param {FocusElement} $element - HTML element\n * @param {object} [options] - Handler options\n * @param {function(this: FocusElement): void} [options.onBeforeFocus] - Callback before focus\n * @param {function(this: FocusElement): void} [options.onBlur] - Callback on blur\n */\nexport function setFocus($element, options = {}) {\n const isFocusable = $element.getAttribute('tabindex')\n\n if (!isFocusable) {\n $element.setAttribute('tabindex', '-1')\n }\n\n /**\n * Handle element focus\n */\n function onFocus() {\n $element.addEventListener('blur', onBlur, { once: true })\n }\n\n /**\n * Handle element blur\n */\n function onBlur() {\n options.onBlur?.call($element)\n\n if (!isFocusable) {\n $element.removeAttribute('tabindex')\n }\n }\n\n // Add listener to reset element on blur, after focus\n $element.addEventListener('focus', onFocus, { once: true })\n\n // Focus element\n options.onBeforeFocus?.call($element)\n $element.focus()\n}\n","/**\n * @param {Element} $element - Element to remove attribute value from\n * @param {string} attr - Attribute name\n * @param {string} value - Attribute value\n */\nexport function removeAttributeValue($element, attr, value) {\n let re, m\n if ($element.getAttribute(attr)) {\n if ($element.getAttribute(attr) === value) {\n $element.removeAttribute(attr)\n } else {\n re = new RegExp(`(^|\\\\s)${value}(\\\\s|$)`)\n m = $element.getAttribute(attr).match(re)\n if (m && m.length === 3) {\n $element.setAttribute(\n attr,\n $element.getAttribute(attr).replace(re, m[1] && m[2] ? ' ' : '')\n )\n }\n }\n }\n}\n\n/**\n * @param {Element} $element - Element to add attribute value to\n * @param {string} attr - Attribute name\n * @param {string} value - Attribute value\n */\nexport function addAttributeValue($element, attr, value) {\n let re\n if (!$element.getAttribute(attr)) {\n $element.setAttribute(attr, value)\n } else {\n re = new RegExp(`(^|\\\\s)${value}(\\\\s|$)`)\n if (!re.test($element.getAttribute(attr))) {\n $element.setAttribute(attr, `${$element.getAttribute(attr)} ${value}`)\n }\n }\n}\n\n/**\n * Find an elements next sibling\n *\n * Utility function to find an elements next sibling matching the provided\n * selector.\n *\n * @param {Element | null} $element - Element to find siblings for\n * @param {string} [selector] - selector for required sibling\n */\nexport function getNextSibling($element, selector) {\n if (!$element || !($element instanceof HTMLElement)) {\n return\n }\n\n // Get the next sibling element\n let $sibling = $element.nextElementSibling\n\n // If there's no selector, return the first sibling\n if (!selector) return $sibling\n\n // If the sibling matches our selector, use it\n // If not, jump to the next sibling and continue the loop\n while ($sibling) {\n if ($sibling.matches(selector)) return $sibling\n $sibling = $sibling.nextElementSibling\n }\n}\n\n/**\n * Find an elements preceding sibling\n *\n * Utility function to find an elements previous sibling matching the provided\n * selector.\n *\n * @param {Element | null} $element - Element to find siblings for\n * @param {string} [selector] - selector for required sibling\n */\nexport function getPreviousSibling($element, selector) {\n if (!$element || !($element instanceof HTMLElement)) {\n return\n }\n\n // Get the previous sibling element\n let $sibling = $element.previousElementSibling\n\n // If there's no selector, return the first sibling\n if (!selector) return $sibling\n\n // If the sibling matches our selector, use it\n // If not, jump to the next sibling and continue the loop\n while ($sibling) {\n if ($sibling.matches(selector)) return $sibling\n $sibling = $sibling.previousElementSibling\n }\n}\n\n/**\n * @param {Element | null} $element\n * @param {string} [selector]\n */\nexport function findNearestMatchingElement($element, selector) {\n // If no element or selector is provided, return\n if (!$element || !($element instanceof HTMLElement) || !selector) {\n return\n }\n\n // Start with the current element\n let $currentElement = $element\n\n while ($currentElement) {\n // First check the current element\n if ($currentElement.matches(selector)) {\n return $currentElement\n }\n\n // Check all previous siblings\n let $sibling = $currentElement.previousElementSibling\n while ($sibling) {\n // Check if the sibling itself is a heading\n if ($sibling.matches(selector)) {\n return $sibling\n }\n $sibling = $sibling.previousElementSibling\n }\n\n // If no match found in siblings, move up to parent\n $currentElement = $currentElement.parentElement\n }\n}\n","import { ConfigurableComponent } from 'govuk-frontend'\n\nimport { setFocus } from '../../common/index.mjs'\nimport {\n findNearestMatchingElement,\n getPreviousSibling\n} from '../../helpers.mjs'\n\n/**\n * @augments {ConfigurableComponent<AlertConfig>}\n */\nexport class Alert extends ConfigurableComponent {\n /**\n * @param {Element | null} $root - HTML element to use for alert\n * @param {AlertConfig} [config] - Alert config\n */\n constructor($root, config = {}) {\n super($root, config)\n\n /**\n * Focus the alert\n *\n * If `role=\"alert\"` is set, focus the element to help some assistive\n * technologies prioritise announcing it.\n *\n * You can turn off the auto-focus functionality by setting\n * `data-disable-auto-focus=\"true\"` in the component HTML. You might wish to\n * do this based on user research findings, or to avoid a clash with another\n * element which should be focused when the page loads.\n */\n if (\n this.$root.getAttribute('role') === 'alert' &&\n !this.config.disableAutoFocus\n ) {\n setFocus(this.$root)\n }\n\n this.$dismissButton = this.$root.querySelector('.moj-alert__dismiss')\n\n if (this.config.dismissible && this.$dismissButton) {\n this.$dismissButton.innerHTML = this.config.dismissText\n this.$dismissButton.removeAttribute('hidden')\n\n this.$root.addEventListener('click', (event) => {\n if (\n event.target instanceof Node &&\n this.$dismissButton.contains(event.target)\n ) {\n this.dimiss()\n }\n })\n }\n }\n\n /**\n * Handle dismissing the alert\n */\n dimiss() {\n let $elementToRecieveFocus\n\n // If a selector has been provided, attempt to find that element\n if (this.config.focusOnDismissSelector) {\n $elementToRecieveFocus = document.querySelector(\n this.config.focusOnDismissSelector\n )\n }\n\n // Is the next sibling another alert\n if (!$elementToRecieveFocus) {\n const $nextSibling = this.$root.nextElementSibling\n if ($nextSibling && $nextSibling.matches('.moj-alert')) {\n $elementToRecieveFocus = $nextSibling\n }\n }\n\n // Else try to find any preceding sibling alert or heading\n if (!$elementToRecieveFocus) {\n $elementToRecieveFocus = getPreviousSibling(\n this.$root,\n '.moj-alert, h1, h2, h3, h4, h5, h6'\n )\n }\n\n // Else find the closest ancestor heading, or fallback to main, or last resort\n // use the body element\n if (!$elementToRecieveFocus) {\n $elementToRecieveFocus = findNearestMatchingElement(\n this.$root,\n 'h1, h2, h3, h4, h5, h6, main, body'\n )\n }\n\n // If we have an element, place focus on it\n if ($elementToRecieveFocus instanceof HTMLElement) {\n setFocus($elementToRecieveFocus)\n }\n\n // Remove the alert\n this.$root.remove()\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'moj-alert'\n\n /**\n * Alert default config\n *\n * @type {AlertConfig}\n */\n static defaults = Object.freeze({\n dismissible: false,\n dismissText: 'Dismiss',\n disableAutoFocus: false\n })\n\n /**\n * Alert config schema\n *\n * @satisfies {Schema<AlertConfig>}\n */\n static schema = Object.freeze(\n /** @type {const} */ ({\n properties: {\n dismissible: { type: 'boolean' },\n dismissText: { type: 'string' },\n disableAutoFocus: { type: 'boolean' },\n focusOnDismissSelector: { type: 'string' }\n }\n })\n )\n}\n\n/**\n * @typedef {object} AlertConfig\n * @property {boolean} [dismissible=false] - Can the alert be dismissed by the user\n * @property {string} [dismissText=Dismiss] - the label text for the dismiss button\n * @property {boolean} [disableAutoFocus=false] - whether the alert will be autofocused\n * @property {string} [focusOnDismissSelector] - CSS Selector for element to be focused on dismiss\n */\n\n/**\n * @import { Schema } from 'govuk-frontend/dist/govuk/common/configuration.mjs'\n */\n"],"names":["setFocus","$element","options","_options$onBeforeFocu","isFocusable","getAttribute","setAttribute","onFocus","addEventListener","onBlur","once","_options$onBlur","call","removeAttribute","onBeforeFocus","focus","getPreviousSibling","selector","HTMLElement","$sibling","previousElementSibling","matches","findNearestMatchingElement","$currentElement","parentElement","Alert","ConfigurableComponent","constructor","$root","config","disableAutoFocus","$dismissButton","querySelector","dismissible","innerHTML","dismissText","event","target","Node","contains","dimiss","$elementToRecieveFocus","focusOnDismissSelector","document","$nextSibling","nextElementSibling","remove","moduleName","defaults","Object","freeze","schema","properties","type"],"mappings":"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"}
@@ -54,7 +54,7 @@ class ConfigError extends GOVUKFrontendError {
54
54
  class ElementError extends GOVUKFrontendError {
55
55
  constructor(messageOrOptions) {
56
56
  let message = typeof messageOrOptions === 'string' ? messageOrOptions : '';
57
- if (typeof messageOrOptions === 'object') {
57
+ if (isObject(messageOrOptions)) {
58
58
  const {
59
59
  component,
60
60
  identifier,
@@ -63,7 +63,9 @@ class ElementError extends GOVUKFrontendError {
63
63
  } = messageOrOptions;
64
64
  message = identifier;
65
65
  message += element ? ` is not of type ${expectedType != null ? expectedType : 'HTMLElement'}` : ' not found';
66
- message = formatErrorMessage(component, message);
66
+ if (component) {
67
+ message = formatErrorMessage(component, message);
68
+ }
67
69
  }
68
70
  super(message);
69
71
  this.name = 'ElementError';
@@ -334,7 +336,7 @@ function getPreviousSibling($element, selector) {
334
336
  */
335
337
  function findNearestMatchingElement($element, selector) {
336
338
  // If no element or selector is provided, return
337
- if (!$element || !($element instanceof HTMLElement) || false) {
339
+ if (!$element || !($element instanceof HTMLElement) || !selector) {
338
340
  return;
339
341
  }
340
342