Submit social housing lettings and sales data (CORE)
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

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;
}
}