mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-12 01:37:40 +02:00
Ensure tasks display correctly for selected stores by admins
Fixes an issue where admin users had to refresh the page to see tasks filtered by their selected store. This change ensures the store selection is properly initialized and validated before fetching tasks, preventing stale data and improving the user experience. The backend task fetching logic is also updated to correctly handle store filtering. Replit-Commit-Author: Agent Replit-Commit-Session-Id: e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce/OvGzl7P
This commit is contained in:
1 parent
9d9344f52e
commit
5688450117
3 files changed
+47
-8
No files matched your search
@@ -1,4 +1,4 @@
|
||||
import { ReactNode, useState, createContext, useContext } from "react";
|
||||
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";
|
||||
@@ -18,6 +18,7 @@ interface StoreContextType {
|
||||
setSidebarCollapsed: (collapsed: boolean) => void;
|
||||
mobileMenuOpen: boolean;
|
||||
setMobileMenuOpen: (open: boolean) => void;
|
||||
storeInitialized: boolean;
|
||||
}
|
||||
|
||||
const StoreContext = createContext<StoreContextType | undefined>(undefined);
|
||||
@@ -46,6 +47,8 @@ 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<boolean>(() => {
|
||||
// Restaurer l'état de la sidebar depuis localStorage, mais forcer collapsed sur mobile
|
||||
@@ -60,12 +63,34 @@ export default function Layout({ children }: LayoutProps) {
|
||||
enabled: !!user,
|
||||
});
|
||||
|
||||
// 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) {
|
||||
const storeExists = stores.find(store => store.id === selectedStoreId);
|
||||
if (!storeExists) {
|
||||
console.log('🏪 Selected store not found in available stores, clearing selection');
|
||||
setSelectedStoreId(null);
|
||||
localStorage.removeItem('selectedStoreId');
|
||||
}
|
||||
}
|
||||
|
||||
console.log('🏪 Store initialization complete:', {
|
||||
user: user.role,
|
||||
selectedStoreId,
|
||||
storesCount: stores.length
|
||||
});
|
||||
setStoreInitialized(true);
|
||||
}
|
||||
}, [user, stores, selectedStoreId]);
|
||||
|
||||
const handleLogout = () => {
|
||||
window.location.href = "/api/logout";
|
||||
};
|
||||
|
||||
return (
|
||||
<StoreContext.Provider value={{ selectedStoreId, setSelectedStoreId, stores, sidebarCollapsed, setSidebarCollapsed, mobileMenuOpen, setMobileMenuOpen }}>
|
||||
<StoreContext.Provider value={{ selectedStoreId, setSelectedStoreId, stores, sidebarCollapsed, setSidebarCollapsed, mobileMenuOpen, setMobileMenuOpen, storeInitialized }}>
|
||||
<div className="layout-container flex bg-gray-50">
|
||||
{/* Mobile overlay */}
|
||||
{isMobile && mobileMenuOpen && (
|
||||
|
||||
@@ -39,7 +39,7 @@ type TaskWithRelations = Task & {
|
||||
|
||||
export default function Tasks() {
|
||||
const { user } = useAuthUnified();
|
||||
const { selectedStoreId } = useStore();
|
||||
const { selectedStoreId, storeInitialized } = useStore();
|
||||
const { toast } = useToast();
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
@@ -57,14 +57,20 @@ export default function Tasks() {
|
||||
const [selectedTask, setSelectedTask] = useState<TaskWithRelations | null>(null);
|
||||
const [taskToDelete, setTaskToDelete] = useState<TaskWithRelations | null>(null);
|
||||
|
||||
// Fetch tasks
|
||||
// Fetch tasks - attendre que l'initialisation des stores soit terminée pour les admins
|
||||
const { data: tasks = [], isLoading } = useQuery({
|
||||
queryKey: ["/api/tasks", selectedStoreId],
|
||||
queryFn: () => {
|
||||
const params = new URLSearchParams();
|
||||
if (selectedStoreId) {
|
||||
if (selectedStoreId && user?.role === 'admin') {
|
||||
params.append('storeId', selectedStoreId.toString());
|
||||
}
|
||||
console.log('📋 TASKS QUERY - Fetching with params:', {
|
||||
selectedStoreId,
|
||||
userRole: user?.role,
|
||||
storeInitialized,
|
||||
url: `/api/tasks?${params.toString()}`
|
||||
});
|
||||
return fetch(`/api/tasks?${params.toString()}`, {
|
||||
credentials: 'include'
|
||||
}).then(res => {
|
||||
@@ -74,7 +80,7 @@ export default function Tasks() {
|
||||
return res.json();
|
||||
});
|
||||
},
|
||||
enabled: !!user,
|
||||
enabled: !!user && (user.role !== 'admin' || storeInitialized),
|
||||
});
|
||||
|
||||
// Fetch users for task assignment - seulement pour admin/manager/directeur
|
||||
|
||||
+10
-2
@@ -1265,11 +1265,19 @@ export async function registerRoutes(app: Express): Promise<Server> {
|
||||
userRole: user.role,
|
||||
userId: user.id,
|
||||
requestedStoreId: storeId,
|
||||
userGroups: user.role !== 'admin' ? user.userGroups.map(ug => ug.groupId) : 'all'
|
||||
userGroups: user.role !== 'admin' ? user.userGroups.map(ug => ug.groupId) : 'all',
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
|
||||
const tasks = await storage.getTasks(groupIds);
|
||||
console.log('📋 Tasks returned:', tasks.length, 'items for user:', user.id);
|
||||
console.log('📋 Tasks returned:', {
|
||||
count: tasks.length,
|
||||
userId: user.id,
|
||||
userRole: user.role,
|
||||
requestedStoreId: storeId,
|
||||
groupIds,
|
||||
taskGroups: tasks.map(t => ({ id: t.id, title: t.title, groupId: t.groupId })).slice(0, 3)
|
||||
});
|
||||
res.json(tasks);
|
||||
} catch (error) {
|
||||
console.error("Error fetching tasks:", error);
|
||||
|
||||
Reference in new issue
Block a user