feat(WEB): IntegratedDetailTemplate 통합 템플릿 구현 및 Phase 1~8 마이그레이션

- Phase 1: 기안함(DocumentCreate) 마이그레이션
- Phase 2: 작업지시(WorkOrderCreate/Edit) 마이그레이션
- Phase 3: 출하(ShipmentCreate/Edit) 마이그레이션
- Phase 4: 사원(EmployeeForm) 마이그레이션
- Phase 5: 게시판(BoardForm) 마이그레이션
- Phase 6: 1:1문의(InquiryForm) 마이그레이션
- Phase 7: 공정(ProcessForm) 마이그레이션
- Phase 8: 수입검사/품질검사(InspectionCreate) 마이그레이션
- DetailActions에 showSave 옵션 추가
- 각 도메인별 config 파일 생성

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
유병철
2026-01-20 19:31:07 +09:00
parent 6b0ffc810b
commit 62ef2b1ff9
24 changed files with 861 additions and 534 deletions

View File

@@ -2,6 +2,7 @@
/**
* 1:1 문의 등록/수정 폼 컴포넌트
* IntegratedDetailTemplate 마이그레이션 (2025-01-20)
*
* 디자인 스펙:
* - 페이지 타이틀: 1:1 문의 등록 / 1:1 문의 수정
@@ -11,9 +12,9 @@
import { useState, useCallback, useRef } from 'react';
import { useRouter } from 'next/navigation';
import { MessageSquare, Upload, X, File, ArrowLeft, Save } from 'lucide-react';
import { PageLayout } from '@/components/organisms/PageLayout';
import { PageHeader } from '@/components/organisms/PageHeader';
import { Upload, X, File } from 'lucide-react';
import { IntegratedDetailTemplate } from '@/components/templates/IntegratedDetailTemplate';
import { inquiryCreateConfig, inquiryEditConfig } from './inquiryConfig';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
@@ -134,29 +135,9 @@ export function InquiryForm({ mode, initialData }: InquiryFormProps) {
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
};
return (
<PageLayout>
{/* 헤더 */}
<PageHeader
title={mode === 'create' ? '1:1 문의 등록' : '1:1 문의 수정'}
description="1:1 문의를 등록합니다."
icon={MessageSquare}
actions={
<div className="flex gap-2">
<Button variant="outline" onClick={handleCancel}>
<ArrowLeft className="h-4 w-4 mr-2" />
</Button>
<Button onClick={handleSubmit}>
<Save className="h-4 w-4 mr-2" />
{mode === 'create' ? '등록' : '수정'}
</Button>
</div>
}
/>
{/* 폼 카드 */}
<Card>
// ===== 폼 콘텐츠 렌더링 =====
const renderFormContent = useCallback(() => (
<Card>
<CardHeader>
<CardTitle className="flex items-center gap-1">
@@ -303,7 +284,22 @@ export function InquiryForm({ mode, initialData }: InquiryFormProps) {
</div>
</CardContent>
</Card>
</PageLayout>
), [category, title, content, errors, attachments, existingAttachments, formatFileSize, handleFileSelect, handleRemoveFile, handleRemoveExistingFile]);
// Config 선택 (create/edit)
const config = mode === 'create' ? inquiryCreateConfig : inquiryEditConfig;
return (
<IntegratedDetailTemplate
config={config}
mode={mode}
isLoading={false}
isSubmitting={false}
onBack={handleCancel}
onCancel={handleCancel}
onSubmit={handleSubmit}
renderForm={renderFormContent}
/>
);
}

View File

@@ -1,6 +1,40 @@
'use client';
import { MessageSquare } from 'lucide-react';
import type { DetailConfig } from '@/components/templates/IntegratedDetailTemplate/types';
/**
* 1:1 문의 등록 페이지 Config
* IntegratedDetailTemplate 마이그레이션 (2025-01-20)
*/
export const inquiryCreateConfig: DetailConfig = {
title: '1:1 문의 등록',
description: '1:1 문의를 등록합니다',
icon: MessageSquare,
basePath: '/customer-center/qna',
fields: [],
actions: {
showBack: true,
showEdit: false,
showDelete: false,
showSave: true,
submitLabel: '등록',
},
};
/**
* 1:1 문의 수정 페이지 Config
*/
export const inquiryEditConfig: DetailConfig = {
...inquiryCreateConfig,
title: '1:1 문의 수정',
description: '1:1 문의를 수정합니다',
actions: {
...inquiryCreateConfig.actions,
submitLabel: '저장',
},
};
/**
* 1:1 문의 상세 페이지 Config
*