{"version":3,"file":"SimpleSearch.js","names":["SimpleSearch","a","setters","Component","default","Event","debounce","ajax","on","off","trigger","deepMerge","mediaQuery","mix","AnalyticsMixin","Accessibility","LoaderMixin","execute","with","constructor","element","options","arguments","length","apiUrl","suggestionsMinChars","selectedSuggestionId","useOverlay","showClearButton","disableFullScreen","autofocus","initCache","classes","resultsActive","active","suggestionActive","hidden","selectors","searchField","querySelector","resultsContainer","contentContainer","resultsGroup","closeButton","clearButton","submitButton","searchAria","initState","state","isResultOpen","isActive","contentLoaded","isFirstTab","afterInit","focus","bindEvents","e","onSearchKeyUp","onSearchBlur","onSearchFocus","onSearchKeydown","bind","onClose","onClear","onSubmit","onOpen","onReset","value","trim","preventDefault","classList","add","is","documentScrollY","window","scrollY","emit","onEnable","scrollIntoView","setFocusedOrder","contentUrl","then","onContentSuccess","catch","response","innerHTML","querySelectorAll","forEach","script","srcScript","document","createElement","text","async","defer","type","remove","appendChild","setFieldValue","removeAttribute","hideResults","hideClearButton","scrollTo","parseInt","restoreFocus","clearSearch","event","indexOf","key","target","addLoader","overlay","getSuggestions","showResults","error","lora","debug","console","message","finally","removeLoader","onArrowKey","onTabKey","suggestions","suggestionsContainer","selectedSuggestion","nextSuggestion","selectPreviousSuggestion","selectNextSuggestion","selectSuggestion","previousElementSibling","nextElementSibling","suggestion","setAttribute","textContent","originalSearchTerm","tabNavigation","resetFocusedOrder","input","searchValue","encodeURIComponent","onGetSuggestionsSuccess","onGetSuggestionsFail","Promise","reject","Error","args","Array","c","updateSuggestions","html","setSearchAria","bubbles","clearSearchAria","val","searchSuggestionTitle","unbindEvents","removeListener","destroy"],"sources":["components/global/SimpleSearch.js"],"sourcesContent":["/* eslint max-lines: [\"error\", {\"max\": 350, \"skipBlankLines\": true, \"skipComments\": true }] */\nimport Component from 'core/Component';\nimport { Event } from 'services/EventEmitter';\nimport { debounce } from 'toolbox/debounce';\nimport { ajax } from 'toolbox/ajax';\nimport { on, off, trigger } from 'toolbox/event';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { mediaQuery } from 'toolbox/mediaQuery';\nimport { mix } from 'core/mixwith';\nimport AnalyticsMixin from 'mixins/Analytics';\nimport Accessibility from 'mixins/Accessibility';\nimport LoaderMixin from 'mixins/Loader';\n\n/**\n * This is a description of the SimpleSearch constructor function.\n * @class\n * @classdesc This is a description of the SimpleSearch class.\n * @extends Component\n */\nexport default class SimpleSearch extends mix(Component).with(AnalyticsMixin, Accessibility, LoaderMixin) {\n /**\n * @typedef {Object} optionsObject\n * @property {object} classNames - CSS classes applied to the component\n * @property {string} classNames.resultsActive - CSS class applied to search form when search suggestions panel is active\n * @property {string} classNames.active - CSS class applied to search form when it is active\n * @property {string} classNames.suggestionActive - CSS class applied to selected search term\n * @property {string} classNames.hidden - CSS class applied to hidden elements\n * @property {string} apiUrl - Search API URL\n * @property {number} suggestionsMinChars - minimal amount of chars entered to show suggestions\n * @property {string} selectedSuggestionId - ID applied to selected search term\n * @property {boolean} useOverlay - use fade overlay when search suggestions are opened\n * @property {boolean} showClearButton - enable clear button, which will be shown instead of search icon if field is not empty\n * @property {boolean} disableFullScreen - disable full screen behavior on mobile\n */\n /**\n * @constructor\n * @param {object} element - DOM node of component\n * @param {optionsObject} options - Component Options\n */\n constructor(element, options = {}) {\n super(element, deepMerge({\n apiUrl: '',\n suggestionsMinChars: 3,\n selectedSuggestionId: 'searchSelectedSuggestion',\n useOverlay: false,\n showClearButton: false,\n disableFullScreen: false,\n autofocus: true,\n }, options));\n }\n\n /**\n * All selectors must be cached. Never cache elements that are out of the component scope\n */\n initCache() {\n this.classes = {\n resultsActive: 'm-results-active',\n active: 'm-active',\n suggestionActive: 'm-active',\n hidden: 'h-hidden',\n };\n\n this.selectors.searchField = this.element.querySelector('[data-js-search-input]');\n this.selectors.resultsContainer = this.element.querySelector('[data-js-search-results]');\n this.selectors.contentContainer = this.element.querySelector('[data-js-search-content]');\n this.selectors.resultsGroup = this.element.querySelector('[data-js-search-results-group]');\n this.selectors.closeButton = this.element.querySelector('[data-js-search-close]');\n this.selectors.clearButton = this.element.querySelector('[data-js-search-clear]');\n this.selectors.submitButton = this.element.querySelector('[data-js-search-submit]');\n this.selectors.searchAria = this.element.querySelector('[data-js-header-search-aria]');\n }\n\n /**\n * Init the different state of the component\n * It helps to avoid heavy DOM manipulation\n */\n initState() {\n this.state.isResultOpen = false;\n this.state.isActive = false;\n this.state.contentLoaded = false;\n this.state.isFirstTab = false;\n }\n\n /**\n * After init\n * Run any script after the component is fully initialized\n */\n afterInit() {\n if (this.options.autofocus) {\n this.selectors.searchField.focus();\n }\n }\n\n /**\n * Should contain only event listeners and nothing else\n * All the event handlers should be into a separated function. No usage of anonyous function\n */\n bindEvents() {\n const { searchField, closeButton, clearButton } = this.selectors;\n\n if (this.options.apiUrl) {\n on('keyup', searchField, debounce(e => this.onSearchKeyUp(e), 300));\n on('blur', searchField, debounce(e => this.onSearchBlur(e), 300));\n on('focus', searchField, debounce(e => this.onSearchFocus(e), 300));\n on('keydown', searchField, this.onSearchKeydown.bind(this));\n }\n\n on('click', closeButton, this.onClose.bind(this));\n if (this.options.showClearButton) {\n on('click', clearButton, this.onClear.bind(this));\n }\n on('click', this.selectors.submitButton, this.onSubmit.bind(this));\n Event.on('header.search.open', this.onOpen, this);\n Event.on('header.search.close', this.onReset, this);\n }\n\n /**\n * Submit button click event handler\n * @param {Object} e DOM event object\n */\n onSubmit(e) {\n if (!this.selectors.searchField.value.trim().length) {\n e.preventDefault();\n this.onClose();\n }\n }\n\n /**\n * Set search panel active\n */\n onOpen() {\n this.state.isActive = true;\n this.element.classList.add(this.classes.active);\n this.focus();\n if (!this.options.disableFullScreen && !mediaQuery.is('large') && !mediaQuery.is('xlarge')) {\n // Prevent the page to scroll when full screen search is opened\n this.state.documentScrollY = `${window.scrollY}px`;\n Event.emit('full.screen.absolute.enabled', {\n onEnable: () => {\n this.element.scrollIntoView(true);\n },\n });\n }\n\n if (!this.state.contentLoaded) {\n ajax(this.options.contentUrl)\n .then(this.onContentSuccess.bind(this))\n .then(() => {\n this.setFocusedOrder(this.element);\n })\n .catch(() => {});\n } else {\n this.setFocusedOrder(this.element);\n }\n }\n\n /**\n * Default content success load callback\n * @param {String} response html content\n */\n onContentSuccess(response) {\n this.selectors.contentContainer.innerHTML = response || '';\n this.state.contentLoaded = true;\n\n this.selectors.contentContainer.querySelectorAll('script').forEach((script) => {\n const srcScript = document.createElement('script');\n\n srcScript.text = script.innerHTML;\n srcScript.async = script.async;\n srcScript.defer = script.defer;\n srcScript.type = script.type;\n // remove initial script object\n script.remove();\n this.selectors.contentContainer.appendChild(srcScript);\n });\n }\n\n /**\n * Reset search panel state\n */\n onReset() {\n this.state.isActive = false;\n this.setFieldValue('');\n this.selectors.searchField.removeAttribute('aria-activedescendant');\n this.selectors.resultsContainer.innerHTML = '';\n this.element.classList.remove(this.classes.active);\n this.hideResults();\n if (this.options.showClearButton) {\n this.hideClearButton();\n }\n if (!this.options.disableFullScreen && !mediaQuery.is('xlarge')) {\n Event.emit('full.screen.absolute.disabled', true);\n\n // restore the scroll top to avoid page jump to the top of the screen\n if (this.state.documentScrollY) {\n window.scrollTo(0, parseInt(this.state.documentScrollY || '0', 10));\n }\n }\n }\n\n /**\n * Handler for click on close CTA\n */\n onClose() {\n this.onReset();\n Event.emit('simplesearch.close', { restoreFocus: true });\n }\n\n /**\n * Handler for click on clear CTA\n */\n onClear() {\n this.clearSearch();\n this.focus();\n }\n\n /**\n * Handler for keyup event on search field\n * Calls getSuggestions with a search term entered, unless service key pressed\n * @param {Event} event - Event object\n */\n onSearchKeyUp(event) {\n if (['Tab', 'ArrowDown', 'ArrowUp'].indexOf(event.key) !== -1) {\n // Do nothing if navigating between suggestions with up, down and TAB keys\n return;\n }\n if (this.options.showClearButton) {\n if (event.target.value.trim().length) {\n this.showClearButton();\n } else {\n this.hideClearButton();\n }\n }\n this.addLoader(this.selectors.resultsGroup, { overlay: true });\n this.getSuggestions(event.target.value)\n .then(() => this.showResults())\n .catch((error) => {\n if (window.lora.debug) {\n console.error(error.message);\n }\n })\n .finally(() => this.removeLoader(this.selectors.resultsGroup));\n }\n\n /**\n * Focus in the search field\n */\n focus() {\n this.selectors.searchField.focus();\n }\n\n /**\n * Handler for keydown event on search field\n * Trigger functions if service key pressed\n * @param {Event} event - Event object\n */\n onSearchKeydown(event) {\n switch (event.key) {\n case 'ArrowUp': // 'ArrowUp' key\n case 'ArrowDown': // 'ArrowDown' key\n this.onArrowKey(event);\n break;\n case 'Tab': // 'Tab' key\n this.onTabKey();\n break;\n case 'Enter': // 'Enter' key\n this.onSubmit(event);\n break;\n default:\n break;\n }\n }\n\n /**\n * Handler for \"up\" and \"down\" keys\n * Navigate between suggested search terms\n * If nothing is selected down key will select first suggestion and up key will select last\n * Original input value will be restored when pressing \"down\" key on the last suggestion or \"up\" on the first\n * @param {Event} event - Event object\n */\n onArrowKey(event) {\n if (!this.state.isResultOpen) {\n // Do nothing if search results closed\n return;\n }\n\n this.selectors.suggestions = this.selectors.suggestionsContainer.querySelectorAll('[aria-selected]');\n this.selectors.selectedSuggestion = this.selectors.suggestionsContainer.querySelector(`#${this.options.selectedSuggestionId}`);\n\n if (['ArrowUp'].indexOf(event.key) !== -1) {\n this.selectors.nextSuggestion = this.selectPreviousSuggestion();\n }\n if (['ArrowDown'].indexOf(event.key) !== -1) {\n this.selectors.nextSuggestion = this.selectNextSuggestion();\n }\n\n this.selectSuggestion(this.selectors.nextSuggestion);\n }\n\n /**\n * Select previous suggestion or last suggestion if nothing is selected\n * @return {HTMLElement} selectPreviousSuggestion\n */\n selectPreviousSuggestion() {\n if (this.selectors.selectedSuggestion) {\n return this.selectors.selectedSuggestion.previousElementSibling;\n }\n\n return this.selectors.suggestions[this.selectors.suggestions.length - 1];\n }\n\n /**\n * Select next suggestion or first suggestion if nothing is selected\n * @return {HTMLElement} selectNextSuggestion\n */\n selectNextSuggestion() {\n if (this.selectors.selectedSuggestion) {\n return this.selectors.selectedSuggestion.nextElementSibling;\n }\n\n return this.selectors.suggestions[0];\n }\n\n /**\n * Highlight selected suggestion and paste suggestion text into the input field\n * If param is null original input state will be restored\n * Set aria-activedescendant and aria-selected accessibility attributes\n * @param {HTMLElement} suggestion - HTML element\n */\n selectSuggestion(suggestion) {\n // Clear previous selected state\n this.selectors.searchField.removeAttribute('aria-activedescendant');\n\n if (this.selectors.selectedSuggestion) {\n this.selectors.selectedSuggestion.setAttribute('aria-selected', 'false');\n this.selectors.selectedSuggestion.setAttribute('id', '');\n this.selectors.selectedSuggestion.classList.remove(this.classes.suggestionActive);\n }\n\n // don't mark anything on the results list and restore original search term if we're back at the input field\n if (!suggestion) {\n this.setFieldValue(this.originalSearchTerm);\n return;\n }\n\n suggestion.setAttribute('aria-selected', 'true');\n suggestion.setAttribute('id', this.options.selectedSuggestionId);\n suggestion.classList.add(this.classes.suggestionActive);\n\n this.selectors.searchField.setAttribute('aria-activedescendant', this.options.selectedSuggestionId);\n this.setFieldValue(suggestion.textContent.trim());\n }\n\n /**\n * Set tabNavigation flag on TAB key press, which blocks search suggestions from closing upon loosing focus on input field\n */\n onTabKey() {\n this.tabNavigation = true;\n if (!this.state.isFirstTab) {\n this.resetFocusedOrder(this.element);\n this.setFocusedOrder(this.element);\n this.state.isFirstTab = true;\n }\n }\n\n /**\n * Hide search suggestions on input field blur\n */\n onSearchBlur() {\n if (this.tabNavigation) {\n // Ignore navigation with TAB key\n return;\n }\n this.hideResults();\n }\n\n /**\n * Show search suggestions on input field focus\n * @param {Event} e - Event object\n */\n onSearchFocus(e) {\n const input = e.target;\n if (input.value.trim().length >= this.options.suggestionsMinChars) {\n this.showResults();\n this.tabNavigation = false;\n }\n }\n\n /**\n * Retrieve suggestions via AJAX\n *\n * @param {String} searchValue - Search value\n * @returns {Promise} object\n */\n getSuggestions(searchValue) {\n if (searchValue.trim().length >= this.options.suggestionsMinChars) {\n // start spinner\n return ajax(this.options.apiUrl + encodeURIComponent(this.selectors.searchField.value))\n .then(response => this.onGetSuggestionsSuccess(response))\n .catch(() => this.onGetSuggestionsFail());\n }\n if (this.state.isResultOpen) {\n this.hideResults();\n }\n\n return Promise.reject(new Error(`${this.options.suggestionsMinChars} chars minimum is required`));\n }\n\n /**\n * Handler for successful search suggestions call\n * @param {HTMLElement} args - HTML element\n */\n onGetSuggestionsSuccess(...args) {\n this.updateSuggestions(args);\n }\n\n /**\n * Handler for failed search suggestions call\n */\n onGetSuggestionsFail() {\n this.updateSuggestions('An error occured'); // need localization\n }\n\n /**\n * Update search suggestions\n * @param {HTMLElement} html - HTML element\n */\n updateSuggestions(html) {\n this.selectors.resultsContainer.innerHTML = html;\n\n // Update selector for suggestions container after AJAX change\n this.selectors.suggestionsContainer = this.selectors.resultsContainer.querySelector('[data-js-search-terms]');\n this.originalSearchTerm = this.selectors.searchField.value;\n\n // update component registry\n Event.emit('registry.registerChildren', this.selectors.resultsContainer);\n }\n\n /**\n * Display the result layer\n */\n showResults() {\n this.resetFocusedOrder(this.element);\n\n this.state.isResultOpen = true;\n this.element.classList.add(this.classes.resultsActive);\n this.selectors.searchField.setAttribute('aria-expanded', 'true');\n this.setSearchAria();\n if (this.options.useOverlay) {\n trigger('simplesearch.results.show', this.element, { bubbles: true });\n Event.emit('overlay.open', {\n /**\n * on overlay close\n */\n onClose: () => {\n trigger('simplesearch.results.hide', this.element, { bubbles: true });\n trigger('simplesearch.overlay.closed', this.element, { bubbles: true });\n },\n });\n }\n\n this.setFocusedOrder(this.element);\n }\n\n /**\n * Hide the result layer\n */\n hideResults() {\n // execute only if result overlay is open\n if (!this.state.isResultOpen) {\n return;\n }\n this.resetFocusedOrder(this.element);\n this.state.isResultOpen = false;\n this.element.classList.remove(this.classes.resultsActive);\n this.selectors.searchField.setAttribute('aria-expanded', 'false');\n this.clearSearchAria();\n\n if (this.options.useOverlay) {\n Event.emit('overlay.close');\n }\n\n this.setFocusedOrder(this.element);\n }\n\n /**\n * Show clear button\n */\n showClearButton() {\n this.selectors.clearButton.classList.add(this.classes.active);\n this.selectors.submitButton.classList.add(this.classes.hidden);\n }\n\n /**\n * Hide clear button\n */\n hideClearButton() {\n this.selectors.clearButton.classList.remove(this.classes.active);\n this.selectors.submitButton.classList.remove(this.classes.hidden);\n }\n\n /**\n * Set value of the value\n * @param {String} val search field value;\n */\n setFieldValue(val = '') {\n this.selectors.searchField.value = val;\n }\n\n /**\n * Clear search field\n */\n clearSearch() {\n this.setFieldValue('');\n this.hideClearButton();\n }\n\n /**\n * Set Search field aria\n */\n setSearchAria() {\n const searchSuggestionTitle = this.element.querySelector('[data-js-search-suggestions-aria]');\n\n this.selectors.searchAria.innerHTML = searchSuggestionTitle && searchSuggestionTitle.innerHTML;\n }\n\n /**\n * Clear Search field aria\n */\n clearSearchAria() {\n this.selectors.searchAria.innerHTML = '';\n }\n\n /**\n * Unbind event handlers\n */\n unbindEvents() {\n const { searchField, closeButton, clearButton } = this.selectors;\n\n if (this.options.apiUrl) {\n ['keyup', 'blur', 'focus', 'keydown'].forEach((event) => {\n off(event, searchField);\n });\n }\n\n off('click', closeButton);\n if (this.options.showClearButton) {\n off('click', clearButton);\n }\n off('click', this.selectors.submitButton);\n Event.removeListener('header.search.open', this.onOpen, this);\n Event.removeListener('header.search.close', this.onReset, this);\n }\n\n /**\n * Destroy is called automatically after the component is being removed from the DOM\n * You must always destroy the listeners attached to an element to avoid any memory leaks\n */\n destroy() {\n this.unbindEvents();\n }\n}\n"],"mappings":"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","ignoreList":[]}