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
|
* 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user