From 20efd9251e589059a665407b056d6108665b26b4 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Wed, 20 Aug 2025 08:58:29 +0000 Subject: [PATCH] Ensure all users can view relevant data by filtering it by their selected store Fix data fetching logic to correctly apply store filtering for all user roles, and add an alert for managers/directors if no store is selected. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 15f19c36-9aac-46a4-a181-3dc5f496fabd Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/15f19c36-9aac-46a4-a181-3dc5f496fabd/H1nJA1b --- client/src/components/Layout.tsx | 50 ++++++++++++++++++++++++++++---- client/src/pages/Deliveries.tsx | 3 +- client/src/pages/Orders.tsx | 3 +- client/src/pages/Tasks.tsx | 6 ++-- 4 files changed, 53 insertions(+), 9 deletions(-) diff --git a/client/src/components/Layout.tsx b/client/src/components/Layout.tsx index a96fd2a..c34387c 100644 --- a/client/src/components/Layout.tsx +++ b/client/src/components/Layout.tsx @@ -2,7 +2,7 @@ import { ReactNode, useState, createContext, useContext, useEffect } from "react import { useQuery, useQueryClient } from "@tanstack/react-query"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Button } from "@/components/ui/button"; -import { LogOut, Store, Menu } from "lucide-react"; +import { LogOut, Store, Menu, AlertTriangle } from "lucide-react"; import { useAuthUnified } from "@/hooks/useAuthUnified"; import { useIsMobile } from "@/hooks/use-mobile"; import Sidebar from "./Sidebar"; @@ -72,29 +72,52 @@ export default function Layout({ children }: LayoutProps) { // Effet pour marquer l'initialisation comme terminée useEffect(() => { if (user && stores.length > 0) { - // Pour les admins, vérifier que selectedStoreId est cohérent avec les stores disponibles - if (user.role === 'admin' && selectedStoreId) { + 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); if (!storeExists) { - console.log('🏪 Selected store not found in available stores, clearing selection'); + 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) { + if ((user.role === 'directeur' || user.role === 'manager') && !selectedStoreId && stores.length === 1 && !needsUpdate) { console.log('🏪 Auto-selecting single available store for directeur/manager:', stores[0].id); 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); @@ -206,6 +229,23 @@ export default function Layout({ children }: LayoutProps) { )} + {/* Alert for directeur/manager without store selection */} + {user && (user.role === 'directeur' || user.role === 'manager') && !selectedStoreId && storeInitialized && ( +
+ Action requise : Veuillez sélectionner un magasin pour afficher les données. + Vos permissions ne permettent pas de voir les données de tous les magasins. +
+