refactor: DynamicItemForm 훅/컴포넌트 분리 리팩토링

대규모 코드 구조 개선:
- useFieldDetection: 필드 감지 로직 분리
- useFileHandling: 파일 업로드 로직 분리
- useItemCodeGeneration: 품목코드 자동생성 로직 분리
- usePartTypeHandling: 파트타입 처리 로직 분리
- FormHeader, ValidationAlert, FileUploadFields 컴포넌트 분리
- DuplicateCodeDialog 컴포넌트 분리
- index.tsx 1300줄+ 감소로 가독성 및 유지보수성 향상
- BOM 검색 최적화 (검색어 입력 시에만 API 호출)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
byeongcheolryu
2025-12-16 17:40:55 +09:00
parent b1587071f2
commit 25f9d4e55f
17 changed files with 1788 additions and 1347 deletions

View File

@@ -306,16 +306,13 @@ export function ItemMasterDataManagement() {
description: section.description || null,
default_fields: null,
// ItemField → TemplateField 변환
// 2025-11-28: field_key에서 사용자입력 부분만 추출 (백엔드 형식: {ID}_{사용자입력})
// 2025-12-16: field_key 전체 표시 (백엔드 형식: {ID}_{사용자입력})
fields: section.fields?.map(field => {
const rawKey = field.field_key || '';
const displayKey = rawKey.includes('_')
? rawKey.substring(rawKey.indexOf('_') + 1)
: rawKey || field.field_name.toLowerCase().replace(/\s+/g, '_');
const rawKey = field.field_key || field.field_name.toLowerCase().replace(/\s+/g, '_');
return {
id: field.id.toString(),
name: field.field_name,
fieldKey: displayKey,
fieldKey: rawKey,
property: {
inputType: field.field_type,
// 2025-11-27: is_required와 properties.required 둘 다 체크
@@ -334,7 +331,7 @@ export function ItemMasterDataManagement() {
);
// 2. 독립 섹션들 (page_id = null, 연결 해제된 섹션)
// 2025-11-28: field_key에서 사용자입력 부분만 추출 (백엔드 형식: {ID}_{사용자입력})
// 2025-12-16: field_key 전체 표시 (백엔드 형식: {ID}_{사용자입력})
const unlinkedSections = independentSections.map(section => ({
id: section.id,
tenant_id: section.tenant_id || 0,
@@ -343,14 +340,11 @@ export function ItemMasterDataManagement() {
description: section.description || null,
default_fields: null,
fields: section.fields?.map(field => {
const rawKey = field.field_key || '';
const displayKey = rawKey.includes('_')
? rawKey.substring(rawKey.indexOf('_') + 1)
: rawKey || field.field_name.toLowerCase().replace(/\s+/g, '_');
const rawKey = field.field_key || field.field_name.toLowerCase().replace(/\s+/g, '_');
return {
id: field.id.toString(),
name: field.field_name,
fieldKey: displayKey,
fieldKey: rawKey,
property: {
inputType: field.field_type,
// 2025-11-27: is_required와 properties.required 둘 다 체크