fix: [quality] 검사완료 건 수정 차단 + 완료 버튼 조건 강화

- 완료 상태 검사 건은 편집 모드 강제 해제
- 미검사/진행중 건이 있으면 검사완료 버튼 비활성화
- 완료 건에 수정 버튼 disabled 표시
This commit is contained in:
2026-03-20 16:59:24 +09:00
parent a32f9b8548
commit 1dcc20552e

View File

@@ -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()}