import { useState } from "react"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import * as z from "zod"; import { format } from "date-fns"; import { CalendarIcon, Check, ChevronDown } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Calendar } from "@/components/ui/calendar"; import { cn } from "@/lib/utils"; import { AppraisalCycle, AppraisalCycleCreateRequest, AppraisalCycleUpdateRequest } from "@/types"; import CustomDialog from "@/components/CustomDialog"; // Custom date dropdown component interface CustomDateDropdownProps { value?: Date; onChange: (date: Date) => void; placeholder: string; label: string; disabled?: boolean; minDate?: Date; error?: string; } function CustomDateDropdown({ value, onChange, placeholder, label, disabled = false, minDate, error }: CustomDateDropdownProps) { const [open, setOpen] = useState(false); const handleButtonClick = (e: React.MouseEvent) => { if (disabled) return; setOpen(!open); }; const handleDateSelect = (date: Date | undefined) => { if (date) { onChange(date); setOpen(false); } }; return (
{label}
{value ? format(value, "PPP") : placeholder}
{open && (
minDate ? date < minDate : false} initialFocus />
)}
{error &&

{error}

}
); } // Define form schema const formSchema = z.object({ name: z.string().min(2, { message: "Name must be at least 2 characters." }), startDate: z.date({ required_error: "Start date is required." }), endDate: z.date({ required_error: "End date is required." }), }).refine(data => data.endDate > data.startDate, { message: "End date must be after start date.", path: ["endDate"], }); interface AppraisalCycleDialogProps { open: boolean; onOpenChange: (open: boolean) => void; onSubmit: (data: AppraisalCycleCreateRequest | AppraisalCycleUpdateRequest) => void; cycleToEdit?: AppraisalCycle; isLoading?: boolean; } export function AppraisalCycleDialog({ open, onOpenChange, onSubmit, cycleToEdit, isLoading = false, }: AppraisalCycleDialogProps) { const [error, setError] = useState(null); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { name: cycleToEdit?.name || "", startDate: cycleToEdit?.startDate ? new Date(cycleToEdit.startDate) : undefined, endDate: cycleToEdit?.endDate ? new Date(cycleToEdit.endDate) : undefined, }, }); function handleSubmit(values: z.infer) { setError(null); const formattedData = { name: values.name, startDate: format(values.startDate, "yyyy-MM-dd"), endDate: format(values.endDate, "yyyy-MM-dd"), }; if (cycleToEdit) { onSubmit({ ...formattedData, cycleId: cycleToEdit.cycleId, } as AppraisalCycleUpdateRequest); } else { onSubmit(formattedData as AppraisalCycleCreateRequest); } } // Handle dialog closing const handleClose = () => { onOpenChange(false); }; return (
( Name )} />
( )} /> ( )} />
{error &&

{error}

}
); }