{"version":3,"file":"js/9816-bc4646cb120082a15d61.js","mappings":"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","sources":["webpack://decidim-development-app/../usr/local/bundle/gems/decidim-core-0.27.0/app/packs/src/decidim/autocomplete.js"],"sourcesContent":["import 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 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 if (this.options.dataFilter) {\n return this.options.dataFilter(list);\n }\n\n return list;\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","placeHolder","debounce","data","keys","src","query","fetchResults","Promise","resolve","filter","list","resultsList","resultItem","item","value","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":""}