import { memo } from "react"; import { Handle, Position } from "@xyflow/react"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { Table as TableIcon } from "lucide-react"; interface Column { name: string; type: string; properties?: { is_primary_key?: boolean; is_foreign_key?: boolean; }; } interface TableNodeData { name: string; columns: Column[]; onDetailClick: (name: string) => void; } export const TableNode = memo(({ data }: { data: TableNodeData }) => { return ( data.onDetailClick(data.name)} >
{data.name}
{data.columns.map((col) => { const isPk = col.properties?.is_primary_key; const isFk = col.properties?.is_foreign_key; let keyText = ""; if (isPk && isFk) keyText = "PK, FK"; else if (isPk) keyText = "PK"; else if (isFk) keyText = "FK"; // Simplify type display, e.g., INTEGER -> int, CHARACTER VARYING -> string let displayType = (col.type || "string").toLowerCase(); if (displayType.includes("int")) displayType = "int"; else if (displayType.includes("char") || displayType.includes("text")) displayType = "string"; else if (displayType.includes("time") || displayType.includes("date")) displayType = "date"; else if (displayType.includes("bool")) displayType = "boolean"; else if (displayType.includes("float") || displayType.includes("double") || displayType.includes("numeric") || displayType.includes("decimal")) displayType = "float"; return ( ); })}
{displayType} {col.name} {keyText}
); });