"use client"; import React, { useState, useEffect } from "react"; import { Plus, Trash2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { DetailTypeDefinition, WorkItem } from "../types"; interface ModalDetail { id: string; detail_type: string; content: string; is_required: string; sort_order: number; } interface WorkItemAddModalProps { open: boolean; onClose: () => void; onSave: (data: { work_phase: string; title: string; is_required: string; description?: string; details?: Array<{ detail_type?: string; content: string; is_required: string; sort_order: number; }>; }) => void; phaseKey: string; phaseLabel: string; detailTypes: DetailTypeDefinition[]; editItem?: WorkItem | null; } export function WorkItemAddModal({ open, onClose, onSave, phaseKey, phaseLabel, detailTypes, editItem, }: WorkItemAddModalProps) { const [title, setTitle] = useState(""); const [isRequired, setIsRequired] = useState("Y"); const [description, setDescription] = useState(""); const [details, setDetails] = useState([]); useEffect(() => { if (open && editItem) { setTitle(editItem.title || ""); setIsRequired(editItem.is_required || "Y"); setDescription(editItem.description || ""); } else if (open && !editItem) { setTitle(""); setIsRequired("Y"); setDescription(""); setDetails([]); } }, [open, editItem]); const resetForm = () => { setTitle(""); setIsRequired("Y"); setDescription(""); setDetails([]); }; const handleSave = () => { if (!title.trim()) return; onSave({ work_phase: phaseKey, title: title.trim(), is_required: isRequired, description: description.trim() || undefined, details: details .filter((d) => d.content.trim()) .map((d, idx) => ({ detail_type: d.detail_type || undefined, content: d.content.trim(), is_required: d.is_required, sort_order: idx + 1, })), }); resetForm(); onClose(); }; const addDetail = () => { setDetails((prev) => [ ...prev, { id: crypto.randomUUID(), detail_type: detailTypes[0]?.value || "", content: "", is_required: "N", sort_order: prev.length + 1, }, ]); }; const removeDetail = (id: string) => { setDetails((prev) => prev.filter((d) => d.id !== id)); }; const updateDetailField = ( id: string, field: keyof ModalDetail, value: string | number ) => { setDetails((prev) => prev.map((d) => (d.id === id ? { ...d, [field]: value } : d)) ); }; return ( { if (!v) { resetForm(); onClose(); } }} > 작업 항목 {editItem ? "수정" : "추가"} {phaseLabel} 단계에 {editItem ? "항목을 수정" : "새 항목을 추가"}합니다.
{/* 기본 정보 */}

기본 정보

setTitle(e.target.value)} placeholder="예: 장비 점검, 품질 검사" className="mt-1 h-8 text-xs sm:h-10 sm:text-sm" />