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:
@@ -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} />;
|
||||
}
|
||||
@@ -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} />;
|
||||
}
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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'
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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[] = [
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -44,7 +44,7 @@ export interface DocumentItem {
|
||||
subType?: 'screen' | 'bending' | 'slat' | 'jointbar';
|
||||
}
|
||||
|
||||
// ===== 1일차: 기준/매뉴얼 심사 타입 =====
|
||||
// ===== 기준/매뉴얼 심사 심사 타입 =====
|
||||
|
||||
// 점검표 하위 항목
|
||||
export interface ChecklistSubItem {
|
||||
|
||||
Reference in New Issue
Block a user