From 69773e3d2fe7cbe07aad9feab1e759210310e6f1 Mon Sep 17 00:00:00 2001 From: R0m1k3 Date: Wed, 10 Dec 2025 13:25:24 +0100 Subject: [PATCH] feat: add mobile tasks page with creation/edit form and new layout component --- client/src/components/Layout.tsx | 90 +++++++++++++-------------- client/src/pages/mobile/TasksPage.tsx | 12 +++- 2 files changed, 54 insertions(+), 48 deletions(-) diff --git a/client/src/components/Layout.tsx b/client/src/components/Layout.tsx index 212332c..c1f8407 100644 --- a/client/src/components/Layout.tsx +++ b/client/src/components/Layout.tsx @@ -24,7 +24,7 @@ export default function Layout({ children }: LayoutProps) { const queryClient = useQueryClient(); const isMobile = useIsMobile(); const { screenSize, isMobileOrTablet, isTablet } = useScreenSize(); - + const [selectedStoreId, setSelectedStoreId] = useState(() => { // Restaurer le selectedStoreId depuis localStorage si disponible const saved = localStorage.getItem('selectedStoreId'); @@ -32,7 +32,7 @@ export default function Layout({ children }: LayoutProps) { console.log('🏪 Layout - Restoring selectedStoreId from localStorage:', { saved, restoredId }); return restoredId; }); - + const [storeInitialized, setStoreInitialized] = useState(false); const [sidebarCollapsed, setSidebarCollapsed] = useState(() => { @@ -58,7 +58,7 @@ export default function Layout({ children }: LayoutProps) { useEffect(() => { if (user && stores.length > 0) { let needsUpdate = false; - + // Pour tous les rôles, vérifier que selectedStoreId est cohérent avec les stores disponibles if (selectedStoreId) { const storeExists = stores.find(store => store.id === selectedStoreId); @@ -79,7 +79,7 @@ export default function Layout({ children }: LayoutProps) { }); } } - + // 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) { @@ -95,7 +95,7 @@ export default function Layout({ children }: LayoutProps) { 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:', { @@ -104,10 +104,10 @@ export default function Layout({ children }: LayoutProps) { availableStores: stores.map(s => ({ id: s.id, name: s.name })) }); } - - console.log('🏪 Store initialization complete:', { - user: user.role, - selectedStoreId, + + 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 @@ -125,25 +125,24 @@ export default function Layout({ children }: LayoutProps) {
{/* Mobile overlay for normal mode */} {isMobile && mobileMenuOpen && ( -
setMobileMenuOpen(false)} /> )} - + {/* Sidebar for normal mode */} - +
- {/* Header with mobile menu and store selector */} -
+ {/* Header with mobile menu and store selector */} +
{/* Mobile menu button (only in normal mode) */} {isMobile && ( @@ -159,9 +158,8 @@ export default function Layout({ children }: LayoutProps) { )} {/* Weather and Date widgets - responsive */} -
+
{!isMobile && }
@@ -174,23 +172,25 @@ export default function Layout({ children }: LayoutProps) {