From 475c52cede9e02b5c95c50316e62867217618000 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Thu, 2 Apr 2026 09:25:09 +0200 Subject: [PATCH] feat: implement dashboard page with store-specific stats, announcement modals, and DLC alerts --- client/src/components/Layout.tsx | 52 ++----------------------------- client/src/components/Sidebar.tsx | 26 ++-------------- client/src/pages/Dashboard.tsx | 23 ++------------ 3 files changed, 7 insertions(+), 94 deletions(-) diff --git a/client/src/components/Layout.tsx b/client/src/components/Layout.tsx index c1f8407..3c22319 100644 --- a/client/src/components/Layout.tsx +++ b/client/src/components/Layout.tsx @@ -28,9 +28,7 @@ export default function Layout({ children }: LayoutProps) { const [selectedStoreId, setSelectedStoreId] = useState(() => { // Restaurer le selectedStoreId depuis localStorage si disponible const saved = localStorage.getItem('selectedStoreId'); - const restoredId = saved ? parseInt(saved) : null; - console.log('🏪 Layout - Restoring selectedStoreId from localStorage:', { saved, restoredId }); - return restoredId; + return saved ? parseInt(saved) : null; }); const [storeInitialized, setStoreInitialized] = useState(false); @@ -39,10 +37,8 @@ export default function Layout({ children }: LayoutProps) { // Restaurer l'état de la sidebar depuis localStorage, mais forcer collapsed sur mobile try { const saved = localStorage.getItem('sidebarCollapsed'); - console.log('🔧 Layout - Restoring sidebar state:', { saved, isMobile }); return isMobile ? true : (saved ? JSON.parse(saved) : false); - } catch (error) { - console.error('Error reading sidebar state from localStorage:', error); + } catch { return isMobile ? true : false; } }); @@ -63,55 +59,21 @@ export default function Layout({ children }: LayoutProps) { if (selectedStoreId) { const storeExists = stores.find(store => store.id === selectedStoreId); if (!storeExists) { - console.log('🏪 Selected store not found in available stores, clearing selection:', { - selectedStoreId, - userRole: user.role, - availableStores: stores.map(s => s.id) - }); setSelectedStoreId(null); localStorage.removeItem('selectedStoreId'); needsUpdate = true; - } else { - console.log('🏪 Selected store validated successfully:', { - selectedStoreId, - userRole: user.role, - storeName: storeExists.name - }); } } // IMPORTANT FIX: Pour les rôles directeur/manager, forcer la sélection d'un magasin spécifique // si aucun n'est sélectionné et qu'ils n'ont accès qu'à un seul magasin if ((user.role === 'directeur' || user.role === 'manager') && !selectedStoreId && stores.length === 1 && !needsUpdate) { - console.log('🏪 Auto-selecting single available store for directeur/manager:', { - storeId: stores[0].id, - storeName: stores[0].name, - userRole: user.role, - userId: user.id, - previousSelectedStoreId: selectedStoreId, - timestamp: new Date().toISOString() - }); const singleStoreId = stores[0].id; setSelectedStoreId(singleStoreId); localStorage.setItem('selectedStoreId', singleStoreId.toString()); } // VALIDATION CRITIQUE: Pour les directeurs/managers, s'assurer qu'un magasin est toujours sélectionné - if ((user.role === 'directeur' || user.role === 'manager') && !selectedStoreId && !needsUpdate) { - console.log('🚨 CRITICAL: Directeur/Manager has no store selected, this will cause empty data display:', { - userId: user.id, - userRole: user.role, - availableStores: stores.map(s => ({ id: s.id, name: s.name })) - }); - } - - console.log('🏪 Store initialization complete:', { - user: user.role, - selectedStoreId, - storesCount: stores.length, - validatedStore: selectedStoreId ? stores.find(s => s.id === selectedStoreId)?.name : 'None', - autoSelected: (user.role === 'directeur' || user.role === 'manager') && !selectedStoreId && stores.length === 1 - }); setStoreInitialized(true); } }, [user, stores, selectedStoreId]); @@ -172,15 +134,7 @@ export default function Layout({ children }: LayoutProps) {