ux-manager.js corrigé
This commit is contained in:
parent
f5b1bf36b8
commit
9eab8fb74e
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user