|
|
|
import { Controller } from "@hotwired/stimulus";
|
|
|
|
import accessibleAutocomplete from "accessible-autocomplete";
|
|
|
|
import "accessible-autocomplete/dist/accessible-autocomplete.min.css";
|
|
|
|
import { enhanceOption, suggestion, sort } from "../modules/search";
|
|
|
|
|
|
|
|
export default class extends Controller {
|
|
|
|
connect() {
|
|
|
|
const selectEl = this.element;
|
|
|
|
const selectOptions = Array.from(selectEl.options);
|
|
|
|
const options = selectOptions.map((o) => enhanceOption(o));
|
|
|
|
|
|
|
|
const matches = /^(\w+)\[(\w+)\]$/.exec(selectEl.name);
|
|
|
|
const rawFieldName = `${matches[1]}[${matches[2]}_raw]`;
|
|
|
|
|
|
|
|
accessibleAutocomplete.enhanceSelectElement({
|
|
|
|
defaultValue: "",
|
|
|
|
selectElement: selectEl,
|
|
|
|
minLength: 2,
|
|
|
|
source: (query, populateResults) => {
|
|
|
|
if (/\S/.test(query)) {
|
|
|
|
populateResults(sort(query, options));
|
|
|
|
}
|
|
|
|
},
|
|
|
|
autoselect: true,
|
|
|
|
templates: { suggestion: (value) => suggestion(value, options) },
|
|
|
|
name: rawFieldName,
|
|
|
|
onConfirm: (val) => {
|
|
|
|
const selectedOption = [].filter.call(
|
|
|
|
selectOptions,
|
|
|
|
(option) => (option.textContent || option.innerText) === val
|
|
|
|
)[0];
|
|
|
|
if (selectedOption) selectedOption.selected = true;
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|