{"version":3,"file":"custom_dropdown_controller-gj7YNHeP.js","sources":["../../../app/javascript/controllers/custom_dropdown_controller.js"],"sourcesContent":["import { Dropdown } from \"tailwindcss-stimulus-components\"\n\nexport default class extends Dropdown {\n static targets = [\n \"placeholder\",\n \"placeholderText\",\n \"mobilePlaceholderText\",\n \"searchInput\",\n \"emptyResultLabel\",\n \"select\",\n \"newOption\",\n \"newOptionButton\",\n \"input\"\n ]\n static values = {\n fuzzySearch: { type: Boolean, default: false },\n placeholder: String\n }\n\n static classes = [\"selected\"]\n\n initialize() {\n this.fuzzySearchFilter = this.fuzzySearchFilter.bind(this)\n this.exactMatchFilter = this.exactMatchFilter.bind(this)\n this.activeIndex = -1 // in the case where user presses Arrow up/down for the first time, ensure first item is selected\n\n if(this.activeOption && !this.activeOption.hasAttribute('data-noplaceholder')) {\n this.changePlaceholder({ currentTarget: this.activeOption })\n }\n }\n\n onInputChange() {\n if(this.inputTarget.value.trim().length > 0) {\n this.show()\n } else {\n super._hide()\n this.removeSearchFilter()\n }\n }\n\n onInputBlur() {\n\n }\n\n openValueChanged() {\n if (this.openValue === false && this.hasSearchInputTarget) {\n setTimeout(() => {this.removeSearchFilter()}, 2)\n }\n\n if (this.openValue && this.hasSearchInputTarget) {\n setTimeout(() => this.searchInputTarget.focus(), 1)\n }\n\n this.dispatch(\"toggle\", {\n detail: this.openValue\n })\n\n if(this.openValue) {\n this.menuTarget.classList.remove(\"hidden\")\n this.menuTarget.setAttribute('aria-expanded', 'true')\n\n this.dispatch(\"opened\", {\n detail: this.openValue\n })\n } else {\n this.menuTarget.classList.add(\"hidden\")\n this.menuTarget.removeAttribute('aria-expanded')\n\n this.dispatch(\"hidden\", {\n detail: this.openValue\n })\n }\n }\n\n hideDropdown() {\n console.log('hiding')\n this.openValue = false\n }\n\n toggle(e) {\n if (this.menuTarget.contains(e.currentTarget)) {\n if(!e.currentTarget.hasAttribute(\"data-noplaceholder\")) {\n this.changePlaceholder(e)\n }\n\n this.applyActiveClassOn(e.currentTarget)\n\n if(this.hasInputTarget) {\n this.inputTarget.value = e.currentTarget.innerText\n }\n }\n\n super.toggle()\n }\n\n changePlaceholder({ currentTarget }) {\n if(this.hasPlaceholderTextTarget &&( currentTarget.dataset.placeholder?.trim().length > 0 || currentTarget.innerText?.trim().length > 0)) {\n\n const placeholderContent = currentTarget.querySelector(\"x-placeholder-content\")?.cloneNode(true)\n\n if(placeholderContent) {\n placeholderContent.removeAttribute(\"hidden\")\n placeholderContent.classList.remove(\"hidden\")\n }\n\n\n this.placeholderTextTarget.innerHTML = placeholderContent?.outerHTML || currentTarget.dataset.placeholder || currentTarget.innerHTML\n\n if(this.hasMobilePlaceholderTextTarget) {\n this.mobilePlaceholderTextTarget.innerHTML = currentTarget.dataset.mobilePlaceholder || currentTarget.dataset.placeholder || currentTarget.innerHTML\n }\n }\n }\n\n setLabel({ detail }) {\n const option = Array.from(\n this.element.querySelectorAll(\"[data-option-value]\")\n ).find(\n (optionElement) =>\n optionElement.dataset.optionValue.toLowerCase() === detail.toLowerCase()\n )\n\n if (option) {\n option.click()\n } else {\n this.placeholderTextTarget = detail\n }\n }\n\n clear() {\n this.selectTarget.value = \"\"\n this.placeholderTextTarget.innerHTML = this.placeholderValue\n\n if(this.activeOption) {\n this.activeOption.classList.remove(...this.activeElementClass)\n }\n }\n\n onKeydown(e) {\n if(this.openValue === false) return\n\n if (e.key === \"Enter\") {\n e.preventDefault()\n\n if(this.filteredElements[this.activeIndex || 0]) {\n this.filteredElements[this.activeIndex || 0]?.click()\n } else if(this.hasNewOptionTarget && this.newOptionTarget.classList.contains(\"hidden\") === false) {\n this.newOptionButtonTarget.click()\n }\n } else if(e.key === \"ArrowUp\") {\n if(this.activeIndex !== 0) {\n this.activeIndex--\n this.mimicFocusBehaviourOnActiveIndex()\n e.preventDefault();\n }\n } else if(e.key === \"ArrowDown\") {\n if(this.activeIndex !== this.filteredElements.length - 1) {\n this.activeIndex++\n this.mimicFocusBehaviourOnActiveIndex()\n e.preventDefault();\n }\n }\n }\n\n disable({ detail: optionToSelect }) {\n this.selectTarget.disabled = true\n\n if(optionToSelect) {\n this.items.find(element => element.dataset.optionValue.toLowerCase() === optionToSelect.toLowerCase())\n ?.click()\n }\n }\n\n enable() {\n this.selectTarget.disabled = false\n }\n\n filter({ target }) {\n if (this.hasSearchInputTarget && target === this.searchInputTarget && target.value.trim().length === 0) {\n this.removeSearchFilter(null, true)\n\n return\n }\n\n if(this.fuzzySearchValue) {\n this.searchableElements.forEach((element) => {\n this.fuzzySearchFilter(element, target.value)\n })\n } else {\n this.searchableElements.forEach((element) => {\n this.exactMatchFilter(element, target.value)\n })\n }\n\n if (this.filteredElements.length === 0) {\n if(this.hasNewOptionTarget) {\n this.dispatch(\"new-option\", { detail: this.searchInputTarget.value })\n } else if(this.hasEmptyResultLabelTarget){\n this.emptyResultLabelTarget.classList.remove(\"hidden\")\n } else {\n this._hide()\n }\n\n if(this.hasNewOptionTarget && this.newOptionTarget.classList.contains(\"hidden\") && this.hasEmptyResultLabelTarget) {\n this.emptyResultLabelTarget.classList.remove(\"hidden\")\n }\n\n return\n } else {\n this.show()\n }\n\n if(this.hasEmptyResultLabelTarget) {\n this.emptyResultLabelTarget.classList.add(\"hidden\")\n }\n\n this.activeIndex = 0\n\n this.filteredElements.forEach((filteredElement, index) => {\n if(index === this.activeIndex) {\n filteredElement.classList.add(...this.activeElementClass)\n } else {\n filteredElement.classList.remove(...this.activeElementClass)\n }\n })\n }\n\n checkOptionValidity({ detail: valid }) {\n if(valid) {\n this.dispatch(\"show\", {\n target: this.newOptionTarget,\n detail: this.searchInputTarget.value\n })\n\n this.emptyResultLabelTarget.classList.add(\"hidden\")\n } else {\n this.newOptionTarget.classList.add(\"hidden\")\n this.emptyResultLabelTarget.classList.remove(\"hidden\")\n }\n }\n\n removeSearchFilter(e, focusInput = true) {\n if(this.hasSearchInputTarget) {\n this.searchInputTarget.value = \"\"\n }\n\n this.searchableElements.forEach((element) => {\n element.classList.remove(\"hidden\")\n\n if(!element.hasAttribute(\"data-active\")) {\n element.classList.remove(...this.activeElementClass)\n }\n })\n\n if(this.hasEmptyResultLabelTarget) {\n this.emptyResultLabelTarget.classList.add(\"hidden\")\n }\n\n if (focusInput && this.hasSearchInputTarget) {\n this.searchInputTarget.focus()\n }\n\n if(this.hasNewOptionTarget) {\n this.newOptionTarget.classList.add(\"hidden\")\n }\n\n this.activeIndex = -1\n }\n\n // private\n\n mimicFocusBehaviourOnActiveIndex() {\n this.filteredElements.forEach((filteredElement, index) => {\n if(index === this.activeIndex) {\n filteredElement.classList.add(...this.activeElementClass)\n } else {\n filteredElement.classList.remove(...this.activeElementClass)\n }\n })\n }\n\n fuzzySearchFilter(element, value) {\n const searchableTerm = element.dataset.searchable.toLowerCase().normalize(\"NFD\").replace(/\\p{Diacritic}/gu, \"\")\n\n if (searchableTerm.includes(value.toLowerCase())) {\n element.classList.remove(\"hidden\")\n } else {\n element.classList.add(\"hidden\")\n }\n }\n\n exactMatchFilter(element, value) {\n const searchableTerm = element.dataset.searchable.toLowerCase().normalize(\"NFD\").replace(/\\p{Diacritic}/gu, \"\")\n\n if (searchableTerm.startsWith(value.toLowerCase())) {\n element.classList.remove(\"hidden\")\n } else {\n element.classList.add(\"hidden\")\n }\n }\n\n applyActiveClassOn(option) {\n if(this.hasNewOptionTarget && option === this.newOptionButtonTarget) return\n\n this.items.forEach((element) => {\n if(element !== option) {\n element.classList.remove(...this.activeElementClass)\n element.removeAttribute(\"data-active\")\n }\n })\n\n const listItem = option.tagName === \"LI\" ? option : option.closest(\"li\")\n listItem.classList.add(...this.activeElementClass)\n\n setTimeout(() => listItem.setAttribute(\"data-active\", \"\"), 1)\n }\n\n get items() {\n return Array.from(this.menuTarget.querySelectorAll(\"li\"))\n }\n\n get searchableElements() {\n return Array.from(this.menuTarget.querySelectorAll(\"[data-searchable]\"))\n }\n\n get filteredElements() {\n return this.searchableElements.filter(\n (element) => element.classList.contains(\"hidden\") === false\n )\n }\n\n get activeOption() {\n return this.items.find((element) => element.hasAttribute(\"data-active\"))\n }\n\n get emptyResultMatchingQuery() {\n return !this.searchableElements.find((element) =>\n element.dataset.searchable\n .toLowerCase()\n .includes(this.searchInputTarget.value.toLowerCase())\n )\n }\n\n get activeElementClass() {\n return this.hasSelectedClass ? this.selectedClasses : [\"bg-lavender-light\"]\n }\n}\n"],"names":["custom_dropdown_controller","Dropdown","currentTarget","_a","_b","placeholderContent","_c","detail","option","optionElement","optionToSelect","element","target","filteredElement","index","valid","focusInput","value","listItem","__publicField"],"mappings":"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"}