feat(WEB): Phase 6 IntegratedDetailTemplate 마이그레이션 완료

Phase 6 마이그레이션 (41개 컴포넌트 완료):
- 건설/시공: 협력업체, 시공관리, 기성관리, 발주관리, 계약관리 등
- 영업: 견적관리(V2), 고객관리(V2), 수주관리
- 회계: 청구관리, 매입관리, 매출관리, 거래처관리, 악성채권 등
- 생산: 작업지시, 검수관리
- 출고: 출하관리
- 자재: 입고관리, 재고현황
- 고객센터: 문의관리, 이벤트관리, 공지관리
- 인사: 직원관리
- 설정: 권한관리

주요 변경사항:
- 34개 xxxConfig.ts 파일 생성 (설정 기반 페이지 구성)
- PageLayout/PageHeader → IntegratedDetailTemplate 통합
- 일관된 타이틀/버튼 영역 (목록, 상세, 수정, 삭제)
- 1112줄 코드 감소 (중복 제거)

프로젝트 공통화 현황 분석 문서 추가:
- 상세 페이지 62%, 목록 페이지 82% 공통화 달성
- 추가 공통화 기회 및 로드맵 정리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-01-20 15:51:02 +09:00
parent 6f457b28f3
commit 61e3a0ed60
71 changed files with 4743 additions and 4402 deletions

View File

@@ -142,6 +142,8 @@ interface QuoteRegistrationV2Props {
onCalculate?: () => void;
initialData?: QuoteFormDataV2 | null;
isLoading?: boolean;
/** IntegratedDetailTemplate 사용 시 타이틀 영역 숨김 */
hideHeader?: boolean;
}
// =============================================================================
@@ -155,6 +157,7 @@ export function QuoteRegistrationV2({
onCalculate,
initialData,
isLoading = false,
hideHeader = false,
}: QuoteRegistrationV2Props) {
// ---------------------------------------------------------------------------
// 상태
@@ -416,16 +419,19 @@ export function QuoteRegistrationV2({
return (
<div className="flex flex-col h-full">
{/* 기본 정보 섹션 */}
<div className="p-4 md:p-6 space-y-6">
<div className="flex items-center justify-between">
<h1 className="text-2xl font-bold flex items-center gap-2">
<FileText className="h-6 w-6" />
{pageTitle}
</h1>
<Badge variant={formData.status === "final" ? "default" : formData.status === "temporary" ? "secondary" : "outline"}>
{formData.status === "final" ? "최종저장" : formData.status === "temporary" ? "임시저장" : "작성중"}
</Badge>
</div>
<div className={hideHeader ? "space-y-6" : "p-4 md:p-6 space-y-6"}>
{/* 타이틀 영역 - hideHeader 시 IntegratedDetailTemplate이 담당 */}
{!hideHeader && (
<div className="flex items-center justify-between">
<h1 className="text-2xl font-bold flex items-center gap-2">
<FileText className="h-6 w-6" />
{pageTitle}
</h1>
<Badge variant={formData.status === "final" ? "default" : formData.status === "temporary" ? "secondary" : "outline"}>
{formData.status === "final" ? "최종저장" : formData.status === "temporary" ? "임시저장" : "작성중"}
</Badge>
</div>
)}
{/* 기본 정보 */}
<Card>

View File

@@ -0,0 +1,29 @@
import { FileText } from 'lucide-react';
import type { DetailConfig } from '@/components/templates/IntegratedDetailTemplate/types';
/**
* 견적관리 상세 페이지 Config (V2 테스트)
*
* 참고: 이 config는 타이틀/뱃지 영역만 정의
* 폼 내용은 QuoteRegistrationV2의 renderContent에서 처리
* (자동 견적 산출, QuoteFooterBar 등 특수 기능 유지)
*
* 특이사항:
* - view/edit/create 모드 지원
* - 기본 버튼(수정/삭제/목록) 숨김 - QuoteFooterBar에서 처리
* - 타이틀 영역만 IntegratedDetailTemplate이 담당
*/
export const quoteConfig: DetailConfig = {
title: '견적',
description: '견적 정보를 조회하고 관리합니다',
icon: FileText,
basePath: '/sales/quote-management',
fields: [], // renderView/renderForm 사용으로 필드 정의 불필요
gridColumns: 2,
actions: {
showBack: true,
showDelete: false, // QuoteFooterBar에서 처리
showEdit: false, // QuoteFooterBar에서 처리
backLabel: '목록',
},
};