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.
115 lines
3.5 KiB
115 lines
3.5 KiB
import {Controller} from '@hotwired/stimulus' |
|
import accessibleAutocomplete from 'accessible-autocomplete' |
|
import 'accessible-autocomplete/dist/accessible-autocomplete.min.css' |
|
import {searchableName} from "../modules/search"; |
|
|
|
const options = [] |
|
|
|
const fetchOptions = async (query) => { |
|
const response = await fetch(`/address_options?query=${query}`) |
|
const data = await response.json() |
|
console.log(data) |
|
return data |
|
} |
|
|
|
const fetchAndPopulateSearchResults = async (query, populateResults, populateOptions, selectEl) => { |
|
if (/\S/.test(query)) { |
|
const results = await fetchOptions(query) |
|
console.log(results) // address and uprn keys returned per result |
|
populateOptions(results, selectEl) |
|
populateResults(Object.values(results).map((o) => o.address)) |
|
// populateResults(results) |
|
} |
|
} |
|
|
|
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) |
|
}) |
|
} |
|
|
|
// const populateOptions = (results, selectEl) => { |
|
// selectEl.innerHTML = '' |
|
// |
|
// Object.keys(results).forEach((key) => { |
|
// const option = document.createElement('option') |
|
// option.value = key |
|
// option.innerHTML = results[key].value |
|
// if (results[key].hint) { option.setAttribute('data-hint', results[key].hint) } |
|
// option.setAttribute('text', searchableName(results[key])) |
|
// selectEl.appendChild(option) |
|
// options.push(option) |
|
// }) |
|
// } |
|
|
|
export default class extends Controller { |
|
connect () { |
|
const selectEl = this.element |
|
|
|
const currentValue = this.getCurrentValue() |
|
console.log(selectEl) |
|
|
|
if (currentValue && currentValue.stored_value) { |
|
console.log(currentValue) |
|
const option = document.createElement('option') |
|
option.value = currentValue.stored_value.uprn |
|
option.innerHTML = currentValue.stored_value.address |
|
option.selected = true |
|
selectEl.appendChild(option) |
|
} |
|
|
|
accessibleAutocomplete.enhanceSelectElement({ |
|
defaultValue: '', |
|
selectElement: selectEl, |
|
minLength: 1, |
|
source: (query, populateResults) => { |
|
fetchAndPopulateSearchResults(query, populateResults, populateOptions, selectEl) |
|
}, |
|
autoselect: true, |
|
showNoOptionsFound: true, |
|
placeholder: currentValue?.stored_value?.address || 'Start typing to search', |
|
templates: { suggestion: (value) => value }, |
|
onConfirm: (val) => { |
|
const selectedResult = Array.from(selectEl.options).find(option => option.address === val) |
|
|
|
if (selectedResult) { |
|
selectedResult.selected = true |
|
} |
|
} |
|
}) |
|
} |
|
|
|
fetchOptions(query, populateResults) { |
|
fetch(`/address_options?query=${query}`) |
|
.then(response => response.json()) |
|
.then(data => { |
|
console.log(data) |
|
const results = data.map(result => result.uprn) |
|
populateResults(results.slice(0, 10)) |
|
}) |
|
} |
|
|
|
async getCurrentValue() { |
|
const currentPageUrl = window.location.href; |
|
console.log(currentPageUrl); |
|
const match = currentPageUrl.match(/sales-logs\/(\d+)\/address-search/); |
|
const id = match ? match[1] : null; |
|
|
|
if (id) { |
|
const response = await fetch(`/address_options/current?log_id=${id}`); |
|
const data = await response.json(); |
|
console.log(data); |
|
return data; |
|
} |
|
|
|
return null; |
|
} |
|
|
|
}
|
|
|