ux-manager.js corrigé

This commit is contained in:
KONE SOREL 2025-12-22 18:00:55 +00:00
parent f5b1bf36b8
commit 9eab8fb74e

View File

@ -1,9 +1,9 @@
/** /**
* UX Manager - Gestionnaire d'expérience utilisateur modulaire * 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é * Description: Gère tous les aspects de l'UX : navigation, panels contextuels, notifications, accessibilité
* Auteur: Portail RH Inter Santé * Auteur: Portail RH Inter Santé
* Date: 2025.12.22 * Date: 2025.12.22 - Version finale
*/ */
// ============================================================================ // ============================================================================
@ -187,14 +187,14 @@ class NavigationManager {
// Configuration des comportements // Configuration des comportements
this.setupActiveMenu(); this.setupActiveMenu();
setTimeout(() => {
this.validateAndFixMenuConsistency();
}, 300);
this.setupMenuBehavior(); this.setupMenuBehavior();
this.setupKeyboardNavigation(); this.setupKeyboardNavigation();
// Vérification finale après initialisation
setTimeout(() => {
this.validateMenuConsistency();
}, 300);
this.isInitialized = true; this.isInitialized = true;
console.log('[Navigation] Système de menus initialisé'); console.log('[Navigation] Système de menus initialisé');
} }
@ -337,6 +337,12 @@ class NavigationManager {
const link = document.querySelector(`[href="#${menuId}"]`); const link = document.querySelector(`[href="#${menuId}"]`);
if (menu && link) { 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); console.log('[Navigation] Ouverture du menu:', menuId);
// 1. Fermer tous les autres menus // 1. Fermer tous les autres menus
@ -465,53 +471,78 @@ class NavigationManager {
} }
/** /**
* Ouvrir un menu par son ID (méthode publique) * Vérifier la cohérence des menus
* @param {string} menuId - ID du menu à ouvrir * @private - Méthode de validation
* @public - Méthode accessible globalement
*/ */
openMenuById(menuId) { validateMenuConsistency() {
this.openMenu(menuId); console.log('[Navigation] Vérification de cohérence...');
this.currentOpenMenu = menuId;
// 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();
} }
/** /**
* Vérifie et corrige la cohérence menu/page * Valider la correspondance entre la page et le menu ouvert
* @private - Méthode de validation avancée
*/ */
validateAndFixMenuConsistency() { validatePageMenuMatch() {
const configParentId = window.appConfig?.activeParentId;
const activeLink = window.appConfig?.activeLink; const activeLink = window.appConfig?.activeLink;
if (!activeLink) return;
if (!configParentId || !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}`);
const configMenuId = `submenu${configParentId}`; // Essayer de trouver le bon menu
const configMenu = document.getElementById(configMenuId); this.autoDetectCorrectMenu();
}
// 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}"]`); * Détecter automatiquement le menu correct
if (!hasActiveLink) { * @private - Méthode d'auto-détection
console.warn(`[Navigation] Menu ${configMenuId} ne contient pas ${activeLink}, recherche alternative...`); */
autoDetectCorrectMenu() {
const activeLink = window.appConfig?.activeLink;
if (!activeLink) return;
console.log(`[Navigation] Auto-détection du menu pour "${activeLink}"...`);
// Chercher dans tous les menus // Chercher dans tous les menus
document.querySelectorAll('.nav-submenu').forEach(menu => { document.querySelectorAll('.nav-submenu').forEach(menu => {
if (menu.querySelector(`a[href*="${activeLink}"]`)) { const link = menu.querySelector(`a[href*="${activeLink}"]`);
if (link) {
const correctMenuId = menu.id; const correctMenuId = menu.id;
console.log(`[Navigation] ${activeLink} trouvé dans ${correctMenuId}`); console.log(`[Navigation] Trouvé dans ${correctMenuId}`);
// Mettre à jour la config // Mettre à jour
this.activeMenuId = correctMenuId; this.activeMenuId = correctMenuId;
if (window.appConfig) { if (window.appConfig) {
const menuNum = correctMenuId.replace('submenu', ''); const menuNum = correctMenuId.replace('submenu', '');
window.appConfig.activeParentId = menuNum; window.appConfig.activeParentId = menuNum;
} }
// Appliquer // Ouvrir le bon menu
setTimeout(() => { setTimeout(() => {
this.openMenu(correctMenuId); this.openMenu(correctMenuId);
this.currentOpenMenu = correctMenuId; this.currentOpenMenu = correctMenuId;
@ -519,6 +550,15 @@ class NavigationManager {
} }
}); });
} }
/**
* Ouvrir un menu par son ID (méthode publique)
* @param {string} menuId - ID du menu à ouvrir
* @public - Méthode accessible globalement
*/
openMenuById(menuId) {
this.openMenu(menuId);
this.currentOpenMenu = menuId;
} }
} }