You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.0 KiB
64 lines
2.0 KiB
import { Controller } from '@hotwired/stimulus' |
|
import accessibleAutocomplete from 'accessible-autocomplete' |
|
import 'accessible-autocomplete/dist/accessible-autocomplete.min.css' |
|
|
|
const options = [] |
|
|
|
const fetchOptions = async (query, searchUrl) => { |
|
const response = await fetch(`${searchUrl}?query=${encodeURIComponent(query)}`) |
|
const data = await response.json() |
|
console.log(data) |
|
console.log("Test 004") |
|
return data |
|
} |
|
|
|
const fetchAndPopulateSearchResults = async (query, populateResults, searchUrl, populateOptions, selectEl) => { |
|
if (/\S/.test(query)) { |
|
const results = await fetchOptions(query, searchUrl) |
|
console.log(results) // address and uprn keys returned per result |
|
populateOptions(results, selectEl) |
|
populateResults(Object.values(results).map((o) => o.address)) |
|
} |
|
} |
|
|
|
const populateOptions = (results, selectEl) => { |
|
selectEl.innerHTML = '' |
|
|
|
results.forEach((result) => { |
|
const option = document.createElement('option') |
|
option.value = result.uprn |
|
option.innerHTML = result.address |
|
option.setAttribute('address', result.address) |
|
selectEl.appendChild(option) |
|
options.push(option) |
|
}) |
|
} |
|
|
|
export default class extends Controller { |
|
connect () { |
|
const searchUrl = JSON.parse(this.element.dataset.info).search_url |
|
const selectEl = this.element |
|
|
|
accessibleAutocomplete.enhanceSelectElement({ |
|
defaultValue: '', |
|
selectElement: selectEl, |
|
minLength: 1, |
|
source: (query, populateResults) => { |
|
fetchAndPopulateSearchResults(query, populateResults, searchUrl, populateOptions, selectEl) |
|
}, |
|
autoselect: true, |
|
showNoOptionsFound: true, |
|
placeholder: 'Start typing to search', |
|
templates: { suggestion: (value) => value }, |
|
onConfirm: (val) => { |
|
console.log({val}) |
|
const selectedResult = Array.from(selectEl.options).find(option => option.text === val) |
|
|
|
console.log({selectedResult}) |
|
if (selectedResult) { |
|
selectedResult.selected = true |
|
} |
|
} |
|
}) |
|
} |
|
}
|
|
|