diff --git a/frontend/app/(main)/admin/systemMng/dataflow/edit/[diagramId]/page.tsx b/frontend/app/(main)/admin/systemMng/dataflow/edit/[diagramId]/page.tsx
index f3a8a895..54e4adf8 100644
--- a/frontend/app/(main)/admin/systemMng/dataflow/edit/[diagramId]/page.tsx
+++ b/frontend/app/(main)/admin/systemMng/dataflow/edit/[diagramId]/page.tsx
@@ -80,8 +80,8 @@ export default function DataFlowEditPage() {
diff --git a/frontend/app/api/admin/layouts/list/route.ts b/frontend/app/api/admin/layouts/list/route.ts
index dc57eecd..f5748cb1 100644
--- a/frontend/app/api/admin/layouts/list/route.ts
+++ b/frontend/app/api/admin/layouts/list/route.ts
@@ -10,14 +10,14 @@ export async function GET(request: NextRequest) {
const codeLayouts = LayoutRegistry.getAllLayouts().map((layout) => ({
id: layout.id,
name: layout.name,
- nameEng: layout.nameEng,
+ nameEng: layout.name_eng,
description: layout.description,
category: layout.category,
type: "code", // 코드로 생성된 레이아웃
- isActive: layout.isActive !== false,
+ isActive: layout.is_active !== false,
tags: layout.tags || [],
metadata: layout.metadata,
- zones: layout.defaultZones?.length || 0,
+ zones: layout.default_zones?.length || 0,
}));
// 레지스트리 통계
diff --git a/frontend/app/test-type-safety/simple-test.tsx b/frontend/app/test-type-safety/simple-test.tsx
index f9387d8a..b49c207b 100644
--- a/frontend/app/test-type-safety/simple-test.tsx
+++ b/frontend/app/test-type-safety/simple-test.tsx
@@ -92,11 +92,11 @@ export default function SimpleTypeSafetyTest() {
const testWidget: WidgetComponent = {
id: "test-widget",
type: "widget",
- widgetType: "text",
+ widget_type: "text",
position: { x: 0, y: 0 },
size: { width: 200, height: 40 },
label: "테스트",
- webTypeConfig: {},
+ web_type_config: {},
};
const testContainer = {
@@ -128,38 +128,38 @@ export default function SimpleTypeSafetyTest() {
{
id: "userName",
type: "widget",
- widgetType: "text",
+ widget_type: "text",
position: { x: 0, y: 0 },
size: { width: 200, height: 40 },
label: "사용자명",
- columnName: "user_name",
- webTypeConfig: {},
+ column_name: "user_name",
+ web_type_config: {},
},
{
id: "isActive",
type: "widget",
- widgetType: "checkbox",
+ widget_type: "checkbox",
position: { x: 0, y: 50 },
size: { width: 200, height: 40 },
label: "활성화",
- columnName: "is_active",
- webTypeConfig: {},
+ column_name: "is_active",
+ web_type_config: {},
},
];
const processedData: Record = {};
formComponents.forEach((component) => {
const fieldValue = formData[component.id as keyof typeof formData];
- if (fieldValue !== undefined && component.columnName) {
- switch (component.widgetType) {
+ if (fieldValue !== undefined && component.column_name) {
+ switch (component.widget_type) {
case "text":
- processedData[component.columnName] = String(fieldValue);
+ processedData[component.column_name] = String(fieldValue);
break;
case "checkbox":
- processedData[component.columnName] = booleanToYN(Boolean(fieldValue));
+ processedData[component.column_name] = booleanToYN(Boolean(fieldValue));
break;
default:
- processedData[component.columnName] = fieldValue;
+ processedData[component.column_name] = fieldValue;
}
}
});
diff --git a/frontend/components/GlobalFileViewer.tsx b/frontend/components/GlobalFileViewer.tsx
index 0fb9c2ca..806c7594 100644
--- a/frontend/components/GlobalFileViewer.tsx
+++ b/frontend/components/GlobalFileViewer.tsx
@@ -98,12 +98,12 @@ export const GlobalFileViewer: React.FC = ({
// 탭별 필터링
if (tab === "images") {
filtered = files.filter(file => {
- const ext = file.realFileName?.split('.').pop()?.toLowerCase() || '';
+ const ext = file.real_file_name?.split('.').pop()?.toLowerCase() || '';
return ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'].includes(ext);
});
} else if (tab === "documents") {
filtered = files.filter(file => {
- const ext = file.realFileName?.split('.').pop()?.toLowerCase() || '';
+ const ext = file.real_file_name?.split('.').pop()?.toLowerCase() || '';
return ['txt', 'md', 'doc', 'docx', 'pdf', 'rtf', 'hwp', 'hwpx'].includes(ext);
});
} else if (tab === "recent") {
@@ -116,8 +116,8 @@ export const GlobalFileViewer: React.FC = ({
if (query.trim()) {
const lowerQuery = query.toLowerCase();
filtered = filtered.filter(file =>
- file.realFileName?.toLowerCase().includes(lowerQuery) ||
- file.savedFileName?.toLowerCase().includes(lowerQuery) ||
+ file.real_file_name?.toLowerCase().includes(lowerQuery) ||
+ file.saved_file_name?.toLowerCase().includes(lowerQuery) ||
file.uploadPage?.toLowerCase().includes(lowerQuery)
);
}
@@ -129,10 +129,11 @@ export const GlobalFileViewer: React.FC = ({
const handleDownload = async (file: GlobalFileInfo) => {
try {
await downloadFile({
- fileId: file.objid,
- originalName: file.realFileName || file.savedFileName || "download",
+ fileId: file.id,
+ server_filename: file.server_filename || "",
+ original_name: file.real_file_name || file.saved_file_name || "download",
});
- toast.success(`파일 다운로드 시작: ${file.realFileName}`);
+ toast.success(`파일 다운로드 시작: ${file.real_file_name}`);
} catch (error) {
console.error("파일 다운로드 오류:", error);
showErrorToast("파일 다운로드에 실패했습니다", error, { guidance: "파일이 존재하는지 확인하고 다시 시도해 주세요." });
@@ -147,9 +148,9 @@ export const GlobalFileViewer: React.FC = ({
// 파일 접근 불가능하게 설정 (삭제 대신)
const handleRemove = (file: GlobalFileInfo) => {
- GlobalFileManager.setFileAccessible(file.objid, false);
+ GlobalFileManager.setFileAccessible(file.id, false);
refreshFiles();
- toast.success(`파일이 목록에서 제거되었습니다: ${file.realFileName}`);
+ toast.success(`파일이 목록에서 제거되었습니다: ${file.real_file_name}`);
};
// 초기 로드 및 검색/탭 변경 시 필터링
@@ -224,16 +225,16 @@ export const GlobalFileViewer: React.FC = ({
) : (
filteredFiles.map((file) => (
-
+
- {getFileIcon(file.realFileName || file.savedFileName || "", 20)}
+ {getFileIcon(file.real_file_name || file.saved_file_name || "", 20)}
- {file.realFileName || file.savedFileName}
+ {file.real_file_name || file.saved_file_name}
-
{formatFileSize(file.fileSize)}
+
{formatFileSize(file.size)}
{new Date(file.uploadTime).toLocaleDateString()}
diff --git a/frontend/components/admin/CodeDetailPanel.tsx b/frontend/components/admin/CodeDetailPanel.tsx
index bab3ad9f..ffdb9361 100644
--- a/frontend/components/admin/CodeDetailPanel.tsx
+++ b/frontend/components/admin/CodeDetailPanel.tsx
@@ -176,7 +176,7 @@ export function CodeDetailPanel({ categoryCode }: CodeDetailPanelProps) {
})),
});
},
- getItemId: (code: CodeInfo) => code.code_value,
+ getItemId: (code: CodeInfo) => code.code_value || "",
});
// 새 코드 생성
@@ -213,7 +213,7 @@ export function CodeDetailPanel({ categoryCode }: CodeDetailPanelProps) {
try {
await deleteCodeMutation.mutateAsync({
categoryCode,
- codeValue: deletingCode.code_value,
+ codeValue: deletingCode.code_value || "",
});
setShowDeleteModal(false);
@@ -298,7 +298,7 @@ export function CodeDetailPanel({ categoryCode }: CodeDetailPanelProps) {
<>
code.code_value)}
+ items={visibleCodes.map((code) => code.code_value || "")}
strategy={verticalListSortingStrategy}
>
{visibleCodes.map((code, index) => {
diff --git a/frontend/components/admin/CodeFormModal.tsx b/frontend/components/admin/CodeFormModal.tsx
index b5a8847b..3e1e9737 100644
--- a/frontend/components/admin/CodeFormModal.tsx
+++ b/frontend/components/admin/CodeFormModal.tsx
@@ -64,7 +64,7 @@ export function CodeFormModal({
categoryCode,
"codeName",
validationStates.codeName.value,
- isEditing ? editingCode?.codeValue || editingCode?.code_value : undefined,
+ isEditing ? editingCode?.code_value : undefined,
validationStates.codeName.enabled,
);
@@ -96,22 +96,22 @@ export function CodeFormModal({
if (isOpen) {
if (isEditing && editingCode) {
// 수정 모드: 기존 데이터 로드 (codeValue는 표시용으로만 설정)
- const parentValue = editingCode.parentCodeValue || editingCode.parent_code_value || "";
+ const parentValue = editingCode.parent_code_value || "";
form.reset({
- codeName: editingCode.codeName || editingCode.code_name,
- codeNameEng: editingCode.codeNameEng || editingCode.code_name_eng || "",
+ codeName: editingCode.code_name,
+ codeNameEng: editingCode.code_name_eng || "",
description: editingCode.description || "",
- sortOrder: editingCode.sortOrder || editingCode.sort_order,
- isActive: (editingCode.isActive || editingCode.is_active) as "Y" | "N",
+ sortOrder: editingCode.sort_order,
+ isActive: editingCode.is_active as "Y" | "N",
parentCodeValue: parentValue,
});
// codeValue는 별도로 설정 (표시용)
- form.setValue("codeValue" as any, editingCode.codeValue || editingCode.code_value);
+ form.setValue("codeValue" as any, editingCode.code_value);
} else {
// 새 코드 모드: 자동 순서 계산
- const maxSortOrder = codes.length > 0 ? Math.max(...codes.map((c) => c.sortOrder || c.sort_order || 0)) : 0;
+ const maxSortOrder = codes.length > 0 ? Math.max(...codes.map((c) => c.sort_order || 0)) : 0;
// 기본 부모 코드가 있으면 설정 (하위 코드 추가 시)
const parentValue = defaultParentCode || "";
@@ -137,7 +137,7 @@ export function CodeFormModal({
// 수정
await updateCodeMutation.mutateAsync({
categoryCode,
- codeValue: editingCode.codeValue || editingCode.code_value || "",
+ codeValue: editingCode.code_value || "",
data: data as UpdateCodeData,
});
} else {
@@ -252,9 +252,9 @@ export function CodeFormModal({
{(() => {
- const parentCode = codes.find((c) => (c.codeValue || c.code_value) === defaultParentCode);
+ const parentCode = codes.find((c) => c.code_value === defaultParentCode);
return parentCode
- ? `${parentCode.codeName || parentCode.code_name} (${defaultParentCode})`
+ ? `${parentCode.code_name} (${defaultParentCode})`
: defaultParentCode;
})()}
diff --git a/frontend/components/admin/CollectionConfigModal.tsx b/frontend/components/admin/CollectionConfigModal.tsx
index ea099bfa..fa25402f 100644
--- a/frontend/components/admin/CollectionConfigModal.tsx
+++ b/frontend/components/admin/CollectionConfigModal.tsx
@@ -5,8 +5,8 @@ import {
Dialog,
DialogContent,
DialogHeader,
-
-
+ DialogTitle,
+ DialogFooter,
} from "@/components/ui/dialog";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
diff --git a/frontend/components/admin/ColumnDefinitionTable.tsx b/frontend/components/admin/ColumnDefinitionTable.tsx
index 5ad02693..dee7761a 100644
--- a/frontend/components/admin/ColumnDefinitionTable.tsx
+++ b/frontend/components/admin/ColumnDefinitionTable.tsx
@@ -106,12 +106,12 @@ export function ColumnDefinitionTable({ columns, onChange, disabled = false }: C
}
// 입력타입 검증
- if (!column.inputType) {
+ if (!column.input_type) {
errors.push("입력타입을 선택해주세요");
}
// 길이 검증 (길이를 지원하는 타입인 경우)
- const inputTypeOption = INPUT_TYPE_OPTIONS.find((opt) => opt.value === column.inputType);
+ const inputTypeOption = INPUT_TYPE_OPTIONS.find((opt) => opt.value === column.input_type) as any;
if (inputTypeOption?.supportsLength && column.length !== undefined) {
if (column.length < VALIDATION_RULES.columnLength.min || column.length > VALIDATION_RULES.columnLength.max) {
errors.push(VALIDATION_RULES.columnLength.errorMessage);
@@ -131,8 +131,8 @@ export function ColumnDefinitionTable({ columns, onChange, disabled = false }: C
* 입력타입 변경 시 길이 기본값 설정
*/
const handleInputTypeChange = (index: number, inputType: string) => {
- const inputTypeOption = INPUT_TYPE_OPTIONS.find((opt) => opt.value === inputType);
- const updates: Partial = { inputType: inputType as any };
+ const inputTypeOption = INPUT_TYPE_OPTIONS.find((opt) => opt.value === inputType) as any;
+ const updates: Partial = { input_type: inputType as any };
// 길이를 지원하는 타입이고 현재 길이가 없으면 기본값 설정
if (inputTypeOption?.supportsLength && !columns[index].length && inputTypeOption.defaultLength) {
@@ -183,7 +183,7 @@ export function ColumnDefinitionTable({ columns, onChange, disabled = false }: C
{columns.map((column, index) => {
- const inputTypeOption = INPUT_TYPE_OPTIONS.find((opt) => opt.value === column.inputType);
+ const inputTypeOption = INPUT_TYPE_OPTIONS.find((opt) => opt.value === column.input_type) as any;
const rowErrors = validationErrors[index] || [];
const hasRowError = rowErrors.length > 0;
@@ -220,7 +220,7 @@ export function ColumnDefinitionTable({ columns, onChange, disabled = false }: C
update({ lineColor: e.target.value })}
+ value={selected.line_color || "#000000"}
+ onChange={(e) => update({ line_color: e.target.value })}
className="h-9 w-20 p-1"
/>
@@ -341,8 +341,8 @@ export function BarcodeDesignerRightPanel() {
update({ backgroundColor: e.target.value })}
+ value={selected.background_color || "#ffffff"}
+ onChange={(e) => update({ background_color: e.target.value })}
className="h-9 w-20 p-1"
/>
@@ -353,8 +353,8 @@ export function BarcodeDesignerRightPanel() {
update({ imageUrl: e.target.value })}
+ value={selected.image_url || ""}
+ onChange={(e) => update({ image_url: e.target.value })}
placeholder="https://..."
/>
또는 나중에 업로드 기능 연동
diff --git a/frontend/components/barcode/designer/BarcodeDesignerToolbar.tsx b/frontend/components/barcode/designer/BarcodeDesignerToolbar.tsx
index a7b0f598..6f57e7d9 100644
--- a/frontend/components/barcode/designer/BarcodeDesignerToolbar.tsx
+++ b/frontend/components/barcode/designer/BarcodeDesignerToolbar.tsx
@@ -71,7 +71,7 @@ export function BarcodeDesignerToolbar() {
setCreating(true);
try {
const createRes = await barcodeApi.createLabel({
- labelNameKor: name,
+ label_name_kor: name,
});
if (!createRes.success || !createRes.data?.labelId) throw new Error(createRes.message || "생성 실패");
const newId = createRes.data.labelId;
@@ -79,7 +79,7 @@ export function BarcodeDesignerToolbar() {
await barcodeApi.saveLayout(newId, {
width_mm: widthMm,
height_mm: heightMm,
- components: components.map((c, i) => ({ ...c, zIndex: i })),
+ components: components.map((c, i) => ({ ...c, z_index: i })),
});
toast({ title: "저장됨", description: "라벨이 생성되었습니다." });
@@ -145,7 +145,7 @@ export function BarcodeDesignerToolbar() {
layout={{
width_mm: widthMm,
height_mm: heightMm,
- components: components.map((c, i) => ({ ...c, zIndex: i })),
+ components: components.map((c, i) => ({ ...c, z_index: i })),
}}
labelName={labelMaster?.label_name_kor || "라벨"}
/>
diff --git a/frontend/components/barcode/designer/BarcodeLabelCanvasComponent.tsx b/frontend/components/barcode/designer/BarcodeLabelCanvasComponent.tsx
index 3567d916..b19e40cd 100644
--- a/frontend/components/barcode/designer/BarcodeLabelCanvasComponent.tsx
+++ b/frontend/components/barcode/designer/BarcodeLabelCanvasComponent.tsx
@@ -147,12 +147,12 @@ export function BarcodeLabelCanvasComponent({ component }: Props) {
top: component.y,
width: component.width,
height: component.height,
- zIndex: component.zIndex,
+ zIndex: component.z_index,
};
const border = selected ? "2px solid #2563eb" : "1px solid transparent";
const isBarcode = component.type === "barcode";
- const isQR = component.barcodeType === "QR";
+ const isQR = component.barcode_type === "QR";
const content = () => {
switch (component.type) {
@@ -160,9 +160,9 @@ export function BarcodeLabelCanvasComponent({ component }: Props) {
return (
);
}
return (
);
case "image":
- return component.imageUrl ? (
+ return component.image_url ? (
})
) : (
@@ -211,9 +211,9 @@ export function BarcodeLabelCanvasComponent({ component }: Props) {
);
@@ -223,8 +223,8 @@ export function BarcodeLabelCanvasComponent({ component }: Props) {
style={{
width: "100%",
height: "100%",
- backgroundColor: component.backgroundColor || "transparent",
- border: `${component.lineWidth || 1}px solid ${component.lineColor || "#000"}`,
+ backgroundColor: component.background_color || "transparent",
+ border: `${component.line_width || 1}px solid ${component.line_color || "#000"}`,
}}
/>
);
diff --git a/frontend/components/common/CascadingDropdown.tsx b/frontend/components/common/CascadingDropdown.tsx
index 026c8868..54776822 100644
--- a/frontend/components/common/CascadingDropdown.tsx
+++ b/frontend/components/common/CascadingDropdown.tsx
@@ -98,27 +98,27 @@ export function CascadingDropdown({
// 부모 값 변경 시 자동 초기화
useEffect(() => {
- if (config.clearOnParentChange !== false) {
- if (prevParentValueRef.current !== undefined &&
- prevParentValueRef.current !== parentValue &&
+ if (config.clear_on_parent_change !== false) {
+ if (prevParentValueRef.current !== undefined &&
+ prevParentValueRef.current !== parentValue &&
value) {
// 부모 값이 변경되면 현재 값 초기화
onChange?.("");
}
}
prevParentValueRef.current = parentValue;
- }, [parentValue, config.clearOnParentChange, value, onChange]);
+ }, [parentValue, config.clear_on_parent_change, value, onChange]);
// 부모 값이 없을 때 메시지
const getPlaceholder = () => {
if (!parentValue) {
- return config.emptyParentMessage || "상위 항목을 먼저 선택하세요";
+ return config.empty_parent_message || "상위 항목을 먼저 선택하세요";
}
if (loading) {
- return config.loadingMessage || "로딩 중...";
+ return config.loading_message || "로딩 중...";
}
if (options.length === 0) {
- return config.noOptionsMessage || "선택 가능한 항목이 없습니다";
+ return config.no_options_message || "선택 가능한 항목이 없습니다";
}
return placeholder || "선택하세요";
};
@@ -152,7 +152,7 @@ export function CascadingDropdown({
- {config.loadingMessage || "로딩 중..."}
+ {config.loading_message || "로딩 중..."}
) : (
@@ -163,8 +163,8 @@ export function CascadingDropdown({
{options.length === 0 ? (
{!parentValue
- ? config.emptyParentMessage || "상위 항목을 먼저 선택하세요"
- : config.noOptionsMessage || "선택 가능한 항목이 없습니다"}
+ ? config.empty_parent_message || "상위 항목을 먼저 선택하세요"
+ : config.no_options_message || "선택 가능한 항목이 없습니다"}
) : (
options.map((option) => (
diff --git a/frontend/components/common/ExcelUploadModal.tsx b/frontend/components/common/ExcelUploadModal.tsx
index 087df420..6f1316c8 100644
--- a/frontend/components/common/ExcelUploadModal.tsx
+++ b/frontend/components/common/ExcelUploadModal.tsx
@@ -257,7 +257,7 @@ export const ExcelUploadModal: React.FC
= ({
console.log("🔍 엔티티 데이터 조회:", refTable);
const response = await DynamicFormApi.getTableData(refTable, {
page: 1,
- pageSize: 1000,
+ page_size: 1000,
});
console.log("🔍 엔티티 데이터 응답:", response);
// getTableData는 { success, data: [...] } 형식으로 반환
@@ -521,12 +521,12 @@ export const ExcelUploadModal: React.FC = ({
const typeResponse = await getTableColumns(tbl);
if (typeResponse.success && typeResponse.data?.columns) {
for (const tc of typeResponse.data.columns) {
- if (tc.inputType === "numbering") {
+ if (tc.input_type === "numbering") {
try {
- const settings = typeof tc.detailSettings === "string"
- ? JSON.parse(tc.detailSettings) : tc.detailSettings;
+ const settings = typeof tc.detail_settings === "string"
+ ? JSON.parse(tc.detail_settings) : tc.detail_settings;
if (settings?.numberingRuleId) {
- numberingColSet.add(tc.columnName);
+ numberingColSet.add(tc.column_name);
}
} catch { /* 파싱 실패 무시 */ }
}
@@ -672,7 +672,7 @@ export const ExcelUploadModal: React.FC = ({
}
const categoryColumns = colResponse.data.columns.filter(
- (col: any) => col.inputType === "category"
+ (col: any) => col.input_type === "category"
);
if (categoryColumns.length === 0) {
@@ -693,13 +693,13 @@ export const ExcelUploadModal: React.FC = ({
: mapping.systemColumn;
const catCol = categoryColumns.find(
- (cc: any) => (cc.columnName || cc.column_name) === rawName
+ (cc: any) => cc.column_name === rawName
);
if (catCol) {
mappedCategoryColumns.push({
systemCol: rawName,
excelCol: mapping.excelColumn,
- displayName: catCol.displayName || catCol.display_name || rawName,
+ displayName: catCol.display_name || rawName,
});
}
}
@@ -968,18 +968,18 @@ export const ExcelUploadModal: React.FC = ({
if (response.success && response.data?.columns) {
for (const col of response.data.columns) {
- if (col.inputType === "numbering") {
+ if (col.input_type === "numbering") {
try {
const settings =
- typeof col.detailSettings === "string"
- ? JSON.parse(col.detailSettings)
- : col.detailSettings;
+ typeof col.detail_settings === "string"
+ ? JSON.parse(col.detail_settings)
+ : col.detail_settings;
if (settings?.numberingRuleId) {
console.log(
- `✅ 채번 컬럼 자동 감지: ${col.columnName} → 규칙 ID: ${settings.numberingRuleId}`
+ `✅ 채번 컬럼 자동 감지: ${col.column_name} → 규칙 ID: ${settings.numberingRuleId}`
);
return {
- columnName: col.columnName,
+ columnName: col.column_name,
numberingRuleId: settings.numberingRuleId,
};
}
@@ -1173,7 +1173,7 @@ export const ExcelUploadModal: React.FC = ({
// DynamicFormApi.getTableData 사용
const existingResponse = await DynamicFormApi.getTableData(tableName, {
page: 1,
- pageSize: 10000,
+ page_size: 10000,
});
console.log("📊 중복 체크용 기존 데이터 조회 결과:", existingResponse);
diff --git a/frontend/components/common/MultiColumnHierarchySelect.tsx b/frontend/components/common/MultiColumnHierarchySelect.tsx
index 1face82e..372174d3 100644
--- a/frontend/components/common/MultiColumnHierarchySelect.tsx
+++ b/frontend/components/common/MultiColumnHierarchySelect.tsx
@@ -275,8 +275,8 @@ export function MultiColumnHierarchySelect({
{largeOptions.map((code) => {
- const codeValue = code.codeValue || code.code_value || "";
- const codeName = code.codeName || code.code_name || "";
+ const codeValue = code.code_value || "";
+ const codeName = code.code_name || "";
return (
{codeName}
@@ -321,8 +321,8 @@ export function MultiColumnHierarchySelect({
) : (
mediumOptions.map((code) => {
- const codeValue = code.codeValue || code.code_value || "";
- const codeName = code.codeName || code.code_name || "";
+ const codeValue = code.code_value || "";
+ const codeName = code.code_name || "";
return (
{codeName}
@@ -368,8 +368,8 @@ export function MultiColumnHierarchySelect({
) : (
smallOptions.map((code) => {
- const codeValue = code.codeValue || code.code_value || "";
- const codeName = code.codeName || code.code_name || "";
+ const codeValue = code.code_value || "";
+ const codeName = code.code_name || "";
return (
{codeName}
diff --git a/frontend/components/common/MultiTableExcelUploadModal.tsx b/frontend/components/common/MultiTableExcelUploadModal.tsx
index 586ee0d7..21166b48 100644
--- a/frontend/components/common/MultiTableExcelUploadModal.tsx
+++ b/frontend/components/common/MultiTableExcelUploadModal.tsx
@@ -367,14 +367,14 @@ export const MultiTableExcelUploadModal: React.FC col.inputType === "category"
+ (col: any) => col.input_type === "category"
);
if (categoryColumns.length === 0) continue;
// 매핑된 컬럼 중 카테고리 타입인 것 찾기
for (const catCol of categoryColumns) {
- const catColName = catCol.columnName || catCol.column_name;
- const catDisplayName = catCol.displayName || catCol.display_name || catColName;
+ const catColName = catCol.column_name;
+ const catDisplayName = catCol.display_name || catColName;
// level.columns에서 해당 dbColumn 찾기
const levelCol = level.columns.find((lc) => lc.dbColumn === catColName);
diff --git a/frontend/components/common/ScreenModal.tsx b/frontend/components/common/ScreenModal.tsx
index 1d330d5b..00cd9b70 100644
--- a/frontend/components/common/ScreenModal.tsx
+++ b/frontend/components/common/ScreenModal.tsx
@@ -46,7 +46,7 @@ export const ScreenModal: React.FC = ({ className }) => {
const { userId, userName, user } = useAuth();
const splitPanelContext = useSplitPanelContext();
const tabId = useTabId();
- const activeTabId = useTabStore((s) => s[s.mode].activeTabId);
+ const activeTabId = useTabStore((s) => s[s.mode].active_tab_id);
const [modalState, setModalState] = useState({
isOpen: false,
@@ -112,12 +112,12 @@ export const ScreenModal: React.FC = ({ className }) => {
const bindingUpdates: Record = {};
for (const comp of screenData.components) {
const db =
- comp.componentConfig?.dataBinding ||
+ comp.component_config?.dataBinding ||
(comp as any).dataBinding;
if (!db?.sourceComponentId || !db?.sourceColumn) continue;
if (db.sourceComponentId !== detail.source) continue;
- const colName = (comp as any).columnName || comp.componentConfig?.columnName;
+ const colName = (comp as any).columnName || comp.component_config?.columnName;
if (!colName) continue;
const selectedRow = detail.data[0];
@@ -209,7 +209,7 @@ export const ScreenModal: React.FC = ({ className }) => {
const handleOpenModal = (event: CustomEvent) => {
// 활성 탭에서만 이벤트 처리 (다른 탭의 ScreenModal 인스턴스는 무시)
const storeState = useTabStore.getState();
- const currentActiveTabId = storeState[storeState.mode].activeTabId;
+ const currentActiveTabId = storeState[storeState.mode].active_tab_id;
if (tabId && tabId !== currentActiveTabId) return;
const {
@@ -290,7 +290,7 @@ export const ScreenModal: React.FC = ({ className }) => {
// 예: 설비의 manufacturer가 소모품의 manufacturer로 들어감
// parentDataMapping에서 명시된 필드만 추출
- const parentDataMapping = splitPanelContext?.parentDataMapping || [];
+ const parentDataMapping = splitPanelContext?.parent_data_mapping || [];
// 부모 데이터 소스
// 🔧 수정: 여러 소스를 병합 (우선순위: splitPanelParentData > selectedLeftData > 기존 formData의 링크 필드)
@@ -298,7 +298,7 @@ export const ScreenModal: React.FC = ({ className }) => {
// - splitPanelParentData: item_info 데이터 (screen 226에서 전달)
// - selectedLeftData: customer_mng 데이터 (SplitPanel 좌측 선택)
// - 기존 formData: 이전 모달에서 설정된 link 필드 (customer_code 등)
- const contextData = splitPanelContext?.selectedLeftData || {};
+ const contextData = splitPanelContext?.selected_left_data || {};
const eventData = splitPanelParentData && Object.keys(splitPanelParentData).length > 0
? splitPanelParentData
: {};
@@ -342,9 +342,9 @@ export const ScreenModal: React.FC = ({ className }) => {
// parentDataMapping에 정의된 필드만 전달
for (const mapping of parentDataMapping) {
- const sourceValue = rawParentData[mapping.sourceColumn];
+ const sourceValue = rawParentData[mapping.source_column];
if (sourceValue !== undefined && sourceValue !== null) {
- parentData[mapping.targetColumn] = sourceValue;
+ parentData[mapping.target_column] = sourceValue;
}
}
@@ -524,7 +524,7 @@ export const ScreenModal: React.FC = ({ className }) => {
const urlParams = new URLSearchParams(window.location.search);
const mode = urlParams.get("mode");
const editId = urlParams.get("editId");
- const tableName = urlParams.get("tableName") || screenInfo.tableName;
+ const tableName = urlParams.get("tableName") || screenInfo.table_name;
const groupByColumnsParam = urlParams.get("groupByColumns");
const primaryKeyColumn = urlParams.get("primaryKeyColumn"); // 🆕 Primary Key 컬럼명
@@ -723,7 +723,7 @@ export const ScreenModal: React.FC = ({ className }) => {
console.log("[ScreenModal] 조건부 레이어 로드 완료:", layerDefs.length, "개",
layerDefs.map((l) => ({
- id: l.id, name: l.name, conditionValue: l.conditionValue,
+ id: l.id, name: l.name, conditionValue: l.condition_value,
componentCount: l.components.length,
condition: l.condition,
}))
@@ -744,7 +744,7 @@ export const ScreenModal: React.FC = ({ className }) => {
conditionalLayers.forEach((layer) => {
if (!layer.condition) return;
- const { targetComponentId, operator, value } = layer.condition;
+ const { target_component_id: targetComponentId, operator, value } = layer.condition;
if (!targetComponentId) return;
// V2 레이아웃: overrides.columnName 우선
@@ -813,7 +813,7 @@ export const ScreenModal: React.FC = ({ className }) => {
const currentActiveLayerIds = conditionalLayers
.filter((layer) => {
if (!layer.condition) return false;
- const { targetComponentId, operator, value } = layer.condition;
+ const { target_component_id: targetComponentId, operator, value } = layer.condition;
if (!targetComponentId) return false;
const allComponents = screenData?.components || [];
@@ -1075,8 +1075,8 @@ export const ScreenModal: React.FC = ({ className }) => {
) : screenData ? (
diff --git a/frontend/components/dashboard/widgets/CargoListWidget.tsx b/frontend/components/dashboard/widgets/CargoListWidget.tsx
index 98eda797..6d7787fb 100644
--- a/frontend/components/dashboard/widgets/CargoListWidget.tsx
+++ b/frontend/components/dashboard/widgets/CargoListWidget.tsx
@@ -54,8 +54,8 @@ export default function CargoListWidget({ element }: CargoListWidgetProps) {
},
body: JSON.stringify({
query: element.dataSource.query,
- connection_type: element.dataSource.connection_type || "current",
- connectionId: element.dataSource.connectionId,
+ connection_type: element.dataSource.connectionType || "current",
+ connectionId: element.dataSource.externalConnectionId,
}),
});
diff --git a/frontend/components/dashboard/widgets/ChartTestWidget.tsx b/frontend/components/dashboard/widgets/ChartTestWidget.tsx
index 8e53587a..4fa7e4f3 100644
--- a/frontend/components/dashboard/widgets/ChartTestWidget.tsx
+++ b/frontend/components/dashboard/widgets/ChartTestWidget.tsx
@@ -111,8 +111,8 @@ export default function ChartTestWidget({ element }: ChartTestWidgetProps) {
}
const queryParams: Record = {};
- if (source.query_params) {
- source.query_params.forEach((param) => {
+ if (source.queryParams) {
+ source.queryParams.forEach((param) => {
if (param.key && param.value) {
queryParams[param.key] = param.value;
}
@@ -150,15 +150,15 @@ export default function ChartTestWidget({ element }: ChartTestWidgetProps) {
}
let apiData = result.data;
- if (source.json_path) {
- const pathParts = source.json_path.split(".");
+ if (source.jsonPath) {
+ const pathParts = source.jsonPath.split(".");
for (const part of pathParts) {
apiData = apiData?.[part];
}
}
const rows = Array.isArray(apiData) ? apiData : [apiData];
- return applyColumnMapping(rows, source.column_mapping);
+ return applyColumnMapping(rows, source.columnMapping);
};
// Database 데이터 로딩
@@ -168,9 +168,9 @@ export default function ChartTestWidget({ element }: ChartTestWidgetProps) {
}
let result;
- if (source.connection_type === "external" && source.external_connection_id) {
+ if (source.connectionType === "external" && source.externalConnectionId) {
const { ExternalDbConnectionAPI } = await import("@/lib/api/externalDbConnection");
- result = await ExternalDbConnectionAPI.executeQuery(parseInt(source.external_connection_id), source.query);
+ result = await ExternalDbConnectionAPI.executeQuery(parseInt(source.externalConnectionId), source.query);
} else {
const { dashboardApi } = await import("@/lib/api/dashboard");
@@ -190,8 +190,8 @@ export default function ChartTestWidget({ element }: ChartTestWidgetProps) {
throw new Error(result.message || "쿼리 실패");
}
- const rows = result.rows || result.data || [];
- return applyColumnMapping(rows, source.column_mapping);
+ const rows = (result as any).rows || result.data || [];
+ return applyColumnMapping(rows, source.columnMapping);
};
// 초기 로드
@@ -206,7 +206,7 @@ export default function ChartTestWidget({ element }: ChartTestWidgetProps) {
if (!dataSources || dataSources.length === 0) return;
const intervals = dataSources
- .map((ds) => ds.refresh_interval)
+ .map((ds) => ds.refreshInterval)
.filter((interval): interval is number => typeof interval === "number" && interval > 0);
if (intervals.length === 0) return;
diff --git a/frontend/components/dashboard/widgets/CustomerIssuesWidget.tsx b/frontend/components/dashboard/widgets/CustomerIssuesWidget.tsx
index 892bed18..33b47f15 100644
--- a/frontend/components/dashboard/widgets/CustomerIssuesWidget.tsx
+++ b/frontend/components/dashboard/widgets/CustomerIssuesWidget.tsx
@@ -55,8 +55,8 @@ export default function CustomerIssuesWidget({ element }: CustomerIssuesWidgetPr
},
body: JSON.stringify({
query: element.dataSource.query,
- connection_type: element.dataSource.connection_type || "current",
- connectionId: element.dataSource.connectionId,
+ connection_type: element.dataSource.connectionType || "current",
+ connectionId: element.dataSource.externalConnectionId,
}),
});
diff --git a/frontend/components/dashboard/widgets/DeliveryStatusSummaryWidget.tsx b/frontend/components/dashboard/widgets/DeliveryStatusSummaryWidget.tsx
index 090e3036..6186d2bc 100644
--- a/frontend/components/dashboard/widgets/DeliveryStatusSummaryWidget.tsx
+++ b/frontend/components/dashboard/widgets/DeliveryStatusSummaryWidget.tsx
@@ -49,7 +49,7 @@ export default function DeliveryStatusSummaryWidget({ element }: DeliveryStatusS
body: JSON.stringify({
query: element.dataSource.query,
connectionType: element.dataSource.connectionType || "current",
- connectionId: element.dataSource.connectionId,
+ connectionId: element.dataSource.externalConnectionId,
}),
});
diff --git a/frontend/components/dashboard/widgets/DeliveryTodayStatsWidget.tsx b/frontend/components/dashboard/widgets/DeliveryTodayStatsWidget.tsx
index 6655bc11..a4d70fee 100644
--- a/frontend/components/dashboard/widgets/DeliveryTodayStatsWidget.tsx
+++ b/frontend/components/dashboard/widgets/DeliveryTodayStatsWidget.tsx
@@ -50,7 +50,7 @@ export default function DeliveryTodayStatsWidget({ element }: DeliveryTodayStats
body: JSON.stringify({
query: element.dataSource.query,
connectionType: element.dataSource.connectionType || "current",
- connectionId: element.dataSource.connectionId,
+ connectionId: element.dataSource.externalConnectionId,
}),
});
diff --git a/frontend/components/dashboard/widgets/ExchangeWidget.tsx b/frontend/components/dashboard/widgets/ExchangeWidget.tsx
index d9d9b63b..415c2b01 100644
--- a/frontend/components/dashboard/widgets/ExchangeWidget.tsx
+++ b/frontend/components/dashboard/widgets/ExchangeWidget.tsx
@@ -270,7 +270,7 @@ export default function ExchangeWidget({
{/* 데이터 출처 */}
-
출처: {exchangeRate.source}
+
출처: 환율 API
);
diff --git a/frontend/components/dashboard/widgets/WorkHistoryWidget.tsx b/frontend/components/dashboard/widgets/WorkHistoryWidget.tsx
index 0e62abef..cff82241 100644
--- a/frontend/components/dashboard/widgets/WorkHistoryWidget.tsx
+++ b/frontend/components/dashboard/widgets/WorkHistoryWidget.tsx
@@ -43,7 +43,7 @@ export default function WorkHistoryWidget({ element, refreshInterval = 60000 }:
body: JSON.stringify({
query: element.dataSource.query,
connectionType: element.dataSource.connectionType || "current",
- connectionId: element.dataSource.connectionId,
+ connectionId: element.dataSource.externalConnectionId,
}),
});
diff --git a/frontend/components/dataflow/ConnectionSetupModal.tsx b/frontend/components/dataflow/ConnectionSetupModal.tsx
index d2ddf035..d1ba0e2b 100644
--- a/frontend/components/dataflow/ConnectionSetupModal.tsx
+++ b/frontend/components/dataflow/ConnectionSetupModal.tsx
@@ -12,6 +12,7 @@ import {
import {
AlertDialog,
AlertDialogAction,
+ AlertDialogFooter,
AlertDialogContent,
AlertDialogHeader,
AlertDialogTitle,
@@ -43,15 +44,15 @@ import { toast } from "sonner";
export const ConnectionSetupModal: React.FC = ({
isOpen,
connection,
- companyCode,
+ company_code: companyCode,
onConfirm,
onCancel,
}) => {
const [config, setConfig] = useState({
- relationshipName: "",
- connectionType: "simple-key",
- fromColumnName: "",
- toColumnName: "",
+ relationship_name: "",
+ connection_type: "simple-key",
+ from_column_name: "",
+ to_column_name: "",
settings: {},
});
@@ -125,28 +126,28 @@ export const ConnectionSetupModal: React.FC = ({
actions: actionsData.map((action: Record) => ({
id: (action.id as string) || `action-${Date.now()}`,
name: (action.name as string) || "새 액션",
- actionType: (action.actionType as "insert" | "update" | "delete" | "upsert") || "insert",
+ action_type: (action.action_type as "insert" | "update" | "delete" | "upsert") || "insert",
conditions: Array.isArray(action.conditions)
? (action.conditions as ConditionNode[]).map((condition) => ({
...condition,
operator: condition.operator || "=", // 기본값 보장
}))
: [],
- fieldMappings: Array.isArray(action.fieldMappings)
- ? action.fieldMappings.map((mapping: Record) => ({
- sourceTable: (mapping.sourceTable as string) || "",
- sourceField: (mapping.sourceField as string) || "",
- targetTable: (mapping.targetTable as string) || "",
- targetField: (mapping.targetField as string) || "",
- defaultValue: (mapping.defaultValue as string) || "",
- transformFunction: (mapping.transformFunction as string) || "",
+ field_mappings: Array.isArray(action.field_mappings)
+ ? action.field_mappings.map((mapping: Record) => ({
+ source_table: (mapping.source_table as string) || "",
+ source_field: (mapping.source_field as string) || "",
+ target_table: (mapping.target_table as string) || "",
+ target_field: (mapping.target_field as string) || "",
+ default_value: (mapping.default_value as string) || "",
+ transform_function: (mapping.transformFunction as string) || "",
}))
: [],
- splitConfig: action.splitConfig
+ split_config: action.split_config
? {
- sourceField: ((action.splitConfig as Record).sourceField as string) || "",
- delimiter: ((action.splitConfig as Record).delimiter as string) || ",",
- targetField: ((action.splitConfig as Record).targetField as string) || "",
+ source_field: ((action.split_config as Record).source_field as string) || "",
+ delimiter: ((action.split_config as Record).delimiter as string) || ",",
+ target_field: ((action.split_config as Record).target_field as string) || "",
}
: undefined,
})),
@@ -178,8 +179,8 @@ export const ConnectionSetupModal: React.FC = ({
}
setExternalCallSettings({
- configId: (externalCallData.configId as number) || undefined,
- configName: (externalCallData.configName as string) || undefined,
+ config_id: (externalCallData.config_id as number) || undefined,
+ config_name: (externalCallData.config_name as string) || undefined,
message: (externalCallData.message as string) || "",
});
}
@@ -210,25 +211,25 @@ export const ConnectionSetupModal: React.FC = ({
// 모달이 열릴 때마다 캐시 초기화 (라벨 업데이트 반영)
setTableColumnsCache({});
- const fromTableName = connection.fromNode.tableName;
- const toTableName = connection.toNode.tableName;
- const fromDisplayName = connection.fromNode.displayName;
- const toDisplayName = connection.toNode.displayName;
+ const fromTableName = connection.from_node.table_name;
+ const toTableName = connection.to_node.table_name;
+ const fromDisplayName = connection.from_node.display_name;
+ const toDisplayName = connection.to_node.display_name;
// 테이블 선택 설정
setSelectedFromTable(fromTableName);
setSelectedToTable(toTableName);
// 기존 관계 정보가 있으면 사용, 없으면 기본값 설정
- const existingRel = connection.existingRelationship;
+ const existingRel = connection.existing_relationship;
const connectionType =
- (existingRel?.connectionType as "simple-key" | "data-save" | "external-call") || "simple-key";
+ (existingRel?.connection_type as "simple-key" | "data-save" | "external-call") || "simple-key";
setConfig({
- relationshipName: existingRel?.relationshipName || `${fromDisplayName} → ${toDisplayName}`,
- connectionType,
- fromColumnName: "",
- toColumnName: "",
+ relationship_name: existingRel?.relationship_name || `${fromDisplayName} → ${toDisplayName}`,
+ connection_type: connectionType,
+ from_column_name: "",
+ to_column_name: "",
settings: existingRel?.settings || {},
});
@@ -248,17 +249,17 @@ export const ConnectionSetupModal: React.FC = ({
setSelectedToColumns([]);
// 선택된 컬럼 정보가 있다면 설정
- if (connection.selectedColumnsData) {
- const fromColumns = connection.selectedColumnsData[fromTableName]?.columns || [];
- const toColumns = connection.selectedColumnsData[toTableName]?.columns || [];
+ if (connection.selected_columns_data) {
+ const fromColumns = connection.selected_columns_data[fromTableName]?.columns || [];
+ const toColumns = connection.selected_columns_data[toTableName]?.columns || [];
setSelectedFromColumns(fromColumns);
setSelectedToColumns(toColumns);
setConfig((prev) => ({
...prev,
- fromColumnName: fromColumns.join(", "),
- toColumnName: toColumns.join(", "),
+ from_column_name: fromColumns.join(", "),
+ to_column_name: toColumns.join(", "),
}));
}
}
@@ -302,8 +303,8 @@ export const ConnectionSetupModal: React.FC = ({
useEffect(() => {
setConfig((prev) => ({
...prev,
- fromColumnName: selectedFromColumns.join(", "),
- toColumnName: selectedToColumns.join(", "),
+ from_column_name: selectedFromColumns.join(", "),
+ to_column_name: selectedToColumns.join(", "),
}));
}, [selectedFromColumns, selectedToColumns]);
@@ -333,12 +334,12 @@ export const ConnectionSetupModal: React.FC = ({
// 필드 매핑에서 사용되는 모든 테이블 수집
dataSaveSettings.actions?.forEach((action) => {
- action.fieldMappings?.forEach((mapping) => {
- if (mapping.sourceTable && !tableColumnsCache[mapping.sourceTable]) {
- tablesToLoad.add(mapping.sourceTable);
+ action.field_mappings?.forEach((mapping) => {
+ if (mapping.source_table && !tableColumnsCache[mapping.source_table]) {
+ tablesToLoad.add(mapping.source_table);
}
- if (mapping.targetTable && !tableColumnsCache[mapping.targetTable]) {
- tablesToLoad.add(mapping.targetTable);
+ if (mapping.target_table && !tableColumnsCache[mapping.target_table]) {
+ tablesToLoad.add(mapping.target_table);
}
});
});
@@ -353,7 +354,7 @@ export const ConnectionSetupModal: React.FC = ({
}, [dataSaveSettings.actions, tableColumnsCache]); // eslint-disable-line react-hooks/exhaustive-deps
const handleConfirm = () => {
- if (!config.relationshipName || !connection) {
+ if (!config.relationship_name || !connection) {
toast.error("필수 정보를 모두 입력해주세요.");
return;
}
@@ -362,7 +363,7 @@ export const ConnectionSetupModal: React.FC = ({
let settings = {};
let plan = {}; // plan 변수 선언
- switch (config.connectionType) {
+ switch (config.connection_type) {
case "simple-key":
settings = simpleKeySettings;
break;
@@ -371,10 +372,10 @@ export const ConnectionSetupModal: React.FC = ({
// INSERT가 아닌 액션 타입에 대한 실행조건 필수 검증
for (const action of dataSaveSettings.actions) {
- if (action.actionType !== "insert") {
+ if (action.action_type !== "insert") {
if (!action.conditions || action.conditions.length === 0) {
toast.error(
- `${action.actionType.toUpperCase()} 액션은 실행조건이 필수입니다. '${action.name}' 액션에 실행조건을 추가해주세요.`,
+ `${action.action_type.toUpperCase()} 액션은 실행조건이 필수입니다. '${action.name}' 액션에 실행조건을 추가해주세요.`,
);
return;
}
@@ -393,7 +394,7 @@ export const ConnectionSetupModal: React.FC = ({
if (!hasValidConditions) {
toast.error(
- `${action.actionType.toUpperCase()} 액션은 완전한 실행조건이 필요합니다. '${action.name}' 액션에 필드, 연산자, 값을 모두 설정해주세요.`,
+ `${action.action_type.toUpperCase()} 액션은 완전한 실행조건이 필요합니다. '${action.name}' 액션에 필드, 연산자, 값을 모두 설정해주세요.`,
);
return;
}
@@ -410,7 +411,7 @@ export const ConnectionSetupModal: React.FC = ({
// 기존 설정 호환성 유지
plan = {
externalCall: {
- configId: externalCallSettings.configId,
+ configId: externalCallSettings.config_id,
configName: externalCallSettings.configName,
message: externalCallSettings.message,
},
@@ -421,7 +422,7 @@ export const ConnectionSetupModal: React.FC = ({
}
// 단순 키값 연결일 때만 컬럼 선택 검증
- if (config.connectionType === "simple-key") {
+ if (config.connection_type === "simple-key") {
if (selectedFromColumns.length === 0 || selectedToColumns.length === 0) {
toast.error("선택된 컬럼이 없습니다. From과 To 테이블에서 각각 최소 1개 이상의 컬럼을 선택해주세요.");
return;
@@ -429,26 +430,26 @@ export const ConnectionSetupModal: React.FC = ({
}
// 선택된 테이블과 컬럼 정보 사용
- const fromTableName = selectedFromTable || connection.fromNode.tableName;
- const toTableName = selectedToTable || connection.toNode.tableName;
+ const fromTableName = selectedFromTable || connection.from_node.table_name;
+ const toTableName = selectedToTable || connection.to_node.table_name;
// 조건부 연결 설정 데이터 준비
- const conditionalSettings = isConditionalConnection(config.connectionType)
+ const conditionalSettings = isConditionalConnection(config.connection_type)
? {
control: {
triggerType: "insert",
conditionTree: conditions.length > 0 ? conditions : null,
},
category: {
- type: config.connectionType,
+ type: config.connection_type,
},
plan: {
sourceTable: fromTableName,
targetActions:
- config.connectionType === "data-save"
+ config.connection_type === "data-save"
? dataSaveSettings.actions.map((action) => ({
id: action.id,
- actionType: action.actionType,
+ actionType: action.action_type,
enabled: true,
conditions:
action.conditions?.map((condition) => {
@@ -459,15 +460,15 @@ export const ConnectionSetupModal: React.FC = ({
}
return baseCondition;
}) || [],
- fieldMappings: action.fieldMappings.map((mapping) => ({
- sourceTable: mapping.sourceTable,
- sourceField: mapping.sourceField,
- targetTable: mapping.targetTable,
- targetField: mapping.targetField,
- defaultValue: mapping.defaultValue,
- transformFunction: mapping.transformFunction,
+ fieldMappings: action.field_mappings.map((mapping) => ({
+ sourceTable: mapping.source_table,
+ sourceField: mapping.source_field,
+ targetTable: mapping.target_table,
+ targetField: mapping.target_field,
+ defaultValue: mapping.default_value,
+ transformFunction: mapping.transform_function,
})),
- splitConfig: action.splitConfig,
+ splitConfig: action.split_config,
}))
: [],
},
@@ -475,17 +476,17 @@ export const ConnectionSetupModal: React.FC = ({
: {};
// 컬럼 정보는 단순 키값 연결일 때만 사용
- const finalFromColumns = config.connectionType === "simple-key" ? selectedFromColumns : [];
- const finalToColumns = config.connectionType === "simple-key" ? selectedToColumns : [];
+ const finalFromColumns = config.connection_type === "simple-key" ? selectedFromColumns : [];
+ const finalToColumns = config.connection_type === "simple-key" ? selectedToColumns : [];
// 메모리 기반 시스템: 관계 데이터만 생성하여 부모로 전달
const relationshipData: TableRelationship = {
- relationship_name: config.relationshipName,
+ relationship_name: config.relationship_name,
from_table_name: fromTableName,
to_table_name: toTableName,
from_column_name: finalFromColumns.join(","), // 여러 컬럼을 콤마로 구분
to_column_name: finalToColumns.join(","), // 여러 컬럼을 콤마로 구분
- connection_type: config.connectionType,
+ connection_type: config.connection_type,
company_code: companyCode,
settings: {
...settings,
@@ -495,17 +496,17 @@ export const ConnectionSetupModal: React.FC = ({
};
// 성공 모달 표시를 위한 상태 설정
- setCreatedConnectionName(config.relationshipName);
+ setCreatedConnectionName(config.relationship_name);
setPendingRelationshipData(relationshipData);
setShowSuccessModal(true);
};
const handleCancel = () => {
setConfig({
- relationshipName: "",
- connectionType: "simple-key",
- fromColumnName: "",
- toColumnName: "",
+ relationship_name: "",
+ connection_type: "simple-key",
+ from_column_name: "",
+ to_column_name: "",
});
onCancel();
};
@@ -525,10 +526,10 @@ export const ConnectionSetupModal: React.FC = ({
// 연결 종류별 설정 패널 렌더링
const renderConnectionTypeSettings = () => {
- console.log("🔍 [ConnectionSetupModal] renderConnectionTypeSettings - connectionType:", config.connectionType);
+ console.log("🔍 [ConnectionSetupModal] renderConnectionTypeSettings - connectionType:", config.connection_type);
console.log("🔍 [ConnectionSetupModal] externalCallConfig:", externalCallConfig);
- switch (config.connectionType) {
+ switch (config.connection_type) {
case "simple-key":
return (
= ({
console.log("🚀 [ConnectionSetupModal] Rendering ExternalCallPanel");
return (
);
@@ -577,11 +578,11 @@ export const ConnectionSetupModal: React.FC = ({
const isButtonDisabled = () => {
// 공통 검증: 관계 이름은 필수
- const hasRelationshipName = !!config.relationshipName?.trim();
+ const hasRelationshipName = !!config.relationship_name?.trim();
if (!hasRelationshipName) return true;
// 연결 타입별 검증
- switch (config.connectionType) {
+ switch (config.connection_type) {
case "simple-key":
// 단순 키값 연결: From과 To 컬럼이 모두 선택되어야 함
const hasFromColumns = selectedFromColumns.length > 0;
@@ -594,32 +595,32 @@ export const ConnectionSetupModal: React.FC = ({
// DELETE 액션은 필드 매핑이 필요 없음
const allActionsHaveMappings = dataSaveSettings.actions.every((action) => {
- if (action.actionType === "delete") {
+ if (action.action_type === "delete") {
return true; // DELETE는 필드 매핑 불필요
}
- return action.fieldMappings.length > 0;
+ return action.field_mappings.length > 0;
});
const allMappingsComplete = dataSaveSettings.actions.every((action) => {
- if (action.actionType === "delete") {
+ if (action.action_type === "delete") {
return true; // DELETE는 필드 매핑 검증 생략
}
// INSERT 액션의 경우 최소 하나의 매핑이 있으면 됨 (모든 컬럼 매핑 필수 조건 제거)
- if (action.actionType === "insert") {
+ if (action.action_type === "insert") {
return true; // 필드 매핑이 있으면 충분함
}
- return action.fieldMappings.every((mapping) => {
+ return action.field_mappings.every((mapping) => {
// 타겟은 항상 필요
- if (!mapping.targetTable || !mapping.targetField) return false;
+ if (!mapping.target_table || !mapping.target_field) return false;
// 소스와 기본값 중 하나는 있어야 함
- const hasSource = mapping.sourceTable && mapping.sourceField;
- const hasDefault = mapping.defaultValue && mapping.defaultValue.trim();
+ const hasSource = mapping.source_table && mapping.source_field;
+ const hasDefault = mapping.default_value && mapping.default_value.trim();
// FROM 테이블이 비어있으면 기본값이 필요
- if (!mapping.sourceTable) {
+ if (!mapping.source_table) {
return !!hasDefault;
}
@@ -630,7 +631,7 @@ export const ConnectionSetupModal: React.FC = ({
// INSERT가 아닌 액션 타입에 대한 실행조건 필수 검증
const allRequiredConditionsMet = dataSaveSettings.actions.every((action) => {
- if (action.actionType === "insert") {
+ if (action.action_type === "insert") {
return true; // INSERT는 조건 불필요
}
@@ -659,9 +660,9 @@ export const ConnectionSetupModal: React.FC = ({
case "external-call":
// 외부 호출: 새로운 설정이 있으면 API URL 검증, 없으면 기존 설정 검증
if (externalCallConfig) {
- return !externalCallConfig.restApiSettings?.apiUrl?.trim();
+ return !externalCallConfig.rest_api_settings?.apiUrl?.trim();
} else {
- return !externalCallSettings.configId || !externalCallSettings.message?.trim();
+ return !externalCallSettings.config_id || !externalCallSettings.message?.trim();
}
default:
@@ -689,7 +690,7 @@ export const ConnectionSetupModal: React.FC = ({
setConfig({ ...config, relationshipName: e.target.value })}
placeholder="employee_id_department_id_연결"
className="text-sm"
@@ -701,11 +702,11 @@ export const ConnectionSetupModal: React.FC = ({
{/* 조건부 연결을 위한 조건 설정 */}
- {isConditionalConnection(config.connectionType) && (
+ {isConditionalConnection(config.connection_type) && (
> = ({
+export const CustomEdge: React.FC>> = ({
id,
sourceX,
sourceY,
diff --git a/frontend/components/dataflow/DataFlowDesigner.tsx b/frontend/components/dataflow/DataFlowDesigner.tsx
index 111ac773..27bc8402 100644
--- a/frontend/components/dataflow/DataFlowDesigner.tsx
+++ b/frontend/components/dataflow/DataFlowDesigner.tsx
@@ -33,8 +33,8 @@ const nodeTypes = {
const edgeTypes = {};
export const DataFlowDesigner: React.FC = ({
- companyCode: propCompanyCode = "*",
- diagramId,
+ company_code: propCompanyCode = "*",
+ diagram_id: diagramId,
}) => {
const { user: authUser } = useAuth();
@@ -113,6 +113,7 @@ export const DataFlowDesigner: React.FC = ({
fromColumns: Array.isArray(rel.fromColumns) ? rel.fromColumns : [],
toColumns: Array.isArray(rel.toColumns) ? rel.toColumns : [],
connectionType: rel.connectionType || "simple-key",
+ connection_type: (rel.connectionType || "simple-key") as "simple-key" | "data-save" | "external-call",
relationshipName: rel.relationshipName || "",
note: rel.note || "", // 🔥 연결 설명 로드
}));
@@ -140,8 +141,8 @@ export const DataFlowDesigner: React.FC = ({
},
data: {
table: {
- tableName,
- displayName: tableName,
+ table_name: tableName,
+ display_name: tableName,
description: "",
columns: Array.isArray(columns)
? columns.map((col) => ({
@@ -152,8 +153,8 @@ export const DataFlowDesigner: React.FC = ({
: [],
},
onColumnClick: handleColumnClick,
- selectedColumns: [],
- connectedColumns: {},
+ selected_columns: [],
+ connected_columns: {},
},
selected: false,
};
@@ -168,14 +169,14 @@ export const DataFlowDesigner: React.FC = ({
},
data: {
table: {
- tableName,
- displayName: tableName,
+ table_name: tableName,
+ display_name: tableName,
description: "",
columns: [],
},
onColumnClick: handleColumnClick,
- selectedColumns: [],
- connectedColumns: {},
+ selected_columns: [],
+ connected_columns: {},
},
selected: false,
};
@@ -279,24 +280,20 @@ export const DataFlowDesigner: React.FC = ({
position: { x: Math.random() * 300, y: Math.random() * 200 },
data: {
table: {
- tableName: table.tableName,
- displayName: table.displayName || table.tableName,
+ table_name: table.tableName,
+ display_name: table.displayName || table.tableName,
description: "", // 새로 추가된 노드는 description 없이 통일
columns: Array.isArray(table.columns)
? table.columns.map((col) => ({
- columnName: col.columnName || "unknown",
- name: col.columnName || "unknown", // 호환성을 위해 유지
- displayName: col.displayName, // 한국어 라벨
- columnLabel: col.columnLabel, // 한국어 라벨
+ name: col.columnName || "unknown",
type: col.dataType || "varchar",
- dataType: col.dataType || "varchar",
description: col.description || "",
}))
: [],
},
onColumnClick: handleColumnClick,
- selectedColumns: selectedColumns[table.tableName] || [],
- connectedColumns: {}, // 새로 추가된 노드는 연결 정보 없음
+ selected_columns: selectedColumns[table.tableName] || [],
+ connected_columns: {}, // 새로 추가된 노드는 연결 정보 없음
},
};
@@ -470,15 +467,15 @@ export const DataFlowDesigner: React.FC = ({
if (!firstNode || !secondNode) return;
setPendingConnection({
- fromNode: {
+ from_node: {
id: firstNode.id,
- tableName: firstNode.data.table.tableName,
- displayName: firstNode.data.table.displayName,
+ table_name: firstNode.data.table.table_name,
+ display_name: firstNode.data.table.display_name,
},
- toNode: {
+ to_node: {
id: secondNode.id,
- tableName: secondNode.data.table.tableName,
- displayName: secondNode.data.table.displayName,
+ table_name: secondNode.data.table.table_name,
+ display_name: secondNode.data.table.display_name,
},
});
};
@@ -497,6 +494,7 @@ export const DataFlowDesigner: React.FC = ({
fromColumns: relationshipData.from_column_name ? relationshipData.from_column_name.split(",") : [],
toColumns: relationshipData.to_column_name ? relationshipData.to_column_name.split(",") : [],
connectionType: relationshipData.connection_type as "simple-key" | "data-save" | "external-call",
+ connection_type: relationshipData.connection_type as "simple-key" | "data-save" | "external-call",
relationshipName: relationshipData.relationship_name,
note: (relationshipData.settings as any)?.notes || "", // 🔥 notes를 note로 변환
settings: relationshipData.settings || {},
@@ -537,6 +535,7 @@ export const DataFlowDesigner: React.FC = ({
fromColumns: relationshipData.from_column_name ? relationshipData.from_column_name.split(",") : [],
toColumns: relationshipData.to_column_name ? relationshipData.to_column_name.split(",") : [],
connectionType: relationshipData.connection_type as "simple-key" | "data-save" | "external-call",
+ connection_type: relationshipData.connection_type as "simple-key" | "data-save" | "external-call",
relationshipName: relationshipData.relationship_name,
note: (relationshipData.settings as any)?.notes || "", // 🔥 notes를 note로 변환
settings: relationshipData.settings || {},
@@ -650,8 +649,8 @@ export const DataFlowDesigner: React.FC = ({
.filter((rel) => rel.settings?.control)
.map((rel) => ({
id: rel.id,
- triggerType: rel.settings?.control?.triggerType || "insert",
- conditions: (rel.settings?.control?.conditionTree || []).map((condition: Record) => ({
+ triggerType: rel.settings?.control?.trigger_type || "insert",
+ conditions: (rel.settings?.control?.condition_tree || []).map((condition: Record) => ({
...condition,
logicalOperator:
condition.logicalOperator === "AND" || condition.logicalOperator === "OR"
@@ -909,12 +908,12 @@ export const DataFlowDesigner: React.FC = ({
@@ -933,41 +932,41 @@ export const DataFlowDesigner: React.FC = ({
onEdit={() => {
if (selectedEdgeInfo) {
// 기존 관계 찾기
- const existingRelationship = tempRelationships.find((rel) => rel.id === selectedEdgeInfo.relationshipId);
+ const existingRelationship = tempRelationships.find((rel) => rel.id === selectedEdgeInfo.relationship_id);
if (existingRelationship) {
// 편집 모드로 설정
- setEditingRelationshipId(selectedEdgeInfo.relationshipId);
+ setEditingRelationshipId(selectedEdgeInfo.relationship_id);
// 연결 설정 모달 열기
- const fromTable = nodes.find((node) => node.data?.table?.tableName === selectedEdgeInfo.fromTable);
- const toTable = nodes.find((node) => node.data?.table?.tableName === selectedEdgeInfo.toTable);
+ const fromTable = nodes.find((node) => node.data?.table?.table_name === selectedEdgeInfo.from_table);
+ const toTable = nodes.find((node) => node.data?.table?.table_name === selectedEdgeInfo.to_table);
if (fromTable && toTable) {
setPendingConnection({
- fromNode: {
+ from_node: {
id: fromTable.id,
- tableName: selectedEdgeInfo.fromTable,
- displayName: fromTable.data?.table?.displayName || selectedEdgeInfo.fromTable,
+ table_name: selectedEdgeInfo.from_table,
+ display_name: fromTable.data?.table?.display_name || selectedEdgeInfo.from_table,
},
- toNode: {
+ to_node: {
id: toTable.id,
- tableName: selectedEdgeInfo.toTable,
- displayName: toTable.data?.table?.displayName || selectedEdgeInfo.toTable,
+ table_name: selectedEdgeInfo.to_table,
+ display_name: toTable.data?.table?.display_name || selectedEdgeInfo.to_table,
},
- selectedColumnsData: {
- [selectedEdgeInfo.fromTable]: {
- displayName: fromTable.data?.table?.displayName || selectedEdgeInfo.fromTable,
- columns: selectedEdgeInfo.fromColumns || [],
+ selected_columns_data: {
+ [selectedEdgeInfo.from_table]: {
+ display_name: fromTable.data?.table?.display_name || selectedEdgeInfo.from_table,
+ columns: selectedEdgeInfo.from_columns || [],
},
- [selectedEdgeInfo.toTable]: {
- displayName: toTable.data?.table?.displayName || selectedEdgeInfo.toTable,
- columns: selectedEdgeInfo.toColumns || [],
+ [selectedEdgeInfo.to_table]: {
+ display_name: toTable.data?.table?.display_name || selectedEdgeInfo.to_table,
+ columns: selectedEdgeInfo.to_columns || [],
},
},
- existingRelationship: {
- relationshipName: existingRelationship.relationshipName,
- connectionType: existingRelationship.connectionType,
+ existing_relationship: {
+ relationship_name: existingRelationship.relationshipName,
+ connection_type: existingRelationship.connectionType,
settings: existingRelationship.settings,
},
});
@@ -983,10 +982,10 @@ export const DataFlowDesigner: React.FC = ({
onDelete={() => {
if (selectedEdgeInfo) {
// 관계 삭제
- setTempRelationships((prev) => prev.filter((rel) => rel.id !== selectedEdgeInfo.relationshipId));
+ setTempRelationships((prev) => prev.filter((rel) => rel.id !== selectedEdgeInfo.relationship_id));
// 엣지 삭제
- setEdges((prev) => prev.filter((edge) => edge.data?.relationshipId !== selectedEdgeInfo.relationshipId));
+ setEdges((prev) => prev.filter((edge) => edge.data?.relationshipId !== selectedEdgeInfo.relationship_id));
// 변경사항 표시
setHasUnsavedChanges(true);
diff --git a/frontend/components/dataflow/DataFlowSidebar.tsx b/frontend/components/dataflow/DataFlowSidebar.tsx
index 0b9162f6..2e0db80f 100644
--- a/frontend/components/dataflow/DataFlowSidebar.tsx
+++ b/frontend/components/dataflow/DataFlowSidebar.tsx
@@ -7,7 +7,7 @@ import { ExtendedJsonRelationship } from "@/types/dataflowTypes";
interface DataFlowSidebarProps {
companyCode: string;
- nodes: Array<{ id: string; data: { table: { tableName: string } } }>;
+ nodes: Array<{ id: string; data: { table: { table_name: string } } }>;
edges: Array<{ id: string }>;
tempRelationships: ExtendedJsonRelationship[];
hasUnsavedChanges: boolean;
diff --git a/frontend/components/dataflow/EdgeInfoPanel.tsx b/frontend/components/dataflow/EdgeInfoPanel.tsx
index 676755a2..f478b8a5 100644
--- a/frontend/components/dataflow/EdgeInfoPanel.tsx
+++ b/frontend/components/dataflow/EdgeInfoPanel.tsx
@@ -39,7 +39,7 @@ export const EdgeInfoPanel: React.FC = ({
🔗
-
{edgeInfo.relationshipName}
+
{edgeInfo.relationship_name}
데이터 관계 정보
@@ -57,7 +57,7 @@ export const EdgeInfoPanel: React.FC = ({
연결 유형
- {edgeInfo.connectionType}
+ {edgeInfo.connection_type}
@@ -68,10 +68,10 @@ export const EdgeInfoPanel: React.FC = ({
{/* From 테이블 */}
FROM
-
{edgeInfo.fromTable}
+
{edgeInfo.from_table}
- {edgeInfo.fromColumns.map((column, index) => (
+ {edgeInfo.from_columns.map((column, index) => (
= ({
{/* To 테이블 */}
TO
-
{edgeInfo.toTable}
+
{edgeInfo.to_table}
- {edgeInfo.toColumns.map((column, index) => (
+ {edgeInfo.to_columns.map((column, index) => (
= ({
}
// 연결 설정 모달 열기
- const fromTable = nodes.find((node) => node.data?.table?.tableName === relationship.fromTable);
- const toTable = nodes.find((node) => node.data?.table?.tableName === relationship.toTable);
+ const fromTable = nodes.find((node) => node.data?.table?.table_name === relationship.fromTable);
+ const toTable = nodes.find((node) => node.data?.table?.table_name === relationship.toTable);
if (fromTable && toTable) {
onSetPendingConnection({
fromNode: {
id: fromTable.id,
tableName: relationship.fromTable,
- displayName: fromTable.data?.table?.displayName || relationship.fromTable,
+ displayName: fromTable.data?.table?.display_name || relationship.fromTable,
},
toNode: {
id: toTable.id,
tableName: relationship.toTable,
- displayName: toTable.data?.table?.displayName || relationship.toTable,
+ displayName: toTable.data?.table?.display_name || relationship.toTable,
},
selectedColumnsData: {
[relationship.fromTable]: {
- displayName: fromTable.data?.table?.displayName || relationship.fromTable,
+ displayName: fromTable.data?.table?.display_name || relationship.fromTable,
columns: relationship.fromColumns || [],
},
[relationship.toTable]: {
- displayName: toTable.data?.table?.displayName || relationship.toTable,
+ displayName: toTable.data?.table?.display_name || relationship.toTable,
columns: relationship.toColumns || [],
},
},
diff --git a/frontend/components/dataflow/SaveDiagramModal.tsx b/frontend/components/dataflow/SaveDiagramModal.tsx
index 53d67afa..5fae22e3 100644
--- a/frontend/components/dataflow/SaveDiagramModal.tsx
+++ b/frontend/components/dataflow/SaveDiagramModal.tsx
@@ -12,6 +12,7 @@ import {
import {
AlertDialog,
AlertDialogAction,
+ AlertDialogFooter,
AlertDialogContent,
AlertDialogHeader,
AlertDialogTitle,
diff --git a/frontend/components/dataflow/SelectedTablesPanel.tsx b/frontend/components/dataflow/SelectedTablesPanel.tsx
index 319051e4..67c99490 100644
--- a/frontend/components/dataflow/SelectedTablesPanel.tsx
+++ b/frontend/components/dataflow/SelectedTablesPanel.tsx
@@ -57,7 +57,7 @@ export const SelectedTablesPanel: React.FC = ({
const node = nodes.find((n) => n.id === nodeId);
if (!node) return null;
- const { tableName, displayName } = node.data.table;
+ const { table_name, display_name } = node.data.table;
return (
{/* 테이블 정보 */}
@@ -76,7 +76,7 @@ export const SelectedTablesPanel: React.FC = ({
index === 0 ? "text-success" : index === 1 ? "text-primary" : "text-foreground"
}`}
>
- {displayName}
+ {display_name}
{selectedNodes.length === 2 && (
= ({
)}
-
{tableName}
+
{table_name}
{/* 연결 화살표 (마지막이 아닌 경우) */}
diff --git a/frontend/components/dataflow/connection/ActionConditionsSection.tsx b/frontend/components/dataflow/connection/ActionConditionsSection.tsx
index e57050f8..a5a2a417 100644
--- a/frontend/components/dataflow/connection/ActionConditionsSection.tsx
+++ b/frontend/components/dataflow/connection/ActionConditionsSection.tsx
@@ -33,7 +33,7 @@ export const ActionConditionsSection: React.FC
= (
const { addActionGroupStart, addActionGroupEnd, getActionCurrentGroupLevel } = useActionConditionHelpers();
// INSERT가 아닌 액션 타입인지 확인
- const isConditionRequired = action.actionType !== "insert";
+ const isConditionRequired = action.action_type !== "insert";
// 유효한 조건이 있는지 확인 (group-start, group-end만 있는 경우 제외)
const hasValidConditions =
@@ -161,7 +161,7 @@ export const ActionConditionsSection: React.FC = (
실행조건이 필요합니다
- {action.actionType.toUpperCase()} 액션은 언제 실행될지 결정하는 조건이 반드시 필요합니다.
+ {action.action_type.toUpperCase()} 액션은 언제 실행될지 결정하는 조건이 반드시 필요합니다.
필드, 연산자, 값을 모두 입력해야 합니다.
diff --git a/frontend/components/dataflow/connection/ActionFieldMappings.tsx b/frontend/components/dataflow/connection/ActionFieldMappings.tsx
index 4e13a86e..0dfa2632 100644
--- a/frontend/components/dataflow/connection/ActionFieldMappings.tsx
+++ b/frontend/components/dataflow/connection/ActionFieldMappings.tsx
@@ -44,10 +44,10 @@ export const ActionFieldMappings: React.FC
= ({
enableMultiConnection = false,
}) => {
// 🆕 다중 커넥션 상태 관리
- const [fromConnectionId, setFromConnectionId] = useState(action.fromConnection?.connectionId);
- const [toConnectionId, setToConnectionId] = useState(action.toConnection?.connectionId);
- const [selectedFromTable, setSelectedFromTable] = useState(action.fromTable || fromTableName);
- const [selectedToTable, setSelectedToTable] = useState(action.targetTable || toTableName);
+ const [fromConnectionId, setFromConnectionId] = useState((action as any).fromConnection?.connectionId);
+ const [toConnectionId, setToConnectionId] = useState((action as any).toConnection?.connectionId);
+ const [selectedFromTable, setSelectedFromTable] = useState((action as any).fromTable || fromTableName);
+ const [selectedToTable, setSelectedToTable] = useState((action as any).targetTable || toTableName);
// 다중 커넥션이 활성화된 경우 새로운 UI 렌더링
if (enableMultiConnection) {
@@ -55,7 +55,7 @@ export const ActionFieldMappings: React.FC = ({
}
// 기존 INSERT 액션 처리 (단일 커넥션)
- if (action.actionType === "insert" && fromTableColumns.length > 0 && toTableColumns.length > 0) {
+ if (action.action_type === "insert" && fromTableColumns.length > 0 && toTableColumns.length > 0) {
return (
= ({
const handleToTableChange = (tableName: string) => {
setSelectedToTable(tableName);
- updateActionTable("targetTable", tableName);
+ updateActionTable("target_table", tableName);
};
// 액션 커넥션 정보 업데이트
const updateActionConnection = (type: "fromConnection" | "toConnection", connectionId: number) => {
const newActions = [...settings.actions];
- if (!newActions[actionIndex][type]) {
- newActions[actionIndex][type] = {};
+ if (!(newActions[actionIndex] as any)[type]) {
+ (newActions[actionIndex] as any)[type] = {};
}
- newActions[actionIndex][type]!.connectionId = connectionId;
+ (newActions[actionIndex] as any)[type]!.connectionId = connectionId;
onSettingsChange({ ...settings, actions: newActions });
};
// 액션 테이블 정보 업데이트
- const updateActionTable = (type: "fromTable" | "targetTable", tableName: string) => {
+ const updateActionTable = (type: "fromTable" | "target_table", tableName: string) => {
const newActions = [...settings.actions];
- newActions[actionIndex][type] = tableName;
+ (newActions[actionIndex] as any)[type] = tableName;
onSettingsChange({ ...settings, actions: newActions });
};
@@ -124,7 +124,7 @@ export const ActionFieldMappings: React.FC = ({
toConnectionId={toConnectionId}
onFromConnectionChange={handleFromConnectionChange}
onToConnectionChange={handleToConnectionChange}
- actionType={action.actionType}
+ actionType={action.action_type}
allowSameConnection={true}
/>
@@ -137,7 +137,7 @@ export const ActionFieldMappings: React.FC = ({
selectedToTable={selectedToTable}
onFromTableChange={handleFromTableChange}
onToTableChange={handleToTableChange}
- actionType={action.actionType}
+ actionType={action.action_type}
allowSameTable={true}
showSameTableWarning={true}
/>
@@ -151,7 +151,7 @@ export const ActionFieldMappings: React.FC = ({
// 액션 타입별 패널 렌더링
function renderActionSpecificPanel() {
- switch (action.actionType) {
+ switch (action.action_type) {
case "insert":
return (
= ({
}
const addFieldMapping = () => {
const newActions = [...settings.actions];
- newActions[actionIndex].fieldMappings.push({
- sourceTable: "",
- sourceField: "",
- targetTable: "",
- targetField: "",
- defaultValue: "",
- transformFunction: "",
+ newActions[actionIndex].field_mappings.push({
+ source_table: "",
+ source_field: "",
+ target_table: "",
+ target_field: "",
+ default_value: "",
});
onSettingsChange({ ...settings, actions: newActions });
};
const updateFieldMapping = (mappingIndex: number, field: string, value: string) => {
const newActions = [...settings.actions];
- (newActions[actionIndex].fieldMappings[mappingIndex] as any)[field] = value;
+ (newActions[actionIndex].field_mappings[mappingIndex] as any)[field] = value;
onSettingsChange({ ...settings, actions: newActions });
};
const removeFieldMapping = (mappingIndex: number) => {
const newActions = [...settings.actions];
- newActions[actionIndex].fieldMappings = newActions[actionIndex].fieldMappings.filter((_, i) => i !== mappingIndex);
+ newActions[actionIndex].field_mappings = newActions[actionIndex].field_mappings.filter((_: unknown, i: number) => i !== mappingIndex);
onSettingsChange({ ...settings, actions: newActions });
};
@@ -236,9 +235,9 @@ export const ActionFieldMappings: React.FC = ({
- {action.fieldMappings.map((mapping, mappingIndex) => (
+ {action.field_mappings.map((mapping, mappingIndex) => (
{/* 컴팩트한 매핑 표시 */}
@@ -246,16 +245,16 @@ export const ActionFieldMappings: React.FC
= ({
{/* 소스 */}
- {mapping.sourceTable && (
+ {mapping.source_table && (