fix(directory) : ville absente du select corrigée (option courante conservée) + matching suggestion BAN par libellé
This commit is contained in:
@@ -108,8 +108,22 @@ const autocomplete = useAddressAutocomplete()
|
|||||||
type Option = { label: string, value: string | number }
|
type Option = { label: string, value: string | number }
|
||||||
|
|
||||||
const addressOptions = ref<Option[]>([])
|
const addressOptions = ref<Option[]>([])
|
||||||
const cityOptions = ref<Option[]>([])
|
// Villes renvoyées par la BAN pour le code postal courant.
|
||||||
|
const fetchedCityOptions = ref<Option[]>([])
|
||||||
const addressLoading = ref(false)
|
const addressLoading = ref(false)
|
||||||
|
|
||||||
|
// Le select Ville n'affiche que les valeurs présentes dans ses options : on
|
||||||
|
// garantit donc que la ville déjà enregistrée (chargement d'une fiche) ou
|
||||||
|
// pré-remplie par l'autocomplétion d'adresse figure toujours dans la liste,
|
||||||
|
// même avant toute recherche par code postal — sinon elle s'afficherait vide.
|
||||||
|
const cityOptions = computed<Option[]>(() => {
|
||||||
|
const current = (props.modelValue.city ?? '').trim()
|
||||||
|
const options = [...fetchedCityOptions.value]
|
||||||
|
if (current && !options.some(o => o.value === current)) {
|
||||||
|
options.unshift({ value: current, label: current })
|
||||||
|
}
|
||||||
|
return options
|
||||||
|
})
|
||||||
// Mode dégradé : BAN indisponible → la ville passe en saisie libre.
|
// Mode dégradé : BAN indisponible → la ville passe en saisie libre.
|
||||||
const degraded = ref(false)
|
const degraded = ref(false)
|
||||||
let lastAddressSuggestions: AddressSuggestion[] = []
|
let lastAddressSuggestions: AddressSuggestion[] = []
|
||||||
@@ -151,7 +165,9 @@ async function onAddressSearch(query: string): Promise<void> {
|
|||||||
/** Sélection d'une suggestion → remplit rue + ville + code postal. */
|
/** Sélection d'une suggestion → remplit rue + ville + code postal. */
|
||||||
function onAddressSelect(option: Option | null): void {
|
function onAddressSelect(option: Option | null): void {
|
||||||
if (option === null) return
|
if (option === null) return
|
||||||
const suggestion = lastAddressSuggestions.find(s => s.street === option.value)
|
// Matching par `label` (adresse complète, unique côté BAN) plutôt que par
|
||||||
|
// rue : deux communes peuvent partager le même libellé de voie.
|
||||||
|
const suggestion = lastAddressSuggestions.find(s => s.label === option.label)
|
||||||
if (!suggestion) {
|
if (!suggestion) {
|
||||||
update('street', String(option.value))
|
update('street', String(option.value))
|
||||||
return
|
return
|
||||||
@@ -171,7 +187,7 @@ async function onPostalCodeInput(value: string): Promise<void> {
|
|||||||
if (digits.length < 5) return
|
if (digits.length < 5) return
|
||||||
try {
|
try {
|
||||||
const suggestions = await autocomplete.searchCity(digits)
|
const suggestions = await autocomplete.searchCity(digits)
|
||||||
cityOptions.value = suggestions.map(s => ({ value: s.city, label: s.city }))
|
fetchedCityOptions.value = suggestions.map(s => ({ value: s.city, label: s.city }))
|
||||||
degraded.value = false
|
degraded.value = false
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
|
|||||||
Reference in New Issue
Block a user