"use client"; import React, { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Plus, Trash2 } from "lucide-react"; import { TableInfo, ColumnInfo } from "@/lib/api/dataflow"; import { DataSaveSettings } from "@/types/connectionTypes"; import { InsertFieldMappingPanel } from "./InsertFieldMappingPanel"; import { ConnectionSelectionPanel } from "./ConnectionSelectionPanel"; import { TableSelectionPanel } from "./TableSelectionPanel"; import { UpdateFieldMappingPanel } from "./UpdateFieldMappingPanel"; import { DeleteConditionPanel } from "./DeleteConditionPanel"; import { getActiveConnections, ConnectionInfo } from "@/lib/api/multiConnection"; interface ActionFieldMappingsProps { action: DataSaveSettings["actions"][0]; actionIndex: number; settings: DataSaveSettings; onSettingsChange: (settings: DataSaveSettings) => void; availableTables: TableInfo[]; tableColumnsCache: { [tableName: string]: ColumnInfo[] }; fromTableColumns?: ColumnInfo[]; toTableColumns?: ColumnInfo[]; fromTableName?: string; toTableName?: string; // πŸ†• 닀쀑 컀λ„₯μ…˜ 지원을 μœ„ν•œ μƒˆλ‘œμš΄ props enableMultiConnection?: boolean; } export const ActionFieldMappings: React.FC = ({ action, actionIndex, settings, onSettingsChange, availableTables, tableColumnsCache, fromTableColumns = [], toTableColumns = [], fromTableName, toTableName, 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); // 닀쀑 컀λ„₯μ…˜μ΄ ν™œμ„±ν™”λœ 경우 μƒˆλ‘œμš΄ UI λ Œλ”λ§ if (enableMultiConnection) { return renderMultiConnectionUI(); } // κΈ°μ‘΄ INSERT μ•‘μ…˜ 처리 (단일 컀λ„₯μ…˜) if (action.actionType === "insert" && fromTableColumns.length > 0 && toTableColumns.length > 0) { return ( ); } // πŸ†• 닀쀑 컀λ„₯μ…˜ UI λ Œλ”λ§ ν•¨μˆ˜ function renderMultiConnectionUI() { const hasConnectionsSelected = fromConnectionId !== undefined && toConnectionId !== undefined; const hasTablesSelected = selectedFromTable && selectedToTable; // 컀λ„₯μ…˜ λ³€κ²½ ν•Έλ“€λŸ¬ const handleFromConnectionChange = (connectionId: number) => { setFromConnectionId(connectionId); setSelectedFromTable(undefined); // ν…Œμ΄λΈ” 선택 μ΄ˆκΈ°ν™” updateActionConnection("fromConnection", connectionId); }; const handleToConnectionChange = (connectionId: number) => { setToConnectionId(connectionId); setSelectedToTable(undefined); // ν…Œμ΄λΈ” 선택 μ΄ˆκΈ°ν™” updateActionConnection("toConnection", connectionId); }; // ν…Œμ΄λΈ” λ³€κ²½ ν•Έλ“€λŸ¬ const handleFromTableChange = (tableName: string) => { setSelectedFromTable(tableName); updateActionTable("fromTable", tableName); }; const handleToTableChange = (tableName: string) => { setSelectedToTable(tableName); updateActionTable("targetTable", tableName); }; // μ•‘μ…˜ 컀λ„₯μ…˜ 정보 μ—…λ°μ΄νŠΈ const updateActionConnection = (type: "fromConnection" | "toConnection", connectionId: number) => { const newActions = [...settings.actions]; if (!newActions[actionIndex][type]) { newActions[actionIndex][type] = {}; } newActions[actionIndex][type]!.connectionId = connectionId; onSettingsChange({ ...settings, actions: newActions }); }; // μ•‘μ…˜ ν…Œμ΄λΈ” 정보 μ—…λ°μ΄νŠΈ const updateActionTable = (type: "fromTable" | "targetTable", tableName: string) => { const newActions = [...settings.actions]; newActions[actionIndex][type] = tableName; onSettingsChange({ ...settings, actions: newActions }); }; return (
{/* 1단계: 컀λ„₯μ…˜ 선택 */} {/* 2단계: ν…Œμ΄λΈ” 선택 */} {hasConnectionsSelected && ( )} {/* 3단계: μ•‘μ…˜ νƒ€μž…λ³„ λ§€ν•‘/쑰건 μ„€μ • */} {hasTablesSelected && renderActionSpecificPanel()}
); } // μ•‘μ…˜ νƒ€μž…λ³„ νŒ¨λ„ λ Œλ”λ§ function renderActionSpecificPanel() { switch (action.actionType) { case "insert": return ( ); case "update": return ( ); case "delete": return ( ); default: return null; } } const addFieldMapping = () => { const newActions = [...settings.actions]; newActions[actionIndex].fieldMappings.push({ sourceTable: "", sourceField: "", targetTable: "", targetField: "", defaultValue: "", transformFunction: "", }); onSettingsChange({ ...settings, actions: newActions }); }; const updateFieldMapping = (mappingIndex: number, field: string, value: string) => { const newActions = [...settings.actions]; (newActions[actionIndex].fieldMappings[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); onSettingsChange({ ...settings, actions: newActions }); }; return (
(ν•„μˆ˜)
{action.fieldMappings.map((mapping, mappingIndex) => (
{/* μ»΄νŒ©νŠΈν•œ λ§€ν•‘ ν‘œμ‹œ */}
{/* μ†ŒμŠ€ */}
{mapping.sourceTable && ( )} .
β†’
{/* νƒ€κ²Ÿ */}
.
{/* κΈ°λ³Έκ°’ (인라인) */} { updateFieldMapping(mappingIndex, "defaultValue", e.target.value); if (e.target.value.trim()) { updateFieldMapping(mappingIndex, "sourceTable", ""); updateFieldMapping(mappingIndex, "sourceField", ""); } }} disabled={!!mapping.sourceTable} className="h-6 w-20 text-xs" placeholder="κΈ°λ³Έκ°’" /> {/* μ‚­μ œ λ²„νŠΌ */}
))} {/* ν•„λ“œ 맀핑이 없을 λ•Œ μ•ˆλ‚΄ λ©”μ‹œμ§€ */} {action.fieldMappings.length === 0 && (
⚠️
ν•„λ“œ 맀핑이 ν•„μš”ν•©λ‹ˆλ‹€
{action.actionType.toUpperCase()} μ•‘μ…˜μ€ μ–΄λ–€ 데이터λ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν• μ§€ κ²°μ •ν•˜λŠ” ν•„λ“œ 맀핑이 ν•„μš”ν•©λ‹ˆλ‹€.
)}
); };