feat: 테이블 설정 모달의 컬럼 저장 로직 개선

- 변경된 컬럼들만 저장하도록 로직을 개선하여 불필요한 API 호출을 줄임
- 기존 컬럼 정보와 편집된 값을 병합하여 최종 설정을 구성
- 엔티티 및 코드 타입에 대한 세부 설정 처리 로직 추가
- 저장 성공 시 사용자에게 피드백 제공 및 편집 상태 초기화 기능 구현
This commit is contained in:
DDD1542 2026-01-14 16:09:00 +09:00
parent 0a3d42f3ad
commit 059ea6b30a
3 changed files with 88 additions and 11 deletions

View File

@ -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<string, unknown> = {};
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<string, unknown> = {};
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) {

View File

@ -461,3 +461,4 @@ export default function DataFlowPanel({ groupId, screenId, screens = [] }: DataF

View File

@ -413,3 +413,4 @@ export default function FieldJoinPanel({ screenId, componentId, layoutId }: Fiel