"use client"; import React, { useState, useMemo, useCallback } from "react"; import { Save, Loader2, ClipboardCheck } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { cn } from "@/lib/utils"; import { ProcessWorkStandardConfig, WorkItem } from "./types"; import { defaultConfig } from "./config"; import { useProcessWorkStandard } from "./hooks/useProcessWorkStandard"; import { ItemProcessSelector } from "./components/ItemProcessSelector"; import { WorkPhaseSection } from "./components/WorkPhaseSection"; import { WorkItemAddModal } from "./components/WorkItemAddModal"; interface ProcessWorkStandardComponentProps { config?: Partial; formData?: Record; isPreview?: boolean; tableName?: string; } export function ProcessWorkStandardComponent({ config: configProp, isPreview, }: ProcessWorkStandardComponentProps) { const config: ProcessWorkStandardConfig = useMemo( () => ({ ...defaultConfig, ...configProp, dataSource: { ...defaultConfig.dataSource, ...configProp?.dataSource }, phases: configProp?.phases?.length ? configProp.phases : defaultConfig.phases, detailTypes: configProp?.detailTypes?.length ? configProp.detailTypes : defaultConfig.detailTypes, }), [configProp] ); const { items, routings, workItems, selectedWorkItemDetails, selectedWorkItemId, selection, loading, fetchItems, selectItem, selectProcess, fetchWorkItemDetails, createWorkItem, updateWorkItem, deleteWorkItem, createDetail, updateDetail, deleteDetail, } = useProcessWorkStandard(config); // 모달 상태 const [modalOpen, setModalOpen] = useState(false); const [modalPhaseKey, setModalPhaseKey] = useState(""); const [editingItem, setEditingItem] = useState(null); // phase별 작업 항목 그룹핑 const workItemsByPhase = useMemo(() => { const map: Record = {}; for (const phase of config.phases) { map[phase.key] = workItems.filter((wi) => wi.work_phase === phase.key); } return map; }, [workItems, config.phases]); const sortedPhases = useMemo( () => [...config.phases].sort((a, b) => a.sortOrder - b.sortOrder), [config.phases] ); const handleAddWorkItem = useCallback((phaseKey: string) => { setModalPhaseKey(phaseKey); setEditingItem(null); setModalOpen(true); }, []); const handleEditWorkItem = useCallback((item: WorkItem) => { setModalPhaseKey(item.work_phase); setEditingItem(item); setModalOpen(true); }, []); const handleModalSave = useCallback( async (data: Parameters[0]) => { if (editingItem) { await updateWorkItem(editingItem.id, { title: data.title, is_required: data.is_required, description: data.description, } as any); } else { await createWorkItem(data); } }, [editingItem, createWorkItem, updateWorkItem] ); const handleSelectWorkItem = useCallback( (workItemId: string) => { fetchWorkItemDetails(workItemId); }, [fetchWorkItemDetails] ); const handleInit = useCallback(() => { fetchItems(); }, [fetchItems]); const splitRatio = config.splitRatio || 30; if (isPreview) { return (

공정 작업기준

{sortedPhases.map((p) => p.label).join(" / ")}

); } return (
{/* 메인 콘텐츠 */}
{/* 좌측 패널 */}
fetchItems(keyword)} onSelectItem={selectItem} onSelectProcess={selectProcess} onInit={handleInit} />
{/* 우측 패널 */}
{/* 우측 헤더 */} {selection.routingDetailId ? ( <>

{selection.itemName} - {selection.processName}

품목: {selection.itemCode} 공정: {selection.processName} 버전: {selection.routingVersionName}
{!config.readonly && ( )}
{/* 작업 단계별 섹션 */}
{sortedPhases.map((phase) => ( ))}
) : (

좌측에서 품목과 공정을 선택하세요

품목을 펼쳐 라우팅별 공정을 선택하면 작업기준을 관리할 수 있습니다

)}
{/* 작업 항목 추가/수정 모달 */} { setModalOpen(false); setEditingItem(null); }} onSave={handleModalSave} phaseKey={modalPhaseKey} phaseLabel={ config.phases.find((p) => p.key === modalPhaseKey)?.label || "" } detailTypes={config.detailTypes} editItem={editingItem} />
); }