From 1e5ea198b297c749d26b9349b7280847a30fc1cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sat, 21 Mar 2026 08:38:48 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[=EA=B3=B5=EC=A0=95=EA=B4=80=EB=A6=AC]?= =?UTF-8?q?=20=EA=B3=B5=EC=A0=95=20=EB=B3=B5=EC=82=AC=20=EB=B2=84=ED=8A=BC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../process-management/ProcessDetail.tsx | 29 +++++++++++++++++-- src/components/process-management/actions.ts | 14 +++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/components/process-management/ProcessDetail.tsx b/src/components/process-management/ProcessDetail.tsx index 24923ee9..e4f11a99 100644 --- a/src/components/process-management/ProcessDetail.tsx +++ b/src/components/process-management/ProcessDetail.tsx @@ -11,7 +11,7 @@ import { useState, useEffect, useCallback, useRef } from 'react'; import { useRouter } from 'next/navigation'; -import { ArrowLeft, Edit, GripVertical, Plus, Trash2 } from 'lucide-react'; +import { ArrowLeft, Copy, Edit, GripVertical, Plus, Trash2 } from 'lucide-react'; import { ReorderButtons } from '@/components/molecules'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; @@ -23,7 +23,7 @@ import { usePermission } from '@/hooks/usePermission'; import { toast } from 'sonner'; import { DeleteConfirmDialog } from '@/components/ui/confirm-dialog'; import { useDeleteDialog } from '@/hooks/useDeleteDialog'; -import { getProcessSteps, reorderProcessSteps, removeProcessItem, deleteProcess } from './actions'; +import { getProcessSteps, reorderProcessSteps, removeProcessItem, deleteProcess, duplicateProcess } from './actions'; import type { Process, ProcessStep } from '@/types/process'; interface ProcessDetailProps { @@ -86,6 +86,21 @@ export function ProcessDetail({ process, onProcessUpdate }: ProcessDetailProps) } }; + const [isDuplicating, setIsDuplicating] = useState(false); + + // 공정 복제 + const handleDuplicate = async () => { + setIsDuplicating(true); + const result = await duplicateProcess(process.id); + setIsDuplicating(false); + if (result.success && result.data) { + toast.success('공정이 복제되었습니다.'); + router.push(`/ko/master-data/process-management/${result.data.id}?mode=view`); + } else { + toast.error(result.error || '공정 복제에 실패했습니다.'); + } + }; + // 네비게이션 const handleEdit = () => { router.push(`/ko/master-data/process-management/${process.id}?mode=edit`); @@ -447,6 +462,16 @@ export function ProcessDetail({ process, onProcessUpdate }: ProcessDetailProps) 삭제 +