feat(WEB): 공정관리 드래그 순서변경, 수주서/출고증 리디자인, 체크리스트 관리 추가

- 공정관리: 드래그&드롭 순서 변경 기능 추가 (reorderProcesses API)
- 수주서(SalesOrderDocument): 기획서 D1.8 기준 리디자인, 출고증과 동일 자재 섹션 구조
- 출고증(ShipmentOrderDocument): 레이아웃 개선
- 체크리스트 관리 페이지 신규 추가 (master-data/checklist-management)
- QMS 품질감사: 타입 및 목데이터 수정
- menuRefresh 유틸 정리

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-02-09 17:52:43 +09:00
parent ce36101929
commit 3ea6a57a10
26 changed files with 3398 additions and 829 deletions

View File

@@ -0,0 +1,22 @@
'use client';
/**
* 점검표 항목 상세/수정/등록 페이지
*
* - /[id]/items/[itemId] → 상세 보기
* - /[id]/items/[itemId]?mode=edit → 수정
* - /[id]/items/new → 등록
*/
import { use } from 'react';
import { ItemDetailClient } from '@/components/checklist-management';
export default function ItemDetailPage({
params,
}: {
params: Promise<{ id: string; itemId: string }>;
}) {
const { id, itemId } = use(params);
return <ItemDetailClient checklistId={id} itemId={itemId} />;
}

View File

@@ -0,0 +1,21 @@
'use client';
/**
* 점검표 상세/수정 페이지
*
* - /[id] → 상세 보기 (view 모드)
* - /[id]?mode=edit → 수정 (edit 모드)
*/
import { use } from 'react';
import { ChecklistDetailClient } from '@/components/checklist-management';
export default function ChecklistDetailPage({
params,
}: {
params: Promise<{ id: string }>;
}) {
const { id } = use(params);
return <ChecklistDetailClient checklistId={id} />;
}

View File

@@ -0,0 +1,30 @@
'use client';
/**
* 점검표 목록/등록 페이지
*/
import { Suspense } from 'react';
import { useSearchParams } from 'next/navigation';
import ChecklistListClient from '@/components/checklist-management/ChecklistListClient';
import { ChecklistDetailClient } from '@/components/checklist-management';
import { ListPageSkeleton } from '@/components/ui/skeleton';
function ChecklistManagementContent() {
const searchParams = useSearchParams();
const mode = searchParams.get('mode');
if (mode === 'new') {
return <ChecklistDetailClient checklistId="new" />;
}
return <ChecklistListClient />;
}
export default function ChecklistManagementPage() {
return (
<Suspense fallback={<ListPageSkeleton showHeader={false} />}>
<ChecklistManagementContent />
</Suspense>
);
}

View File

