{"version":3,"file":"Src_Scripts_components_site-search_js.6af1f99b4109cf328eb6.js","sources":["webpack://Boerneraadet/./Src/Scripts/components/site-search.js","webpack://Boerneraadet/./node_modules/unscroll/unscroll.js"],"sourcesContent":["import Masonry from 'masonry-layout';\r\nimport Unscroll from 'unscroll';\r\n\r\nexport default class SiteSearch {\r\n\r\n constructor(elm) {\r\n\r\n let msnry;\r\n\r\n const searchBox = elm.querySelector('#knowledge-search-term');\r\n const clearSearch = elm.querySelector('#clear-search');\r\n const searchButton = elm.querySelector('#perform-knowledge-search');\r\n const searchShowMoreButton = elm.querySelector('#search-show-more');\r\n const searchResultContainer = elm.querySelector('.search__results__items');\r\n const siteSearchIntro = elm.querySelector('.site-search__intro');\r\n const status = elm.querySelector('.site-search__status');\r\n const searchFor = elm.querySelector('.site-search__search-for');\r\n const resultCount = elm.querySelector('.site-search__result-count');\r\n const notfound = elm.querySelector('#notfound');\r\n let allThemes;\r\n\r\n let page = 0;\r\n const pageSize = 10;\r\n\r\n function setGrid() {\r\n\r\n if (window.innerWidth > 1700) {\r\n elm.querySelector('.search__results__items').classList.add('grid');\r\n } else {\r\n elm.querySelector('.search__results__items').classList.remove('grid');\r\n }\r\n }\r\n\r\n const searchButtons = document.querySelectorAll('.toggle-site-search');\r\n for (let i = 0; i < searchButtons.length; i++) {\r\n searchButtons[i].addEventListener('click', e => {\r\n e.preventDefault();\r\n if (!elm.classList.contains('open')) {\r\n\r\n // close mobile menu if open\r\n document.querySelector('#mobile-navigation-main').classList.remove('active');\r\n document.querySelector('.header-mobile__menu-icon.open').classList.add('active');\r\n document.querySelector('.header-mobile__menu-icon.close').classList.remove('active');\r\n\r\n // open search overlay\r\n document.querySelector('.header').classList.add('searching');\r\n document.querySelector('.nav-search').classList.add('searching');\r\n document.querySelector('#nav-search-text').innerText = 'Luk søg';\r\n document.querySelector('#nav-search-icon-sitesearch').style.display = 'none';\r\n document.querySelector('#nav-search-icon-close').style.display = 'inline';\r\n document.querySelector('#nav-search-icon-mobile').style.display = 'none';\r\n document.querySelector('#nav-search-icon-mobile').classList.remove('active');\r\n document.querySelector('#nav-search-icon-mobile-close').style.display = 'inline';\r\n document.querySelector('#nav-search-icon-mobile-close').classList.add('active');\r\n document.querySelector('header').classList.remove('scrolled');\r\n Unscroll();\r\n elm.classList.add('open');\r\n } else {\r\n // close search overlay\r\n document.querySelector('.header').classList.remove('searching');\r\n document.querySelector('.nav-search').classList.remove('searching');\r\n document.querySelector('#nav-search-text').innerText = 'Hvad søger du?';\r\n document.querySelector('#nav-search-icon-sitesearch').style.display = 'inline';\r\n document.querySelector('#nav-search-icon-close').style.display = 'none';\r\n document.querySelector('#nav-search-icon-mobile').style.display = 'inline';\r\n document.querySelector('#nav-search-icon-mobile').classList.add('active');\r\n document.querySelector('#nav-search-icon-mobile-close').style.display = 'none';\r\n document.querySelector('#nav-search-icon-mobile-close').classList.remove('active');\r\n Unscroll.reset();\r\n elm.classList.remove('open');\r\n }\r\n });\r\n }\r\n\r\n searchButton.addEventListener('click', () => {\r\n // new search, clear filters\r\n if (!searchButton.classList.contains('disabled')) {\r\n performSearch(false, false);\r\n }\r\n });\r\n\r\n searchBox.addEventListener('keydown', () => {\r\n if (event.key === 'Enter') {\r\n // new search, clear filters\r\n performSearch(false, false);\r\n }\r\n });\r\n\r\n searchBox.addEventListener('keyup', () => {\r\n if (searchBox.value == '') {\r\n disableSearchButton(true);\r\n } else {\r\n disableSearchButton(false);\r\n }\r\n });\r\n\r\n searchShowMoreButton.addEventListener('click', e => {\r\n e.preventDefault();\r\n if (!searchShowMoreButton.classList.contains('disabled')) {\r\n performSearch(true, false);\r\n }\r\n });\r\n\r\n elm.querySelector('#mobile-filter').addEventListener('click', e => {\r\n e.preventDefault();\r\n const clickX = e.pageX - e.currentTarget.offsetLeft;\r\n if (clickX < 72) {\r\n document.querySelector('.site-search').scrollTo(0, 0);\r\n searchBox.focus();\r\n } else {\r\n document.querySelector('#mobile-filter').classList.add('hidden');\r\n document.body.classList.add('stop-scrolling');\r\n }\r\n });\r\n\r\n clearSearch.addEventListener('click', () => {\r\n searchBox.value = '';\r\n clearResults();\r\n clearSearch.classList.add('hidden');\r\n siteSearchIntro.classList.remove('hidden');\r\n disableSearchButton(true);\r\n });\r\n\r\n window.addEventListener('resize', () => {\r\n setGrid();\r\n });\r\n\r\n\r\n elm.addEventListener('scroll', () => {\r\n setMobileFilterButtonVisibility();\r\n });\r\n\r\n function setMobileFilterButtonVisibility() {\r\n\r\n const offset = document.querySelector('.search__box').getBoundingClientRect();\r\n if (offset.bottom < 0) {\r\n document.querySelector('#mobile-filter').classList.remove('hidden');\r\n } else {\r\n document.querySelector('#mobile-filter').classList.add('hidden');\r\n }\r\n }\r\n\r\n\r\n function initializeMasonry() {\r\n const grid = elm.querySelector('.grid');\r\n if (grid) {\r\n msnry = new Masonry(grid, {\r\n itemSelector: '.search-result',\r\n gutter: 40,\r\n });\r\n }\r\n }\r\n\r\n function disableSearchButton(disable) {\r\n searchButton.disabled = disable;\r\n if (disable) {\r\n searchButton.classList.add('disabled');\r\n } else {\r\n searchButton.classList.remove('disabled');\r\n }\r\n\r\n }\r\n\r\n function clearResults() {\r\n while (searchResultContainer.firstChild) {\r\n searchResultContainer.removeChild(searchResultContainer.firstChild);\r\n }\r\n status.style.visibility = 'hidden';\r\n searchFor.innerText = '';\r\n resultCount.innerText = '';\r\n\r\n searchShowMoreButton.classList.add('hidden');\r\n notfound.style.display = 'none';\r\n }\r\n\r\n async function performSearch(addToResults, filter) {\r\n\r\n if (searchBox.value.length > 0) {\r\n clearSearch.classList.remove('hidden');\r\n }\r\n\r\n notfound.style.display = 'none';\r\n siteSearchIntro.classList.add('hidden');\r\n\r\n if (!addToResults) {\r\n // clear search results\r\n while (searchResultContainer.firstChild) {\r\n searchResultContainer.removeChild(searchResultContainer.firstChild);\r\n }\r\n if (!filter) {\r\n page = 0;\r\n }\r\n } else {\r\n page += 1;\r\n }\r\n\r\n const templateArea = elm.querySelector('[data-templates]');\r\n\r\n const searchResultTemplate = templateArea.querySelector('[data-search-result-template]');\r\n\r\n const contentPageSearchResultTemplate = templateArea.querySelector('[data-contentpage-search-result-template]');\r\n\r\n const searchUrl = '/Umbraco/Api/Search/GetSiteSearchResults';\r\n const searchParams = new Array();\r\n\r\n const searchTerm = searchBox.value;\r\n\r\n if (searchTerm != null && searchTerm != '') {\r\n searchParams.push('searchTerm=' + searchTerm);\r\n }\r\n\r\n if (page > 0) {\r\n searchParams.push('page=' + page);\r\n }\r\n\r\n if (filter) {\r\n searchParams.push('takeAll=true');\r\n }\r\n\r\n let searchParamString = '';\r\n\r\n if (searchParams.length > 0) {\r\n\r\n searchParamString = '?' + searchParams.join('&');\r\n }\r\n\r\n const responseText = await fetch(searchUrl + searchParamString);\r\n const response = await responseText.json();\r\n const results = response.results;\r\n\r\n allThemes = response.themes;\r\n let currentArticleYear = '';\r\n let previousArticleYear = '';\r\n\r\n // const sizerDiv = document.createElement('div');\r\n // sizerDiv.classList.add('grid-sizer');\r\n // searchResultContainer.appendChild(sizerDiv);\r\n\r\n for (const i in results) {\r\n let elem;\r\n\r\n if (results[i].category != 'Indholdssider') {\r\n\r\n elem = searchResultTemplate.cloneNode(true);\r\n\r\n elem.classList.add('category-' + results[i].category.toLowerCase());\r\n const iconElement = templateArea.querySelector('.article__category-icon.' + results[i].category.toLowerCase().replace('ø', 'oe'));\r\n const newIconElement = iconElement.cloneNode(true);\r\n\r\n elem.querySelector('.article__theme-text').innerText = results[i].themes[0];\r\n elem.querySelector('.article__category').innerText = results[i].category;\r\n\r\n if (results[i].imageUrl) {\r\n elem.querySelector('.search-result__image').src = results[i].imageUrl;\r\n if (results[i].media == 'pdf') {\r\n elem.querySelector('.search-result__image').classList.add('pdf');\r\n }\r\n elem.querySelector('.search-result__image').alt = results[i].altText;\r\n\r\n if (results[i].hasVideo) {\r\n const playButtonElement = templateArea.querySelector('.play-icon');\r\n const newPlayButtonElement = playButtonElement.cloneNode(true);\r\n elem.querySelector('.search-result__image-container').appendChild(newPlayButtonElement);\r\n }\r\n\r\n } else {\r\n elem.querySelector('.search-result__content').removeChild(elem.querySelector('.search-result__image-container'));\r\n }\r\n\r\n elem.querySelector('.article__category').insertBefore(newIconElement, elem.querySelector('.article__category').firstChild);\r\n elem.querySelector('.article__date').innerText = results[i].publishDate;\r\n } else {\r\n elem = contentPageSearchResultTemplate.cloneNode(true);\r\n }\r\n\r\n elem.classList.add('grid-item');\r\n currentArticleYear = results[i].publishDate.slice(-4);\r\n if (currentArticleYear !== previousArticleYear) {\r\n elem.classList.add('anchor');\r\n elem.id = 'year-' + currentArticleYear;\r\n }\r\n\r\n elem.querySelector('.search-result__headline').innerText = results[i].headline;\r\n elem.querySelector('.search-result__text-extract').innerText = results[i].bodyText;\r\n elem.setAttribute('data-url', results[i].url);\r\n const url = results[i].url.slice();\r\n elem.addEventListener('click', () => {\r\n location.href = url;\r\n });\r\n\r\n searchResultContainer.appendChild(elem);\r\n\r\n elem.classList.add('visible');\r\n previousArticleYear = currentArticleYear;\r\n }\r\n\r\n searchFor.innerText = '\"' + searchTerm + '\"';\r\n resultCount.innerText = '' + response.totalResultCount + ' resultater';\r\n status.style.visibility = 'visible';\r\n\r\n if (elm.getElementsByClassName('grid')) {\r\n initializeMasonry();\r\n }\r\n\r\n if (results.length === 0) {\r\n notfound.style.display = 'block';\r\n }\r\n if (response.totalResultCount <= pageSize) {\r\n searchShowMoreButton.classList.add('hidden');\r\n notfound.style.display = 'block';\r\n } else if (response.pagedResultCount >= response.filteredResultCount) {\r\n searchShowMoreButton.classList.add('hidden');\r\n notfound.style.display = 'block';\r\n } else {\r\n searchShowMoreButton.classList.remove('hidden');\r\n }\r\n }\r\n\r\n // get querystring parameters\r\n const params = new URLSearchParams(window.location.search);\r\n\r\n if (params.has('searchTerm')) {\r\n searchBox.value = params.get('searchTerm');\r\n }\r\n\r\n if (params.has('themes')) {\r\n params.getAll('themes').forEach(theme => {\r\n // add theme as selected\r\n addTheme(theme, true, false);\r\n });\r\n }\r\n\r\n setGrid();\r\n disableSearchButton(true);\r\n }\r\n}\r\n","// UMD wrapper from https://github.com/umdjs/umd\n(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = factory();\n } else {\n root.unscroll = factory();\n }\n}(typeof self !== 'undefined' ? self : this, function () {\n\n // Main function to remove scrollbar and adjust elements\n function unscroll(elements) {\n\n // Store reusable vars\n this.set = function (id, value) {\n if (!window.unscrollStore) {\n window.unscrollStore = {};\n }\n window.unscrollStore[id] = value;\n };\n\n // Get reusable vars\n this.get = function (id) {\n return window.unscrollStore ? window.unscrollStore[id] : null;\n };\n\n // Get the width of the scroll bar in pixel\n this.getScrollbarWidth = function () {\n if (this.get('scrollbarWidth')) {\n return this.get('scrollbarWidth') + 'px';\n }\n var scrollElement = document.createElement('div');\n scrollElement.style.width = '100px';\n scrollElement.style.height = '100px';\n scrollElement.style.overflow = 'scroll';\n scrollElement.style.position = 'absolute';\n scrollElement.style.top = '-10000';\n\n document.body.appendChild(scrollElement);\n var scrollbarWidth = scrollElement.offsetWidth - scrollElement.clientWidth;\n document.body.removeChild(scrollElement);\n\n this.set('scrollbarWidth', scrollbarWidth);\n return scrollbarWidth + 'px';\n }\n\n // Add unscroll class to head\n function addUnscrollClassName() {\n if (document.getElementById('unscroll-class-name')) {\n return;\n }\n var css = '.unscrollable { overflow: hidden !important; }';\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n style.setAttribute('id', 'unscroll-class-name');\n style.appendChild(document.createTextNode(css));\n head.appendChild(style);\n }\n\n // Get the elements to adjust, force body element\n this.getElementsToAdjust = function (elements) {\n !elements && (elements = []);\n\n if (typeof elements === 'string') {\n elements = [\n [elements, 'padding-right']\n ];\n }\n\n elements.forEach(function (element, index) {\n if (typeof element === 'string') {\n elements[index] = [element, 'padding-right'];\n }\n });\n\n var bodyFound = false;\n for (var i = 0; i < elements.length; i++) {\n if (elements[i][0].indexOf('body') !== -1) {\n bodyFound = true;\n }\n };\n\n if (bodyFound === false) {\n elements.push(['body', 'padding-right']);\n }\n\n return elements;\n }\n\n this.pageHasScrollbar = function () {\n return this.getScrollbarWidth() && document.body.offsetHeight > window.innerHeight;\n }\n\n // Clean up elements\n if (this.pageHasScrollbar()) {\n elements = this.getElementsToAdjust(elements);\n\n // Loop through elements and adjust accordingly\n for (var i = 0; i < elements.length; i++) {\n var elementsDOM = document.querySelectorAll(elements[i][0]);\n for (var j = 0; j < elementsDOM.length; j++) {\n if (elementsDOM[j].getAttribute('data-unscroll')) {\n return;\n }\n var attribute = elements[i][1];\n var computedStyles = window.getComputedStyle(elementsDOM[j]);\n var computedStyle = computedStyles.getPropertyValue(attribute);\n elementsDOM[j].setAttribute('data-unscroll', attribute);\n if (!computedStyle) {\n computedStyle = '0px';\n }\n var operator = attribute == 'padding-right' || attribute == 'right' ? '+' : '-';\n elementsDOM[j].style[attribute] = 'calc(' + computedStyle + ' ' + operator + ' ' + this.getScrollbarWidth() + ')';\n }\n }\n }\n\n // Make the page unscrollable\n addUnscrollClassName();\n document.body.classList.add('unscrollable');\n }\n\n // Reset elements and make page scrollable again\n unscroll.reset = function () {\n var elements = document.querySelectorAll('[data-unscroll]');\n\n for (var i = 0; i < elements.length; i++) {\n var attribute = elements[i].getAttribute('data-unscroll');\n elements[i].style[attribute] = null;\n elements[i].removeAttribute('data-unscroll');\n }\n document.body.classList.remove('unscrollable');\n }\n\n return unscroll;\n}));\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAAA;AACA;;;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AAFA;AAIA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA5UA;AACA;A;;A;;;;;;;;;;;ACJA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA,WAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A;;A","sourceRoot":""}