digitalmarketplace-frontend
Version:
Digital Marketplace Frontend contains assets and components used in Digital Marketplace projects
1 lines • 15.3 kB
Source Map (JSON)
{"version":3,"file":"list-input.mjs","sources":["../../../../src/digitalmarketplace/components/list-input/list-input.ts"],"sourcesContent":["import { DigitalMarketplaceFrontendComponent } from '../../digitalmarketplace-frontend-component'\n\nclass ListInput implements DigitalMarketplaceFrontendComponent {\n static moduleName = 'dm-list-input'\n\n static itemContainerClass = 'dm-list-input__item-container'\n static hiddenItemClass = 'dm-list-input__item--hidden'\n static visibleItemClass = 'dm-list-input__item--visible'\n static itemInputClass = 'dm-list-input__item-input'\n static itemErrorClass = 'dm-list-input__item--error'\n static itemErrorMsgClass = 'dm-list-input-error-message'\n static itemCounterClass = 'dm-list-input__counter'\n static inputErrorClass = 'govuk-input--error'\n static removeButtonClass = 'dm-list-input__item-remove'\n static hiddenRemoveButtonClass = 'dm-list-input__item-remove--hidden'\n static formGroupErrorClass = 'govuk-form-group--error'\n static hiddenAddButtonClass = 'dm-list-input__item-add--hidden'\n static addButtonRemainingClass = 'dm-list-input__js-remaining-counter'\n\n $module: JQuery<HTMLElement>\n $allVisibleItems: JQuery<HTMLElement>\n $addAnotherButton: JQuery<HTMLButtonElement>\n $allItems: JQuery<HTMLElement>\n\n constructor ($module: JQuery<HTMLElement>) {\n this.$module = $module\n this.$allVisibleItems = this.findVisibleItems()\n this.$addAnotherButton = this.$module.find<HTMLButtonElement>('.dm-list-input__item-add')\n this.$allItems = this.$module.find('.dm-list-input__item')\n }\n\n init () {\n this.hideEmptyItems()\n this.updateAllCounters()\n this.addRemoveClickEvent()\n this.toggleAddAnotherButton()\n this.addAddClickEvent()\n }\n\n findVisibleItems () {\n return this.$module.find('.dm-list-input__item--visible')\n }\n\n // Hide all items that do not have a value (except for the first one, or the first two if no items have a value)\n hideEmptyItems () {\n let numberOfVisibleEmptyItems = 0\n let numberOfFilledInItems = 0\n\n this.$allItems.each((_index, item) => {\n const $item = $(item)\n const $input = $item.find('.' + ListInput.itemInputClass)\n const $removeButton = $item.find('.' + ListInput.removeButtonClass)\n\n if (!$input.attr('value')) {\n if (numberOfVisibleEmptyItems === 0) {\n $removeButton.removeClass(ListInput.hiddenRemoveButtonClass)\n } else if (numberOfVisibleEmptyItems === 1 && numberOfFilledInItems === 0) {\n $removeButton.removeClass(ListInput.hiddenRemoveButtonClass)\n } else {\n $item.addClass(ListInput.hiddenItemClass)\n $item.removeClass(ListInput.visibleItemClass)\n $removeButton.addClass(ListInput.hiddenRemoveButtonClass)\n $input.attr('disabled', 'true')\n }\n numberOfVisibleEmptyItems += 1\n } else {\n $item.removeClass(ListInput.hiddenItemClass)\n $item.addClass(ListInput.visibleItemClass)\n $removeButton.removeClass(ListInput.hiddenRemoveButtonClass)\n numberOfFilledInItems += 1\n }\n })\n this.$allVisibleItems = this.findVisibleItems()\n }\n\n // Adds an event listener to module to listen for any\n // click events fired by the items \"Remove\" button\n addRemoveClickEvent () {\n this.$allItems.each((_index, item) => {\n const $item = $(item)\n const $input = $item.find('.' + ListInput.itemInputClass)\n const $removeButton = $item.find('.' + ListInput.removeButtonClass)\n\n $removeButton.on('click', () =>{\n $input.val('')\n $input.removeAttr('value')\n $input.attr('disabled', 'true')\n $removeButton.addClass(ListInput.hiddenRemoveButtonClass)\n $item.addClass(ListInput.hiddenItemClass)\n $item.removeClass(ListInput.visibleItemClass)\n this.$allVisibleItems = this.findVisibleItems()\n\n if ($item.hasClass(ListInput.itemErrorClass)) {\n $item.removeClass(ListInput.itemErrorClass)\n const $errorFormGroup = $item.find('.' + ListInput.formGroupErrorClass)\n $errorFormGroup.removeClass(ListInput.formGroupErrorClass)\n $errorFormGroup.remove('.' + ListInput.itemErrorMsgClass)\n const $errorInput = $errorFormGroup.find('.' + ListInput.inputErrorClass)\n const inputId = $errorInput.attr('id') as string\n const inputDescribedBy = $errorInput.attr('aria-describedby') as string\n $errorInput.attr('aria-describedby', inputDescribedBy.replace(inputId + '-error', ''))\n $errorInput.removeClass(ListInput.inputErrorClass)\n }\n\n // Hide Remove buttons if there is only one item left\n if (this.$allVisibleItems.length === 1) {\n const $removeButtons = this.$module.find('.' + ListInput.removeButtonClass)\n $removeButtons.each((_index, button) => {\n $(button).addClass(ListInput.hiddenRemoveButtonClass)\n })\n $(this.$allVisibleItems.get(0) as HTMLElement).find('input').trigger('focus')\n } else {\n // Set focus to the next input\n const $nextVisibleItem = ListInput.getSibling('next', $item, '.' + ListInput.visibleItemClass)\n\n if ($nextVisibleItem) {\n $nextVisibleItem.find('input').trigger('focus')\n } else {\n const $previousVisibleItem = ListInput.getSibling('previous', $item, '.' + ListInput.visibleItemClass) as JQuery<HTMLElement>\n $previousVisibleItem.find('input').trigger('focus')\n }\n }\n\n this.updateAllCounters()\n this.toggleAddAnotherButton()\n })\n })\n }\n\n // Used to update each item's label and remove button hidden text\n updateCounters () {\n this.$allVisibleItems.each((index, item) => {\n $(item).find('.' + ListInput.itemCounterClass).each((_index, counter) => {\n $(counter).text(index + 1)\n })\n })\n }\n\n // Used to update \"Add another\" buttons \"Remaining\" counter\n // and sets focus to the new additional input\n updateRemainingCounter () {\n const $visibleItems = this.$allVisibleItems\n const totalItems = this.$allItems.length\n\n this.$module.find('.' + ListInput.addButtonRemainingClass).text(totalItems - $visibleItems.length)\n }\n\n addAddClickEvent () {\n this.$addAnotherButton.on('click', () => {\n const $firstHiddenItem = this.$module.find('.' + ListInput.hiddenItemClass).first()\n const $firstHiddenInput = $firstHiddenItem.find('.' + ListInput.itemInputClass)\n\n if ($firstHiddenItem.length) {\n $firstHiddenInput.removeAttr('disabled')\n this.$module.find('.' + ListInput.itemContainerClass).append($firstHiddenItem)\n $firstHiddenItem.removeClass(ListInput.hiddenItemClass)\n $firstHiddenItem.addClass(ListInput.visibleItemClass)\n this.$allVisibleItems = this.findVisibleItems()\n this.updateAllCounters()\n $firstHiddenItem.find('.' + ListInput.removeButtonClass).removeClass(ListInput.hiddenRemoveButtonClass)\n $firstHiddenInput.trigger('focus')\n this.toggleAddAnotherButton()\n\n // Show Remove buttons if there is more one item\n if (this.$allVisibleItems.length > 1) {\n this.$module.find('.' + ListInput.removeButtonClass).each((_index, button) => {\n $(button).removeClass(ListInput.hiddenRemoveButtonClass)\n })\n }\n }\n })\n }\n\n toggleAddAnotherButton () {\n const $firstHiddenItem = this.$module.find('.' + ListInput.hiddenItemClass)\n\n if ($firstHiddenItem.length) {\n this.$addAnotherButton.removeClass(ListInput.hiddenAddButtonClass)\n } else {\n this.$addAnotherButton.addClass(ListInput.hiddenAddButtonClass)\n }\n }\n\n updateAllCounters () {\n this.updateCounters()\n this.updateRemainingCounter()\n }\n\n static getSibling (direction: string, elem: JQuery<HTMLElement>, selector: string) {\n // Get the next sibling element\n let sibling = (direction === 'next') ? elem.next() : elem.prev()\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\n while (sibling.length) {\n if (sibling.is(selector)) return sibling\n sibling = (direction === 'next') ? sibling.next() : sibling.prev()\n }\n }\n}\n\nexport { ListInput }\n"],"names":[],"mappings":"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"}