import { PermissionAction } from '@supabase/shared-types/out/constants' import { buildTableEditorUrl } from 'components/grid/SupabaseGrid.utils' import { TableEditor } from 'icons' import { Copy, DiamondIcon, Edit, Fingerprint, Hash, InfoIcon, Key, MoreVertical, Table2, } from 'lucide-react' import { useRouter } from 'next/router' import { Handle, NodeProps } from 'reactflow' import { Button, cn, copyToClipboard, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import { useSchemaGraphContext } from './SchemaGraphContext' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' // ReactFlow is scaling everything by the factor of 2 export const TABLE_NODE_WIDTH = 320 export const TABLE_NODE_ROW_HEIGHT = 40 export type TableNodeData = { id: number schema: string name: string ref?: string isForeign: boolean description: string columns: { id: string isPrimary: boolean isNullable: boolean isUnique: boolean isIdentity: boolean name: string format: string }[] } export const TableNode = ({ data, targetPosition, sourcePosition, placeholder, }: NodeProps & { placeholder?: boolean }) => { // Important styles is a nasty hack to use Handles (required for edges calculations), but do not show them in the UI. // ref: https://github.com/wbkd/react-flow/discussions/2698 const hiddenNodeConnector = '!h-px !w-px !min-w-0 !min-h-0 !cursor-grab !border-0 !opacity-0' const schemaGraphContext = useSchemaGraphContext() const { data: project } = useSelectedProjectQuery() const { can: canUpdateColumns } = useAsyncCheckPermissions( PermissionAction.TENANT_SQL_ADMIN_WRITE, 'columns' ) const router = useRouter() const itemHeight = 'h-[22px]' return ( <> {data.isForeign ? (
{data.name} {targetPosition && ( )}
) : (
{data.name}
{ // Hide the actions while downloading the schema as png/svg !schemaGraphContext.isDownloading ? (
{data.description && ( {data.description} )} {!placeholder && ( schemaGraphContext.onEditTable(data.id)} >

Edit table

{ e.stopPropagation() copyToClipboard(data.name) }} > Copy name router.push( buildTableEditorUrl({ projectRef: project?.ref, tableId: data.id, schema: data.schema, }) ) } >

View in Table Editor

)}
) : null }
{data.columns.map((column) => (
{column.isPrimary && ( )} {column.isNullable && ( )} {!column.isNullable && ( )} {column.isUnique && ( )} {column.isIdentity && ( )}
{column.name} {column.format}
{targetPosition && ( )} {sourcePosition && ( )} schemaGraphContext.onEditColumn(data.id, column.id)} className="space-x-2" >

Edit column

{!canUpdateColumns && ( Additional permissions required to edit column )}
{ e.stopPropagation() copyToClipboard(column.name) }} > Copy name
))}
)} ) }