diff --git a/frontend/components/dataflow/DataFlowDesigner.tsx b/frontend/components/dataflow/DataFlowDesigner.tsx index ab8f0776..f0951f6b 100644 --- a/frontend/components/dataflow/DataFlowDesigner.tsx +++ b/frontend/components/dataflow/DataFlowDesigner.tsx @@ -784,6 +784,8 @@ export const DataFlowDesigner: React.FC = ({ // 수정 모드였다면 해제 if (editingRelationshipId) { setEditingRelationshipId(null); + // 편집 모드 취소 시 선택된 컬럼도 초기화 + setSelectedColumns({}); } }, [editingRelationshipId]); @@ -1136,98 +1138,101 @@ export const DataFlowDesigner: React.FC = ({ - {/* 선택된 컬럼 팝업 - 캔버스 좌측 상단 고정 (신규 관계도 생성 시에만 표시) */} - {Object.keys(selectedColumns).length > 0 && !showEdgeActions && !pendingConnection && !diagramId && ( -
- {/* 헤더 */} -
-
-
- 📋 -
-
-
선택된 컬럼
-
{Object.keys(selectedColumns).length}개 테이블
+ {/* 선택된 컬럼 팝업 - 캔버스 좌측 상단 고정 (새 관계 생성 시에만 표시) */} + {Object.keys(selectedColumns).length > 0 && + !showEdgeActions && + !pendingConnection && + !editingRelationshipId && ( +
+ {/* 헤더 */} +
+
+
+ 📋 +
+
+
선택된 컬럼
+
{Object.keys(selectedColumns).length}개 테이블
+
+
- -
- {/* 컨텐츠 */} -
-
- {[...new Set(selectionOrder)] - .filter((tableName) => selectedColumns[tableName] && selectedColumns[tableName].length > 0) - .map((tableName, index, filteredOrder) => { - const columns = selectedColumns[tableName]; - const node = nodes.find((n) => n.data.table.tableName === tableName); - const displayName = node?.data.table.displayName || tableName; + {/* 컨텐츠 */} +
+
+ {[...new Set(selectionOrder)] + .filter((tableName) => selectedColumns[tableName] && selectedColumns[tableName].length > 0) + .map((tableName, index, filteredOrder) => { + const columns = selectedColumns[tableName]; + const node = nodes.find((n) => n.data.table.tableName === tableName); + const displayName = node?.data.table.displayName || tableName; - return ( -
- {/* 테이블 정보 */} -
-
{displayName}
-
- {columns.map((column, columnIndex) => ( - - {column} - - ))} + return ( +
+ {/* 테이블 정보 */} +
+
{displayName}
+
+ {columns.map((column, columnIndex) => ( + + {column} + + ))} +
+ + {/* 화살표 */} + {index === 0 && filteredOrder.length > 1 && ( +
+
+
+ )}
+ ); + })} +
+
- {/* 화살표 */} - {index === 0 && filteredOrder.length > 1 && ( -
-
-
- )} -
- ); - })} + {/* 액션 버튼 */} +
+ +
- - {/* 액션 버튼 */} -
- - -
-
- )} + )} {/* 안내 메시지 */} {nodes.length === 0 && ( @@ -1258,23 +1263,23 @@ export const DataFlowDesigner: React.FC = ({ {/* 엣지 정보 및 액션 버튼 */} {showEdgeActions && selectedEdgeForEdit && selectedEdgeInfo && (
{/* 헤더 */} -
-
-
- 🔗 +
+
+
+ 🔗
-
{selectedEdgeInfo.relationshipName}
-
데이터 관계
+
{selectedEdgeInfo.relationshipName}
+
데이터 관계 정보
+ {/* 관계 정보 요약 */} +
+
+
+
관계 유형
+
+ {selectedEdgeInfo.relationshipType} +
+
+
|
+
+
연결 유형
+
+ {selectedEdgeInfo.connectionType} +
+
+
+
+ {/* 연결 정보 */}
{/* From 테이블 */} -
-
From 테이블
-
{selectedEdgeInfo.fromTable}
-
- {selectedEdgeInfo.fromColumns.map((column, index) => ( - - {column} - - ))} +
+
FROM
+
{selectedEdgeInfo.fromTable}
+
+
+ {selectedEdgeInfo.fromColumns.map((column, index) => ( + + {column} + + ))} +
- {/* 화살표 */} + {/* 관계 화살표 */}
-
-
- -
-
+
{/* To 테이블 */} -
-
To 테이블
-
{selectedEdgeInfo.toTable}
-
- {selectedEdgeInfo.toColumns.map((column, index) => ( - - {column} - - ))} -
-
- - {/* 관계 정보 */} -
-
-
관계 유형
-
{selectedEdgeInfo.relationshipType}
-
-
-
연결 유형
-
{selectedEdgeInfo.connectionType}
+
+
TO
+
{selectedEdgeInfo.toTable}
+
+
+ {selectedEdgeInfo.toColumns.map((column, index) => ( + + {column} + + ))} +
{/* 액션 버튼 */} -
+
diff --git a/frontend/components/dataflow/TableNode.tsx b/frontend/components/dataflow/TableNode.tsx index 5cac239c..0956cd67 100644 --- a/frontend/components/dataflow/TableNode.tsx +++ b/frontend/components/dataflow/TableNode.tsx @@ -22,18 +22,10 @@ interface TableNodeData { onScrollAreaEnter?: () => void; onScrollAreaLeave?: () => void; selectedColumns?: string[]; // 선택된 컬럼 목록 - connectedColumns?: { [columnName: string]: { direction: "source" | "target" | "both" } }; // 연결된 컬럼 정보 } export const TableNode: React.FC<{ data: TableNodeData }> = ({ data }) => { - const { - table, - onColumnClick, - onScrollAreaEnter, - onScrollAreaLeave, - selectedColumns = [], - connectedColumns = {}, - } = data; + const { table, onColumnClick, onScrollAreaEnter, onScrollAreaLeave, selectedColumns = [] } = data; return (
@@ -42,7 +34,7 @@ export const TableNode: React.FC<{ data: TableNodeData }> = ({ data }) => { {/* 테이블 헤더 - 통일된 디자인 */} -
+

{table.displayName}

{table.description &&

{table.description}

}
@@ -50,7 +42,7 @@ export const TableNode: React.FC<{ data: TableNodeData }> = ({ data }) => { {/* 컬럼 목록 */}
- {table.columns.map((column, index) => { + {table.columns.map((column) => { const isSelected = selectedColumns.includes(column.name); return (