diff --git a/frontend/components/screen/CopyScreenModal.tsx b/frontend/components/screen/CopyScreenModal.tsx index 8bbe80a6..fa294e52 100644 --- a/frontend/components/screen/CopyScreenModal.tsx +++ b/frontend/components/screen/CopyScreenModal.tsx @@ -51,9 +51,9 @@ const escapeRegExp = (str: string): string => { }; interface LinkedModalScreen { - screenId: number; - screenName: string; - screenCode: string; + screen_id: number; + screen_name: string; + screen_code: string; newScreenName?: string; newScreenCode?: string; } @@ -237,7 +237,7 @@ export default function CopyScreenModal({ setLinkedScreens((prev) => prev.map((screen) => ({ ...screen, - newScreenName: applyBulkRename(screen.screenName), + newScreenName: applyBulkRename(screen.screen_name), })) ); } else { @@ -247,7 +247,7 @@ export default function CopyScreenModal({ setLinkedScreens((prev) => prev.map((screen) => ({ ...screen, - newScreenName: screen.screenName, + newScreenName: screen.screen_name, })) ); } @@ -344,7 +344,7 @@ export default function CopyScreenModal({ setLinkedScreens( linked.map((screen) => ({ ...screen, - newScreenName: `${screen.screenName} (복사본)`, + newScreenName: `${screen.screen_name} (복사본)`, })) ); @@ -394,7 +394,7 @@ export default function CopyScreenModal({ setLinkedScreens(updatedLinkedScreens); console.log("✅ 모달 화면 코드 할당 완료:", updatedLinkedScreens.map(s => ({ - name: s.screenName, + name: s.screen_name, code: s.newScreenCode }))); } @@ -408,14 +408,14 @@ export default function CopyScreenModal({ const updateLinkedScreenName = (screenId: number, newName: string) => { setLinkedScreens((prev) => prev.map((screen) => - screen.screenId === screenId ? { ...screen, newScreenName: newName } : screen + screen.screen_id === screenId ? { ...screen, newScreenName: newName } : screen ) ); }; // 연결된 화면 제거 (복사하지 않음) const removeLinkedScreen = (screenId: number) => { - setLinkedScreens((prev) => prev.filter((screen) => screen.screenId !== screenId)); + setLinkedScreens((prev) => prev.filter((screen) => screen.screen_id !== screenId)); }; // 화면명 일괄 변경 적용 @@ -448,8 +448,8 @@ export default function CopyScreenModal({ preview: applyBulkRename(sourceScreen.screen_name), // (복사본) 없음 }, modals: linkedScreens.map((screen) => ({ - original: screen.screenName, - preview: applyBulkRename(screen.screenName), + original: screen.screen_name, + preview: applyBulkRename(screen.screen_name), })), }; }; @@ -548,11 +548,11 @@ export default function CopyScreenModal({ // 연결된 화면들의 이름 검증 for (const linked of linkedScreens) { if (!linked.newScreenName?.trim()) { - toast.error(`"${linked.screenName}" 모달 화면의 새 이름을 입력해주세요.`); + toast.error(`"${linked.screen_name}" 모달 화면의 새 이름을 입력해주세요.`); return; } if (!linked.newScreenCode?.trim()) { - toast.error(`"${linked.screenName}" 모달 화면의 코드가 생성되지 않았습니다.`); + toast.error(`"${linked.screen_name}" 모달 화면의 코드가 생성되지 않았습니다.`); return; } } @@ -599,7 +599,7 @@ export default function CopyScreenModal({ description: description.trim(), }, modalScreens: linkedScreens.map((screen) => ({ - sourceScreenId: screen.screenId, + sourceScreenId: screen.screen_id, screenName: screen.newScreenName!.trim(), screenCode: screen.newScreenCode!.trim(), })), @@ -1785,11 +1785,11 @@ export default function CopyScreenModal({
{linkedScreens.map((linked) => ( -
+
updateLinkedScreenName(linked.screenId, e.target.value)} + onChange={(e) => updateLinkedScreenName(linked.screen_id, e.target.value)} className="h-7 text-xs" placeholder="모달 화면명" /> @@ -1798,7 +1798,7 @@ export default function CopyScreenModal({ variant="ghost" size="icon" className="h-7 w-7 ml-1 text-destructive" - onClick={() => removeLinkedScreen(linked.screenId)} + onClick={() => removeLinkedScreen(linked.screen_id)} > diff --git a/frontend/components/screen/EditModal.tsx b/frontend/components/screen/EditModal.tsx index c7ef75c5..70b57e3f 100644 --- a/frontend/components/screen/EditModal.tsx +++ b/frontend/components/screen/EditModal.tsx @@ -264,7 +264,7 @@ export const EditModal: React.FC = ({ className }) => { let detailTableName = eventTableName; if (!detailTableName) { const screenInfo = await screenApi.getScreen(targetScreenId); - detailTableName = screenInfo?.table_name ?? screenInfo?.tableName; + detailTableName = screenInfo?.table_name; } if (!detailTableName) { diff --git a/frontend/components/screen/ScreenDesigner.tsx b/frontend/components/screen/ScreenDesigner.tsx index ed3565f3..553a2b6f 100644 --- a/frontend/components/screen/ScreenDesigner.tsx +++ b/frontend/components/screen/ScreenDesigner.tsx @@ -1350,7 +1350,7 @@ export default function ScreenDesigner({ const tableListResponse = await tableManagementApi.getTableList(); const currentTable = tableListResponse.success && tableListResponse.data - ? tableListResponse.data.find((t) => t.tableName === tableName) + ? tableListResponse.data.find((t) => t.table_name === tableName) : null; const tableLabel = currentTable?.display_name || tableName; @@ -1359,11 +1359,11 @@ export default function ScreenDesigner({ const columns: ColumnInfo[] = (columnsResponse || []).map((col: any) => { // widgetType 결정: inputType(entity 등) > webType > widget_type - const inputType = col.inputType || col.input_type; - const widgetType = inputType || col.widgetType || col.widget_type || col.webType || col.web_type; + const inputType = col.input_type; + const widgetType = inputType || col.widget_type || col.web_type; // detailSettings 파싱 (문자열이면 JSON 파싱) - let detailSettings = col.detailSettings || col.detail_settings; + let detailSettings = col.detail_settings; if (typeof detailSettings === "string") { // JSON 형식인 경우에만 파싱 시도 (중괄호로 시작하는 경우) if (detailSettings.trim().startsWith("{")) { @@ -1382,33 +1382,33 @@ export default function ScreenDesigner({ // 엔티티 타입 디버깅 if (inputType === "entity" || widgetType === "entity") { console.log("🔍 엔티티 컬럼 감지:", { - columnName: col.columnName || col.column_name, + columnName: col.column_name, inputType, widgetType, detailSettings, - referenceTable: detailSettings?.referenceTable || col.referenceTable || col.reference_table, + referenceTable: detailSettings?.referenceTable || col.reference_table, }); } return { - tableName: col.tableName || tableName, - columnName: col.columnName || col.column_name, - columnLabel: col.displayName || col.columnLabel || col.column_label || col.columnName || col.column_name, - dataType: col.dataType || col.data_type || col.dbType, - webType: col.webType || col.web_type, + tableName: col.table_name || tableName, + columnName: col.column_name, + columnLabel: col.display_name || col.column_label || col.column_name, + dataType: col.data_type || col.db_type, + webType: col.web_type, input_type: inputType, inputType: inputType, widgetType, - isNullable: col.isNullable || col.is_nullable, - required: col.required !== undefined ? col.required : col.isNullable === "NO" || col.is_nullable === "NO", - columnDefault: col.columnDefault || col.column_default, - characterMaximumLength: col.characterMaximumLength || col.character_maximum_length, - codeCategory: col.codeCategory || col.code_category, - codeValue: col.codeValue || col.code_value, + isNullable: col.is_nullable, + required: col.required !== undefined ? col.required : col.is_nullable === "NO", + columnDefault: col.column_default, + characterMaximumLength: col.character_maximum_length, + codeCategory: col.code_category, + codeValue: col.code_value, // 엔티티 타입용 참조 테이블 정보 (detailSettings에서 추출) - referenceTable: detailSettings?.referenceTable || col.referenceTable || col.reference_table, - referenceColumn: detailSettings?.referenceColumn || col.referenceColumn || col.reference_column, - displayColumn: detailSettings?.displayColumn || col.displayColumn || col.display_column, + referenceTable: detailSettings?.referenceTable || col.reference_table, + referenceColumn: detailSettings?.referenceColumn || col.reference_column, + displayColumn: detailSettings?.displayColumn || col.display_column, // detailSettings 전체 보존 (V2 컴포넌트용) detailSettings, }; @@ -1455,7 +1455,7 @@ export default function ScreenDesigner({ const tableListResponse = await tableManagementApi.getTableList(); const currentTable = tableListResponse.success && tableListResponse.data - ? tableListResponse.data.find((t: any) => (t.tableName || t.table_name) === tableName) + ? tableListResponse.data.find((t: any) => t.table_name === tableName) : null; const tableLabel = currentTable?.display_name || currentTable?.table_label || tableName; @@ -1463,10 +1463,10 @@ export default function ScreenDesigner({ const columnsResponse = await tableTypeApi.getColumns(tableName, true); const columns: ColumnInfo[] = (columnsResponse || []).map((col: any) => { - const inputType = col.inputType || col.input_type; - const widgetType = inputType || col.widgetType || col.widget_type || col.webType || col.web_type; + const inputType = col.input_type; + const widgetType = inputType || col.widget_type || col.web_type; - let detailSettings = col.detailSettings || col.detail_settings; + let detailSettings = col.detail_settings; if (typeof detailSettings === "string") { try { detailSettings = JSON.parse(detailSettings); @@ -1476,23 +1476,23 @@ export default function ScreenDesigner({ } return { - tableName: col.tableName || tableName, - columnName: col.columnName || col.column_name, - columnLabel: col.displayName || col.columnLabel || col.column_label || col.columnName || col.column_name, - dataType: col.dataType || col.data_type || col.dbType, - webType: col.webType || col.web_type, + tableName: col.table_name || tableName, + columnName: col.column_name, + columnLabel: col.display_name || col.column_label || col.column_name, + dataType: col.data_type || col.db_type, + webType: col.web_type, input_type: inputType, inputType: inputType, widgetType, - isNullable: col.isNullable || col.is_nullable, - required: col.required !== undefined ? col.required : col.isNullable === "NO" || col.is_nullable === "NO", - columnDefault: col.columnDefault || col.column_default, - characterMaximumLength: col.characterMaximumLength || col.character_maximum_length, - codeCategory: col.codeCategory || col.code_category, - codeValue: col.codeValue || col.code_value, - referenceTable: detailSettings?.referenceTable || col.referenceTable || col.reference_table, - referenceColumn: detailSettings?.referenceColumn || col.referenceColumn || col.reference_column, - displayColumn: detailSettings?.displayColumn || col.displayColumn || col.display_column, + isNullable: col.is_nullable, + required: col.required !== undefined ? col.required : col.is_nullable === "NO", + columnDefault: col.column_default, + characterMaximumLength: col.character_maximum_length, + codeCategory: col.code_category, + codeValue: col.code_value, + referenceTable: detailSettings?.referenceTable || col.reference_table, + referenceColumn: detailSettings?.referenceColumn || col.reference_column, + displayColumn: detailSettings?.displayColumn || col.display_column, detailSettings, }; }); @@ -2174,8 +2174,8 @@ export default function ScreenDesigner({ if (Array.isArray(columns)) { columnLabelMap[tableName] = {}; columns.forEach((col: any) => { - const colName = col.columnName || col.column_name || col.name; - const colLabel = col.displayName || col.columnLabel || col.column_label || colName; + const colName = col.column_name || col.name; + const colLabel = col.display_name || col.column_label || colName; if (colName) { columnLabelMap[tableName][colName] = colLabel; } diff --git a/frontend/components/screen/ScreenList.tsx b/frontend/components/screen/ScreenList.tsx index 93c140a9..c8a7be17 100644 --- a/frontend/components/screen/ScreenList.tsx +++ b/frontend/components/screen/ScreenList.tsx @@ -273,12 +273,12 @@ export default function ScreenList({ onScreenSelect, selectedScreen, onDesignScr // 최고 관리자이고 특정 회사를 선택한 경우 if (isSuperAdmin && selectedCompanyCode !== "all") { - params.companyCode = selectedCompanyCode; + params.company_code = selectedCompanyCode; } // 그룹 필터 if (selectedGroupId !== "all") { - params.groupId = selectedGroupId; + params.group_id = selectedGroupId; } console.log("🔍 화면 목록 API 호출:", params); // 디버깅용 @@ -325,9 +325,9 @@ export default function ScreenList({ onScreenSelect, selectedScreen, onDesignScr // 최고 관리자이고 특정 회사를 선택한 경우 if (isSuperAdmin && selectedCompanyCode !== "all") { - params.companyCode = selectedCompanyCode; + params.company_code = selectedCompanyCode; } - + const resp = await screenApi.getScreens(params); setScreens(resp.data || []); setTotalPages(Math.max(1, Math.ceil((resp.total || 0) / 20))); @@ -740,7 +740,7 @@ export default function ScreenList({ onScreenSelect, selectedScreen, onDesignScr 미분류 {groups.map((group) => ( - {group.groupName} + {group.group_name} ))} diff --git a/frontend/components/screen/ScreenRelationView.tsx b/frontend/components/screen/ScreenRelationView.tsx index 9f400b1a..274b2c61 100644 --- a/frontend/components/screen/ScreenRelationView.tsx +++ b/frontend/components/screen/ScreenRelationView.tsx @@ -189,18 +189,18 @@ export function ScreenRelationView({ screen }: ScreenRelationViewProps) { className="flex items-center gap-2 p-2 rounded-md bg-muted/50 text-sm" >
- {join.sourceTable} + {join.save_table} . - {join.sourceColumn} + {join.save_column}
- {join.targetTable} + {join.join_table} . - {join.targetColumn} + {join.join_column}
- {join.joinType} + {join.join_type}
))} @@ -231,14 +231,14 @@ export function ScreenRelationView({ screen }: ScreenRelationViewProps) { className="flex items-center gap-2 p-2 rounded-md bg-muted/50 text-sm" > - {flow.flowName || "이름 없음"} + {flow.flow_label || "이름 없음"} - 화면 #{flow.targetScreenId} + 화면 #{flow.target_screen_id} - {flow.flowType} + {flow.flow_type}
))} @@ -269,11 +269,11 @@ export function ScreenRelationView({ screen }: ScreenRelationViewProps) { className="flex items-center gap-2 p-2 rounded-md bg-muted/50 text-sm" > - {relation.parentTable} + {screen.table_name} - {relation.childTable} + {relation.table_name} - {relation.relationType} + {relation.relation_type} ))} diff --git a/frontend/lib/api/data.ts b/frontend/lib/api/data.ts index e1f14b14..206a0607 100644 --- a/frontend/lib/api/data.ts +++ b/frontend/lib/api/data.ts @@ -61,10 +61,10 @@ export const dataApi = { try { const params: any = {}; if (enableEntityJoin) { - params.enableEntityJoin = true; + params.enable_entity_join = true; } if (groupByColumns.length > 0) { - params.groupByColumns = JSON.stringify(groupByColumns); + params.group_by_columns = JSON.stringify(groupByColumns); } console.log("🌐 [dataApi.getRecordDetail] API 호출:", { @@ -123,14 +123,14 @@ export const dataApi = { ): Promise => { const response = await apiClient.get(`/data/join`, { params: { - leftTable, - rightTable, - leftColumn, - rightColumn, - leftValue, - dataFilter: dataFilter ? JSON.stringify(dataFilter) : undefined, - enableEntityJoin: enableEntityJoin ?? true, - displayColumns: displayColumns ? JSON.stringify(displayColumns) : undefined, // 🆕 표시 컬럼 전달 + left_table: leftTable, + right_table: rightTable, + left_column: leftColumn, + right_column: rightColumn, + left_value: leftValue, + data_filter: dataFilter ? JSON.stringify(dataFilter) : undefined, + enable_entity_join: enableEntityJoin ?? true, + display_columns: displayColumns ? JSON.stringify(displayColumns) : undefined, // 🆕 표시 컬럼 전달 deduplication: deduplication ? JSON.stringify(deduplication) : undefined, // 🆕 중복 제거 설정 전달 }, }); @@ -215,7 +215,7 @@ export const dataApi = { try { const params: any = {}; if (enableEntityJoin) { - params.enableEntityJoin = "true"; + params.enable_entity_join = "true"; } const response = await apiClient.get(`/data/${tableName}/${id}`, { params }); return response.data; // { success: true, data: ... } 형식 그대로 반환 @@ -249,10 +249,10 @@ export const dataApi = { }); const requestBody = { - tableName, + table_name: tableName, parentKeys, records, - deleteOrphans: options?.deleteOrphans ?? true, // 기본값: true (기존 동작 유지) + delete_orphans: options?.deleteOrphans ?? true, // 기본값: true (기존 동작 유지) }; console.log("📦 [dataApi.upsertGroupedRecords] 요청 본문 (JSON):", JSON.stringify(requestBody, null, 2)); diff --git a/frontend/lib/api/dataflowSave.ts b/frontend/lib/api/dataflowSave.ts index 49007659..a51c5607 100644 --- a/frontend/lib/api/dataflowSave.ts +++ b/frontend/lib/api/dataflowSave.ts @@ -64,7 +64,7 @@ export const loadDataflowRelationship = async (diagramId: number) => { let relationshipsData; // Case 1: 현재 구조 - relationships 자체가 관계 데이터 - if (diagram.relationships && (diagram.relationships.connection_type || diagram.relationships.connectionType)) { + if (diagram.relationships && diagram.relationships.connection_type) { relationshipsData = diagram.relationships; console.log("✅ 현재 구조 감지 (relationships 직접):", relationshipsData); } @@ -85,22 +85,22 @@ export const loadDataflowRelationship = async (diagramId: number) => { // 기존 구조를 redesigned 구조로 변환 relationshipsData = { description: firstRelation.note || "", - connectionType: firstRelation.connection_type || firstRelation.connectionType || "data_save", - fromConnection: { id: 0, name: "메인 데이터베이스 (현재 시스템)" }, // 기본값 - toConnection: { id: 0, name: "메인 데이터베이스 (현재 시스템)" }, // 기본값 - fromTable: firstRelation.from_table || firstRelation.fromTable, - toTable: firstRelation.to_table || firstRelation.toTable, - actionType: "insert", // 기본값 - controlConditions: [], - actionConditions: [], - fieldMappings: [], + connection_type: firstRelation.connection_type || "data_save", + from_connection: { id: 0, name: "메인 데이터베이스 (현재 시스템)" }, // 기본값 + to_connection: { id: 0, name: "메인 데이터베이스 (현재 시스템)" }, // 기본값 + from_table: firstRelation.from_table, + to_table: firstRelation.to_table, + action_type: "insert", // 기본값 + control_conditions: [], + action_conditions: [], + field_mappings: [], }; // 기존 control 및 plan 데이터를 변환 if (diagram.control && diagram.control.length > 0) { const control = diagram.control.find((c) => c.id === firstRelation.id); if (control && control.conditions) { - relationshipsData.controlConditions = control.conditions; + relationshipsData.control_conditions = control.conditions; } } @@ -108,9 +108,9 @@ export const loadDataflowRelationship = async (diagramId: number) => { const plan = diagram.plan.find((p) => p.id === firstRelation.id); if (plan && plan.actions && plan.actions.length > 0) { const firstAction = plan.actions[0]; - relationshipsData.actionType = firstAction.action_type || firstAction.actionType || "insert"; - relationshipsData.fieldMappings = firstAction.field_mappings || firstAction.fieldMappings || []; - relationshipsData.actionConditions = firstAction.action_conditions || firstAction.conditions || []; + relationshipsData.action_type = firstAction.action_type || "insert"; + relationshipsData.field_mappings = firstAction.field_mappings || []; + relationshipsData.action_conditions = firstAction.action_conditions || firstAction.conditions || []; } } } @@ -121,18 +121,18 @@ export const loadDataflowRelationship = async (diagramId: number) => { // 현재 DB에 저장된 구조 처리 (relationships 객체에 모든 데이터가 있음) relationshipsData = { description: diagram.relationships.description || "", - connection_type: diagram.relationships.connection_type || diagram.relationships.connectionType || "data_save", - from_connection: diagram.relationships.from_connection || diagram.relationships.fromConnection || { id: 0, name: "메인 데이터베이스 (현재 시스템)" }, - to_connection: diagram.relationships.to_connection || diagram.relationships.toConnection || { id: 0, name: "메인 데이터베이스 (현재 시스템)" }, - from_table: diagram.relationships.from_table || diagram.relationships.fromTable, - to_table: diagram.relationships.to_table || diagram.relationships.toTable, - action_type: diagram.relationships.action_type || diagram.relationships.actionType || "insert", - control_conditions: diagram.relationships.control_conditions || diagram.relationships.controlConditions || [], - action_conditions: diagram.relationships.action_conditions || diagram.relationships.actionConditions || [], - field_mappings: diagram.relationships.field_mappings || diagram.relationships.fieldMappings || [], + connection_type: diagram.relationships.connection_type || "data_save", + from_connection: diagram.relationships.from_connection || { id: 0, name: "메인 데이터베이스 (현재 시스템)" }, + to_connection: diagram.relationships.to_connection || { id: 0, name: "메인 데이터베이스 (현재 시스템)" }, + from_table: diagram.relationships.from_table, + to_table: diagram.relationships.to_table, + action_type: diagram.relationships.action_type || "insert", + control_conditions: diagram.relationships.control_conditions || [], + action_conditions: diagram.relationships.action_conditions || [], + field_mappings: diagram.relationships.field_mappings || [], // 🔧 멀티 액션 그룹 데이터 로드 - action_groups: diagram.relationships.action_groups || diagram.relationships.actionGroups || null, - external_call_config: diagram.relationships.external_call_config || diagram.relationships.externalCallConfig, + action_groups: diagram.relationships.action_groups || null, + external_call_config: diagram.relationships.external_call_config, }; console.log("✅ 현재 DB 구조 처리 완료:", relationshipsData); } else { @@ -146,19 +146,19 @@ export const loadDataflowRelationship = async (diagramId: number) => { diagramId: diagram.diagram_id, // 🔧 수정 모드를 위한 diagramId 추가 relationshipName: diagram.diagram_name, description: relationshipsData.description || diagram.description || "", // 🔧 diagram.description도 확인 - connectionType: relationshipsData.connection_type || relationshipsData.connectionType || "data_save", - fromConnection: relationshipsData.from_connection || relationshipsData.fromConnection || { id: 0, name: "메인 데이터베이스 (현재 시스템)" }, - toConnection: relationshipsData.to_connection || relationshipsData.toConnection || { id: 0, name: "메인 데이터베이스 (현재 시스템)" }, - fromTable: relationshipsData.from_table || relationshipsData.fromTable, - toTable: relationshipsData.to_table || relationshipsData.toTable, - actionType: relationshipsData.action_type || relationshipsData.actionType || "insert", - controlConditions: relationshipsData.control_conditions || relationshipsData.controlConditions || [], - actionConditions: relationshipsData.action_conditions || relationshipsData.actionConditions || [], - fieldMappings: relationshipsData.field_mappings || relationshipsData.fieldMappings || [], + connectionType: relationshipsData.connection_type || "data_save", + fromConnection: relationshipsData.from_connection || { id: 0, name: "메인 데이터베이스 (현재 시스템)" }, + toConnection: relationshipsData.to_connection || { id: 0, name: "메인 데이터베이스 (현재 시스템)" }, + fromTable: relationshipsData.from_table, + toTable: relationshipsData.to_table, + actionType: relationshipsData.action_type || "insert", + controlConditions: relationshipsData.control_conditions || [], + actionConditions: relationshipsData.action_conditions || [], + fieldMappings: relationshipsData.field_mappings || [], // 🔧 멀티 액션 그룹 데이터 포함 - actionGroups: relationshipsData.action_groups || relationshipsData.actionGroups, + actionGroups: relationshipsData.action_groups, // 🔧 외부호출 설정 데이터 포함 - externalCallConfig: relationshipsData.external_call_config || relationshipsData.externalCallConfig, + externalCallConfig: relationshipsData.external_call_config, }; console.log("✨ 변환된 로드 데이터:", loadedData); diff --git a/frontend/lib/api/dynamicForm.ts b/frontend/lib/api/dynamicForm.ts index 3e0146a4..7e720036 100644 --- a/frontend/lib/api/dynamicForm.ts +++ b/frontend/lib/api/dynamicForm.ts @@ -247,8 +247,8 @@ export class DynamicFormApi { page?: number; size?: number; search?: string; - sortBy?: string; - sortOrder?: "asc" | "desc"; + sort_by?: string; + sort_order?: "asc" | "desc"; }, ): Promise< ApiResponse<{ @@ -433,12 +433,12 @@ export class DynamicFormApi { tableName: string, params?: { page?: number; - pageSize?: number; + page_size?: number; search?: string; - sortBy?: string; - sortOrder?: "asc" | "desc"; + sort_by?: string; + sort_order?: "asc" | "desc"; filters?: Record; - autoFilter?: { + auto_filter?: { enabled: boolean; filter_column?: string; user_field?: string; @@ -452,8 +452,8 @@ export class DynamicFormApi { // pageSize를 size로 변환 (백엔드 파라미터명 호환) const requestParams = { ...params, - size: params?.pageSize || params?.size || 100, // 기본값 100 - autoFilter: params?.autoFilter ?? { + size: params?.page_size || params?.size || 100, // 기본값 100 + auto_filter: params?.auto_filter ?? { enabled: true, filter_column: "company_code", user_field: "company_code", @@ -533,10 +533,10 @@ export class DynamicFormApi { * @returns 업로드 결과 */ static async uploadExcelData(payload: { - tableName: string; + table_name: string; data: any[]; - uploadMode: "insert" | "update" | "upsert"; - keyColumn?: string; + upload_mode: "insert" | "update" | "upsert"; + key_column?: string; }): Promise> { try { console.log("📤 엑셀 업로드 요청:", payload); diff --git a/frontend/lib/api/file.ts b/frontend/lib/api/file.ts index 3e7390f9..79726ea9 100644 --- a/frontend/lib/api/file.ts +++ b/frontend/lib/api/file.ts @@ -22,7 +22,7 @@ export interface FileUploadResponse { export interface FileDownloadParams { fileId: string; server_filename: string; - originalName: string; + original_name: string; } /** @@ -89,7 +89,7 @@ export const downloadFile = async (params: FileDownloadParams): Promise => const response = await apiClient.get(`/files/download/${params.fileId}`, { params: { server_filename: params.server_filename, - originalName: params.originalName, + original_name: params.original_name, }, responseType: "blob", // 파일 다운로드를 위해 blob 타입으로 설정 }); @@ -103,7 +103,7 @@ export const downloadFile = async (params: FileDownloadParams): Promise => // 다운로드 링크 생성 및 클릭 const link = document.createElement("a"); link.href = url; - link.download = params.originalName; + link.download = params.original_name; document.body.appendChild(link); link.click(); diff --git a/frontend/lib/api/screen.ts b/frontend/lib/api/screen.ts index c0e564cc..5e9d688b 100644 --- a/frontend/lib/api/screen.ts +++ b/frontend/lib/api/screen.ts @@ -358,7 +358,7 @@ export const screenApi = { // 연결된 모달 화면 감지 detectLinkedModals: async ( screenId: number, - ): Promise> => { + ): Promise> => { const response = await apiClient.get(`/screen-management/screens/${screenId}/linked-modals`); return response.data.data || []; }, diff --git a/frontend/lib/registry/components/v2-file-upload/FileUploadComponent.tsx b/frontend/lib/registry/components/v2-file-upload/FileUploadComponent.tsx index dedd6194..5f6638b7 100644 --- a/frontend/lib/registry/components/v2-file-upload/FileUploadComponent.tsx +++ b/frontend/lib/registry/components/v2-file-upload/FileUploadComponent.tsx @@ -823,8 +823,8 @@ const FileUploadComponent: React.FC = ({ try { await downloadFile({ fileId: file.objid, - serverFilename: file.savedFileName, - originalName: file.realFileName, + server_filename: file.savedFileName, + original_name: file.realFileName, }); toast.success(`${file.realFileName} 다운로드 완료`); } catch (error) { @@ -934,7 +934,7 @@ const FileUploadComponent: React.FC = ({ // 🔑 previewUrl 상대 경로 대신 apiClient를 사용하여 Docker 환경에서도 정상 동작 const response = await apiClient.get(`/files/preview/${file.objid}`, { params: { - serverFilename: file.savedFileName, + server_filename: file.savedFileName, }, responseType: "blob", }); diff --git a/frontend/lib/registry/components/v2-split-panel-layout/SplitPanelLayoutConfigPanel.tsx b/frontend/lib/registry/components/v2-split-panel-layout/SplitPanelLayoutConfigPanel.tsx index 517fd5be..d3e9c240 100644 --- a/frontend/lib/registry/components/v2-split-panel-layout/SplitPanelLayoutConfigPanel.tsx +++ b/frontend/lib/registry/components/v2-split-panel-layout/SplitPanelLayoutConfigPanel.tsx @@ -1656,7 +1656,7 @@ export const SplitPanelLayoutConfigPanel: React.FC = ({ )} {allTables - .filter((t) => (t.tableName || t.table_name) !== screenTableName) + .filter((t) => t.table_name !== screenTableName) .map((table) => { - const tableName = table.tableName || table.table_name; - const displayName = table.tableLabel || table.displayName || tableName; + const tableName = table.table_name; + const displayName = table.table_label || table.display_name || tableName; return (