PageSourceSearch

https://www.handifaction.fr/wp-content/plugins/handifaction_result…?ver=7.1.2-b-modified-1784291661

js handifaction.fr collected 2026-10-02 14:57:14 UTC 12,201 bytes, 250 lines download raw bytes

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.