diff --git a/Bootstrap_new/js/ux-manager.js b/Bootstrap_new/js/ux-manager.js index 11ce284..41bd10f 100644 --- a/Bootstrap_new/js/ux-manager.js +++ b/Bootstrap_new/js/ux-manager.js @@ -1,9 +1,9 @@ /** * UX Manager - Gestionnaire d'expérience utilisateur modulaire - * Version: 2.0.0 + * Version: 3.0.0 - Corrigée et Optimisée * Description: Gère tous les aspects de l'UX : navigation, panels contextuels, notifications, accessibilité * Auteur: Portail RH Inter Santé - * Date: 2025.12.22 + * Date: 2025.12.22 - Version finale */ // ============================================================================ @@ -187,14 +187,14 @@ class NavigationManager { // Configuration des comportements this.setupActiveMenu(); - - setTimeout(() => { - this.validateAndFixMenuConsistency(); - }, 300); - this.setupMenuBehavior(); this.setupKeyboardNavigation(); + // Vérification finale après initialisation + setTimeout(() => { + this.validateMenuConsistency(); + }, 300); + this.isInitialized = true; console.log('[Navigation] Système de menus initialisé'); } @@ -337,6 +337,12 @@ class NavigationManager { const link = document.querySelector(`[href="#${menuId}"]`); if (menu && link) { + // Vérifier si le menu est déjà ouvert + if (menu.classList.contains('show')) { + console.log('[Navigation] Menu déjà ouvert:', menuId); + return; + } + console.log('[Navigation] Ouverture du menu:', menuId); // 1. Fermer tous les autres menus @@ -464,6 +470,87 @@ class NavigationManager { } } + /** + * Vérifier la cohérence des menus + * @private - Méthode de validation + */ + validateMenuConsistency() { + console.log('[Navigation] Vérification de cohérence...'); + + // 1. Vérifier que le menu actif est ouvert + if (this.activeMenuId) { + const activeMenu = document.getElementById(this.activeMenuId); + if (activeMenu && !activeMenu.classList.contains('show')) { + console.warn('[Navigation] Menu actif non ouvert, correction...'); + this.openMenu(this.activeMenuId); + } + } + + // 2. Vérifier qu'un seul menu est ouvert + const openMenus = document.querySelectorAll('.nav-submenu.show'); + if (openMenus.length > 1) { + console.warn(`[Navigation] ${openMenus.length} menus ouverts, correction...`); + this.forceSingleMenu(); + } + + // 3. Vérifier la correspondance page/menu + this.validatePageMenuMatch(); + } + + /** + * Valider la correspondance entre la page et le menu ouvert + * @private - Méthode de validation avancée + */ + validatePageMenuMatch() { + const activeLink = window.appConfig?.activeLink; + if (!activeLink) return; + + // Chercher si la page active est dans le menu ouvert + const openMenu = document.querySelector('.nav-submenu.show'); + if (openMenu) { + const hasActiveLink = openMenu.querySelector(`a[href*="${activeLink}"]`); + if (!hasActiveLink) { + console.warn(`[Navigation] Page "${activeLink}" non trouvée dans le menu ouvert ${openMenu.id}`); + + // Essayer de trouver le bon menu + this.autoDetectCorrectMenu(); + } + } + } + + /** + * Détecter automatiquement le menu correct + * @private - Méthode d'auto-détection + */ + autoDetectCorrectMenu() { + const activeLink = window.appConfig?.activeLink; + if (!activeLink) return; + + console.log(`[Navigation] Auto-détection du menu pour "${activeLink}"...`); + + // Chercher dans tous les menus + document.querySelectorAll('.nav-submenu').forEach(menu => { + const link = menu.querySelector(`a[href*="${activeLink}"]`); + if (link) { + const correctMenuId = menu.id; + console.log(`[Navigation] Trouvé dans ${correctMenuId}`); + + // Mettre à jour + this.activeMenuId = correctMenuId; + if (window.appConfig) { + const menuNum = correctMenuId.replace('submenu', ''); + window.appConfig.activeParentId = menuNum; + } + + // Ouvrir le bon menu + setTimeout(() => { + this.openMenu(correctMenuId); + this.currentOpenMenu = correctMenuId; + }, 100); + } + }); + } + /** * Ouvrir un menu par son ID (méthode publique) * @param {string} menuId - ID du menu à ouvrir @@ -473,53 +560,6 @@ class NavigationManager { this.openMenu(menuId); this.currentOpenMenu = menuId; } - - /** - * Vérifie et corrige la cohérence menu/page - */ - validateAndFixMenuConsistency() { - const configParentId = window.appConfig?.activeParentId; - const activeLink = window.appConfig?.activeLink; - - if (!configParentId || !activeLink) return; - - const configMenuId = `submenu${configParentId}`; - const configMenu = document.getElementById(configMenuId); - - // Vérification 1: Le menu configuré existe-t-il? - if (!configMenu) { - console.warn(`[Navigation] Menu configuré ${configMenuId} non trouvé, auto-détection...`); - this.autoDetectActiveMenu(); - return; - } - - // Vérification 2: Le menu contient-il un lien vers la page active? - const hasActiveLink = configMenu.querySelector(`a[href*="${activeLink}"]`); - if (!hasActiveLink) { - console.warn(`[Navigation] Menu ${configMenuId} ne contient pas ${activeLink}, recherche alternative...`); - - // Chercher dans tous les menus - document.querySelectorAll('.nav-submenu').forEach(menu => { - if (menu.querySelector(`a[href*="${activeLink}"]`)) { - const correctMenuId = menu.id; - console.log(`[Navigation] ${activeLink} trouvé dans ${correctMenuId}`); - - // Mettre à jour la config - this.activeMenuId = correctMenuId; - if (window.appConfig) { - const menuNum = correctMenuId.replace('submenu', ''); - window.appConfig.activeParentId = menuNum; - } - - // Appliquer - setTimeout(() => { - this.openMenu(correctMenuId); - this.currentOpenMenu = correctMenuId; - }, 100); - } - }); - } - } } // ============================================================================ @@ -541,7 +581,7 @@ class ContextPanelManager { this.isOpen = false; this.isInitialized = false; } - + /** * Initialiser le panel contextuel * @public - Méthode appelée par UXManager