@@ -48,7 +48,7 @@ export function AuditProgressBar({
activeDay === 1 ? 'bg-blue-50 border-blue-200' : 'bg-gray-50 border-gray-200'
)}>
<div className="flex items-center justify-between mb-1">
<span className="text-xs font-medium text-gray-600">1일차: /</span>
<span className="text-xs font-medium text-gray-600">/ </span>
<span className={cn(
'text-xs font-bold',
day1Percentage === 100 ? 'text-green-600' : 'text-gray-600'
@@ -73,7 +73,7 @@ export function AuditProgressBar({
activeDay === 2 ? 'bg-blue-50 border-blue-200' : 'bg-gray-50 border-gray-200'
)}>
<div className="flex items-center justify-between mb-1">
<span className="text-xs font-medium text-gray-600">2일차: 로트추적</span>
<span className="text-xs font-medium text-gray-600"> </span>
<span className={cn(
'text-xs font-bold',
day2Percentage === 100 ? 'text-green-600' : 'text-gray-600'

View File

@@ -41,7 +41,7 @@ export function DayTabs({ activeDay, onDayChange, day1Progress, day2Progress }:
>
<Calendar className="h-4 w-4 shrink-0" />
<span className="font-medium text-xs sm:text-sm">
<span className="hidden sm:inline">1일차: /</span>
<span className="hidden sm:inline">/ </span>
<span className="sm:hidden">1</span>
</span>
<span className={cn(
@@ -65,7 +65,7 @@ export function DayTabs({ activeDay, onDayChange, day1Progress, day2Progress }:
>
<Calendar className="h-4 w-4 shrink-0" />
<span className="font-medium text-xs sm:text-sm">
<span className="hidden sm:inline">2일차: 로트추적</span>
<span className="hidden sm:inline"> </span>
<span className="sm:hidden">2</span>
</span>
<span className={cn(
@@ -105,7 +105,7 @@ export function DayTabs({ activeDay, onDayChange, day1Progress, day2Progress }:
{/* 1일차 진행률 */}
<div className="flex items-center gap-2 sm:gap-3">
<span className="text-xs sm:text-sm text-gray-600 w-14 sm:w-28 shrink-0">
<span className="hidden sm:inline">1일차: /</span>
<span className="hidden sm:inline">/ </span>
<span className="sm:hidden">1</span>
</span>
<div className="flex-1 h-1.5 sm:h-2 bg-gray-200 rounded-full overflow-hidden">
@@ -128,7 +128,7 @@ export function DayTabs({ activeDay, onDayChange, day1Progress, day2Progress }:
{/* 2일차 진행률 */}
<div className="flex items-center gap-2 sm:gap-3">
<span className="text-xs sm:text-sm text-gray-600 w-14 sm:w-28 shrink-0">
<span className="hidden sm:inline">2일차: 로트추적</span>
<span className="hidden sm:inline"> </span>
<span className="sm:hidden">2</span>
</span>
<div className="flex-1 h-1.5 sm:h-2 bg-gray-200 rounded-full overflow-hidden">

View File

@@ -291,7 +291,7 @@ export const DEFAULT_DOCUMENTS: Document[] = [
{ id: 'def-8', type: 'quality', title: '품질관리서', count: 0, items: [] },
];
// ===== 1일차: 기준/매뉴얼 심사 Mock 데이터 =====
// ===== 기준/매뉴얼 심사 심사 Mock 데이터 =====
// 1일차 점검표 카테고리
export const MOCK_DAY1_CATEGORIES: ChecklistCategory[] = [

View File

@@ -255,7 +255,7 @@ export default function QualityInspectionPage() {
: 'bg-white border-gray-200 text-gray-700 hover:border-blue-300'
}`}
>
1일차: /
/
</button>
<button
type="button"
@@ -266,7 +266,7 @@ export default function QualityInspectionPage() {
: 'bg-white border-gray-200 text-gray-700 hover:border-blue-300'
}`}
>
2일차: 로트추적
</button>
</div>
)}
@@ -282,7 +282,7 @@ export default function QualityInspectionPage() {
/>
{activeDay === 1 ? (
// ===== 1일차: 기준/매뉴얼 심사 =====
// ===== 기준/매뉴얼 심사 심사 =====
<div className="flex-1 grid grid-cols-12 gap-3 sm:gap-4 lg:min-h-0">
{/* 좌측: 점검표 항목 */}
<div className={`col-span-12 min-h-[250px] sm:min-h-[300px] lg:min-h-0 lg:h-full overflow-auto ${
@@ -326,7 +326,7 @@ export default function QualityInspectionPage() {
)}
</div>
) : (
// ===== 2일차: 로트추적 심사 =====
// ===== 로트 추적 심사 심사 =====
<div className="flex-1 grid grid-cols-12 gap-3 sm:gap-4 lg:gap-6 lg:min-h-0">
<div className="col-span-12 lg:col-span-3 min-h-[250px] sm:min-h-[300px] lg:min-h-0 lg:h-full overflow-auto lg:overflow-hidden">
<ReportList

View File

@@ -44,7 +44,7 @@ export interface DocumentItem {
subType?: 'screen' | 'bending' | 'slat' | 'jointbar';
}
// ===== 1일차: 기준/매뉴얼 심사 타입 =====
// ===== 기준/매뉴얼 심사 심사 타입 =====
// 점검표 하위 항목
export interface ChecklistSubItem {