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.
116 lines
3.5 KiB
116 lines
3.5 KiB
1 month ago
|
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;
|
||
|
}
|
||
|
|
||
|
}
|