1// ########################################################################################################## 2// MODULE: MAP-UI-CONTROLLER.JS 3// Gestion des éléments d'interface utilisateur liés à la carte 4// 5// POINTS CLÃS : 6// - Orchestration de toutes les interactions UI liées à la carte (sélecteur de période, navigation, synchronisation URL). 7// - Gère lâinitialisation, la configuration et la robustesse du sélecteur de période et des boutons de navigation. 8// - Assure la synchronisation entre lâUI, la navigation, la période sélectionnée et lâétat global de lâapplication. 9// 10// FONCTIONS PRINCIPALES : 11// - initPeriodSelector() : Initialise et configure le sélecteur de période, définit la période par défaut. 12// - handleDropdownChange() : Gère le changement de période sélectionnée et déclenche la mise à jour des données/cartes. 13// - initializeUIListeners() : Initialise tous les écouteurs dâévénements pour lâinterface utilisateur liée à la carte. 14// - handleURLParameters() : Traite les paramètres dâURL pour permettre la navigation directe (région, département). 15// 16// DÃPENDANCES : 17// - window.mapCore : Centralise lâétat, les constantes et les données globales de la carte. 18// - window.mapNavigation : Gère la navigation (drillUp, drillToRegion, drillToDepartement, handleMapClick). 19// - window.mapDataProcessor : Gère le chargement et la synchronisation des données selon la période sélectionnée. 20// - window.periodesDropdown : Ãlément HTML du sélecteur de période. 21// - showUserMessage, showDebugLog : Affichage de messages utilisateur et logs de debug. 22// - document, window.location, window.history : Manipulation DOM et gestion de lâURL. 23// ########################################################################################################## 24 25// Initialisation du sélecteur de période 26function initPeriodSelector() {
27 // Vérifier si l'initialisation a déjà été effectuée 28 if (window.mapCore && window.mapCore.periodSelectorInitialized) { 29 // Ãviter la double initialisation du sélecteur de période 30 showDebugLog('warning', `Sélecteur de période déjà initialisé, appel ignoré`); 31 return; 32 } 33 34 showDebugLog('log', `Initialisation du sélecteur de période`); 35 36 // Récupérer l'élément dropdown 37 window.periodesDropdown = document.getElementById('periodesDropdown'); 38 39 if (!window.periodesDropdown) { 40 showDebugLog('error', `Ãlément periodesDropdown non trouvé`); 41 showUserMessage('error', `Une erreur est survenue lors du chargement de la carte. Veuillez recharger la page ou réessayer plus tard.`) 42 return; 43 } 44 45 // Définir la période par défaut comme la première option du dropdown 46 if (window.periodesDropdown.options.length > 0) { 47 window.defaultPeriod = window.periodesDropdown.options[0].value; 48 showDebugLog('log', `Période par défaut définie : ${window.defaultPeriod}`); 49 } 50 51 // Stocker la valeur initiale et le flag sur l'élément dropdown pour persistance 52 window.periodesDropdown._initialDropdownValue = window.periodesDropdown.value; 53 window.periodesDropdown._isInitialDropdownSetup = true; 54 55 // Fonction pour gérer le changement de période 56 function handleDropdownChange() { 57 const selectedPeriod = window.periodesDropdown.value; 58 if (window.periodesDropdown._isInitialDropdownSetup && selectedPeriod === window.periodesDropdown._initialDropdownValue) { 59 // On ignore le premier événement change si la valeur n'a pas changé depuis l'init 60 window.periodesDropdown._isInitialDropdownSetup = false; 61 return; 62 } 63 window.periodesDropdown._isInitialDropdownSetup = false; 64 showDebugLog('log', `Période sélectionnée : ${selectedPeriod}`); 65 66 // Désactiver le dropdown pendant le chargement 67 window.periodesDropdown.disabled = true; 68 69 // Appeler la fonction centrale de changement de période 70 if (window.mapCore && typeof window.mapCore.onPeriodSelected === 'function') { 71 window.mapCore.onPeriodSelected(selectedPeriod); 72 } else { 73 showDebugLog('error', `La fonction onPeriodSelected n'est pas disponible`); 74 showUserMessage('error', `Une erreur est survenue lors du chargement de la carte. Veuillez recharger la page ou réessayer plus tard.`) 75 window.periodesDropdown.disabled = false; 76 } 77 } 78 79 // Supprimer tous les écouteurs d'événements existants pour éviter les doublons 80 const oldDropdown = window.periodesDropdown.cloneNode(true); 81 // Copier les flags de gestion d'initialisation sur le nouvel élément 82 oldDropdown._initialDropdownValue = window.periodesDropdown._initialDropdownValue; 83 oldDropdown._isInitialDropdownSetup = window.periodesDropdown._isInitialDropdownSetup; 84 window.periodesDropdown.parentNode.replaceChild(oldDropdown, window.periodesDropdown); 85 window.periodesDropdown = oldDropdown; 86 87 // L'écouteur 'change' n'est attaché qu'après sélection de la période initiale 88 window.periodesDropdown.addEventListener('change', handleDropdownChange); 89 90 // Marquer le sélecteur comme initialisé 91 if (!window.mapCore) { 92 window.mapCore = {}; 93 } 94 window.mapCore.periodSelectorInitialized = true; 95 96 showDebugLog('log', `Sélecteur de période initialisé avec succès`); 97 98 // Initialiser avec la période par défaut ou celle spécifiée dans l'URL 99 const urlParams = new URLSearchParams(window.location.search); 100 const periodParam = urlParams.get('periode'); 101 102 if (periodParam) { 103 // Vérifier si la période existe dans le dropdown 104 let periodExists = false; 105 for (let i = 0; i < window.periodesDropdown.options.length; i++) { 106 if (window.periodesDropdown.options[i].value === periodParam) { 107 periodExists = true; 108 // Retirer l'écouteur pour éviter le déclenchement du changement à l'init 109 window.periodesDropdown.removeEventListener('change', handleDropdownChange); 110 window.periodesDropdown.selectedIndex = i; 111 // L'écouteur 'change' n'est attaché qu'après sélection de la période initiale 112 window.periodesDropdown.addEventListener('change', handleDropdownChange); 113 break; 114 } 115 } 116 117 if (periodExists) { 118 showDebugLog('log', `Période trouvée dans l'URL : ${periodParam}`); 119 } else { 120 showDebugLog('warning', `Période spécifiée dans l'URL non trouvée dans les options disponibles : ${periodParam}`); 121 showUserMessage('error', `La période spécifiée dans l'URL (${periodParam}) n'est pas disponible. Veuillez sélectionner une période dans la liste.`) 122 123 // Sélectionner la première période disponible 124 if (window.periodesDropdown.options.length > 0) { 125 window.periodesDropdown.selectedIndex = 0; 126 } 127 } 128 } else { 129 // Utiliser la première option comme valeur par défaut 130 if (window.periodesDropdown.options.length > 0) { 131 window.periodesDropdown.selectedIndex = 0; 132 } 133 } 134} 135 136// Fonction pour initialiser les écouteurs d'événements pour l'interface utilisateur 137function initializeUIListeners() { 138 showDebugLog('log', `Initialisation des écouteurs d\'événements pour l\'interface utilisateur`); 139 140 // Initialiser le sélecteur de période une fois que le DOM est chargé 141 document.addEventListener('DOMContentLoaded', function() { 142 showDebugLog('log', `DOM chargé, initialisation du sélecteur de période`); 143 144 // S'assurer que mapCore est initialisé 145 if (!window.mapCore) { 146 window.mapCore = {}; 147 } 148 149 // Définir le flag pour éviter le double chargement 150 window.mapCore.skipInitialLoad = true; 151 152 // Initialiser le sélecteur de période mais sans déclencher le chargement automatique 153 if (typeof initPeriodSelector === 'function') { 154 initPeriodSelector(); 155 // Le chargement initial des données est désormais centralisé dans main.js 156 // Aucun chargement manuel ici pour éviter toute double initialisation 157 } 158 }); 159 160 // Ajouter des écouteurs pour les boutons de navigation (si présents) 161 const drillUpButton = document.getElementById('drillUpButton'); 162 if (drillUpButton) { 163 drillUpButton.addEventListener('click', function() { 164 if (window.mapNavigation && typeof window.mapNavigation.drillUp === 'function') { 165 window.mapNavigation.drillUp(); 166 } 167 }); 168 } 169 170 // Ajouter des écouteurs pour les boutons de zoom (si présents) 171 const zoomInButton = document.getElementById('zoomInButton'); 172 const zoomOutButton = document.getElementById('zoomOutButton'); 173 174 if (zoomInButton && window.mapChart) { 175 zoomInButton.addEventListener('click', function() { 176 window.mapChart.mapZoom(0.5); 177 }); 178 } 179 180 if (zoomOutButton && window.mapChart) { 181 zoomOutButton.addEventListener('click', function() { 182 window.mapChart.mapZoom(2); 183 }); 184 } 185} 186 187// Fonction pour gérer les paramètres d'URL pour la navigation directe 188function handleURLParameters() {
189 // Vérifier si la navigation par URL a déjà été effectuée 190 if (window.mapCore && window.mapCore.urlNavigationDone) { 191 showDebugLog('log', `Navigation par URL déjà effectuée, ignorée`); 192 return; 193 } 194 195 const urlParams = new URLSearchParams(window.location.search); 196 const lieuParam = urlParams.get('lieu'); 197 198 if (!lieuParam) { 199 showDebugLog('log', `Aucun paramètre lieu trouvé dans l'URL`); 200 return; 201 } 202 203 showDebugLog('log', `Paramètre lieu trouvé dans l'URL : ${lieuParam}`); 204 205 // Attendre que la carte soit initialisée 206 const checkMapInitialized = setInterval(function() { 207 if (window.mapChart && window.mapCore && !window.mapCore.mapInitializing) { 208 clearInterval(checkMapInitialized); 209 210 // Marquer que la navigation par URL a été effectuée 211 if (!window.mapCore) window.mapCore = {}; 212 window.mapCore.urlNavigationDone = true; 213 214 // Naviguer vers le lieu spécifié (région ou département) 215 showDebugLog('log', `Navigation directe vers le lieu : ${lieuParam}`); 216 217 // Déterminer si c'est une région ou un département en fonction du format du code 218 const parts = lieuParam.split('-'); 219 220 if (parts.length === 3) { 221 // C'est un département (ex: fr-ara-01) 222 if (window.mapNavigation && typeof window.mapNavigation.drillToDepartement === 'function') { 223 // Lors d'une navigation automatique (ex: via l'URL), on transmet urlAlreadyUpdated=true pour éviter toute modification indésirable de l'URL 224 window.mapInitializer.drillToDepartement(lieuParam, true); 225 } 226 } else if (parts.length === 2) { 227 // C'est une région (ex: fr-ara) 228 if (window.mapNavigation && typeof window.mapNavigation.drillToRegion === 'function') { 229 // Lors d'une navigation automatique (ex: via l'URL), on transmet skipUrlUpdate=true pour éviter toute modification indésirable de l'URL 230 window.mapInitializer.drillToRegion(lieuParam, true); 231 } 232 } 233 } 234 }, 100); 235 236 // Arrêter la vérification après 10 secondes pour éviter une boucle infinie 237 setTimeout(function() { 238 clearInterval(checkMapInitialized); 239 }, 10000); 240} 241 242// Exposer les fonctions pour qu'elles soient accessibles 243window.mapUIController = { 244 initPeriodSelector, 245 initializeUIListeners, 246 handleURLParameters 247}; 248 249// Initialiser les écouteurs d'événements 250initializeUIListeners();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.