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 (
);
}