From 26579affb34cb30c302b2d9638011948c291f9f0 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Tue, 19 Aug 2025 11:07:48 +0000 Subject: [PATCH] Restore previous task list view and fix task update issues Revert client-side task routing to use the previous `TasksListSimple` component and implement server-side data cleaning for task updates, specifically addressing potential issues with `startDate` and `dueDate` when they are empty strings. Replit-Commit-Author: Agent Replit-Commit-Session-Id: cc2d271b-82f0-4d6a-9302-a0b067ffb429 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/cc2d271b-82f0-4d6a-9302-a0b067ffb429/fN5Ayh3 --- ...-4E68-BCC2-2FEF5994C6B5}_1755601443875.png | Bin 0 -> 35244 bytes client/src/components/RouterProduction.tsx | 4 +- client/src/pages/TasksListSimple.tsx | 568 ++++++++++++++++++ server/routes.ts | 15 +- 4 files changed, 584 insertions(+), 3 deletions(-) create mode 100644 attached_assets/{496F0E32-2A57-4E68-BCC2-2FEF5994C6B5}_1755601443875.png create mode 100644 client/src/pages/TasksListSimple.tsx diff --git a/attached_assets/{496F0E32-2A57-4E68-BCC2-2FEF5994C6B5}_1755601443875.png b/attached_assets/{496F0E32-2A57-4E68-BCC2-2FEF5994C6B5}_1755601443875.png new file mode 100644 index 0000000000000000000000000000000000000000..64ad496200744bed179a60e3dd1d8dee3e359114 GIT binary patch literal 35244 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 bdWQ1*k;wHcfMWF(@JC!&M(Df1H=q9jHsaZ_ literal 0 HcmV?d00001 diff --git a/client/src/components/RouterProduction.tsx b/client/src/components/RouterProduction.tsx index e5276d6..44ed4c5 100644 --- a/client/src/components/RouterProduction.tsx +++ b/client/src/components/RouterProduction.tsx @@ -19,7 +19,7 @@ import CustomerOrders from "@/pages/CustomerOrders"; import DlcPage from "@/pages/DlcPage"; import BackupManager from "@/pages/BackupManager"; import Utilities from "@/pages/Utilities"; -import TasksProductionSimple from "@/pages/TasksProductionSimple"; +import TasksListSimple from "@/pages/TasksListSimple"; import SavTickets from "@/pages/SavTickets"; import WeatherSettings from "@/pages/WeatherSettings"; import Layout from "@/components/Layout"; @@ -94,7 +94,7 @@ function RouterProduction() { - + {/* Routes de compatibilité - redirection vers utilities */} diff --git a/client/src/pages/TasksListSimple.tsx b/client/src/pages/TasksListSimple.tsx new file mode 100644 index 0000000..2e57e57 --- /dev/null +++ b/client/src/pages/TasksListSimple.tsx @@ -0,0 +1,568 @@ +import { useState, useEffect } from "react"; + +// Interface pour les tâches +interface Task { + id: number; + title: string; + description?: string; + priority: 'low' | 'medium' | 'high'; + status: 'pending' | 'completed'; + assignedTo: string; + startDate?: string | null; + dueDate?: string | null; + createdAt?: string; + groupId?: number; + createdBy?: string; +} + +export default function TasksListSimple() { + const [tasks, setTasks] = useState([]); + const [loading, setLoading] = useState(true); + const [editingId, setEditingId] = useState(null); + const [searchTerm, setSearchTerm] = useState(""); + const [statusFilter, setStatusFilter] = useState("all"); + const [showCreateForm, setShowCreateForm] = useState(false); + + // Charger les tâches + const loadTasks = async () => { + try { + const response = await fetch('/api/tasks'); + if (response.ok) { + const data = await response.json(); + setTasks(data); + } else { + console.error('Erreur lors du chargement des tâches:', response.status); + } + } catch (error) { + console.error('Erreur lors du chargement des tâches:', error); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + loadTasks(); + }, []); + + // Créer une tâche + const createTask = async (formData: FormData) => { + const title = formData.get('title') as string; + const description = formData.get('description') as string; + const priority = formData.get('priority') as string; + const status = formData.get('status') as string; + const assignedTo = formData.get('assignedTo') as string; + const startDate = formData.get('startDate') as string; + const dueDate = formData.get('dueDate') as string; + + if (!title?.trim()) { + alert("Le titre est requis"); + return false; + } + + if (!assignedTo?.trim()) { + alert("L'assignation est requise"); + return false; + } + + try { + const taskData = { + title: title.trim(), + description: description?.trim() || "", + priority: priority || "medium", + status: status || "pending", + assignedTo: assignedTo.trim(), + startDate: startDate || null, + dueDate: dueDate || null, + groupId: 1, + createdBy: 'admin', + }; + + console.log('📤 Creating task:', taskData); + + const response = await fetch('/api/tasks', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(taskData), + }); + + if (!response.ok) { + const errorText = await response.text(); + console.error('❌ Create Error:', { status: response.status, error: errorText }); + throw new Error(`Erreur ${response.status}: ${errorText}`); + } + + alert("Tâche créée avec succès"); + loadTasks(); + return true; + } catch (error) { + console.error('Erreur lors de la création:', error); + alert("Erreur lors de la création"); + return false; + } + }; + + // Modifier une tâche + const updateTask = async (id: number, formData: FormData) => { + const title = formData.get('title') as string; + const description = formData.get('description') as string; + const priority = formData.get('priority') as string; + const status = formData.get('status') as string; + const assignedTo = formData.get('assignedTo') as string; + const startDate = formData.get('startDate') as string; + const dueDate = formData.get('dueDate') as string; + + if (!title?.trim()) { + alert("Le titre est requis"); + return false; + } + + if (!assignedTo?.trim()) { + alert("L'assignation est requise"); + return false; + } + + try { + // Préparer les données exactement comme le serveur les attend + const taskData: Partial = { + title: title.trim(), + description: description?.trim() || "", + priority: (priority as Task['priority']) || "medium", + status: (status as Task['status']) || "pending", + assignedTo: assignedTo.trim(), + }; + + // Gestion spéciale des dates pour éviter les erreurs de format + if (startDate && startDate.trim() !== '') { + taskData.startDate = startDate; + } else { + taskData.startDate = null; + } + + if (dueDate && dueDate.trim() !== '') { + taskData.dueDate = dueDate; + } else { + taskData.dueDate = null; + } + + console.log('📤 Updating task:', { id, taskData }); + + const response = await fetch(`/api/tasks/${id}`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(taskData), + }); + + console.log('📥 Update Response:', { status: response.status, ok: response.ok }); + + if (!response.ok) { + const errorText = await response.text(); + console.error('❌ Update Error:', { status: response.status, error: errorText }); + throw new Error(`Erreur ${response.status}: ${errorText}`); + } + + alert("Tâche modifiée avec succès"); + setEditingId(null); + loadTasks(); + return true; + } catch (error) { + console.error('Erreur lors de la modification:', error); + alert("Erreur lors de la modification"); + return false; + } + }; + + // Filtrer les tâches + const filteredTasks = tasks.filter(task => { + const matchesSearch = !searchTerm || task.title?.toLowerCase().includes(searchTerm.toLowerCase()); + const matchesStatus = statusFilter === "all" || task.status === statusFilter; + return matchesSearch && matchesStatus; + }); + + // Formulaire inline + const TaskForm = ({ task, onSubmit, onCancel }: { + task?: Task; + onSubmit: (formData: FormData) => Promise; + onCancel: () => void; + }) => { + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + const formData = new FormData(e.currentTarget); + const success = await onSubmit(formData); + if (success && !task) { + (e.target as HTMLFormElement).reset(); + } + }; + + return ( + + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + + ); + }; + + if (loading) { + return ( +
+

Chargement des tâches...

+
+ ); + } + + return ( +
+ {/* Header */} +
+
+

+ 📋 Gestion des Tâches +

+ +
+ + {/* Filtres */} +
+
+ setSearchTerm(e.target.value)} + style={{ + width: '100%', + padding: '8px 12px', + border: '1px solid #d1d5db', + borderRadius: '6px', + fontSize: '14px' + }} + /> +
+
+ +
+
+
+ + {/* Tableau des tâches */} +
+ + + + + + + + + + + + + {showCreateForm && ( + setShowCreateForm(false)} + /> + )} + + {filteredTasks.length === 0 ? ( + + + + ) : ( + filteredTasks.map((task) => ( + editingId === task.id ? ( + updateTask(task.id, formData)} + onCancel={() => setEditingId(null)} + /> + ) : ( + + + + + + + + + ) + )) + )} + +
TitrePrioritéStatutAssigné àDatesActions
+ Aucune tâche trouvée +
+
+
+ {task.title} +
+ {task.description && ( +
+ {task.description} +
+ )} +
+
+ + {task.priority === 'high' ? '🔴 Élevée' : task.priority === 'medium' ? '🟡 Moyenne' : '🟢 Faible'} + + + + {task.status === 'completed' ? '✅ Terminée' : '⏳ En cours'} + + + {task.assignedTo} + + {task.startDate && ( +
📅 {new Date(task.startDate).toLocaleDateString('fr-FR')}
+ )} + {task.dueDate && ( +
⏰ {new Date(task.dueDate).toLocaleDateString('fr-FR')}
+ )} +
+ +
+
+
+ ); +} \ No newline at end of file diff --git a/server/routes.ts b/server/routes.ts index 83ab079..e248193 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -1455,7 +1455,20 @@ export async function registerRoutes(app: Express): Promise { } } - const updatedTask = await storage.updateTask(id, req.body); + // Nettoyer les données reçues pour éviter les problèmes de types + const cleanData = { + ...(req.body.title && { title: req.body.title }), + ...(req.body.description !== undefined && { description: req.body.description }), + ...(req.body.priority && { priority: req.body.priority }), + ...(req.body.status && { status: req.body.status }), + ...(req.body.assignedTo && { assignedTo: req.body.assignedTo }), + ...(req.body.startDate !== undefined && { startDate: req.body.startDate === '' ? null : req.body.startDate }), + ...(req.body.dueDate !== undefined && { dueDate: req.body.dueDate === '' ? null : req.body.dueDate }), + }; + + console.log('🧹 Cleaned data for update:', cleanData); + + const updatedTask = await storage.updateTask(id, cleanData); console.log('✅ Task updated:', { id: updatedTask.id, title: updatedTask.title,