import { useQuery } from "@tanstack/react-query"; import { useAuthUnified } from "@/hooks/useAuthUnified"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { ListTodo, Circle, Clock, AlertTriangle, ArrowRight } from "lucide-react"; import { format, addDays, isAfter, isBefore } from "date-fns"; import { fr } from "date-fns/locale"; import { useLocation } from "wouter"; import { useStore } from "@/components/Layout"; import { Task } from "@shared/schema"; type TaskWithRelations = Task & { assignedUser: { id: string; username: string; firstName?: string; lastName?: string; }; creator: { id: string; username: string; firstName?: string; lastName?: string; }; group: { id: number; name: string; color: string; }; }; export default function RecentTasksCard() { const { user } = useAuthUnified(); const { selectedStoreId } = useStore(); const [, navigate] = useLocation(); // Fetch tasks const { data: tasks = [], isLoading } = useQuery({ queryKey: ["/api/tasks", selectedStoreId], queryFn: () => { const params = new URLSearchParams(); if (selectedStoreId) { params.append('storeId', selectedStoreId.toString()); } return fetch(`/api/tasks?${params.toString()}`).then(res => res.json()); }, enabled: !!user, }); // Filtrer les tâches des 7 prochains jours qui ne sont pas terminées const upcomingTasks = tasks .filter((task: TaskWithRelations) => { // Seulement les tâches incomplètes if (task.status === 'completed') return false; // Tâches avec date d'échéance dans les 7 prochains jours if (task.dueDate) { const dueDate = new Date(task.dueDate); const now = new Date(); const sevenDaysFromNow = addDays(now, 7); return isAfter(dueDate, now) && isBefore(dueDate, sevenDaysFromNow); } return false; }) .sort((a: TaskWithRelations, b: TaskWithRelations) => { // Trier par priorité (high -> medium -> low) puis par date const priorityOrder = { high: 3, medium: 2, low: 1 }; const priorityDiff = (priorityOrder[b.priority as keyof typeof priorityOrder] || 2) - (priorityOrder[a.priority as keyof typeof priorityOrder] || 2); if (priorityDiff !== 0) return priorityDiff; // Si même priorité, trier par date d'échéance if (a.dueDate && b.dueDate) { return new Date(a.dueDate).getTime() - new Date(b.dueDate).getTime(); } return 0; }) .slice(0, 5); // Limite à 5 tâches const getPriorityConfig = (priority: string) => { switch (priority) { case 'high': return { color: 'destructive' as const, icon: AlertTriangle, label: 'Élevée' }; case 'medium': return { color: 'default' as const, icon: Clock, label: 'Moyenne' }; case 'low': return { color: 'secondary' as const, icon: Circle, label: 'Faible' }; default: return { color: 'secondary' as const, icon: Circle, label: 'Moyenne' }; } }; const handleViewAllTasks = () => { navigate("/tasks"); }; if (isLoading) { return ( Tâches à venir ); } return ( Tâches à venir {upcomingTasks.length === 0 ? ( Aucune tâche à venir dans les 7 prochains jours ) : ( {upcomingTasks.map((task: TaskWithRelations) => { const priorityConfig = getPriorityConfig(task.priority); const PriorityIcon = priorityConfig.icon; return ( {task.title} {priorityConfig.label} {task.description && ( {task.description} )} {task.dueDate && ( {format(new Date(task.dueDate), 'dd/MM à HH:mm', { locale: fr })} )} {task.assignedTo} ); })} Voir toutes les tâches )} ); }
Aucune tâche à venir dans les 7 prochains jours
{task.description}