This commit is contained in:
KONE SOREL 2025-12-31 11:20:10 +00:00
parent 3bfb1f60d3
commit 765f22e08d
3 changed files with 60 additions and 60 deletions

View File

@ -36,7 +36,7 @@ class UXManager {
* Appelée automatiquement par le constructeur
*/
init() {
console.log('[UX Manager] Initialisation du système d\'expérience utilisateur...');
//console.log('[UX Manager] Initialisation du système d\'expérience utilisateur...');
// Initialisation séquentielle des sous-managers
this.navigation.init();
@ -52,7 +52,7 @@ class UXManager {
// Initialisation du Service Worker
this.initServiceWorker();
console.log('[UX Manager] Initialisation terminée avec succès');
//console.log('[UX Manager] Initialisation terminée avec succès');
}
/**
@ -149,9 +149,9 @@ class UXManager {
initServiceWorker() {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.ready.then(registration => {
console.log('[UX Manager] Service Worker actif:', registration.scope);
//console.log('[UX Manager] Service Worker actif:', registration.scope);
}).catch(error => {
console.warn('[UX Manager] Service Worker non disponible:', error);
//console.warn('[UX Manager] Service Worker non disponible:', error);
});
}
}
@ -182,7 +182,7 @@ class NavigationManager {
init() {
if (this.isInitialized) return;
console.log('[Navigation] Initialisation du système de menus...');
// console.log('[Navigation] Initialisation du système de menus...');
// Appliquer le correctif d'urgence pour les menus multiples ouverts
this.applyEmergencyFix();
@ -198,7 +198,7 @@ class NavigationManager {
}, 300);
this.isInitialized = true;
console.log('[Navigation] Système de menus initialisé');
//console.log('[Navigation] Système de menus initialisé');
}
/**
@ -211,7 +211,7 @@ class NavigationManager {
if (activeParentId !== null && activeParentId !== '') {
this.activeMenuId = `submenu${activeParentId}`;
console.log('[Navigation] Correctif: Menu actif détecté:', this.activeMenuId);
//console.log('[Navigation] Correctif: Menu actif détecté:', this.activeMenuId);
// Forcer la fermeture de tous les autres menus
this.forceSingleMenu();
@ -225,7 +225,7 @@ class NavigationManager {
forceSingleMenu() {
if (!this.activeMenuId) return;
console.log('[Navigation] Forçage: Un seul menu ouvert ->', this.activeMenuId);
//console.log('[Navigation] Forçage: Un seul menu ouvert ->', this.activeMenuId);
// Étape 1: Fermer TOUS les menus
document.querySelectorAll('.nav-submenu').forEach(menu => {
@ -249,11 +249,11 @@ class NavigationManager {
const activeParentId = window.appConfig?.activeParentId;
const activeLink = window.appConfig?.activeLink;
console.log('[Navigation] Configuration:', { activeParentId, activeLink });
//console.log('[Navigation] Configuration:', { activeParentId, activeLink });
// CORRECTION : Si "Accueil" mais activeParentId != 0, corriger
if (activeLink === 'Accueil' && activeParentId !== '0') {
console.warn('[Navigation] Correction: Accueil devrait être menu 0, pas', activeParentId);
//console.warn('[Navigation] Correction: Accueil devrait être menu 0, pas', activeParentId);
this.activeMenuId = 'submenu0';
// Mettre à jour la config
@ -268,7 +268,7 @@ class NavigationManager {
this.activeMenuId = null;
}
console.log('[Navigation] Menu actif final:', this.activeMenuId);
//console.log('[Navigation] Menu actif final:', this.activeMenuId);
// Appliquer
if (this.activeMenuId) {
@ -291,7 +291,7 @@ class NavigationManager {
e.stopPropagation();
const targetId = link.getAttribute('href').substring(1); // Enlever le #
console.log('[Navigation] Clic détecté sur menu:', targetId);
//console.log('[Navigation] Clic détecté sur menu:', targetId);
// Logique de basculement intelligent
if (this.currentOpenMenu === targetId) {
@ -341,11 +341,11 @@ class NavigationManager {
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);
//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
document.querySelectorAll('.nav-submenu.show').forEach(otherMenu => {
@ -389,11 +389,11 @@ class NavigationManager {
if (menu && link) {
// Ne pas fermer le menu actif s'il correspond à la page courante (sauf si forcé)
if (!force && menuId === this.activeMenuId) {
console.log('[Navigation] Menu actif, fermeture bloquée:', menuId);
//console.log('[Navigation] Menu actif, fermeture bloquée:', menuId);
return;
}
console.log('[Navigation] Fermeture du menu:', menuId);
//console.log('[Navigation] Fermeture du menu:', menuId);
// Appliquer les changements visuels
menu.classList.remove('show');
@ -411,7 +411,7 @@ class NavigationManager {
* @public - Méthode accessible globalement
*/
closeAllMenus() {
console.log('[Navigation] Fermeture de tous les menus (sauf actif)');
//console.log('[Navigation] Fermeture de tous les menus (sauf actif)');
document.querySelectorAll('.nav-submenu.show').forEach(menu => {
if (menu.id !== this.activeMenuId) {
@ -477,13 +477,13 @@ class NavigationManager {
* @private - Méthode de validation
*/
validateMenuConsistency() {
console.log('[Navigation] Vérification de cohérence...');
//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...');
//console.warn('[Navigation] Menu actif non ouvert, correction...');
this.openMenu(this.activeMenuId);
}
}
@ -491,7 +491,7 @@ class NavigationManager {
// 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...`);
//console.warn(`[Navigation] ${openMenus.length} menus ouverts, correction...`);
this.forceSingleMenu();
}
@ -512,7 +512,7 @@ class NavigationManager {
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}`);
//console.warn(`[Navigation] Page "${activeLink}" non trouvée dans le menu ouvert ${openMenu.id}`);
// Essayer de trouver le bon menu
this.autoDetectCorrectMenu();
@ -528,14 +528,14 @@ class NavigationManager {
const activeLink = window.appConfig?.activeLink;
if (!activeLink) return;
console.log(`[Navigation] Auto-détection du menu pour "${activeLink}"...`);
//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}`);
//console.log(`[Navigation] Trouvé dans ${correctMenuId}`);
// Mettre à jour
this.activeMenuId = correctMenuId;
@ -591,7 +591,7 @@ class ContextPanelManager {
init() {
if (this.isInitialized || !this.panel) return;
console.log('[Context Panel] Initialisation...');
//console.log('[Context Panel] Initialisation...');
this.setupProximityDetection();
this.setupKeyboardControls();
@ -671,7 +671,7 @@ class ContextPanelManager {
if (closeBtn) closeBtn.focus();
}, 300);
console.log('[Context Panel] Ouvert');
//console.log('[Context Panel] Ouvert');
window.appUX?.accessibility.announce('Panneau contextuel ouvert');
}
@ -688,7 +688,7 @@ class ContextPanelManager {
// Retourner le focus au bouton toggle
this.toggleButton.focus();
console.log('[Context Panel] Fermé');
//console.log('[Context Panel] Fermé');
window.appUX?.accessibility.announce('Panneau contextuel fermé');
}
}
@ -715,7 +715,7 @@ class NotificationManager {
* @public - Méthode appelée par UXManager
*/
init() {
console.log('[Notifications] Initialisation...');
//console.log('[Notifications] Initialisation...');
this.loadNotifications();
this.setupPolling();
@ -730,7 +730,7 @@ class NotificationManager {
const mockCount = 3; // Exemple : 3 notifications non lues
this.updateCount(mockCount);
console.log('[Notifications] Chargement simulé:', mockCount, 'notification(s)');
//console.log('[Notifications] Chargement simulé:', mockCount, 'notification(s)');
}
/**
@ -787,7 +787,7 @@ class NotificationManager {
showMessagesModal() {
const modalElement = document.getElementById('messagesModal');
if (!modalElement) {
console.error('[Notifications] Modale des messages non trouvée');
//console.error('[Notifications] Modale des messages non trouvée');
return;
}
@ -797,7 +797,7 @@ class NotificationManager {
// Charger les messages
this.loadMessages();
console.log('[Notifications] Affichage de la modale des messages');
//console.log('[Notifications] Affichage de la modale des messages');
}
/**
@ -859,14 +859,14 @@ class AccessibilityManager {
* @public - Méthode appelée par UXManager
*/
init() {
console.log('[Accessibility] Initialisation des fonctionnalités d\'accessibilités...');
//console.log('[Accessibility] Initialisation des fonctionnalités d\'accessibilités...');
this.setupFocusManagement();
this.setupAriaLiveRegions();
this.detectReducedMotion();
this.setupSkipLinks();
console.log('[Accessibility] Fonctionnalités d\'accessibilité activées');
//console.log('[Accessibility] Fonctionnalités d\'accessibilité activées');
}
/**
@ -934,7 +934,7 @@ class AccessibilityManager {
this.liveRegion.setAttribute('role', 'status');
document.body.appendChild(this.liveRegion);
console.log('[Accessibility] Région ARIA live créée');
//console.log('[Accessibility] Région ARIA live créée');
}
/**
@ -951,7 +951,7 @@ class AccessibilityManager {
// Ajouter le nouveau message après un délai
setTimeout(() => {
this.liveRegion.textContent = message;
console.log('[Accessibility] Annonce:', message);
//console.log('[Accessibility] Annonce:', message);
}, 100);
}
@ -965,7 +965,7 @@ class AccessibilityManager {
if (this.reducedMotion) {
document.documentElement.classList.add('reduced-motion');
console.log('[Accessibility] Réduction des mouvements activée');
//console.log('[Accessibility] Réduction des mouvements activée');
}
// Écouter les changements de préférence
@ -976,7 +976,7 @@ class AccessibilityManager {
} else {
document.documentElement.classList.remove('reduced-motion');
}
console.log('[Accessibility] Préférence de mouvement mise à jour:', this.reducedMotion);
//console.log('[Accessibility] Préférence de mouvement mise à jour:', this.reducedMotion);
});
}
@ -1002,7 +1002,7 @@ class AccessibilityManager {
// Insérer au début du body
document.body.insertBefore(skipLinks, document.body.firstChild);
console.log('[Accessibility] Liens d\'évitement créés');
//console.log('[Accessibility] Liens d\'évitement créés');
}
}
@ -1027,14 +1027,14 @@ class PerformanceManager {
* @public - Méthode appelée par UXManager
*/
init() {
console.log('[Performance] Initialisation du monitoring...');
//console.log('[Performance] Initialisation du monitoring...');
this.monitorPerformance();
this.setupLazyLoading();
this.setupIntersectionObserver();
this.setupIdleCallback();
console.log('[Performance] Monitoring activé');
//console.log('[Performance] Monitoring activé');
}
/**
@ -1049,16 +1049,16 @@ class PerformanceManager {
switch (entry.entryType) {
case 'largest-contentful-paint':
this.metrics.lcp = entry.startTime;
console.log('[Performance] LCP:', entry.startTime.toFixed(2), 'ms');
//console.log('[Performance] LCP:', entry.startTime.toFixed(2), 'ms');
break;
case 'first-input':
this.metrics.fid = entry.processingStart - entry.startTime;
console.log('[Performance] FID:', this.metrics.fid.toFixed(2), 'ms');
//console.log('[Performance] FID:', this.metrics.fid.toFixed(2), 'ms');
break;
case 'layout-shift':
if (!entry.hadRecentInput) {
this.metrics.cls = (this.metrics.cls || 0) + entry.value;
console.log('[Performance] CLS cumulé:', this.metrics.cls.toFixed(4));
//console.log('[Performance] CLS cumulé:', this.metrics.cls.toFixed(4));
}
break;
}
@ -1083,11 +1083,11 @@ class PerformanceManager {
document.querySelectorAll('img[loading="lazy"]').forEach(img => {
img.addEventListener('load', () => {
img.classList.add('loaded');
console.log('[Performance] Image chargée:', img.src);
//console.log('[Performance] Image chargée:', img.src);
});
img.addEventListener('error', () => {
console.warn('[Performance] Erreur de chargement image:', img.src);
//console.warn('[Performance] Erreur de chargement image:', img.src);
});
});
} else {
@ -1212,7 +1212,7 @@ class LanguageManager {
this.detectCurrentLanguage();
this.updateLanguageTexts();
console.log('[Language] Gestionnaire de langue initialisé:', this.currentLang);
//console.log('[Language] Gestionnaire de langue initialisé:', this.currentLang);
}
/**
@ -1258,7 +1258,7 @@ class LanguageManager {
// Rediriger vers la page de connexion avec le nouveau paramètre de langue
const redirectUrl = window.appConfig?.racineWeb +
'Connexion/index?langue=' + newLang;
console.log('[Language] Changement de langue vers:', newLang);
//console.log('[Language] Changement de langue vers:', newLang);
window.location.href = redirectUrl;
}
});
@ -1298,11 +1298,11 @@ class LanguageManager {
* Point d'entrée principal de l'application
*/
document.addEventListener('DOMContentLoaded', () => {
console.log('[App] DOM chargé, initialisation de l\'application...');
//console.log('[App] DOM chargé, initialisation de l\'application...');
// Vérifier que la configuration est disponible
if (!window.appConfig) {
console.warn('[App] Configuration non trouvée, création par défaut...');
//console.warn('[App] Configuration non trouvée, création par défaut...');
window.appConfig = {
activeParentId: '',
activeChildId: '',
@ -1320,7 +1320,7 @@ document.addEventListener('DOMContentLoaded', () => {
// Marquer le chargement comme terminé
setTimeout(() => {
document.body.classList.add('loaded');
console.log('[App] Portail RH Inter Santé initialisé avec succès');
//console.log('[App] Portail RH Inter Santé initialisé avec succès');
// Émettre un événement personnalisé
document.dispatchEvent(new CustomEvent('app:initialized'));
@ -1414,11 +1414,11 @@ window.uxManager = {
*/
testSystem: () => {
if (window.appConfig?.debugMode) {
console.group('[UX Manager] Test du système');
/*console.group('[UX Manager] Test du système');
console.log('App UX:', window.appUX);
console.log('Navigation:', window.appUX?.navigation);
console.log('Config:', window.appConfig);
console.groupEnd();
console.groupEnd();*/
}
}
};
@ -1440,4 +1440,4 @@ export {
};
*/
console.log('[UX Manager] Module chargé et prêt à l\'emploi');
//console.log('[UX Manager] Module chargé et prêt à l\'emploi');

View File

@ -65,15 +65,15 @@
// ============================================
function handleRegistrationError(error) {
console.error('Erreur d\'enregistrement du Service Worker:', error);
//console.error('Erreur d\'enregistrement du Service Worker:', error);
// Suggestions de dépannage basées sur l'erreur
if (error.name === 'SecurityError') {
console.warn('⚠️ Vérifiez que vous êtes en HTTPS');
//console.warn('⚠️ Vérifiez que vous êtes en HTTPS');
} else if (error.name === 'TypeError') {
console.warn('⚠️ Vérifiez le chemin du Service Worker');
//console.warn('⚠️ Vérifiez le chemin du Service Worker');
} else if (error.message.includes('MIME type')) {
console.warn('⚠️ Vérifiez l\'en-tête Content-Type du Service Worker');
//console.warn('⚠️ Vérifiez l\'en-tête Content-Type du Service Worker');
}
}
@ -382,7 +382,7 @@
function log(message, ...args) {
if (DEBUG) {
console.log('[SW Register]', message, ...args);
//console.log('[SW Register]', message, ...args);
}
}
@ -417,7 +417,7 @@
window.addEventListener('error', function(event) {
if (event.message && event.message.includes('ServiceWorker')) {
console.error('Erreur Service Worker:', event.error);
//console.error('Erreur Service Worker:', event.error);
}
});

View File

@ -608,10 +608,10 @@ $activeChildId = $menuData['child'];
<?php endif; ?>
<!-- UX Enhancement Script -->
<script src="/Bootstrap_new/js/ux-manager.js?ver=2025.12.23.01"></script>
<script src="/Bootstrap_new/js/ux-manager.js?ver=2025.12.31.00"></script>
<!-- Service Worker Registration -->
<script src="/Js/sw-register.js?ver=2025.12.26.01"></script>
<script src="/Js/sw-register.js?ver=2025.12.31.00"></script>
<script>