diff --git a/attached_assets/{91C8B3DA-D7C8-4ADA-83AA-0709433632EF}_1755601835606.png b/attached_assets/{91C8B3DA-D7C8-4ADA-83AA-0709433632EF}_1755601835606.png new file mode 100644 index 0000000..9417e23 Binary files /dev/null and b/attached_assets/{91C8B3DA-D7C8-4ADA-83AA-0709433632EF}_1755601835606.png differ diff --git a/attached_assets/{D21CE371-D28D-4D2E-BE51-BBE3618FFDA8}_1755602028247.png b/attached_assets/{D21CE371-D28D-4D2E-BE51-BBE3618FFDA8}_1755602028247.png new file mode 100644 index 0000000..2a1a937 Binary files /dev/null and b/attached_assets/{D21CE371-D28D-4D2E-BE51-BBE3618FFDA8}_1755602028247.png differ diff --git a/client/src/components/RouterProduction.tsx b/client/src/components/RouterProduction.tsx index 44ed4c5..16c6445 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 TasksListSimple from "@/pages/TasksListSimple"; +import Tasks from "@/pages/Tasks"; 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/server/routes.ts b/server/routes.ts index e248193..0a53a7b 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -1456,15 +1456,20 @@ export async function registerRoutes(app: Express): Promise { } // 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 }), - }; + const cleanData: any = {}; + + // Ne pas utiliser de conditions qui ignorent les valeurs falsy légitimes + if (req.body.title !== undefined) cleanData.title = req.body.title; + if (req.body.description !== undefined) cleanData.description = req.body.description; + if (req.body.priority !== undefined) cleanData.priority = req.body.priority; + if (req.body.status !== undefined) cleanData.status = req.body.status; + if (req.body.assignedTo !== undefined) cleanData.assignedTo = req.body.assignedTo; + if (req.body.startDate !== undefined) { + cleanData.startDate = req.body.startDate === '' ? null : req.body.startDate; + } + if (req.body.dueDate !== undefined) { + cleanData.dueDate = req.body.dueDate === '' ? null : req.body.dueDate; + } console.log('🧹 Cleaned data for update:', cleanData); @@ -1477,8 +1482,16 @@ export async function registerRoutes(app: Express): Promise { }); res.json(updatedTask); } catch (error) { - console.error("Error updating task:", error); - res.status(500).json({ message: "Failed to update task" }); + console.error("❌ Error updating task:", { + taskId: id, + error: error instanceof Error ? error.message : String(error), + stack: error instanceof Error ? error.stack : undefined, + reqBody: req.body + }); + res.status(500).json({ + message: "Failed to update task", + details: error instanceof Error ? error.message : String(error) + }); } }); diff --git a/server/storage.ts b/server/storage.ts index 780f9a7..7d59452 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -1710,21 +1710,54 @@ export class DatabaseStorage implements IStorage { dueDateType: typeof taskData.dueDate, dueDateISO: taskData.dueDate instanceof Date ? taskData.dueDate.toISOString() : taskData.dueDate }); + + // Validation des données avant update + if (!taskData || typeof taskData !== 'object') { + throw new Error('Invalid task data provided'); + } + + // Nettoyer les données pour éviter les problèmes de type + const cleanData: any = {}; - const [task] = await db - .update(tasks) - .set({ ...taskData, updatedAt: new Date() }) - .where(eq(tasks.id, id)) - .returning(); + if (taskData.title !== undefined) cleanData.title = taskData.title; + if (taskData.description !== undefined) cleanData.description = taskData.description; + if (taskData.priority !== undefined) cleanData.priority = taskData.priority; + if (taskData.status !== undefined) cleanData.status = taskData.status; + if (taskData.assignedTo !== undefined) cleanData.assignedTo = taskData.assignedTo; + if (taskData.startDate !== undefined) { + cleanData.startDate = taskData.startDate === '' ? null : taskData.startDate; + } + if (taskData.dueDate !== undefined) { + cleanData.dueDate = taskData.dueDate === '' ? null : taskData.dueDate; + } + + cleanData.updatedAt = new Date(); + + console.log('🧹 Cleaned data for database update:', cleanData); + + try { + const [task] = await db + .update(tasks) + .set(cleanData) + .where(eq(tasks.id, id)) + .returning(); + + console.log('✅ DatabaseStorage.updateTask - Success:', { + taskId: task.id, + title: task.title, + dueDate: task.dueDate, + dueDateType: typeof task.dueDate + }); - console.log('💾 DatabaseStorage.updateTask - Result:', { - taskId: task.id, - title: task.title, - dueDate: task.dueDate, - dueDateType: typeof task.dueDate - }); - - return task; + return task; + } catch (error) { + console.error('❌ DatabaseStorage.updateTask - Database Error:', { + taskId: id, + error: error instanceof Error ? error.message : String(error), + cleanData + }); + throw new Error(`Failed to update task in database: ${error instanceof Error ? error.message : String(error)}`); + } } async deleteTask(id: number): Promise {