"use client";
import React from "react";
import { Handle, Position } from "@xyflow/react";
interface TableColumn {
name: string;
type: string;
description: string;
}
interface Table {
tableName: string;
displayName: string;
description: string;
columns: TableColumn[];
}
interface TableNodeData {
table: Table;
onColumnClick: (tableName: string, columnName: string) => void;
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;
return (
{/* React Flow Handles - 숨김 처리 */}
{/* 테이블 헤더 */}
{table.displayName}
{table.description &&
{table.description}
}
{/* 컬럼 목록 */}
{table.columns.map((column, index) => {
const isSelected = selectedColumns.includes(column.name);
const connectionInfo = connectedColumns[column.name];
const isConnected = !!connectionInfo;
// 연결된 컬럼에만 핸들 표시
const showSourceHandle =
isConnected && (connectionInfo.direction === "source" || connectionInfo.direction === "both");
const showTargetHandle =
isConnected && (connectionInfo.direction === "target" || connectionInfo.direction === "both");
return (
onColumnClick(table.tableName, column.name)}
>
{/* Target Handle (왼쪽) - 세련된 디자인 */}
{showTargetHandle && (
)}
{/* Source Handle (오른쪽) - 세련된 디자인 */}
{showSourceHandle && (
)}
{column.name}
{column.type}
{column.description &&
{column.description}
}
);
})}
);
};