'use client'; import { useState, useEffect } from 'react'; import { differenceInDays, parseISO } from 'date-fns'; import { Loader2 } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { DatePicker } from '@/components/ui/date-picker'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import type { VacationRequestFormData, LeaveType } from './types'; import { LEAVE_TYPE_LABELS } from './types'; import { getActiveEmployees, type EmployeeOption } from './actions'; import { toast } from 'sonner'; interface VacationRequestDialogProps { open: boolean; onOpenChange: (open: boolean) => void; onSave: (data: VacationRequestFormData) => void; } export function VacationRequestDialog({ open, onOpenChange, onSave, }: VacationRequestDialogProps) { const [formData, setFormData] = useState({ employeeId: '', leaveType: 'annual', startDate: '', endDate: '', vacationDays: 1, }); const [employees, setEmployees] = useState([]); const [isLoadingEmployees, setIsLoadingEmployees] = useState(false); // 직원 목록 로드 useEffect(() => { if (open && employees.length === 0) { setIsLoadingEmployees(true); getActiveEmployees() .then((result) => { if (result.success && result.data) { setEmployees(result.data); } }) .finally(() => setIsLoadingEmployees(false)); } }, [open, employees.length]); useEffect(() => { if (open) { setFormData({ employeeId: '', leaveType: 'annual', startDate: '', endDate: '', vacationDays: 1, }); } }, [open]); // 날짜 변경 시 휴가 일수 자동 계산 useEffect(() => { if (formData.startDate && formData.endDate) { const start = parseISO(formData.startDate); const end = parseISO(formData.endDate); const days = differenceInDays(end, start) + 1; if (days > 0 && days !== formData.vacationDays) { setFormData(prev => ({ ...prev, vacationDays: days })); } } }, [formData.startDate, formData.endDate, formData.vacationDays]); const handleSave = () => { if (!formData.employeeId) { toast.warning('사원을 선택해주세요.'); return; } if (!formData.startDate || !formData.endDate) { toast.warning('휴가 기간을 선택해주세요.'); return; } if (formData.endDate < formData.startDate) { toast.warning('종료일은 시작일 이후여야 합니다.'); return; } onSave(formData); }; const handleCancel = () => { onOpenChange(false); }; return ( 휴가 신청
{/* 사원 선택 */}
{/* 휴가 유형 */}
{/* 시작일 */}
setFormData(prev => ({ ...prev, startDate: date }))} />
{/* 종료일 */}
setFormData(prev => ({ ...prev, endDate: date }))} />
{/* 휴가 일수 (자동 계산) */} {formData.startDate && formData.endDate && (
{formData.vacationDays}일
)}
); }