- 공정관리: 드래그&드롭 순서 변경 기능 추가 (reorderProcesses API) - 수주서(SalesOrderDocument): 기획서 D1.8 기준 리디자인, 출고증과 동일 자재 섹션 구조 - 출고증(ShipmentOrderDocument): 레이아웃 개선 - 체크리스트 관리 페이지 신규 추가 (master-data/checklist-management) - QMS 품질감사: 타입 및 목데이터 수정 - menuRefresh 유틸 정리 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
111 lines
3.2 KiB
TypeScript
111 lines
3.2 KiB
TypeScript
'use client';
|
|
|
|
/**
|
|
* 항목 상세 클라이언트 컴포넌트
|
|
*
|
|
* 라우팅:
|
|
* - /[id]/items/[itemId] → 상세 보기
|
|
* - /[id]/items/[itemId]?mode=edit → 수정
|
|
* - /[id]/items/new → 등록
|
|
*/
|
|
|
|
import { useState, useEffect } from 'react';
|
|
import { useSearchParams } from 'next/navigation';
|
|
import { ItemDetail } from './ItemDetail';
|
|
import { ItemForm } from './ItemForm';
|
|
import { getChecklistItemById } from './actions';
|
|
import type { ChecklistItem } from '@/types/checklist';
|
|
import { DetailPageSkeleton } from '@/components/ui/skeleton';
|
|
import { ErrorCard } from '@/components/ui/error-card';
|
|
import { toast } from 'sonner';
|
|
|
|
type DetailMode = 'view' | 'edit' | 'create';
|
|
|
|
interface ItemDetailClientProps {
|
|
checklistId: string;
|
|
itemId: string;
|
|
}
|
|
|
|
export function ItemDetailClient({ checklistId, itemId }: ItemDetailClientProps) {
|
|
const searchParams = useSearchParams();
|
|
const modeFromQuery = searchParams.get('mode') as DetailMode | null;
|
|
const isNewMode = itemId === 'new';
|
|
|
|
const [mode] = useState<DetailMode>(() => {
|
|
if (isNewMode) return 'create';
|
|
if (modeFromQuery === 'edit') return 'edit';
|
|
return 'view';
|
|
});
|
|
|
|
const [itemData, setItemData] = useState<ChecklistItem | null>(null);
|
|
const [isLoading, setIsLoading] = useState(!isNewMode);
|
|
const [error, setError] = useState<string | null>(null);
|
|
|
|
useEffect(() => {
|
|
if (isNewMode) {
|
|
setIsLoading(false);
|
|
return;
|
|
}
|
|
|
|
const loadData = async () => {
|
|
setIsLoading(true);
|
|
setError(null);
|
|
try {
|
|
const result = await getChecklistItemById(checklistId, itemId);
|
|
if (result.success && result.data) {
|
|
setItemData(result.data);
|
|
} else {
|
|
setError(result.error || '항목 정보를 찾을 수 없습니다.');
|
|
toast.error('항목을 불러오는데 실패했습니다.');
|
|
}
|
|
} catch {
|
|
setError('항목 정보를 불러오는 중 오류가 발생했습니다.');
|
|
toast.error('항목을 불러오는데 실패했습니다.');
|
|
} finally {
|
|
setIsLoading(false);
|
|
}
|
|
};
|
|
|
|
loadData();
|
|
}, [checklistId, itemId, isNewMode]);
|
|
|
|
if (isLoading) {
|
|
return <DetailPageSkeleton sections={1} fieldsPerSection={4} />;
|
|
}
|
|
|
|
if (error && !isNewMode) {
|
|
return (
|
|
<ErrorCard
|
|
type="network"
|
|
title="항목 정보를 불러올 수 없습니다"
|
|
description={error}
|
|
tips={['해당 항목이 존재하는지 확인해주세요']}
|
|
homeButtonLabel="점검표로 돌아가기"
|
|
homeButtonHref={`/ko/master-data/checklist-management/${checklistId}`}
|
|
/>
|
|
);
|
|
}
|
|
|
|
if (mode === 'create') {
|
|
return <ItemForm mode="create" checklistId={checklistId} />;
|
|
}
|
|
|
|
if (mode === 'edit' && itemData) {
|
|
return <ItemForm mode="edit" checklistId={checklistId} initialData={itemData} />;
|
|
}
|
|
|
|
if (mode === 'view' && itemData) {
|
|
return <ItemDetail item={itemData} checklistId={checklistId} />;
|
|
}
|
|
|
|
return (
|
|
<ErrorCard
|
|
type="not-found"
|
|
title="항목을 찾을 수 없습니다"
|
|
description="요청하신 항목 정보가 존재하지 않습니다."
|
|
homeButtonLabel="점검표로 돌아가기"
|
|
homeButtonHref={`/ko/master-data/checklist-management/${checklistId}`}
|
|
/>
|
|
);
|
|
}
|