{"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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"}