feat: [공정관리] 공정 복사 버튼 추가

This commit is contained in:
김보곤
2026-03-21 08:38:48 +09:00
parent f6e60dac49
commit 1e5ea198b2
2 changed files with 41 additions and 2 deletions

View File

@@ -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)
<Trash2 className="h-4 w-4 md:mr-2" />
<span className="hidden md:inline"></span>
</Button>
<Button
variant="outline"
onClick={handleDuplicate}
disabled={isDuplicating}
size="sm"
className="md:size-default"
>
<Copy className="h-4 w-4 md:mr-2" />
<span className="hidden md:inline">{isDuplicating ? '복사 중...' : '복사'}</span>
</Button>
<Button onClick={handleEdit} size="sm" className="md:size-default">
<Edit className="h-4 w-4 md:mr-2" />
<span className="hidden md:inline"></span>

View File

@@ -314,6 +314,20 @@ export async function removeProcessItem(processId: string, remainingItemIds: num
return { success: result.success, data: result.data, error: result.error };
}
/**
* 공정 복제
*/
export async function duplicateProcess(id: string): Promise<{ success: boolean; data?: Process; error?: string; __authError?: boolean }> {
const result = await executeServerAction({
url: buildApiUrl(`/api/v1/processes/${id}/duplicate`),
method: 'POST',
transform: (d: ApiProcess) => transformApiToFrontend(d),
errorMessage: '공정 복제에 실패했습니다.',
});
if (result.__authError) return { success: false, __authError: true };
return { success: result.success, data: result.data, error: result.error };
}
/**
* 공정 삭제
*/