From 435c7fcfc2606a6c5c68992aa06f2b39cce1d832 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Wed, 24 Jun 2026 18:05:16 +0200 Subject: [PATCH] =?UTF-8?q?fix(directory)=20:=20ville=20absente=20du=20sel?= =?UTF-8?q?ect=20corrig=C3=A9e=20(option=20courante=20conserv=C3=A9e)=20+?= =?UTF-8?q?=20matching=20suggestion=20BAN=20par=20libell=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/DirectoryAddressBlock.vue | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/frontend/modules/directory/components/DirectoryAddressBlock.vue b/frontend/modules/directory/components/DirectoryAddressBlock.vue index 019f8a1..54fafd8 100644 --- a/frontend/modules/directory/components/DirectoryAddressBlock.vue +++ b/frontend/modules/directory/components/DirectoryAddressBlock.vue @@ -108,8 +108,22 @@ const autocomplete = useAddressAutocomplete() type Option = { label: string, value: string | number } const addressOptions = ref([]) -const cityOptions = ref([]) +// Villes renvoyées par la BAN pour le code postal courant. +const fetchedCityOptions = ref([]) 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(() => { + 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. const degraded = ref(false) let lastAddressSuggestions: AddressSuggestion[] = [] @@ -151,7 +165,9 @@ async function onAddressSearch(query: string): Promise { /** Sélection d'une suggestion → remplit rue + ville + code postal. */ function onAddressSelect(option: Option | null): void { 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) { update('street', String(option.value)) return @@ -171,7 +187,7 @@ async function onPostalCodeInput(value: string): Promise { if (digits.length < 5) return try { 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 } catch {