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

@@ -91,17 +91,14 @@ export const fieldService = {
/**
* 필드 키 유효성 검사
* - 필수 입력
* - 영문자로 시작
* - 영문, 숫자, 언더스코어만 허용
* 2025-12-16: 숫자로 시작하는 키도 허용 (예: 105_state)
*/
validateFieldKey: (key: string): SingleFieldValidation => {
if (!key || !key.trim()) {
return { valid: false, error: '필드 키를 입력해주세요' };
}
if (!/^[a-zA-Z]/.test(key)) {
return { valid: false, error: '영문자로 시작해야 합니다' };
}
if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(key)) {
if (!/^[a-zA-Z0-9_]+$/.test(key)) {
return { valid: false, error: '영문, 숫자, 언더스코어만 사용 가능합니다' };
}
return { valid: true };
@@ -110,8 +107,9 @@ export const fieldService = {
/**
* 필드 키 패턴 정규식
* UI에서 직접 사용 가능
* 2025-12-16: 숫자로 시작하는 키도 허용
*/
fieldKeyPattern: /^[a-zA-Z][a-zA-Z0-9_]*$/,
fieldKeyPattern: /^[a-zA-Z0-9_]+$/,
/**
* 필드 키가 유효한지 간단 체크 (boolean 반환)
@@ -124,20 +122,11 @@ export const fieldService = {
// ===== Parsing =====
/**
* field_key에서 사용자 입력 부분 추출
* 형식: {ID}_{사용자입력} → 사용자입력 반환
* 예: "123_itemCode" → "itemCode"
* field_key 반환 (전체 키 그대로 반환)
* 2025-12-16: 전체 field_key 표시로 변경 (예: "105_state" 그대로 표시)
*/
extractUserInputFromFieldKey: (fieldKey: string | null | undefined): string => {
if (!fieldKey) return '';
// 언더스코어가 포함된 경우 첫 번째 언더스코어 이후 부분 반환
const underscoreIndex = fieldKey.indexOf('_');
if (underscoreIndex !== -1) {
return fieldKey.substring(underscoreIndex + 1);
}
// 언더스코어가 없으면 전체 반환
return fieldKey;
},