From 1a54a24fd5623c09a4fb61c194d67928f6a5af49 Mon Sep 17 00:00:00 2001 From: ZeinebMegaadi Date: Sat, 18 Apr 2026 12:54:13 +0100 Subject: [PATCH 1/2] fix: skip future date validation when editing maintenance window --- client/src/Hooks/useMaintenanceWindowForm.ts | 3 +- client/src/Validation/maintenanceWindow.ts | 52 ++++++++++---------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/client/src/Hooks/useMaintenanceWindowForm.ts b/client/src/Hooks/useMaintenanceWindowForm.ts index 1f10d55efd..a6974a99e7 100644 --- a/client/src/Hooks/useMaintenanceWindowForm.ts +++ b/client/src/Hooks/useMaintenanceWindowForm.ts @@ -2,6 +2,7 @@ import { useMemo } from "react"; import dayjs from "dayjs"; import { maintenanceWindowSchema, + maintenanceWindowEditSchema, repeatOptions, type MaintenanceWindowFormData, } from "@/Validation/maintenanceWindow"; @@ -47,6 +48,6 @@ export const useMaintenanceWindowForm = ({ }; } - return { schema: maintenanceWindowSchema, defaults }; + return { schema: data ? maintenanceWindowEditSchema : maintenanceWindowSchema, defaults }; }, [data]); }; diff --git a/client/src/Validation/maintenanceWindow.ts b/client/src/Validation/maintenanceWindow.ts index 61ccf3c8da..dbe447e871 100644 --- a/client/src/Validation/maintenanceWindow.ts +++ b/client/src/Validation/maintenanceWindow.ts @@ -14,30 +14,32 @@ export const durationUnitOptions = [ { id: "days", name: "days", multiplier: 86400000 }, ] as const; -export const maintenanceWindowSchema = z - .object({ - name: z - .string() - .min(1, "Name is required") - .max(100, "Name must be at most 100 characters"), - repeat: z.string(), - startDate: z.string().min(1, "Start date is required"), - startTime: z.string().min(1, "Start time is required"), - duration: z.number().int().min(1, "Duration must be at least 1"), - durationUnit: z.string(), - monitors: z.array(z.string()).min(1, "At least one monitor is required"), - }) - .refine( - (data) => { - const startDateTime = dayjs(data.startDate) - .set("hour", parseInt(data.startTime.split(":")[0], 10)) - .set("minute", parseInt(data.startTime.split(":")[1], 10)); - return startDateTime.isAfter(dayjs()); - }, - { - message: "Start date and time must be in the future", - path: ["startDate"], - } - ); +const maintenanceWindowBaseSchema = z.object({ + name: z + .string() + .min(1, "Name is required") + .max(100, "Name must be at most 100 characters"), + repeat: z.string(), + startDate: z.string().min(1, "Start date is required"), + startTime: z.string().min(1, "Start time is required"), + duration: z.number().int().min(1, "Duration must be at least 1"), + durationUnit: z.string(), + monitors: z.array(z.string()).min(1, "At least one monitor is required"), +}); + +export const maintenanceWindowSchema = maintenanceWindowBaseSchema.refine( + (data) => { + const startDateTime = dayjs(data.startDate) + .set("hour", parseInt(data.startTime.split(":")[0], 10)) + .set("minute", parseInt(data.startTime.split(":")[1], 10)); + return startDateTime.isAfter(dayjs()); + }, + { + message: "Start date and time must be in the future", + path: ["startDate"], + } +); + +export const maintenanceWindowEditSchema = maintenanceWindowBaseSchema; export type MaintenanceWindowFormData = z.infer; From d41d9a3dab1ed74e4122dcc3b820b67610abc3c0 Mon Sep 17 00:00:00 2001 From: ZeinebMegaadi Date: Sat, 18 Apr 2026 12:55:10 +0100 Subject: [PATCH 2/2] fix: skip future date validation when editing maintenance window --- client/src/Hooks/useMaintenanceWindowForm.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/src/Hooks/useMaintenanceWindowForm.ts b/client/src/Hooks/useMaintenanceWindowForm.ts index a6974a99e7..4e7d84a9a9 100644 --- a/client/src/Hooks/useMaintenanceWindowForm.ts +++ b/client/src/Hooks/useMaintenanceWindowForm.ts @@ -48,6 +48,9 @@ export const useMaintenanceWindowForm = ({ }; } - return { schema: data ? maintenanceWindowEditSchema : maintenanceWindowSchema, defaults }; + return { + schema: data ? maintenanceWindowEditSchema : maintenanceWindowSchema, + defaults, + }; }, [data]); };