{"version":3,"file":"js/7361-e42241260f8096b53530.js","mappings":"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","sources":["webpack://app/../usr/local/bundle/bundler/gems/decidim-c77d1346afca/decidim-core/app/packs/src/decidim/autocomplete.js"],"sourcesContent":["/* eslint max-lines: [\"error\", 350] */\n\nimport AutoCompleteJS from \"@tarekraafat/autocomplete.js\";\n\nexport default class AutoComplete {\n constructor(el, options = {}) {\n this.element = el;\n this.stickySelectedSpan = null;\n this.clearStickySelectionSpan = null;\n this.stickyHiddenInput = null;\n this.promptDiv = null;\n const thresholdTemp = options.threshold || 2;\n this.options = Object.assign({\n // Defines name of the hidden input (e.g. assembly_member[user_id])\n name: null,\n // Placeholder of the visible input field\n placeholder: \"\",\n // Defines what happens after user has selected value from suggestions\n // sticky - Allows selecting a single value and not editing the value after selected (e.g. as the admin autocomplete fields)\n // single - Allows selecting a single value and editing the selected text after the selection (e.g. geocoding field)\n // multi - Allows selecting multiple values\n // null (default) - Disable selection event handling in this class\n mode: null,\n // Defines if we show input help (e.g. \"Type at least three characters to search\") or not.\n searchPrompt: false,\n // Defines search prompt message, only shown if showPrompt is enabled!\n searchPromptText: `Type at least ${thresholdTemp} characters to search`,\n // Defines items that are selected already when page is loaded before user selects them. (e.g. when form submit fails)\n selected: null,\n // Defines how many characters input has to have before we start searching\n threshold: thresholdTemp,\n // Defines how many results to show in the autocomplete selection list\n // by maximum.\n maxResults: 10,\n // Defines the data keys against which to match the user input when\n // searching through the results. For example, when the following\n // data is returned by the API:\n // { id: 123, name: \"John\", nickname: \"john\", __typename: \"User\" }\n //\n // You can define the data keys array as [\"name\", \"nickname\"] in\n // which case the results shown to user would be only those that\n // have matching text in these defined fields.\n dataMatchKeys: null,\n // The data source is a method that gets the callback parameter as\n // its first argument which should be called with the results array\n // once they are returned by the API.\n // For example:\n // (query, callback) => {\n // (async () => {\n // const results = await callAjax(`/api/url?query=${query}`);\n // callback(results);\n // })();\n // }\n //\n // Signature: (callback: Function)\n dataSource: () => [],\n // Filters the data list returned by the data source before it is shown\n // to the user. Can be used e.g. to hide already selected values from\n // the list.\n dataFilter: null,\n // Delay in milliseconds how long to wait after user action before\n // doing a backend request.\n delay: 200,\n // Allows modifying the suggested items before they are displayed in the list\n // Signature: (element: HTMLElement, value: Object)\n modifyResult: null\n }, options);\n\n this.autocomplete = new AutoCompleteJS({\n selector: () => this.element,\n diacritics: true,\n placeHolder: options.placeholder,\n // Delay (milliseconds) before autocomplete engine starts. It's preventing many queries when user is typing fast.\n debounce: 200,\n threshold: this.options.threshold,\n data: {\n keys: this.options.dataMatchKeys,\n src: async (query) => {\n const fetchResults = () => {\n return new Promise((resolve) => {\n this.options.dataSource(query, resolve);\n });\n }\n\n try {\n return await fetchResults();\n } catch (error) {\n return error;\n }\n },\n filter: (list) => {\n const results = list.filter(\n (item, idx, arr) => {\n return arr.findIndex((val) => val.value === item.value) === idx;\n }\n );\n\n if (this.options.dataFilter) {\n return this.options.dataFilter(results);\n }\n\n return results;\n }\n },\n resultsList: {\n maxResults: this.options.maxResults\n },\n resultItem: {\n element: (item, data) => {\n if (!this.options.modifyResult) {\n return;\n }\n\n this.options.modifyResult(item, data.value);\n }\n },\n events: {\n input: {\n blur: () => {\n this.promptDiv.style.display = \"none\";\n }\n }\n }\n });\n\n this.acWrapper = this.element.closest(\".autoComplete_wrapper\");\n this.element.ac = this.autocomplete;\n\n // Stop input field from bubbling open and close events to parent elements,\n // because foundation closes modal from these events.\n const stopPropagation = (event) => {\n event.stopPropagation();\n }\n this.element.addEventListener(\"close\", stopPropagation);\n this.element.addEventListener(\"open\", stopPropagation);\n\n this.createPromptDiv();\n\n switch (this.options.mode) {\n case \"sticky\":\n this.createStickySelect(this.options.name);\n break;\n case \"multi\":\n this.createMultiSelect(this.options.name);\n break;\n default:\n }\n }\n\n setInput(value) {\n this.autocomplete.input.value = value;\n }\n\n handleEvent(event) {\n switch (this.options.mode) {\n case \"single\":\n this.setInput(event.detail.selection.value[event.detail.selection.key]);\n break;\n case \"sticky\":\n this.handleStickyEvents(event);\n break;\n case \"multi\":\n this.handleMultiEvents(event);\n break;\n default:\n }\n }\n\n handleMultiEvents(event) {\n switch (event.type) {\n case \"selection\":\n this.addMultiSelectItem(event.detail.selection);\n break;\n default:\n }\n }\n\n handleStickyEvents(event) {\n switch (event.type) {\n case \"selection\":\n this.addStickySelectItem(event.detail.selection);\n break;\n case \"click\":\n if (event.target === this.clearStickySelectionSpan) {\n this.removeStickySelection();\n }\n break;\n case \"keyup\":\n if (this.stickyHiddenInput.value !== \"\" && event.target === this.element && ([\"Escape\", \"Backspace\", \"Delete\"].includes(event.key) || (/^[a-z0-9]$/i).test(event.key))) {\n this.removeStickySelection();\n } else if (this.options.searchPrompt) {\n if (this.stickyHiddenInput.value === \"\" && this.element.value.length < this.options.threshold) {\n this.promptDiv.style.display = \"block\";\n } else {\n this.promptDiv.style.display = \"none\";\n }\n }\n break;\n default:\n }\n }\n\n createHiddenInput(value) {\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.name = this.options.name;\n hiddenInput.type = \"hidden\";\n if (value) {\n hiddenInput.value = value;\n }\n this.acWrapper.prepend(hiddenInput);\n return hiddenInput;\n }\n\n removeStickySelection() {\n this.stickyHiddenInput.value = \"\";\n this.element.placeholder = this.options.placeholder;\n this.clearStickySelectionSpan.style.display = \"none\";\n this.stickySelectedSpan.style.display = \"none\";\n }\n\n addStickySelectItem(selection) {\n this.stickyHiddenInput.value = selection.value.value;\n this.element.placeholder = \"\";\n this.stickySelectedSpan.innerHTML = selection.value[selection.key];\n this.stickySelectedSpan.style.display = \"block\";\n this.clearStickySelectionSpan.style.display = \"block\";\n this.setInput(\"\");\n }\n\n addMultiSelectItem(selection) {\n this.setInput(\"\");\n const chosen = document.createElement(\"span\");\n chosen.classList.add(\"label\", \"primary\", \"autocomplete__selected-item\", \"multi\");\n chosen.innerHTML = selection.value[selection.key];\n const clearSelection = document.createElement(\"span\");\n clearSelection.classList.add(\"clear-multi-selection\");\n clearSelection.innerHTML = \"×\";\n clearSelection.setAttribute(\"data-remove\", selection.value.value);\n clearSelection.addEventListener(\"click\", (evt) => {\n const hiddenInput = this.acWrapper.querySelector(`input[type='hidden'][value='${selection.value.value}']`);\n if (hiddenInput) {\n hiddenInput.remove();\n evt.target.parentElement.remove();\n }\n });\n chosen.appendChild(clearSelection);\n\n const multiSelectWrapper = this.acWrapper.querySelector(\".multiselect\");\n const inputContainer = multiSelectWrapper.querySelector(\"span.input-container\");\n multiSelectWrapper.insertBefore(chosen, inputContainer);\n this.createHiddenInput(selection.value.value);\n }\n\n createStickySelect() {\n this.stickySelectedSpan = document.createElement(\"span\");\n this.stickySelectedSpan.classList.add(\"autocomplete__selected-item\", \"sticky\");\n this.stickySelectedSpan.style.display = \"none\";\n this.stickySelectedSpan.addEventListener(\"click\", () => this.element.focus());\n this.stickyHiddenInput = this.createHiddenInput();\n\n this.clearStickySelectionSpan = document.createElement(\"span\");\n this.clearStickySelectionSpan.className = \"clear-sticky-selection\";\n this.clearStickySelectionSpan.innerHTML = \"×\";\n this.clearStickySelectionSpan.style.display = \"none\";\n this.clearStickySelectionSpan.addEventListener(\"click\", this);\n\n this.element.addEventListener(\"selection\", this);\n this.element.addEventListener(\"keyup\", this);\n\n this.acWrapper.insertBefore(this.clearStickySelectionSpan, this.element);\n this.acWrapper.insertBefore(this.stickySelectedSpan, this.element);\n if (this.options.selected) {\n this.addStickySelectItem(this.options.selected);\n }\n }\n\n createMultiSelect() {\n const multiSelectWrapper = document.createElement(\"div\");\n multiSelectWrapper.classList.add(\"multiselect\");\n\n const inputContainer = document.createElement(\"span\");\n inputContainer.classList.add(\"input-container\");\n\n multiSelectWrapper.appendChild(inputContainer);\n this.acWrapper.prepend(multiSelectWrapper);\n inputContainer.appendChild(this.element);\n\n this.element.addEventListener(\"selection\", this);\n multiSelectWrapper.addEventListener(\"click\", () => {\n this.element.focus();\n })\n\n if (this.options.selected) {\n this.options.selected.forEach((selection) => {\n this.addMultiSelectItem(selection);\n })\n }\n }\n\n createPromptDiv() {\n this.promptDiv = document.createElement(\"div\");\n this.promptDiv.classList.add(\"search-prompt\");\n this.promptDiv.style.display = \"none\";\n this.promptDiv.innerHTML = this.options.searchPromptText;\n this.acWrapper.appendChild(this.promptDiv);\n }\n}\n"],"names":["AutoComplete","el","options","this","element","stickySelectedSpan","clearStickySelectionSpan","stickyHiddenInput","promptDiv","thresholdTemp","threshold","Object","assign","name","placeholder","mode","searchPrompt","searchPromptText","selected","maxResults","dataMatchKeys","dataSource","dataFilter","delay","modifyResult","autocomplete","AutoCompleteJS","selector","_this","diacritics","placeHolder","debounce","data","keys","src","query","_context","fetchResults","Promise","resolve","filter","list","results","item","idx","arr","findIndex","val","value","resultsList","resultItem","events","input","blur","style","display","acWrapper","closest","ac","stopPropagation","event","addEventListener","createPromptDiv","createStickySelect","createMultiSelect","setInput","detail","selection","key","handleStickyEvents","handleMultiEvents","type","addMultiSelectItem","addStickySelectItem","target","removeStickySelection","includes","test","length","hiddenInput","document","createElement","prepend","innerHTML","chosen","classList","add","clearSelection","setAttribute","evt","_this2","querySelector","remove","parentElement","appendChild","multiSelectWrapper","inputContainer","insertBefore","createHiddenInput","_this3","focus","className","_this4","forEach"],"sourceRoot":""}