From 5e0027b86143bbe64e8ab1d96e6d5f8c7f3c1246 Mon Sep 17 00:00:00 2001 From: Jules Neny Date: Sat, 3 Oct 2026 08:57:16 +0200 Subject: [PATCH] =?UTF-8?q?feat(fiches):=20/=20et=20/agences=20ouvrent=20l?= =?UTF-8?q?a=20fiche=20dans=20le=20panneau=20;=20FicheReseauContenu=20extr?= =?UTF-8?q?ait,=20FicheModal=20et=20FicheModalV2=20retir=C3=A9es=20;=20Voi?= =?UTF-8?q?r=20sur=20la=20carte=20(B12-M4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01AGNSEFZdoKvbdsGyfSnu5S --- components/FicheDetail.vue | 39 +++- components/FicheModal.vue | 183 --------------- components/FicheModalV2.vue | 360 ------------------------------ components/FicheReseauContenu.vue | 291 ++++++++++++++++++++++++ components/NavMap.vue | 18 ++ components/NavMapV2.vue | 18 ++ pages/agences.vue | 40 ++-- pages/index.vue | 76 ++++--- 8 files changed, 427 insertions(+), 598 deletions(-) delete mode 100644 components/FicheModal.vue delete mode 100644 components/FicheModalV2.vue create mode 100644 components/FicheReseauContenu.vue diff --git a/components/FicheDetail.vue b/components/FicheDetail.vue index 6628b2e..5472b46 100644 --- a/components/FicheDetail.vue +++ b/components/FicheDetail.vue @@ -6,12 +6,14 @@ style="background: var(--nav-surface); border: 1px solid var(--nav-bg-alt);" > -
-
-

+
+ {{ org.nom }}

+ >{{ org.nom }} -
+ + + +
-
+
@@ -106,7 +118,8 @@
@@ -186,7 +199,15 @@ const baseTiles = useBaseTiles() import type { Org } from '~/types/org' -const props = defineProps<{ org: Org }>() +const props = defineProps<{ + org: Org + /** Panneau de détail de la vue fiches (B12, 380 px) : tout en colonne, titre en h2. */ + compact?: boolean + /** Fonctions en chips cliquables : la vue fiches ajoute le filtre. */ + etiquettesCliquables?: boolean +}>() + +const emit = defineEmits<{ etiquette: [fonction: string] }>() // ── Champs ────────────────────────────────────────────────────────────── const descriptionUser = computed(() => diff --git a/components/FicheModal.vue b/components/FicheModal.vue deleted file mode 100644 index 71bb252..0000000 --- a/components/FicheModal.vue +++ /dev/null @@ -1,183 +0,0 @@ - - - - - diff --git a/components/FicheModalV2.vue b/components/FicheModalV2.vue deleted file mode 100644 index 5091e16..0000000 --- a/components/FicheModalV2.vue +++ /dev/null @@ -1,360 +0,0 @@ - - - - - diff --git a/components/FicheReseauContenu.vue b/components/FicheReseauContenu.vue new file mode 100644 index 0000000..23f2bdc --- /dev/null +++ b/components/FicheReseauContenu.vue @@ -0,0 +1,291 @@ + + + + + + diff --git a/components/NavMap.vue b/components/NavMap.vue index b54da7e..87fc8ca 100644 --- a/components/NavMap.vue +++ b/components/NavMap.vue @@ -26,6 +26,8 @@ const props = defineProps<{ selectedId?: number | null /** Fiche survolée dans la liste (B11) : épingle safran, sans recentrer. */ survolId?: number | null + /** « Voir sur la carte » (B12) : zoome jusqu'à l'épingle, sortie de son cluster ; `n` change à chaque demande. */ + centrage?: { id: number; n: number } | null }>() const emit = defineEmits<{ @@ -275,4 +277,20 @@ onUnmounted(() => { mapInstance = null } }) + +// « Voir sur la carte » (B12) : la carte vient peut-être de s'afficher (Fiches → Mixte) ; +// on attend sa taille réelle, puis on sort l'épingle de son cluster. +watch( + () => props.centrage?.n, + () => { + const c = props.centrage + if (!c) return + setTimeout(() => { + if (!mapInstance || !clusterGroup) return + mapInstance.invalidateSize({ pan: false }) + const m = markers.get(c.id) + if (m) clusterGroup.zoomToShowLayer(m, () => mapInstance?.panTo(m.getLatLng(), { animate: true })) + }, 260) + }, +) diff --git a/components/NavMapV2.vue b/components/NavMapV2.vue index d923b33..12e8b9b 100644 --- a/components/NavMapV2.vue +++ b/components/NavMapV2.vue @@ -23,6 +23,8 @@ const props = defineProps<{ selectedId?: string | null /** Fiche survolée dans la liste (B11) : épingle cerclée de safran, sans recentrer. */ survolId?: string | null + /** « Voir sur la carte » (B12) : zoome jusqu'à l'épingle, sortie de son cluster ; `n` change à chaque demande. */ + centrage?: { id: string; n: number } | null }>() const emit = defineEmits<{ @@ -272,4 +274,20 @@ onUnmounted(() => { mapInstance = null } }) + +// « Voir sur la carte » (B12) : la carte vient peut-être de s'afficher (Fiches → Mixte) ; +// on attend sa taille réelle, puis on sort l'épingle de son cluster. +watch( + () => props.centrage?.n, + () => { + const c = props.centrage + if (!c) return + setTimeout(() => { + if (!mapInstance || !clusterGroup) return + mapInstance.invalidateSize({ pan: false }) + const m = markers.get(c.id) + if (m) clusterGroup.zoomToShowLayer(m, () => mapInstance?.panTo(m.getLatLng(), { animate: true })) + }, 260) + }, +) diff --git a/pages/agences.vue b/pages/agences.vue index 0754fa1..e807ec6 100644 --- a/pages/agences.vue +++ b/pages/agences.vue @@ -11,7 +11,6 @@ libelle-recherche="Rechercher une structure…" :pending="pending" :selected-id="selectedId" - @select="(f) => onSelectStructure(String(f.id))" > - - - + + +