fix: [quality] 검사완료 건 수정 차단 + 완료 버튼 조건 강화
- 완료 상태 검사 건은 편집 모드 강제 해제 - 미검사/진행중 건이 있으면 검사완료 버튼 비활성화 - 완료 건에 수정 버튼 disabled 표시
This commit is contained in:
@@ -21,6 +21,7 @@ import {
|
||||
Plus,
|
||||
Trash2,
|
||||
ClipboardCheck,
|
||||
Pencil,
|
||||
} from 'lucide-react';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { Badge } from '@/components/ui/badge';
|
||||
@@ -121,12 +122,15 @@ const EMPTY_FORM: InspectionFormData = {
|
||||
export function InspectionDetail({ id }: InspectionDetailProps) {
|
||||
const router = useRouter();
|
||||
const searchParams = useSearchParams();
|
||||
const isEditMode = searchParams.get('mode') === 'edit';
|
||||
const isEditModeParam = searchParams.get('mode') === 'edit';
|
||||
|
||||
// 상세 데이터
|
||||
const [inspection, setInspection] = useState<ProductInspection | null>(null);
|
||||
const [isLoading, setIsLoading] = useState(true);
|
||||
|
||||
// 완료 상태면 편집 모드 강제 해제
|
||||
const isEditMode = isEditModeParam && inspection?.status !== '완료';
|
||||
|
||||
// 수정 폼 데이터
|
||||
const [formData, setFormData] = useState<InspectionFormData>(EMPTY_FORM);
|
||||
|
||||
@@ -809,7 +813,8 @@ export function InspectionDetail({ id }: InspectionDetailProps) {
|
||||
);
|
||||
}
|
||||
|
||||
// View 모드: 검사제품요청서 보기, 제품검사하기, 검사 완료 버튼 표시
|
||||
// View 모드: 검사제품요청서 보기, 제품검사하기, 수정(완료시 disabled), 검사 완료
|
||||
const isCompleted = inspection.status === '완료';
|
||||
return (
|
||||
<>
|
||||
<Button variant="outline" size="sm" onClick={() => setRequestDocOpen(true)}>
|
||||
@@ -820,19 +825,30 @@ export function InspectionDetail({ id }: InspectionDetailProps) {
|
||||
<PlayCircle className="w-4 h-4 md:mr-2" />
|
||||
<span className="hidden md:inline">제품검사하기</span>
|
||||
</Button>
|
||||
{inspection.status !== '완료' && (
|
||||
<Button
|
||||
size="sm"
|
||||
className="bg-green-600 hover:bg-green-700"
|
||||
onClick={() => setShowCompleteDialog(true)}
|
||||
>
|
||||
<CheckCircle2 className="w-4 h-4 md:mr-2" />
|
||||
<span className="hidden md:inline">검사 완료</span>
|
||||
{isCompleted && (
|
||||
<Button size="sm" disabled title="검사완료된 건은 수정할 수 없습니다.">
|
||||
<Pencil className="w-4 h-4 md:mr-2" />
|
||||
<span className="hidden md:inline">수정</span>
|
||||
</Button>
|
||||
)}
|
||||
{!isCompleted && (() => {
|
||||
const hasIncomplete = !inspectionStats || inspectionStats.none > 0 || inspectionStats.inProgress > 0;
|
||||
return (
|
||||
<Button
|
||||
size="sm"
|
||||
className="bg-green-600 hover:bg-green-700"
|
||||
disabled={hasIncomplete}
|
||||
onClick={() => setShowCompleteDialog(true)}
|
||||
title={hasIncomplete ? (!inspectionStats ? '검사 대상이 없습니다.' : `미검사 ${inspectionStats.none}건, 진행중 ${inspectionStats.inProgress}건이 남아있습니다.`) : ''}
|
||||
>
|
||||
<CheckCircle2 className="w-4 h-4 md:mr-2" />
|
||||
<span className="hidden md:inline">검사 완료</span>
|
||||
</Button>
|
||||
);
|
||||
})()}
|
||||
</>
|
||||
);
|
||||
}, [isEditMode, inspection]);
|
||||
}, [isEditMode, inspection, inspectionStats]);
|
||||
|
||||
// ===== View 모드 렌더링 =====
|
||||
const renderViewContent = useCallback(() => {
|
||||
@@ -1295,11 +1311,12 @@ export function InspectionDetail({ id }: InspectionDetailProps) {
|
||||
const mode = isEditMode ? 'edit' : 'view';
|
||||
|
||||
const dynamicConfig = useMemo(() => {
|
||||
if (isEditMode) {
|
||||
return { ...inspectionConfig, title: '제품검사' };
|
||||
const base = isEditMode ? { ...inspectionConfig, title: '제품검사' } : inspectionConfig;
|
||||
if (inspection?.status === '완료') {
|
||||
return { ...base, permissions: { ...base.permissions, canEdit: false } };
|
||||
}
|
||||
return inspectionConfig;
|
||||
}, [isEditMode]);
|
||||
return base;
|
||||
}, [isEditMode, inspection?.status]);
|
||||
|
||||
// 데이터 없음
|
||||
if (!isLoading && !inspection) {
|
||||
@@ -1322,7 +1339,7 @@ export function InspectionDetail({ id }: InspectionDetailProps) {
|
||||
itemId={id}
|
||||
isLoading={isLoading}
|
||||
onSubmit={handleSubmit}
|
||||
onEdit={handleEdit}
|
||||
onEdit={inspection?.status !== '완료' ? handleEdit : undefined}
|
||||
headerActions={headerActions}
|
||||
renderView={() => renderViewContent()}
|
||||
renderForm={() => renderFormContent()}
|
||||
|
||||
Reference in New Issue
Block a user