{"version":3,"file":"js/search-page.ad842f944f5ba9a65ff9.js","mappings":"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","sources":["webpack:///./Features/Pages/SearchPage/Scripts/search-page.ts"],"sourcesContent":["interface ISearchHit {\r\n heading: string;\r\n url: string;\r\n excerpt: string | null;\r\n lastUpdatedDate: string;\r\n lastUpdatedDateISO: string;\r\n type: string;\r\n fileType: string | null;\r\n}\r\n\r\ninterface ISearchResult {\r\n searchHits: ISearchHit[];\r\n totalHits: number;\r\n filters: string[];\r\n}\r\n\r\ninterface ITextContent {\r\n noKeywords: string;\r\n noResults: string;\r\n resultFor: string;\r\n resultsFor: string;\r\n lastUpdated: string;\r\n showMore: string;\r\n}\r\n\r\nconst useSearchPage = (): void => {\r\n const searchForm = document.querySelector('.search-page__form') as HTMLFormElement;\r\n const searchInput = document.querySelector('.search-page__input') as HTMLInputElement;\r\n const searchResultSection = document.querySelector('.search-page__result') as HTMLElement;\r\n const searchResultInfo = document.querySelector('.search-page__result-info') as HTMLParagraphElement;\r\n\r\n /* Data */\r\n const { hitsToShow, hitsToAdd, currentLanguage, includeText } = searchForm.dataset;\r\n\r\n /* Text content (translated text) */\r\n let includeTextArray = includeText?.split(', ') as string[];\r\n let textContent: ITextContent = {\r\n noKeywords: includeTextArray[0],\r\n noResults: includeTextArray[1],\r\n resultFor: includeTextArray[2],\r\n resultsFor: includeTextArray[3],\r\n lastUpdated: includeTextArray[4],\r\n showMore: includeTextArray[5]\r\n };\r\n\r\n /* Global variables */\r\n let query: string | null = null;\r\n let apiSkipAmount: number = 0;\r\n let apiTakeAmount: number = parseInt(hitsToShow!, 10);\r\n let selectedCategoryIds: number[] = [];\r\n\r\n /* Functions – Reset and clear DOM */\r\n const resetSearchResult = (): void => {\r\n searchInput.value = '';\r\n searchResultSection.classList.add('sr-only');\r\n searchResultInfo.textContent = textContent.noKeywords;\r\n }\r\n\r\n const clearResultList = (): void => {\r\n const resultList: HTMLUListElement | null = document.querySelector('.search-page__result-list');\r\n const showMore: HTMLDivElement | null = document.querySelector('.show-more');\r\n\r\n if (resultList) {\r\n resultList.remove();\r\n }\r\n\r\n if (showMore) {\r\n showMore.remove();\r\n }\r\n }\r\n\r\n /* Functions – Get data from API */\r\n const getSearchResult = async (): Promise => {\r\n try {\r\n let selectedCategoryIdsString = selectedCategoryIds ? selectedCategoryIds.join(',') : '';\r\n \r\n const response = await fetch(`/api/search?query=${query}&take=${apiTakeAmount}&skip=${apiSkipAmount}&lang=${currentLanguage}&filter=${selectedCategoryIdsString}`, {\r\n method: 'GET',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json'\r\n }\r\n });\r\n\r\n const result = await response.json();\r\n\r\n if (!response.ok) {\r\n throw new Error(response.statusText);\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n console.log(error);\r\n \r\n document.getElementById('spinner')!.classList.remove('spinner--show');\r\n }\r\n }\r\n\r\n /* Functions – Render DOM */\r\n const renderResultItems = (searchHits: ISearchHit[], resultList: HTMLUListElement): void => {\r\n searchHits.forEach(item => { \r\n const listItem = document.createElement('li') as HTMLLIElement;\r\n listItem.classList.add('search-page__result-item', 'content-area-item', 'content-area-item--full', 'site-page-partial');\r\n\r\n if (item.type === 'Media') {\r\n listItem.classList.add('search-page__result-item--media');\r\n }\r\n \r\n listItem.addEventListener('click', (): void => {\r\n window.location.href = item.url;\r\n });\r\n \r\n const content = document.createElement('div') as HTMLDivElement;\r\n content.classList.add('site-page-partial__content');\r\n listItem.appendChild(content);\r\n \r\n const textContainer = document.createElement('div') as HTMLDivElement;\r\n textContainer.classList.add('site-page-partial__text-container');\r\n content.appendChild(textContainer);\r\n\r\n const heading = document.createElement('h3') as HTMLHeadingElement;\r\n heading.classList.add('site-page-partial__heading', 'heading', 'heading--small');\r\n textContainer.appendChild(heading);\r\n\r\n if (item.type === 'Media') {\r\n const documentIcon = document.createElement('span') as HTMLSpanElement;\r\n documentIcon.classList.add('site-page-partial__heading-icon', 'heading__icon', 'icon', 'icon--file');\r\n heading.classList.add('heading--has-icon');\r\n heading.appendChild(documentIcon);\r\n }\r\n \r\n const link = document.createElement('a') as HTMLAnchorElement;\r\n link.classList.add('site-page-partial__link', 'heading__text');\r\n link.setAttribute('href', item.url);\r\n link.textContent = item.heading;\r\n\r\n if (item.fileType) {\r\n link.textContent += ` (${item.fileType})`;\r\n }\r\n \r\n heading.appendChild(link);\r\n\r\n if (item.excerpt) {\r\n const excerpt = document.createElement('p') as HTMLParagraphElement;\r\n excerpt.classList.add('site-page-partial__excerpt');\r\n excerpt.textContent = item.excerpt;\r\n textContainer.appendChild(excerpt);\r\n }\r\n \r\n const lastUpdatedDate = document.createElement('span') as HTMLSpanElement;\r\n lastUpdatedDate.classList.add('site-page-partial__date');\r\n lastUpdatedDate.textContent = `${textContent.lastUpdated}: `\r\n textContainer.appendChild(lastUpdatedDate);\r\n\r\n const time = document.createElement('time') as HTMLTimeElement;\r\n time.setAttribute('datetime', item.lastUpdatedDateISO);\r\n time.textContent = item.lastUpdatedDate;\r\n lastUpdatedDate.appendChild(time);\r\n \r\n const arrowIconContainer = document.createElement('div') as HTMLDivElement;\r\n arrowIconContainer.classList.add('site-page-partial__arrow-icon-container');\r\n textContainer.appendChild(arrowIconContainer);\r\n \r\n const arrowIcon = document.createElement('span') as HTMLSpanElement;\r\n if(item.type === 'Media') {\r\n arrowIcon.classList.add('site-page-partial__arrow-icon', 'icon', 'icon--arrow-down');\r\n } else {\r\n arrowIcon.classList.add('site-page-partial__arrow-icon', 'icon', 'icon--arrow-right'); \r\n }\r\n\r\n arrowIconContainer.appendChild(arrowIcon);\r\n\r\n resultList.appendChild(listItem);\r\n });\r\n }\r\n\r\n const renderShowMoreButton = (): void => {\r\n const showMoreContainer = document.createElement('div');\r\n showMoreContainer.classList.add('show-more');\r\n\r\n const showMoreButton = document.createElement('button');\r\n showMoreButton.classList.add('search-page__show-more-button', 'button', 'button--secondary');\r\n showMoreButton.setAttribute('type', 'button');\r\n showMoreButton.innerHTML = ` ${textContent.showMore}`;\r\n\r\n showMoreButton.addEventListener('click', (): void => {\r\n addMoreResultItems(showMoreButton);\r\n });\r\n\r\n showMoreContainer.appendChild(showMoreButton);\r\n searchResultSection.appendChild(showMoreContainer);\r\n }\r\n\r\n const renderResult = (searchResult: ISearchResult): void => {\r\n clearResultList();\r\n\r\n if (searchResult.totalHits > 0) { \r\n const searchResultSectionContainer = searchResultSection.querySelector('.section-block__container') as HTMLDivElement;\r\n const resultList = document.createElement('ul') as HTMLUListElement;\r\n resultList.classList.add('search-page__result-list', 'content-area');\r\n searchResultSectionContainer.appendChild(resultList);\r\n\r\n renderResultItems(searchResult.searchHits, resultList);\r\n let filterListElement = (document.querySelector('.filter') as HTMLUListElement);\r\n \r\n // Render search filters\r\n if (searchResult.filters && !!filterListElement) {\r\n filterListElement.innerHTML = Object.entries(searchResult.filters)\r\n .sort(([_, name1], [__, name2]) => name1.localeCompare(name2, currentLanguage))\r\n .map(([key, value]) => {\r\n let isSelected = selectedCategoryIds.includes(parseInt(key));\r\n return `
  • `;\r\n })\r\n .join(' ');\r\n filterListElement.hidden = false;\r\n } else {\r\n filterListElement.hidden = true;\r\n filterListElement.innerHTML = '';\r\n }\r\n\r\n let clearFilterButton = document.querySelector('.search-page__clear-filter') as HTMLButtonElement;\r\n \r\n if (selectedCategoryIds.length > 0){\r\n clearFilterButton.hidden = false;\r\n } else {\r\n clearFilterButton.hidden = true;\r\n }\r\n\r\n if (searchResult.totalHits === 1) {\r\n searchResultInfo.innerHTML = `${searchResult.totalHits} ${textContent.resultFor} ${query}.`;\r\n } else {\r\n searchResultInfo.innerHTML = `${searchResult.totalHits} ${textContent.resultsFor} ${query}.`;\r\n }\r\n \r\n // Add search filter event listeners\r\n addFilterButtonsEventListeners();\r\n\r\n if (searchResult.searchHits.length < searchResult.totalHits) {\r\n renderShowMoreButton();\r\n }\r\n } else {\r\n document.getElementById('no-result-text')!.style.display = 'block';\r\n searchResultInfo.textContent = textContent.noResults;\r\n }\r\n\r\n searchResultSection.classList.remove('sr-only');\r\n }\r\n\r\n const renderWithoutResult = (): void => {\r\n clearResultList();\r\n\r\n let filterListElement: HTMLUListElement | null = (document.querySelector('.filter') as HTMLUListElement);\r\n let clearFilterButton: HTMLButtonElement = document.querySelector('.search-page__clear-filter') as HTMLButtonElement;\r\n \r\n // Remove filters\r\n if (filterListElement) {\r\n filterListElement.hidden = true;\r\n filterListElement.innerHTML = '';\r\n }\r\n \r\n // Hide clear filter button\r\n clearFilterButton.hidden = true;\r\n\r\n // Reset search result\r\n searchInput.value = '';\r\n searchResultInfo.textContent = textContent.noKeywords;\r\n searchResultSection.classList.remove('sr-only');\r\n }\r\n\r\n /* Functions - Search */\r\n const search = async(): Promise => {\r\n apiSkipAmount = 0;\r\n\r\n let searchContainer = document.querySelector('.search-page__container') as HTMLUListElement;\r\n\r\n searchContainer.style.opacity = '0';\r\n document.getElementById('spinner')!.classList.add('spinner--show');\r\n\r\n let searchResult = await getSearchResult();\r\n\r\n setTimeout(() => {\r\n document.getElementById('spinner')!.classList.remove('spinner--show');\r\n searchContainer.style.opacity = '1';\r\n\r\n if (searchResult) {\r\n renderResult(searchResult);\r\n }\r\n }, 750)\r\n }\r\n\r\n const searchFromQueryString = (): void => {\r\n const urlParams = new URLSearchParams(window.location.search) as URLSearchParams;\r\n let queryFromParam: string | null = urlParams.get('query');\r\n let takeFromParam: string | null = urlParams.get('take');\r\n let selectedCategoryIdsFromParam: string | null = urlParams.get('filter');\r\n\r\n query = queryFromParam;\r\n\r\n if (query) {\r\n query = query.trim();\r\n searchInput.value = query;\r\n } else {\r\n query = '';\r\n }\r\n\r\n if (takeFromParam && !isNaN(parseInt(takeFromParam, 10))) {\r\n apiTakeAmount = parseInt(takeFromParam, 10);\r\n }\r\n \r\n if (!!selectedCategoryIdsFromParam?.length) {\r\n selectedCategoryIds = selectedCategoryIdsFromParam.split(',').map(Number);\r\n }\r\n\r\n if (query.length > 0) {\r\n search();\r\n } else {\r\n renderWithoutResult();\r\n }\r\n }\r\n\r\n const addMoreResultItems = async (showMoreButton: HTMLButtonElement): Promise => {\r\n apiSkipAmount += apiTakeAmount;\r\n apiTakeAmount = parseInt(hitsToAdd!, 10);\r\n\r\n let searchResult = await getSearchResult();\r\n if (searchResult) {\r\n const resultList = document.querySelector('.search-page__result-list') as HTMLUListElement;\r\n const resultItemsCount = resultList.children.length as number;\r\n let takeAmount = resultItemsCount + parseInt(hitsToAdd!, 10);\r\n\r\n if (searchResult.totalHits < takeAmount) {\r\n takeAmount = searchResult.totalHits;\r\n }\r\n\r\n let filter = selectedCategoryIds.length > 0 ? `&filter=${selectedCategoryIds.join(',')}` : '';\r\n\r\n window.history.replaceState({},'', `?query=${query}&take=${takeAmount}${filter}`);\r\n\r\n renderResultItems(searchResult.searchHits, resultList);\r\n\r\n if (resultList.children.length === searchResult.totalHits) {\r\n showMoreButton.parentElement!.remove();\r\n }\r\n\r\n let resultItems = resultList.children as HTMLCollection;\r\n let firstAddedResultItem = resultItems[resultItemsCount] as HTMLLIElement;\r\n let firstAddedResultItemLink = firstAddedResultItem.querySelector('a') as HTMLAnchorElement;\r\n firstAddedResultItemLink.focus();\r\n }\r\n }\r\n\r\n const getSelectedFilterButtons = () => {\r\n const selectedFilterButtons = document.querySelectorAll('.button--filter.button--selected') as NodeListOf;\r\n\r\n // Reset selected category ids\r\n selectedCategoryIds = [];\r\n \r\n // Add selected category ids\r\n selectedFilterButtons.forEach((button) => {\r\n selectedCategoryIds.push(parseInt(button.dataset.id!));\r\n });\r\n \r\n return selectedCategoryIds;\r\n };\r\n\r\n const handleFilterButtonEvent = (event: MouseEvent): void => {\r\n (event.target as HTMLButtonElement).classList.toggle('button--selected');\r\n selectedCategoryIds = getSelectedFilterButtons();\r\n \r\n // Add filters to query string\r\n let params = [];\r\n \r\n if (!!query) {\r\n params.push(`query=${query}`);\r\n }\r\n \r\n if (!!apiTakeAmount) {\r\n params.push(`take=${apiTakeAmount}`);\r\n }\r\n \r\n if (selectedCategoryIds.length > 0) {\r\n params.push(`filter=${selectedCategoryIds.join(',')}`);\r\n }\r\n \r\n window.history.pushState({},'', `?${params.join('&')}`);\r\n \r\n // Clear search result\r\n clearResultList();\r\n\r\n // Show pages based on selected category id:s\r\n search();\r\n };\r\n \r\n const addFilterButtonsEventListeners = (): void => {\r\n const filterButtons = document.querySelectorAll('.button--filter') as NodeListOf\r\n \r\n if (filterButtons.length > 0) {\r\n filterButtons.forEach((button) => {\r\n button.addEventListener('click', handleFilterButtonEvent);\r\n });\r\n }\r\n }\r\n\r\n const initializeEvents = (): void => {\r\n // Event that happens if someone enters url with query string\r\n window.addEventListener('load', (): void => {\r\n if (window.location.search) {\r\n searchFromQueryString();\r\n }\r\n\r\n searchInput.focus();\r\n });\r\n\r\n // Event that happens when users browse through their browser history, e.g. use the back button.\r\n window.addEventListener('popstate', (): void => {\r\n if (window.location.search) {\r\n searchFromQueryString();\r\n } else {\r\n resetSearchResult();\r\n }\r\n\r\n searchInput.focus();\r\n });\r\n\r\n // Event that happens when user submits a search with the form\r\n searchForm.addEventListener('submit', (event: SubmitEvent): void => {\r\n event.preventDefault();\r\n\r\n // If the query is different from the one in the search input, clear the result list\r\n if(!!query && query.length > 0 && query != searchInput.value.trim()) {\r\n clearResultList();\r\n }\r\n\r\n // Clear filters\r\n selectedCategoryIds = [];\r\n\r\n // Update query string\r\n query = searchInput.value.trim();\r\n window.history.pushState({},'', `?query=${query}`);\r\n\r\n if (query.length > 0) {\r\n search();\r\n } else {\r\n renderWithoutResult();\r\n }\r\n });\r\n\r\n // Event that happens when user clicks the clear filter button\r\n (document.querySelector(\".search-page__clear-filter\") as HTMLButtonElement).addEventListener('click', (event: MouseEvent): void => {\r\n // Clear query string\r\n window.history.pushState({},'', `?query=${query}`);\r\n \r\n selectedCategoryIds = [];\r\n apiTakeAmount = parseInt(hitsToShow!, 10);\r\n apiSkipAmount = 0;\r\n clearResultList();\r\n search();\r\n });\r\n }\r\n \r\n initializeEvents();\r\n};\r\n\r\nuseSearchPage();\r\n"],"names":["searchForm","document","querySelector","searchInput","searchResultSection","searchResultInfo","hitsToShow","hitsToAdd","currentLanguage","includeText","dataset","includeTextArray","split","textContent","noKeywords","noResults","resultFor","resultsFor","lastUpdated","showMore","query","apiSkipAmount","apiTakeAmount","parseInt","selectedCategoryIds","clearResultList","resultList","remove","getSearchResult","async","selectedCategoryIdsString","join","response","fetch","method","headers","result","json","ok","Error","statusText","error","console","log","getElementById","classList","renderResultItems","searchHits","forEach","item","listItem","createElement","add","type","addEventListener","window","location","href","url","content","appendChild","textContainer","heading","documentIcon","link","setAttribute","fileType","excerpt","lastUpdatedDate","time","lastUpdatedDateISO","arrowIconContainer","arrowIcon","renderResult","searchResult","totalHits","searchResultSectionContainer","filterListElement","filters","innerHTML","Object","entries","sort","_","name1","__","name2","localeCompare","map","key","value","includes","hidden","clearFilterButton","length","addFilterButtonsEventListeners","showMoreContainer","showMoreButton","addMoreResultItems","renderShowMoreButton","style","display","renderWithoutResult","search","searchContainer","opacity","setTimeout","searchFromQueryString","urlParams","URLSearchParams","queryFromParam","get","takeFromParam","selectedCategoryIdsFromParam","trim","isNaN","Number","resultItemsCount","children","takeAmount","filter","history","replaceState","parentElement","focus","handleFilterButtonEvent","event","target","toggle","selectedFilterButtons","querySelectorAll","button","push","id","getSelectedFilterButtons","params","pushState","filterButtons","preventDefault","useSearchPage"],"sourceRoot":""}