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
* 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