diff --git a/components/FichesPanel.vue b/components/FichesPanel.vue new file mode 100644 index 0000000..85500fb --- /dev/null +++ b/components/FichesPanel.vue @@ -0,0 +1,135 @@ + + + + + + diff --git a/pages/agences.vue b/pages/agences.vue index e4728e0..f096f6b 100644 --- a/pages/agences.vue +++ b/pages/agences.vue @@ -2,7 +2,15 @@
- + + +
+ +
- +
+
@@ -273,8 +310,11 @@
+ +
+ - +
@@ -365,6 +405,21 @@
+ + + + + + +
@@ -455,15 +510,41 @@ function familleColor(f: number): string { } // ── État UI ──────────────────────────────────────────────────────────────── +type MapView = 'metropole' | 'outremer' | 'graphe' | 'fiches' + +const route = useRoute() +const router = useRouter() + const selectedId = ref(null) const hoveredId = ref(null) const ficheModalOpen = ref(false) const ficheModalId = ref(null) const chatbotOpen = ref(false) -const mobileMapView = ref<'metropole' | 'outremer' | 'graphe'>('metropole') -const desktopMapView = ref<'metropole' | 'outremer' | 'graphe'>('metropole') +const mobileMapView = ref((route.query.vue as string) === 'fiches' ? 'fiches' : 'metropole') +const desktopMapView = ref((route.query.vue as string) === 'fiches' ? 'fiches' : 'metropole') const missionOpen = ref(false) +// Sync URL — B3-M3 : pose/retire ?vue=fiches uniquement (agences.vue n'avait +// aucune synchronisation URL avant B3 pour search/famille/hashtags/vue ; hors +// périmètre de cette mission de l'étendre, seul ?vue=fiches est ajouté ici). +function setDesktopView(v: MapView) { + desktopMapView.value = v + syncViewUrl() +} +function setMobileView(v: MapView) { + mobileMapView.value = v + syncViewUrl() +} +function syncViewUrl() { + const q: Record = { ...(route.query as Record) } + if (desktopMapView.value === 'fiches' || mobileMapView.value === 'fiches') { + q.vue = 'fiches' + } else { + delete q.vue + } + router.replace({ query: Object.keys(q).length ? q : undefined }) +} + onMounted(() => { try { if (!localStorage.getItem('aep_reseaux_seen')) { @@ -556,6 +637,11 @@ function resetFilters() { // Pour simplifier : toutes les structures (la carte gère les sans-coords) const metropoleStructures = computed(() => filtered.value) +// Panneau « Toutes les fiches » (B3-M3) — mêmes structures que `filtered`, +// sans filtrer par géolocalisation (adaptateur mutualisé avec `/`). +const { toMini } = useFicheAdapter() +const allStructuresMini = computed(() => filtered.value.map((s) => toMini(s))) + // Outre-mer : pas de structures V2 DOM-TOM pour l'instant - garder le composant existant vide // OutremerMap attend le format Org legacy - on passe un tableau vide const outremerOrgsLegacy = computed(() => []) diff --git a/pages/index.vue b/pages/index.vue index be813e5..58ed839 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -40,7 +40,7 @@ Mode dev — données seed - + + + +
+
+ +
+ +
- +
+
@@ -154,9 +193,12 @@
- + +
+ + - +
+ + + + + @@ -358,12 +413,14 @@ const territoireMode = ref( (route.query.mode as string) === 'outremer' ? 'outremer' : 'metropole' ) -const desktopMapView = ref<'metropole' | 'outremer'>('metropole') +type MapView = 'metropole' | 'outremer' | 'fiches' + +const desktopMapView = ref((route.query.vue as string) === 'fiches' ? 'fiches' : 'metropole') const selectedId = ref(null) const chatbotOpen = ref(false) const ficheModalOpen = ref(false) const ficheModalId = ref(null) -const mobileMapView = ref<'metropole' | 'outremer'>('metropole') +const mobileMapView = ref((route.query.vue as string) === 'fiches' ? 'fiches' : 'metropole') const missionOpen = ref(false) onMounted(() => { @@ -411,9 +468,20 @@ function syncUrl() { if (fonctions.value.length) q.fonctions = fonctions.value.join(',') if (territoire.value) q.territoire = territoire.value if (territoireMode.value === 'outremer') q.mode = 'outremer' + if (desktopMapView.value === 'fiches' || mobileMapView.value === 'fiches') q.vue = 'fiches' router.replace({ query: Object.keys(q).length ? q : undefined }) } +// Changement de vue (carte/fiches) — passe par syncUrl pour poser/retirer ?vue=fiches +function setDesktopView(v: MapView) { + desktopMapView.value = v + syncUrl() +} +function setMobileView(v: MapView) { + mobileMapView.value = v + syncUrl() +} + // Sauvegarde les filtres courants dans sessionStorage pour le bouton retour des fiches function storeFiltersForBack() { if (typeof window === 'undefined') return @@ -541,6 +609,12 @@ const filtered = computed(() => { return result }) +// Panneau « Toutes les fiches » (B3-M3) — mêmes fiches que `filtered`, sans +// filtrer par géolocalisation : c'est le gain principal de cette mission, +// les fiches sans latitude/longitude (invisibles sur la carte) y apparaissent. +const { toMini } = useFicheAdapter() +const allFichesMini = computed(() => filtered.value.map((org) => toMini(org))) + const DOM_TOM = ['Guadeloupe', 'Martinique', 'Guyane', 'La Réunion', 'Mayotte'] const DOM_TOM_LIST = DOM_TOM