feat(WEB): 자재/출고/생산/품질/단가 기능 대폭 개선 및 신규 페이지 추가

자재관리:
- 입고관리 재고조정 다이얼로그 신규 추가, 상세/목록 기능 확장
- 재고현황 컴포넌트 리팩토링

출고관리:
- 출하관리 생성/수정/목록/상세 개선
- 차량배차관리 상세/수정/목록 기능 보강

생산관리:
- 작업지시서 WIP 생산 모달 신규 추가
- 벤딩WIP/슬랫조인트바 검사 콘텐츠 신규 추가
- 작업자화면 기능 대폭 확장 (카드/목록 개선)
- 검사성적서 모달 개선

품질관리:
- 실적보고서 관리 페이지 신규 추가
- 검사관리 문서/타입/목데이터 개선

단가관리:
- 단가배포 페이지 및 컴포넌트 신규 추가
- 단가표 관리 페이지 및 컴포넌트 신규 추가

공통:
- 권한 시스템 추가 개선 (PermissionContext, usePermission, PermissionGuard)
- 메뉴 폴링 훅 개선, 레이아웃 수정
- 모바일 줌/패닝 CSS 수정
- locale 유틸 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-02-04 12:46:19 +09:00
parent 17c16028b1
commit c1b63b850a
70 changed files with 6832 additions and 384 deletions

View File

@@ -0,0 +1,14 @@
'use client';
import { use } from 'react';
import { PriceDistributionDetail } from '@/components/pricing-distribution';
export default function PriceDistributionEditPage({
params,
}: {
params: Promise<{ id: string }>;
}) {
const { id } = use(params);
return <PriceDistributionDetail id={id} mode="edit" />;
}

View File

@@ -0,0 +1,14 @@
'use client';
import { use } from 'react';
import { PriceDistributionDetail } from '@/components/pricing-distribution';
export default function PriceDistributionDetailPage({
params,
}: {
params: Promise<{ id: string }>;
}) {
const { id } = use(params);
return <PriceDistributionDetail id={id} mode="view" />;
}

View File

@@ -0,0 +1,13 @@
'use client';
import { Suspense } from 'react';
import { PriceDistributionList } from '@/components/pricing-distribution';
import { ListPageSkeleton } from '@/components/ui/skeleton';
export default function PriceDistributionPage() {
return (
<Suspense fallback={<ListPageSkeleton showHeader={false} />}>
<PriceDistributionList />
</Suspense>
);
}

View File

@@ -0,0 +1,14 @@
'use client';
import { use } from 'react';
import { PricingTableDetailClient } from '@/components/pricing-table-management';
export default function PricingTableDetailPage({
params,
}: {
params: Promise<{ id: string }>;
}) {
const { id } = use(params);
return <PricingTableDetailClient pricingTableId={id} />;
}

View File

@@ -0,0 +1,26 @@
'use client';
import { Suspense } from 'react';
import { useSearchParams } from 'next/navigation';
import PricingTableListClient from '@/components/pricing-table-management/PricingTableListClient';
import { PricingTableDetailClient } from '@/components/pricing-table-management';
import { ListPageSkeleton } from '@/components/ui/skeleton';
function PricingTableManagementContent() {
const searchParams = useSearchParams();
const mode = searchParams.get('mode');
if (mode === 'new') {
return <PricingTableDetailClient pricingTableId="new" />;
}
return <PricingTableListClient />;
}
export default function PricingTableManagementPage() {
return (
<Suspense fallback={<ListPageSkeleton showHeader={false} />}>
<PricingTableManagementContent />
</Suspense>
);
}

View File

@@ -0,0 +1,12 @@
'use client';
/**
* 실적신고관리 페이지
* URL: /quality/performance-reports
*/
import { PerformanceReportList } from '@/components/quality/PerformanceReportManagement';
export default function PerformanceReportsPage() {
return <PerformanceReportList />;
}

View File

@@ -222,6 +222,8 @@
html {
/* 🔧 Always show scrollbar to prevent layout shift */
/*overflow-y: scroll;*/
/* 📱 모바일 확대 후 좌우 패닝 허용 */
touch-action: manipulation;
}
body {