diff --git a/frontend/components/screen/TableSettingModal.tsx b/frontend/components/screen/TableSettingModal.tsx index b6fbbd11..f0613b66 100644 --- a/frontend/components/screen/TableSettingModal.tsx +++ b/frontend/components/screen/TableSettingModal.tsx @@ -78,7 +78,7 @@ import { deleteFieldJoin, FieldJoin, } from "@/lib/api/screenGroup"; -import { tableManagementApi, ColumnTypeInfo, TableInfo } from "@/lib/api/tableManagement"; +import { tableManagementApi, ColumnTypeInfo, TableInfo, ColumnSettings } from "@/lib/api/tableManagement"; import { screenApi } from "@/lib/api/screen"; import { INPUT_TYPE_OPTIONS } from "@/types/input-types"; import TableManagementPage from "@/app/(main)/admin/systemMng/tableMngList/page"; @@ -434,22 +434,97 @@ export function TableSettingModal({ } }; - // 전체 저장 + // 전체 저장 (테이블타입관리 페이지와 동일한 로직) const handleSaveAll = async () => { setSaving(true); try { - // 각 컬럼 설정 저장 - for (const [columnName, settings] of Object.entries(editedColumns)) { - await tableManagementApi.updateColumnSettings(tableName, columnName, { - column_label: settings.displayName || "", - input_type: (settings.inputType as string) || "text", - reference_table: settings.referenceTable || null, - reference_column: settings.referenceColumn || null, - display_column: settings.displayColumn || null, - }); + // 변경된 컬럼들만 저장 + for (const [columnName, editedSettings] of Object.entries(editedColumns)) { + // 기존 컬럼 정보 찾기 + const originalColumn = tableColumns.find((c) => c.columnName === columnName); + if (!originalColumn) continue; + + // 기존 값과 편집된 값 병합 + const mergedColumn = { + ...originalColumn, + ...editedSettings, + }; + + // detailSettings 처리 (Entity 타입인 경우) + let finalDetailSettings = mergedColumn.detailSettings || ""; + + if (mergedColumn.inputType === "entity" && mergedColumn.referenceTable) { + // 기존 detailSettings를 파싱하거나 새로 생성 + let existingSettings: Record = {}; + if (typeof mergedColumn.detailSettings === "string" && mergedColumn.detailSettings.trim().startsWith("{")) { + try { + existingSettings = JSON.parse(mergedColumn.detailSettings); + } catch { + existingSettings = {}; + } + } + + // 엔티티 설정 추가 + const entitySettings = { + ...existingSettings, + entityTable: mergedColumn.referenceTable, + entityCodeColumn: mergedColumn.referenceColumn || "id", + entityLabelColumn: mergedColumn.displayColumn || "name", + placeholder: (existingSettings.placeholder as string) || "항목을 선택하세요", + searchable: existingSettings.searchable ?? true, + }; + + finalDetailSettings = JSON.stringify(entitySettings); + console.log("Entity 설정 JSON 생성:", entitySettings); + } + + // Code 타입인 경우 hierarchyRole을 detailSettings에 포함 + if (mergedColumn.inputType === "code" && (mergedColumn as any).hierarchyRole) { + let existingSettings: Record = {}; + if (typeof finalDetailSettings === "string" && finalDetailSettings.trim().startsWith("{")) { + try { + existingSettings = JSON.parse(finalDetailSettings); + } catch { + existingSettings = {}; + } + } + + const codeSettings = { + ...existingSettings, + hierarchyRole: (mergedColumn as any).hierarchyRole, + }; + + finalDetailSettings = JSON.stringify(codeSettings); + console.log("Code 계층 역할 설정 JSON 생성:", codeSettings); + } + + // ColumnSettings 인터페이스에 맞게 데이터 구성 + const columnSetting: ColumnSettings = { + columnName: columnName, + columnLabel: mergedColumn.displayName || originalColumn.displayName || "", + webType: mergedColumn.inputType || originalColumn.inputType || "text", + detailSettings: finalDetailSettings, + codeCategory: mergedColumn.codeCategory || originalColumn.codeCategory || "", + codeValue: mergedColumn.codeValue || originalColumn.codeValue || "", + referenceTable: mergedColumn.referenceTable || "", + referenceColumn: mergedColumn.referenceColumn || "", + displayColumn: mergedColumn.displayColumn || "", + }; + + console.log("저장할 컬럼 설정:", columnSetting); + + // API 호출 + const response = await tableManagementApi.updateColumnSettings(tableName, columnName, columnSetting); + + if (!response.success) { + console.error(`컬럼 '${columnName}' 저장 실패:`, response.message); + toast.error(`컬럼 '${columnName}' 저장 실패: ${response.message}`); + return; + } } toast.success("테이블 설정이 저장되었습니다."); + setEditedColumns({}); // 편집 상태 초기화 onSaveSuccess?.(); await loadTableData(); } catch (error) { diff --git a/frontend/components/screen/panels/DataFlowPanel.tsx b/frontend/components/screen/panels/DataFlowPanel.tsx index 518fbd2c..4b31d1a9 100644 --- a/frontend/components/screen/panels/DataFlowPanel.tsx +++ b/frontend/components/screen/panels/DataFlowPanel.tsx @@ -461,3 +461,4 @@ export default function DataFlowPanel({ groupId, screenId, screens = [] }: DataF + diff --git a/frontend/components/screen/panels/FieldJoinPanel.tsx b/frontend/components/screen/panels/FieldJoinPanel.tsx index 86ebc226..884ac69b 100644 --- a/frontend/components/screen/panels/FieldJoinPanel.tsx +++ b/frontend/components/screen/panels/FieldJoinPanel.tsx @@ -413,3 +413,4 @@ export default function FieldJoinPanel({ screenId, componentId, layoutId }: Fiel +