"use client"; import React, { useRef, useEffect, useState } from "react"; import { WorkOrder, Process, StatusType } from "./types"; import { STATUS_TEXT } from "./data"; interface PopWorkCardProps { workOrder: WorkOrder; currentStatus: StatusType; selectedProcess: Process | null; onAccept: () => void; onCancelAccept: () => void; onStartProduction: () => void; onClick: () => void; } export function PopWorkCard({ workOrder, currentStatus, selectedProcess, onAccept, onCancelAccept, onStartProduction, onClick, }: PopWorkCardProps) { const chipsRef = useRef(null); const [showLeftBtn, setShowLeftBtn] = useState(false); const [showRightBtn, setShowRightBtn] = useState(false); const progress = ((workOrder.producedQuantity / workOrder.orderQuantity) * 100).toFixed(1); const isReturnWork = workOrder.isReturn === true; // 공정 스크롤 버튼 표시 여부 확인 const checkScrollButtons = () => { const container = chipsRef.current; if (!container) return; const isScrollable = container.scrollWidth > container.clientWidth; if (isScrollable) { const scrollLeft = container.scrollLeft; const maxScroll = container.scrollWidth - container.clientWidth; setShowLeftBtn(scrollLeft > 5); setShowRightBtn(scrollLeft < maxScroll - 5); } else { setShowLeftBtn(false); setShowRightBtn(false); } }; // 현재 공정으로 스크롤 const scrollToCurrentProcess = () => { const container = chipsRef.current; if (!container || !workOrder.processFlow) return; let targetIndex = -1; // 내 공정 우선 if (selectedProcess) { targetIndex = workOrder.processFlow.findIndex( (step) => step.id === selectedProcess.id && (step.status === "current" || step.status === "pending") ); } // 없으면 현재 진행 중인 공정 if (targetIndex === -1) { targetIndex = workOrder.processFlow.findIndex((step) => step.status === "current"); } if (targetIndex === -1) return; const chips = container.querySelectorAll(".pop-process-chip"); if (chips.length > targetIndex) { const targetChip = chips[targetIndex] as HTMLElement; const scrollPos = targetChip.offsetLeft - container.clientWidth / 2 + targetChip.offsetWidth / 2; container.scrollLeft = Math.max(0, scrollPos); } }; useEffect(() => { scrollToCurrentProcess(); checkScrollButtons(); const container = chipsRef.current; if (container) { container.addEventListener("scroll", checkScrollButtons); return () => container.removeEventListener("scroll", checkScrollButtons); } }, [workOrder, selectedProcess]); const handleScroll = (direction: "left" | "right", e: React.MouseEvent) => { e.stopPropagation(); const container = chipsRef.current; if (!container) return; const scrollAmount = 150; container.scrollLeft += direction === "left" ? -scrollAmount : scrollAmount; setTimeout(checkScrollButtons, 100); }; // 상태 텍스트 결정 const statusText = isReturnWork && currentStatus === "pending-accept" ? "리턴" : STATUS_TEXT[workOrder.status]; const statusClass = isReturnWork ? "return" : workOrder.status; // 완료된 공정 수 const completedCount = workOrder.processFlow.filter((s) => s.status === "completed").length; const totalCount = workOrder.processFlow.length; return (
{/* 헤더 */}
{workOrder.id} {isReturnWork && 리턴} {workOrder.acceptedQuantity && workOrder.acceptedQuantity > 0 && workOrder.acceptedQuantity < workOrder.orderQuantity && ( {workOrder.acceptedQuantity}/{workOrder.orderQuantity} 접수 )}
{statusText} {/* 액션 버튼 */} {currentStatus === "pending-accept" && (
)} {currentStatus === "in-progress" && (
)}
{/* 리턴 정보 배너 */} {isReturnWork && currentStatus === "pending-accept" && (
🔄
{workOrder.returnFromProcessName} 공정에서 리턴됨
{workOrder.returnReason || "사유 없음"}
)} {/* 바디 */}
품목 {workOrder.itemName}
규격 {workOrder.spec}
지시 {workOrder.orderQuantity}
납기 {workOrder.dueDate}
{/* 공정 타임라인 */}
공정 진행 {completedCount}/{totalCount}
{workOrder.processFlow.map((step, index) => { let segmentClass = ""; if (step.status === "completed") segmentClass = "done"; else if (step.status === "current") segmentClass = "current"; if (selectedProcess && step.id === selectedProcess.id) { segmentClass += " my-work"; } return
; })}
{workOrder.processFlow.map((step, index) => { let chipClass = ""; if (step.status === "completed") chipClass = "done"; else if (step.status === "current") chipClass = "current"; if (selectedProcess && step.id === selectedProcess.id) { chipClass += " my-work"; } return (
{index + 1} {step.name}
); })}
{/* 진행률 바 */} {workOrder.status !== "completed" && (
{workOrder.producedQuantity} / {workOrder.orderQuantity} EA {progress}%
)}
); }