import React, { useState, useEffect } from 'react'; import { X, Save, Calendar, Clock, FileText, User } from 'lucide-react'; import { KuntaeModel } from '@/types'; interface KuntaeEditModalProps { isOpen: boolean; onClose: () => void; onSave: (data: KuntaeFormData) => Promise; initialData?: KuntaeModel | null; mode: 'add' | 'edit' | 'copy'; } export interface KuntaeFormData { idx?: number; cate: string; sdate: string; edate: string; term: number; crtime: number; termDr: number; drTime: number; contents: string; uid: string; } const CATE_OPTIONS = ['연차', '대체', '공가', '경조', '병가', '오전반차', '오후반차', '조퇴', '외출', '지각', '결근', '휴직', '교육', '출장', '재택', '특근', '당직', '기타']; export function KuntaeEditModal({ isOpen, onClose, onSave, initialData, mode }: KuntaeEditModalProps) { const [formData, setFormData] = useState({ cate: '연차', sdate: new Date().toISOString().split('T')[0], edate: new Date().toISOString().split('T')[0], term: 1, crtime: 0, termDr: 0, drTime: 0, contents: '', uid: '', }); const [saving, setSaving] = useState(false); useEffect(() => { if (isOpen) { if (initialData) { setFormData({ idx: mode === 'edit' ? initialData.idx : undefined, cate: initialData.cate || '연차', sdate: initialData.sdate || new Date().toISOString().split('T')[0], edate: initialData.edate || new Date().toISOString().split('T')[0], term: initialData.term || 0, crtime: initialData.crtime || 0, termDr: initialData.termDr || 0, drTime: initialData.DrTime || 0, contents: initialData.contents || '', uid: initialData.uid || '', }); } else { // 초기화 setFormData({ cate: '연차', sdate: new Date().toISOString().split('T')[0], edate: new Date().toISOString().split('T')[0], term: 1, crtime: 0, termDr: 0, drTime: 0, contents: '', uid: '', // 상위 컴포넌트에서 현재 사용자 ID를 주입받거나 여기서 처리해야 함 }); } } }, [isOpen, initialData, mode]); const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: name === 'term' || name === 'crtime' || name === 'termDr' || name === 'drTime' ? parseFloat(value) || 0 : value })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setSaving(true); try { await onSave(formData); onClose(); } catch (error) { console.error('Save error:', error); alert('저장 중 오류가 발생했습니다.'); } finally { setSaving(false); } }; // 날짜 변경 시 기간 자동 계산 (단순 1일 차이) useEffect(() => { if (formData.sdate && formData.edate) { const start = new Date(formData.sdate); const end = new Date(formData.edate); const diffTime = Math.abs(end.getTime() - start.getTime()); const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1; // 연차/휴가 등일 때만 자동 계산 if (['연차', '공가', '경조', '병가', '교육', '출장'].includes(formData.cate)) { setFormData(prev => ({ ...prev, term: diffDays })); } } }, [formData.sdate, formData.edate, formData.cate]); if (!isOpen) return null; const title = mode === 'add' ? '근태 등록' : mode === 'edit' ? '근태 수정' : '근태 복사 등록'; return (
{/* 헤더 */}

{title}

{/* 폼 */}
{/* 구분 및 사용자 */}
{/* 기간 */}
{/* 사용량 (일/시간) */}
{/* 발생량 (일/시간) - 대체근무 등 발생 시 */}
{/* 내용 */}