{"version":3,"file":"multi-select.mjs","sources":["../../../../src/moj/components/multi-select/multi-select.mjs"],"sourcesContent":["import { ConfigurableComponent } from 'govuk-frontend'\n\n/**\n * @augments {ConfigurableComponent<MultiSelectConfig>}\n */\nexport class MultiSelect extends ConfigurableComponent {\n  /**\n   * @param {Element | null} $root - HTML element to use for multi select\n   * @param {MultiSelectConfig} [config] - Multi select config\n   */\n  constructor($root, config = {}) {\n    super($root, config)\n\n    const $container = this.$root.querySelector(\n      `#${this.config.idPrefix}select-all`\n    )\n\n    const $checkboxes = /** @type {NodeListOf<HTMLInputElement>} */ (\n      this.config.checkboxes.items ??\n        this.$root.querySelectorAll(this.config.checkboxes.selector)\n    )\n\n    if (\n      !$container ||\n      !($container instanceof HTMLElement) ||\n      !$checkboxes.length\n    ) {\n      return this\n    }\n\n    this.setupToggle(this.config.idPrefix)\n\n    this.$toggleButton = this.$toggle.querySelector('input')\n    this.$toggleButton.addEventListener('click', this.onButtonClick.bind(this))\n\n    this.$container = $container\n    this.$container.append(this.$toggle)\n\n    this.$checkboxes = Array.from($checkboxes)\n    this.$checkboxes.forEach(($input) =>\n      $input.addEventListener('click', this.onCheckboxClick.bind(this))\n    )\n\n    this.checked = config.checked || false\n  }\n\n  setupToggle(idPrefix = '') {\n    const id = `${idPrefix}checkboxes-all`\n\n    const $toggle = document.createElement('div')\n    const $label = document.createElement('label')\n    const $input = document.createElement('input')\n    const $span = document.createElement('span')\n\n    $toggle.classList.add(\n      'govuk-checkboxes__item',\n      'govuk-checkboxes--small',\n      'moj-multi-select__checkbox'\n    )\n\n    $input.id = id\n    $input.type = 'checkbox'\n    $input.classList.add('govuk-checkboxes__input')\n\n    $label.setAttribute('for', id)\n    $label.classList.add(\n      'govuk-label',\n      'govuk-checkboxes__label',\n      'moj-multi-select__toggle-label'\n    )\n\n    $span.classList.add('govuk-visually-hidden')\n    $span.textContent = 'Select all'\n\n    $label.append($span)\n    $toggle.append($input, $label)\n\n    this.$toggle = $toggle\n  }\n\n  onButtonClick() {\n    if (this.checked) {\n      this.uncheckAll()\n      this.$toggleButton.checked = false\n    } else {\n      this.checkAll()\n      this.$toggleButton.checked = true\n    }\n  }\n\n  checkAll() {\n    this.$checkboxes.forEach(($input) => {\n      $input.checked = true\n    })\n\n    this.checked = true\n  }\n\n  uncheckAll() {\n    this.$checkboxes.forEach(($input) => {\n      $input.checked = false\n    })\n\n    this.checked = false\n  }\n\n  /**\n   * @param {MouseEvent} event - Click event\n   */\n  onCheckboxClick(event) {\n    if (!(event.target instanceof HTMLInputElement)) {\n      return\n    }\n\n    if (!event.target.checked) {\n      this.$toggleButton.checked = false\n      this.checked = false\n    } else {\n      if (\n        this.$checkboxes.filter(($input) => $input.checked).length ===\n        this.$checkboxes.length\n      ) {\n        this.$toggleButton.checked = true\n        this.checked = true\n      }\n    }\n  }\n\n  /**\n   * Name for the component used when initialising using data-module attributes.\n   */\n  static moduleName = 'moj-multi-select'\n\n  /**\n   * Multi select config\n   *\n   * @type {MultiSelectConfig}\n   */\n  static defaults = Object.freeze({\n    idPrefix: '',\n    checkboxes: {\n      selector: 'tbody input.govuk-checkboxes__input'\n    }\n  })\n\n  /**\n   * Multi select config schema\n   *\n   * @satisfies {Schema<MultiSelectConfig>}\n   */\n  static schema = Object.freeze(\n    /** @type {const} */ ({\n      properties: {\n        idPrefix: { type: 'string' },\n        checked: { type: 'boolean' },\n        checkboxes: { type: 'object' }\n      }\n    })\n  )\n}\n\n/**\n * Multi select config\n *\n * @typedef {object} MultiSelectConfig\n * @property {string} [idPrefix] - Prefix for the Select all\" checkbox `id` attribute\n * @property {boolean} [checked] - Whether the \"Select all\" checkbox is checked\n * @property {object} [checkboxes] - Checkboxes config\n * @property {string} [checkboxes.selector] - Checkboxes query selector\n * @property {NodeListOf<HTMLInputElement>} [checkboxes.items] - Checkboxes query selector results\n */\n\n/**\n * @import { Schema } from 'govuk-frontend/dist/govuk/common/configuration.mjs'\n */\n"],"names":["MultiSelect","ConfigurableComponent","constructor","$root","config","_this$config$checkbox","$container","querySelector","idPrefix","$checkboxes","checkboxes","items","querySelectorAll","selector","HTMLElement","length","setupToggle","$toggleButton","$toggle","addEventListener","onButtonClick","bind","append","Array","from","forEach","$input","onCheckboxClick","checked","id","document","createElement","$label","$span","classList","add","type","setAttribute","textContent","uncheckAll","checkAll","event","target","HTMLInputElement","filter","moduleName","defaults","Object","freeze","schema","properties"],"mappings":"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"}