feat(WEB): 공정관리 상세 체크리스트 연동 및 리팩토링 문서 업데이트

- ProcessDetail: 체크리스트 연동 UI 추가
- Process 타입 체크리스트 필드 확장
- 리팩토링 로드맵 및 Phase1 체크리스트 진행상황 업데이트
- claudedocs 인덱스 정리

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-02-09 21:49:45 +09:00
parent 14b84cc08d
commit 0643d56194
6 changed files with 126 additions and 63 deletions

View File

@@ -20,7 +20,9 @@ import { PageHeader } from '@/components/organisms/PageHeader';
import { useMenuStore } from '@/store/menuStore';
import { usePermission } from '@/hooks/usePermission';
import { toast } from 'sonner';
import { getProcessSteps, reorderProcessSteps, removeProcessItem } from './actions';
import { DeleteConfirmDialog } from '@/components/ui/confirm-dialog';
import { useDeleteDialog } from '@/hooks/useDeleteDialog';
import { getProcessSteps, reorderProcessSteps, removeProcessItem, deleteProcess } from './actions';
import type { Process, ProcessStep } from '@/types/process';
interface ProcessDetailProps {
@@ -33,6 +35,13 @@ export function ProcessDetail({ process, onProcessUpdate }: ProcessDetailProps)
const sidebarCollapsed = useMenuStore((state) => state.sidebarCollapsed);
const { canUpdate } = usePermission();
// 삭제 다이얼로그
const deleteDialog = useDeleteDialog({
onDelete: deleteProcess,
onSuccess: () => router.push('/ko/master-data/process-management'),
entityName: '공정',
});
// 단계 목록 상태
const [steps, setSteps] = useState<ProcessStep[]>([]);
const [isStepsLoading, setIsStepsLoading] = useState(true);
@@ -383,12 +392,32 @@ export function ProcessDetail({ process, onProcessUpdate }: ProcessDetailProps)
<span className="hidden md:inline"></span>
</Button>
{canUpdate && (
<Button onClick={handleEdit} size="sm" className="md:size-default">
<Edit className="h-4 w-4 md:mr-2" />
<span className="hidden md:inline"></span>
</Button>
<div className="flex items-center gap-2">
<Button
variant="outline"
onClick={() => deleteDialog.single.open(process.id)}
size="sm"
className="md:size-default text-destructive hover:text-destructive"
>
<Trash2 className="h-4 w-4 md:mr-2" />
<span className="hidden md:inline"></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>
</Button>
</div>
)}
</div>
{/* 삭제 확인 다이얼로그 */}
<DeleteConfirmDialog
open={deleteDialog.single.isOpen}
onOpenChange={deleteDialog.single.onOpenChange}
onConfirm={deleteDialog.single.confirm}
loading={deleteDialog.isPending}
description="이 공정을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다."
/>
</PageLayout>
);
}

View File

@@ -16,6 +16,9 @@ interface ApiProcess {
description: string | null;
process_type: string;
department: string | null;
manager: string | null;
process_category: string | null;
use_production_date: boolean;
work_log_template: string | null;
required_workers: number;
equipment_info: string | null;
@@ -88,6 +91,9 @@ function transformApiToFrontend(apiData: ApiProcess): Process {
description: apiData.description ?? undefined,
processType: apiData.process_type as Process['processType'],
department: apiData.department ?? '',
manager: apiData.manager ?? undefined,
processCategory: apiData.process_category ?? undefined,
useProductionDate: apiData.use_production_date ?? false,
workLogTemplate: apiData.work_log_template ?? undefined,
classificationRules: [...patternRules, ...individualRules],
requiredWorkers: apiData.required_workers,
@@ -176,6 +182,9 @@ function transformFrontendToApi(data: ProcessFormData): Record<string, unknown>
process_name: data.processName,
process_type: data.processType,
department: data.department || null,
manager: data.manager || null,
process_category: data.processCategory || null,
use_production_date: data.useProductionDate ?? false,
work_log_template: data.workLogTemplate || null,
required_workers: data.requiredWorkers,
equipment_info: data.equipmentInfo || null,