UNPKG

digitalmarketplace-frontend

Version:

Digital Marketplace Frontend contains assets and components used in Digital Marketplace projects

1 lines 15.9 kB
{"version":3,"file":"option-select.bundle.mjs","sources":["../../../../src/digitalmarketplace/components/option-select/option-select.ts"],"sourcesContent":["import { DigitalMarketplaceFrontendComponent } from '../../digitalmarketplace-frontend-component'\n\nclass OptionSelect implements DigitalMarketplaceFrontendComponent {\n static moduleName = 'dm-option-select'\n\n $optionSelect: JQuery<HTMLElement>\n $options: JQuery<HTMLInputElement>\n $optionsContainer: JQuery<HTMLElement>\n $optionList: JQuery<HTMLElement>\n $allCheckboxes: JQuery<HTMLElement>\n checkedCheckboxes: HTMLElement[]\n filterOptions: FilterOptions | undefined\n\n constructor ($module: JQuery<HTMLElement>) {\n this.$optionSelect = $module\n this.$options = this.$optionSelect.find<HTMLInputElement>('input[type=\"checkbox\"]')\n this.$optionsContainer = this.$optionSelect.find('.js-options-container')\n this.$optionList = this.$optionsContainer.find('.js-auto-height-inner')\n this.$allCheckboxes = this.$optionsContainer.find('.govuk-checkboxes__item')\n this.checkedCheckboxes = []\n }\n\n init () {\n // Attach listener to update checked count\n this.$optionSelect.on('change', (event) => {\n const changedEl = event.target\n\n if (changedEl.tagName === 'INPUT' && changedEl.getAttribute('type') === 'checkbox') {\n this.updateCheckedCount()\n }\n })\n\n // Replace div.container-head with a button\n this.replaceHeadingSpanWithButton()\n\n // Add js-collapsible class to parent for CSS\n this.$optionSelect.addClass('js-collapsible')\n\n // Add open/close listeners\n this.$optionSelect.find('.js-container-button').on('click', (event) => {\n this.toggleOptionSelect(event)\n })\n\n if (this.$optionSelect.data().closedOnLoad) {\n this.close()\n } else {\n this.setupHeight()\n }\n\n const checkedString = this.checkedString()\n if (checkedString) {\n this.attachCheckedCounter(checkedString)\n }\n\n const $filter = this.$optionSelect.find('.js-dm-filter-options')\n if ($filter.length) {\n this.filterOptions = new FilterOptions($filter, this)\n this.filterOptions.init()\n }\n }\n\n getAllCheckedCheckboxes () {\n this.checkedCheckboxes = []\n\n this.$allCheckboxes.each((_index, checkbox) => {\n if ($(checkbox).find('input[type=checkbox]').is(':checked')) {\n this.checkedCheckboxes.push(checkbox)\n }\n })\n }\n\n replaceHeadingSpanWithButton () {\n /* Replace the span within the heading with a button element. This is based on feedback from Léonie Watson.\n * The button has all of the accessibility hooks that are used by screen readers and etc.\n * We do this in the JavaScript because if the JavaScript is not active then the button shouldn't\n * be there as there is no JS to handle the click event.\n */\n const $containerHead = this.$optionSelect.find('.js-container-button')\n const jsContainerHeadHTML = $containerHead.html()\n\n // Create button and replace the preexisting html with the button.\n const $button = document.createElement('button')\n $button.classList.add('js-container-button', 'dm-option-select__title', 'dm-option-select__button')\n // Add type button to override default type submit when this component is used within a form\n $button.setAttribute('type', 'button')\n $button.setAttribute('aria-expanded', 'true')\n $button.setAttribute('id', $containerHead.attr('id') as string)\n $button.setAttribute('aria-controls', this.$optionsContainer.attr('id') as string)\n $button.innerHTML = jsContainerHeadHTML\n $containerHead.after($button.outerHTML)\n $containerHead.remove()\n }\n\n attachCheckedCounter (checkedString: string) {\n this.$optionSelect.find('.js-container-button').after(`<div class=\"dm-option-select__selected-counter js-selected-counter\">${checkedString}</div>`)\n }\n\n updateCheckedCount () {\n const checkedString = this.checkedString()\n const $checkedStringElement = this.$optionSelect.find('.js-selected-counter')\n\n if (checkedString) {\n if ($checkedStringElement.length) {\n $checkedStringElement.text(checkedString)\n } else {\n this.attachCheckedCounter(checkedString)\n }\n } else {\n $checkedStringElement.remove()\n }\n }\n\n checkedString () {\n this.getAllCheckedCheckboxes()\n const count = this.checkedCheckboxes.length\n return count > 0 ? `${count} selected` : ''\n }\n\n toggleOptionSelect (event: JQuery.ClickEvent) {\n if (this.isClosed()) {\n this.open()\n } else {\n this.close()\n }\n event.preventDefault()\n }\n\n open () {\n if (this.isClosed()) {\n this.$optionSelect.find('.js-container-button').attr('aria-expanded', 'true')\n this.$optionSelect.removeClass('js-closed')\n this.$optionSelect.addClass('js-opened')\n if (!this.$optionsContainer.css('height')) {\n this.setupHeight()\n }\n }\n }\n\n close () {\n this.$optionSelect.removeClass('js-opened')\n this.$optionSelect.addClass('js-closed')\n this.$optionSelect.find('.js-container-button').attr('aria-expanded', 'false')\n }\n\n isClosed () {\n return this.$optionSelect.hasClass('js-closed')\n }\n\n setContainerHeight (height: number) {\n this.$optionsContainer.css('height', height + 'px')\n }\n\n getMaxContainerHeight () {\n const maxHeight = parseFloat(window.getComputedStyle(this.$optionsContainer.get(0) as HTMLElement).maxHeight)\n\n return Number.isNaN(maxHeight) ? 200 : maxHeight\n }\n\n isCheckboxVisible ($checkbox: JQuery<HTMLElement>, containerHeight: number) {\n if (!$checkbox.is(':visible')) {\n return false\n }\n\n const checkboxTop = ($checkbox.get(0) as HTMLElement).offsetTop\n\n return checkboxTop < containerHeight\n }\n\n getVisibleCheckboxes (containerHeight: number) {\n const allVisibleCheckboxes = this.$allCheckboxes.filter(':visible').get()\n const visibleCheckboxes = allVisibleCheckboxes.filter((checkbox) => this.isCheckboxVisible($(checkbox), containerHeight))\n\n\n // Add one extra visible row so the collapsed list hints there are more options.\n if (visibleCheckboxes.length < allVisibleCheckboxes.length) {\n visibleCheckboxes.push(allVisibleCheckboxes[visibleCheckboxes.length] as HTMLElement)\n }\n\n return visibleCheckboxes\n }\n\n setupHeight () {\n const optionsContainer = this.$optionsContainer.get(0) as HTMLElement\n const optionList = this.$optionList.get(0) as HTMLElement\n\n const maxContainerHeight = this.getMaxContainerHeight()\n const height = optionList.scrollHeight\n\n // check whether this is hidden by progressive disclosure,\n // because height calculations won't work\n if (optionsContainer.offsetParent === null) {\n this.setContainerHeight(maxContainerHeight)\n return\n }\n\n // Resize if the list is only slightly bigger than its container\n if (height <= maxContainerHeight + 50) {\n this.setContainerHeight(height + 1)\n return\n }\n\n // Resize to cut last item cleanly in half\n const visibleCheckboxes = this.getVisibleCheckboxes(maxContainerHeight)\n\n if (!visibleCheckboxes.length) {\n this.setContainerHeight(height + 1)\n return\n }\n\n const lastVisibleCheckbox = visibleCheckboxes[visibleCheckboxes.length - 1] as HTMLElement\n const position = lastVisibleCheckbox?.offsetTop\n const checkboxHeight = lastVisibleCheckbox?.offsetHeight ?? 0\n\n // Never shrink below one full visible row.\n const calculatedHeight = position + (checkboxHeight / 1.5)\n this.setContainerHeight(Math.max(calculatedHeight, checkboxHeight + 1))\n }\n}\n\nclass FilterOptions {\n static moduleName = 'dm-filter-options'\n\n $filter: JQuery<HTMLElement>\n $optionSelect: JQuery<HTMLElement>\n $optionsContainer: JQuery<HTMLElement>\n $input: JQuery<HTMLInputElement>\n $checkboxes: JQuery<HTMLElement>\n optionSelect: OptionSelect\n\n constructor ($module: JQuery<HTMLElement>, optionSelect: OptionSelect) {\n this.$filter = $module\n this.$optionSelect = optionSelect.$optionSelect\n this.$optionsContainer = optionSelect.$optionsContainer\n this.$input = this.$filter.find('input')\n this.$checkboxes = this.$optionSelect.find('.govuk-checkboxes__item')\n this.optionSelect = optionSelect\n }\n\n init () {\n this.$input.on('keyup input search', () => this.filterCheckboxes())\n }\n\n filterCheckboxes () {\n const query = (this.$input.val() as string).toLowerCase()\n\n this.$checkboxes.each((_index, checkbox) => {\n const $checkbox = $(checkbox)\n const label = $checkbox.find('label').text().toLowerCase()\n\n if (label.includes(query)) {\n $checkbox.show()\n } else {\n $checkbox.hide()\n }\n })\n\n this.$optionsContainer.css('height', 'auto')\n this.optionSelect.setupHeight()\n }\n}\n\nexport { OptionSelect }\n"],"names":[],"mappings":"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"}