garage-erp/apps/dashboard/modules/shop-timings/shop-timing.schema.ts
Najjar\NajjarV02 16fd7dd423 feat(shop-timings): day-of-week select and closed toggle in form
Add day_of_week dropdown and is_closed checkbox to the shop timing form.
In/out times become optional and disabled when the day is marked closed;
required otherwise via schema superRefine.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 14:39:55 +04:00

51 lines
1.6 KiB
TypeScript

import { z } from "zod"
const timeRegex = /^([01]\d|2[0-3]):([0-5]\d):([0-5]\d)$/
const optionalTimeFormat = z
.string()
.optional()
.refine((v) => !v || timeRegex.test(v), "Time must be in HH:MM:SS format")
export const DAY_OF_WEEK_VALUES = [
"saturday",
"sunday",
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
] as const
const shopTimingFormSchema = z
.object({
title: z.string().min(1, "Title is required").max(255, "Title cannot exceed 255 characters"),
day_of_week: z.string().optional(),
is_closed: z.boolean().default(false),
// Optional at the field level; required below only when the day is open.
in_time: optionalTimeFormat,
out_time: optionalTimeFormat,
full_day_hours: optionalTimeFormat,
half_day_hours: optionalTimeFormat,
punch_in: optionalTimeFormat,
punch_out: optionalTimeFormat,
before_time: optionalTimeFormat,
after_time: optionalTimeFormat,
is_default: z.boolean().default(false),
})
.superRefine((values, ctx) => {
// When the shop is open, in/out times are mandatory.
if (!values.is_closed) {
if (!values.in_time) {
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["in_time"], message: "In time is required" })
}
if (!values.out_time) {
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["out_time"], message: "Out time is required" })
}
}
})
type ShopTimingFormValues = z.infer<typeof shopTimingFormSchema>
export { shopTimingFormSchema }
export type { ShopTimingFormValues }