{"version":3,"file":"lazy-autocomplete-edac92a8.js","sources":["../../.tmp/js/components/autocomplete/statusText.js","../../.tmp/js/components/autocomplete/lazy-autocomplete.js","../../.tmp/js/components/autocomplete/createListItemHtml.js"],"sourcesContent":["const fallbackText = {\n available: 'tilgjengelig',\n is: 'er',\n are: 'er',\n result: 'resultat',\n results: 'resultater',\n of: 'av',\n highlighted: 'markert',\n};\nfunction selectedOption(option, index, length, textObject) {\n const text = textObject || fallbackText;\n return `${option} ${index + 1} ${text.of} ${length} ${text.is} ${text.highlighted}`;\n}\nfunction availableOptions(length, textObject) {\n const text = textObject || fallbackText;\n const wordIs = length === 1 ? text.is : text.are;\n const wordResult = length === 1 ? text.result : text.results;\n return `${length} ${wordResult} ${wordIs} ${text.available}.`;\n}\nexport const addStatusText = {\n selectedOption,\n availableOptions,\n};\n//# sourceMappingURL=statusText.js.map","import { debounce } from '../../functions/debounce';\nimport { createListItemHtml } from './createListItemHtml';\nimport { addStatusText } from './statusText';\nexport default function autocomplete(searchForm) {\n let currentFocus;\n const searchInput = searchForm.getElementsByTagName('input')[0];\n const searchButton = searchForm.querySelector('[data-search-button]');\n const clearInputButton = searchForm.querySelector('[data-clear-input]');\n const status = searchForm.querySelector('[data-status]');\n const statusText = status.dataset.statustext;\n const statusJson = statusText && JSON.parse(statusText);\n clearInputButton.addEventListener('click', () => {\n searchInput.value = '';\n searchInput.focus();\n });\n const getDataFromApi = async (prefix) => {\n if (prefix != '') {\n const searchActionUrl = searchForm.querySelector('form')?.getAttribute('action');\n await fetch(`${searchActionUrl}/Suggest?prefix=${prefix}`)\n .then(response => response.json())\n .then(json => {\n const suggestions = json.hits.map((hit) => hit.query);\n if (suggestions.length > 0) {\n createList(suggestions, prefix);\n }\n })\n .catch(error => {\n console.log('error', error);\n });\n }\n };\n function createList(items, inputValue) {\n let listElement;\n let listHasItems = false;\n currentFocus = -1;\n const listContainer = document.getElementById(`${searchInput.id}autocomplete-list-container`);\n let list = searchForm?.querySelector(`#${searchInput.id}autocomplete-list`);\n const ul = document.createElement('ul');\n const autocompleteSearchSuggestions = listContainer?.dataset.suggestions;\n ul.id = searchInput.id + 'autocomplete-list';\n ul.setAttribute('role', 'listbox');\n ul.setAttribute('aria-label', autocompleteSearchSuggestions || '');\n function filterItems(arr, query) {\n return arr.filter((item) => item.substring(0, query.length).toUpperCase() == query.toUpperCase());\n }\n const filteredItems = filterItems(items, inputValue);\n if (!list) {\n listContainer?.appendChild(ul);\n list = searchForm?.querySelector(`#${searchInput.id}autocomplete-list`);\n }\n while (list?.firstChild) {\n list?.removeChild(list.firstChild);\n }\n filteredItems.forEach((item, index) => {\n if (item.substring(0, inputValue.length).toUpperCase() == inputValue.toUpperCase()) {\n listHasItems = true;\n listElement = createListItemHtml({\n item: item,\n inputValue: inputValue,\n setsize: filteredItems.length,\n posinset: index,\n });\n listElement.addEventListener('click', function () {\n searchInput.value = this.dataset.value || '';\n searchButton.click();\n });\n searchInput.setAttribute('aria-expanded', 'true');\n list?.appendChild(listElement);\n }\n });\n if (listHasItems) {\n searchForm?.classList.add('spv-autocomplete--hasDropdown');\n }\n status.innerText = filteredItems.length\n ? addStatusText.availableOptions(filteredItems.length, statusJson)\n : '';\n }\n const checkInput = (value) => {\n const fieldVal = value;\n closeAllLists();\n if (!fieldVal) {\n searchForm.classList.remove('spv-autocomplete--hasValue');\n return;\n }\n searchForm.classList.add('spv-autocomplete--hasValue');\n getDataFromApi(fieldVal);\n };\n searchInput.addEventListener('input', debounce(e => {\n const target = e.target;\n return checkInput(target.value);\n }));\n searchInput.addEventListener('focus', debounce(e => {\n const target = e.target;\n checkInput(target.value);\n }));\n function handlePrintableKey(event) {\n const inputElement = searchInput;\n const eventIsOnInput = event.target === inputElement;\n if (!eventIsOnInput) {\n inputElement.focus();\n }\n }\n function handleUpArrow(event, list) {\n event.preventDefault();\n currentFocus--;\n addActive(list);\n }\n function handleDownArrow(event, list) {\n event.preventDefault();\n currentFocus++;\n addActive(list);\n }\n function handleSelectItem(e, list) {\n if (currentFocus > -1) {\n e.preventDefault();\n if (list)\n list[currentFocus].click();\n }\n }\n function handleComponentBlur(e) {\n e.stopImmediatePropagation();\n closeAllLists();\n }\n function handleKeyDown(event) {\n const autocompleteList = (document.getElementById(searchInput.id + 'autocomplete-list'));\n let autocompleteListItems;\n if (!autocompleteList) {\n return;\n }\n else {\n autocompleteListItems = autocompleteList.getElementsByTagName('li');\n }\n switch (event.code) {\n case 'ArrowUp':\n handleUpArrow(event, autocompleteListItems);\n break;\n case 'ArrowDown':\n handleDownArrow(event, autocompleteListItems);\n break;\n case 'Space':\n handleSelectItem(event, autocompleteListItems);\n break;\n case 'Enter':\n handleSelectItem(event, autocompleteListItems);\n break;\n case 'Escape':\n handleComponentBlur(event);\n break;\n default:\n if (event.code !== 'Tab') {\n handlePrintableKey(event);\n }\n break;\n }\n }\n function addActive(autocompleteList) {\n if (!autocompleteList)\n return;\n removeActive(autocompleteList);\n if (currentFocus >= autocompleteList.length)\n currentFocus = 0;\n if (currentFocus < 0)\n currentFocus = autocompleteList.length - 1;\n searchInput.setAttribute('aria-activedescendant', 'spv-autocomplete__dropdownItem_' + currentFocus);\n const currentItem = autocompleteList[currentFocus];\n currentItem.classList.add('spv-autocomplete__dropdownItem--active');\n currentItem.setAttribute('aria-selected', 'true');\n currentItem.focus();\n status.innerText = addStatusText.selectedOption(currentItem.innerText, currentFocus, autocompleteList.length, statusJson);\n }\n function removeActive(autocompleteList) {\n for (let i = 0; i < autocompleteList.length; i++) {\n autocompleteList[i].classList.remove('spv-autocomplete__dropdownItem--active');\n autocompleteList[i].removeAttribute('aria-selected');\n }\n }\n function closeAllLists() {\n status?.innerText && (status.innerText = '');\n searchForm?.classList.remove('spv-autocomplete--hasDropdown');\n const listContainer = document.getElementById(`${searchInput.id}autocomplete-list-container`);\n if (listContainer) {\n listContainer.innerHTML = '';\n }\n searchInput.setAttribute('aria-expanded', 'false');\n }\n searchForm.addEventListener('keydown', e => handleKeyDown(e));\n}\n//# sourceMappingURL=lazy-autocomplete.js.map","export function createListItemHtml(listItem) {\n const li = document.createElement('li');\n const listButton = document.createElement('button');\n listButton.setAttribute('type', 'button');\n li.setAttribute('role', 'option');\n li.classList.add('spv-autocomplete__dropdownItem');\n li.setAttribute('id', 'spv-autocomplete__dropdownItem_' + listItem.posinset);\n li.innerHTML = '' + listItem.item.substring(0, listItem.inputValue.length) + '';\n li.innerHTML += listItem.item.substring(listItem.inputValue.length);\n li.setAttribute('data-value', listItem.item);\n li.setAttribute('aria-setsize', `${listItem.setsize}`);\n li.setAttribute('aria-posinset', `${listItem.posinset + 1}`);\n li.setAttribute('tabindex', '-1');\n return li;\n}\n//# sourceMappingURL=createListItemHtml.js.map"],"names":["fallbackText","available","is","are","result","results","of","highlighted","addStatusText","selectedOption","option","index","length","textObject","text","availableOptions","wordIs","autocomplete","searchForm","currentFocus","searchInput","getElementsByTagName","searchButton","querySelector","clearInputButton","status","statusText","dataset","statustext","statusJson","JSON","parse","addEventListener","value","focus","getDataFromApi","async","prefix","searchActionUrl","getAttribute","fetch","then","response","json","suggestions","hits","map","hit","query","items","inputValue","listElement","listHasItems","listContainer","document","getElementById","id","list","ul","createElement","autocompleteSearchSuggestions","filterItems","arr","filter","item","substring","toUpperCase","setAttribute","filteredItems","appendChild","firstChild","removeChild","forEach","listItem","li","classList","add","posinset","innerHTML","setsize","createListItemHtml","this","click","innerText","createList","catch","error","console","log","checkInput","fieldVal","closeAllLists","remove","handleSelectItem","e","preventDefault","handleKeyDown","event","autocompleteList","autocompleteListItems","code","addActive","handleUpArrow","handleDownArrow","stopImmediatePropagation","inputElement","target","handlePrintableKey","i","removeAttribute","removeActive","currentItem","debounce"],"mappings":"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"}