"use client"; import React, { useState, useEffect } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from "@/components/ui/dialog"; 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 { Loader2 } from "lucide-react"; import { apiClient } from "@/lib/api/client"; interface BomDetailEditModalProps { open: boolean; onOpenChange: (open: boolean) => void; node: Record | null; isRootNode?: boolean; tableName: string; onSaved?: () => void; } export function BomDetailEditModal({ open, onOpenChange, node, isRootNode = false, tableName, onSaved, }: BomDetailEditModalProps) { const [formData, setFormData] = useState>({}); const [saving, setSaving] = useState(false); const [processOptions, setProcessOptions] = useState<{ value: string; label: string }[]>([]); useEffect(() => { if (open && !isRootNode) { apiClient.get("/table-categories/bom_detail/process_type/values") .then((res) => { const values = res.data?.data || []; if (values.length > 0) { setProcessOptions(values.map((v: any) => ({ value: v.value_code, label: v.value_label }))); } }) .catch(() => { /* 카테고리 없으면 빈 배열 유지 */ }); } }, [open, isRootNode]); useEffect(() => { if (node && open) { if (isRootNode) { setFormData({ base_qty: node.base_qty || "", unit: node.unit || "", remark: node.remark || "", }); } else { setFormData({ quantity: node.quantity || "", process_type: node.process_type || "", loss_rate: node.loss_rate || "", remark: node.remark || "", }); } } }, [node, open, isRootNode]); const handleChange = (field: string, value: string) => { setFormData((prev) => ({ ...prev, [field]: value })); }; const handleSave = async () => { if (!node) return; setSaving(true); try { const targetTable = isRootNode ? "bom" : tableName; const realId = isRootNode ? node.id?.replace("__root_", "") : node.id; await apiClient.put(`/table-management/tables/${targetTable}/edit`, { originalData: { id: realId }, updatedData: { id: realId, ...formData }, }); onSaved?.(); onOpenChange(false); } catch (error) { console.error("[BomDetailEdit] 저장 실패:", error); alert("저장 중 오류가 발생했습니다."); } finally { setSaving(false); } }; if (!node) return null; const itemCode = isRootNode ? node.child_item_code || node.item_code || node.bom_number || "-" : node.child_item_code || "-"; const itemName = isRootNode ? node.child_item_name || node.item_name || "-" : node.child_item_name || "-"; return ( {isRootNode ? "BOM 헤더 수정" : "품목 수정"} {isRootNode ? "BOM 기본 정보를 수정합니다" : "선택한 품목의 BOM 구성 정보를 수정합니다"}
handleChange(isRootNode ? "base_qty" : "quantity", e.target.value)} className="mt-1 h-8 text-xs sm:h-10 sm:text-sm" />
{isRootNode ? ( handleChange("unit", e.target.value)} className="mt-1 h-8 text-xs sm:h-10 sm:text-sm" /> ) : ( )}
{!isRootNode && ( <>
{processOptions.length > 0 ? ( ) : ( handleChange("process_type", e.target.value)} placeholder="예: 조립공정" className="mt-1 h-8 text-xs sm:h-10 sm:text-sm" /> )}
handleChange("loss_rate", e.target.value)} className="mt-1 h-8 text-xs sm:h-10 sm:text-sm" />
)}