From 3b3056f6b827406eed49c4c09ac4c27a2f30c486 Mon Sep 17 00:00:00 2001 From: marco370 <48531002-marco370@users.noreply.replit.com> Date: Fri, 24 Oct 2025 17:08:57 +0000 Subject: [PATCH] Improve planning duplication functionality with error handling and validation Add validation for selected date and error handling for opening the duplicate dialog in the mobile planning view, also improve date display for scheduled routes. Replit-Commit-Author: Agent Replit-Commit-Session-Id: e0b5b11c-5b75-4389-8ea9-5f3cd9332f88 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80/e0b5b11c-5b75-4389-8ea9-5f3cd9332f88/JYtd6x2 --- .replit | 4 +++ client/src/pages/planning-mobile.tsx | 40 +++++++++++++++++++++------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/.replit b/.replit index 6b5c189..d5c2e6d 100644 --- a/.replit +++ b/.replit @@ -19,6 +19,10 @@ externalPort = 80 localPort = 33035 externalPort = 3001 +[[ports]] +localPort = 38905 +externalPort = 6000 + [[ports]] localPort = 41295 externalPort = 5173 diff --git a/client/src/pages/planning-mobile.tsx b/client/src/pages/planning-mobile.tsx index 6f5da0a..ca8daa3 100644 --- a/client/src/pages/planning-mobile.tsx +++ b/client/src/pages/planning-mobile.tsx @@ -273,13 +273,33 @@ export default function PlanningMobile() { // Funzione per aprire dialog duplicazione sequenza const handleOpenDuplicateDialog = (route: any) => { - const nextDay = format(addDays(parseISO(selectedDate), 1), "yyyy-MM-dd"); - setDuplicateDialog({ - isOpen: true, - sourceRoute: route, - targetDate: nextDay, // Default = giorno successivo - selectedDuplicateGuardId: route.guardId, // Pre-compilato con guardia attuale - }); + try { + // Validazione data selezionata + const parsedDate = parseISO(selectedDate); + if (!isValid(parsedDate)) { + toast({ + title: "Errore data", + description: "La data selezionata non è valida", + variant: "destructive", + }); + return; + } + + const nextDay = format(addDays(parsedDate, 1), "yyyy-MM-dd"); + setDuplicateDialog({ + isOpen: true, + sourceRoute: route, + targetDate: nextDay, // Default = giorno successivo + selectedDuplicateGuardId: route.guardId || "", // Pre-compilato con guardia attuale + }); + } catch (error) { + toast({ + title: "Errore", + description: "Impossibile aprire il dialog di duplicazione", + variant: "destructive", + }); + console.error("Error opening duplicate dialog:", error); + } }; // Handler submit dialog duplicazione @@ -879,7 +899,9 @@ export default function PlanningMobile() {
Data: - {format(parseISO(duplicateDialog.sourceRoute.scheduledDate), "dd/MM/yyyy", { locale: it })} + {duplicateDialog.sourceRoute.scheduledDate && isValid(parseISO(duplicateDialog.sourceRoute.scheduledDate)) + ? format(parseISO(duplicateDialog.sourceRoute.scheduledDate), "dd/MM/yyyy", { locale: it }) + : "Data non valida"}
@@ -901,7 +923,7 @@ export default function PlanningMobile() { data-testid="input-target-date" />

- {duplicateDialog.sourceRoute && duplicateDialog.targetDate && + {duplicateDialog.sourceRoute && duplicateDialog.targetDate && duplicateDialog.sourceRoute.scheduledDate && isValid(parseISO(duplicateDialog.sourceRoute.scheduledDate)) && format(parseISO(duplicateDialog.sourceRoute.scheduledDate), "yyyy-MM-dd") === duplicateDialog.targetDate ? "⚠️ Stessa data: verrà modificata la guardia della sequenza esistente" : "✓ Data diversa: verrà creata una nuova sequenza con tutte le tappe"