fix: field_key 저장 및 표시 기능 완전 수정
- field_key 저장 시 백엔드 형식({ID}_{사용자입력})으로 전송
- API 요청 전 field_key 유효성 검증 추가
- 계층구조 탭 필드 추가/수정 시 field_key 반영
- 섹션 탭에서 field_key 표시 시 사용자입력 부분만 추출
- sectionsAsTemplates useMemo에서 linkedSections/unlinkedSections 모두 수정
- 마스터 필드, 템플릿 필드 다이얼로그에서 field_key 입력 지원
- ItemMasterContext에 field_key 상태 업데이트 로직 추가
- transformers에서 field_key 변환 처리
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -116,7 +116,8 @@ export function useFieldManagement(): UseFieldManagementReturn {
|
||||
const masterField = itemMasterFields.find(f => f.id === Number(selectedMasterFieldId));
|
||||
if (masterField) {
|
||||
setNewFieldName(masterField.field_name);
|
||||
setNewFieldKey(masterField.id.toString());
|
||||
// 2025-11-28: field_key 사용 (없으면 빈 문자열로 사용자가 입력하도록)
|
||||
setNewFieldKey('');
|
||||
setNewFieldInputType(masterField.field_type || 'textbox');
|
||||
// properties에서 required 확인, 또는 validation_rules에서 확인
|
||||
const isRequired = (masterField.properties as any)?.required || false;
|
||||
@@ -168,6 +169,7 @@ export function useFieldManagement(): UseFieldManagementReturn {
|
||||
section_id: Number(selectedSectionForField),
|
||||
master_field_id: masterFieldId,
|
||||
field_name: newFieldName,
|
||||
field_key: newFieldKey, // 2025-11-28: field_key 추가 (백엔드에서 {ID}_{입력값} 형태로 저장)
|
||||
field_type: newFieldInputType,
|
||||
order_no: 0,
|
||||
is_required: newFieldRequired,
|
||||
@@ -229,7 +231,13 @@ export function useFieldManagement(): UseFieldManagementReturn {
|
||||
setSelectedSectionForField(Number(sectionId));
|
||||
setEditingFieldId(field.id);
|
||||
setNewFieldName(field.field_name);
|
||||
setNewFieldKey(field.id.toString());
|
||||
// 2025-11-28: field_key 사용 (없으면 빈 문자열)
|
||||
// field_key 형식: {ID}_{사용자입력} → 사용자입력 부분만 추출해서 표시
|
||||
const fieldKeyValue = field.field_key || '';
|
||||
const userInputPart = fieldKeyValue.includes('_')
|
||||
? fieldKeyValue.substring(fieldKeyValue.indexOf('_') + 1)
|
||||
: fieldKeyValue;
|
||||
setNewFieldKey(userInputPart);
|
||||
setNewFieldInputType(field.field_type);
|
||||
// 2025-11-27: is_required와 properties.required 둘 다 체크
|
||||
setNewFieldRequired(field.is_required || field.properties?.required || false);
|
||||
|
||||
@@ -83,8 +83,10 @@ export function useMasterFieldManagement(): UseMasterFieldManagementReturn {
|
||||
}
|
||||
|
||||
// ItemMasterField 타입에 맞게 필수 필드 포함
|
||||
// 2025-11-28: field_key 추가 (백엔드에서 {ID}_{입력값} 형태로 저장)
|
||||
const newMasterFieldData: Omit<ItemMasterField, 'id' | 'tenant_id' | 'created_by' | 'updated_by' | 'created_at' | 'updated_at'> = {
|
||||
field_name: newMasterFieldName,
|
||||
field_key: newMasterFieldKey, // 2025-11-28: field_key 추가
|
||||
field_type: newMasterFieldInputType,
|
||||
category: newMasterFieldCategory || null,
|
||||
description: newMasterFieldDescription || null,
|
||||
@@ -109,10 +111,16 @@ export function useMasterFieldManagement(): UseMasterFieldManagementReturn {
|
||||
};
|
||||
|
||||
// 마스터 항목 수정 시작
|
||||
// 2025-11-28: field_key 추가 - {ID}_{사용자입력} 형식에서 사용자입력 부분만 추출
|
||||
const handleEditMasterField = (field: ItemMasterField) => {
|
||||
setEditingMasterFieldId(field.id);
|
||||
setNewMasterFieldName(field.field_name);
|
||||
setNewMasterFieldKey(field.id.toString());
|
||||
// 2025-11-28: field_key 형식 {ID}_{사용자입력}에서 사용자입력 부분만 추출
|
||||
const fieldKeyValue = field.field_key || '';
|
||||
const userInputPart = fieldKeyValue.includes('_')
|
||||
? fieldKeyValue.substring(fieldKeyValue.indexOf('_') + 1)
|
||||
: fieldKeyValue;
|
||||
setNewMasterFieldKey(userInputPart);
|
||||
setNewMasterFieldInputType(field.field_type || 'textbox');
|
||||
setNewMasterFieldRequired((field.properties as any)?.required || false);
|
||||
setNewMasterFieldCategory(field.category || '공통');
|
||||
@@ -132,8 +140,10 @@ export function useMasterFieldManagement(): UseMasterFieldManagementReturn {
|
||||
return;
|
||||
}
|
||||
|
||||
// 2025-11-28: field_key 수정 시에도 API 요청에 포함
|
||||
const updateData: Partial<ItemMasterField> = {
|
||||
field_name: newMasterFieldName,
|
||||
field_key: newMasterFieldKey, // 2025-11-28: field_key 추가
|
||||
field_type: newMasterFieldInputType,
|
||||
category: newMasterFieldCategory || null,
|
||||
description: newMasterFieldDescription || null,
|
||||
|
||||
@@ -265,8 +265,10 @@ export function useTemplateManagement(): UseTemplateManagementReturn {
|
||||
try {
|
||||
// 수정 모드: 기존 필드 속성 업데이트
|
||||
if (editingTemplateFieldId) {
|
||||
// 2025-11-28: field_key 추가 (백엔드 요청에 포함)
|
||||
const updateData = {
|
||||
field_name: templateFieldName,
|
||||
field_key: templateFieldKey, // 2025-11-28: field_key 추가
|
||||
field_type: templateFieldInputType,
|
||||
is_required: templateFieldRequired,
|
||||
placeholder: templateFieldDescription || null,
|
||||
@@ -307,11 +309,17 @@ export function useTemplateManagement(): UseTemplateManagementReturn {
|
||||
};
|
||||
|
||||
// 템플릿 필드 수정 시작
|
||||
// 2025-11-28: field_key 형식 {ID}_{사용자입력}에서 사용자입력 부분만 추출
|
||||
const handleEditTemplateField = (templateId: number, field: TemplateField) => {
|
||||
setCurrentTemplateId(templateId);
|
||||
setEditingTemplateFieldId(Number(field.id));
|
||||
setTemplateFieldName(field.name);
|
||||
setTemplateFieldKey(field.fieldKey);
|
||||
// 2025-11-28: field_key 형식 {ID}_{사용자입력}에서 사용자입력 부분만 추출
|
||||
const fieldKeyValue = field.fieldKey || '';
|
||||
const userInputPart = fieldKeyValue.includes('_')
|
||||
? fieldKeyValue.substring(fieldKeyValue.indexOf('_') + 1)
|
||||
: fieldKeyValue;
|
||||
setTemplateFieldKey(userInputPart);
|
||||
setTemplateFieldInputType(field.property.inputType);
|
||||
setTemplateFieldRequired(field.property.required);
|
||||
setTemplateFieldOptions(field.property.options?.join(', ') || '');
|
||||
|
||||
Reference in New Issue
Block a user