From 21bbd48c1509b41e094620353e108966cfa337a3 Mon Sep 17 00:00:00 2001 From: Jonathan Fishner Date: Sun, 4 Jan 2026 16:37:51 +0200 Subject: [PATCH] fix: improve UI for views (#1043) * fix: improve UI for views * fix --------- Co-authored-by: Guy Ben-Aharon --- .../chartdb-context/chartdb-provider.tsx | 6 +- .../canvas/canvas-filter/canvas-filter.tsx | 1 + .../editor-page/canvas/canvas-filter/types.ts | 1 + .../editor-page/canvas/canvas-filter/utils.ts | 4 +- .../canvas/table-node/table-node.tsx | 5 + .../table-list-item-content.tsx | 153 ++++++++++-------- .../table-list-item-header.tsx | 34 ++-- 7 files changed, 118 insertions(+), 86 deletions(-) diff --git a/src/context/chartdb-context/chartdb-provider.tsx b/src/context/chartdb-context/chartdb-provider.tsx index 535d461c..04d4150c 100644 --- a/src/context/chartdb-context/chartdb-provider.tsx +++ b/src/context/chartdb-context/chartdb-provider.tsx @@ -336,9 +336,13 @@ export const ChartDBProvider: React.FC< const createTable: ChartDBContext['createTable'] = useCallback( async (attributes) => { + const isView = attributes?.isView ?? false; + const count = isView + ? tables.filter((t) => t.isView).length + 1 + : tables.filter((t) => !t.isView).length + 1; const table: DBTable = { id: generateId(), - name: `table_${tables.length + 1}`, + name: isView ? `view_${count}` : `table_${count}`, x: 0, y: 0, fields: [ diff --git a/src/pages/editor-page/canvas/canvas-filter/canvas-filter.tsx b/src/pages/editor-page/canvas/canvas-filter/canvas-filter.tsx index 6388ee71..0355f286 100644 --- a/src/pages/editor-page/canvas/canvas-filter/canvas-filter.tsx +++ b/src/pages/editor-page/canvas/canvas-filter/canvas-filter.tsx @@ -66,6 +66,7 @@ export const CanvasFilter: React.FC = ({ onClose }) => { name: table.name, schema: table.schema, parentAreaId: table.parentAreaId, + isView: table.isView, })), [tables, showDBViews, checkIfNewTable] ); diff --git a/src/pages/editor-page/canvas/canvas-filter/types.ts b/src/pages/editor-page/canvas/canvas-filter/types.ts index e8b57596..a00f60fb 100644 --- a/src/pages/editor-page/canvas/canvas-filter/types.ts +++ b/src/pages/editor-page/canvas/canvas-filter/types.ts @@ -24,4 +24,5 @@ export type RelevantTableData = { name: string; schema?: string | null; parentAreaId?: string | null; + isView?: boolean; }; diff --git a/src/pages/editor-page/canvas/canvas-filter/utils.ts b/src/pages/editor-page/canvas/canvas-filter/utils.ts index e99ed4a3..80d488d9 100644 --- a/src/pages/editor-page/canvas/canvas-filter/utils.ts +++ b/src/pages/editor-page/canvas/canvas-filter/utils.ts @@ -9,7 +9,7 @@ import type { TableContext, } from './types'; import type { TreeNode } from '@/components/tree-view/tree'; -import { Box, Database, Layers, Table } from 'lucide-react'; +import { Box, Database, Layers, Table, View } from 'lucide-react'; import { filterTable } from '@/lib/domain/diagram-filter/filter'; import { defaultSchemas } from '@/lib/data/default-schemas'; @@ -42,7 +42,7 @@ const createTableChildren = ( name: table.name, type: 'table' as const, isFolder: false, - icon: Table, + icon: table.isView ? View : Table, context: { tableSchema: table.schema, visible: table.visible, diff --git a/src/pages/editor-page/canvas/table-node/table-node.tsx b/src/pages/editor-page/canvas/table-node/table-node.tsx index 831f4130..b4c9f0b6 100644 --- a/src/pages/editor-page/canvas/table-node/table-node.tsx +++ b/src/pages/editor-page/canvas/table-node/table-node.tsx @@ -24,6 +24,7 @@ import { SquareDot, SquarePlus, SquareMinus, + View, } from 'lucide-react'; import { Label } from '@/components/label/label'; import { @@ -344,6 +345,7 @@ export const TableNode: React.FC> = React.memo( () => cn( 'flex w-full flex-col border-2 bg-slate-50 dark:bg-slate-950 rounded-lg shadow-sm transition-transform duration-300', + table.isView ? 'border-dashed' : '', selected || isTarget || isPartOfCreatingRelationship ? 'border-pink-600' : 'border-slate-500 dark:border-slate-700', @@ -390,6 +392,7 @@ export const TableNode: React.FC> = React.memo( isTarget, editTableMode, isPartOfCreatingRelationship, + table.isView, ] ); @@ -537,6 +540,8 @@ export const TableNode: React.FC> = React.memo( Table Changed + ) : table.isView ? ( + ) : ( )} diff --git a/src/pages/editor-page/side-panel/tables-section/table-list/table-list-item/table-list-item-content/table-list-item-content.tsx b/src/pages/editor-page/side-panel/tables-section/table-list/table-list-item/table-list-item-content/table-list-item-content.tsx index 940db3ae..a5ae96e5 100644 --- a/src/pages/editor-page/side-panel/tables-section/table-list/table-list-item/table-list-item-content/table-list-item-content.tsx +++ b/src/pages/editor-page/side-panel/tables-section/table-list/table-list-item/table-list-item-content/table-list-item-content.tsx @@ -207,71 +207,82 @@ export const TableListItemContent: React.FC = ({ - - -
-
- - {t('side_panel.tables_section.table.indexes')} -
- {!readonly ? ( -
-
- + {!table.isView ? ( + + +
+
+ + {t( + 'side_panel.tables_section.table.indexes' + )} +
+ {!readonly ? ( +
+
+ +
+ ) : null} +
+
+ + {[...table.indexes] + .sort((a, b) => { + // Sort PK indexes first + if (a.isPrimaryKey && !b.isPrimaryKey) + return -1; + if (!a.isPrimaryKey && b.isPrimaryKey) + return 1; + return 0; + }) + .map((index) => ( + + removeIndex(table.id, index.id) + } + updateIndex={( + attrs: Partial + ) => + updateIndex( + table.id, + index.id, + attrs + ) + } + fields={table.fields} + /> + ))} + + {!readonly ? ( +
+
) : null} -
- - - {[...table.indexes] - .sort((a, b) => { - // Sort PK indexes first - if (a.isPrimaryKey && !b.isPrimaryKey) - return -1; - if (!a.isPrimaryKey && b.isPrimaryKey) return 1; - return 0; - }) - .map((index) => ( - - removeIndex(table.id, index.id) - } - updateIndex={(attrs: Partial) => - updateIndex(table.id, index.id, attrs) - } - fields={table.fields} - /> - ))} - - {!readonly ? ( -
- -
- ) : null} -
- + + + ) : null} = ({ {!readonly ? (
- + {!table.isView ? ( + + ) : null}
)}
-
+
{!editMode ? ( <> {!readonly ?
{renderDropDownMenu()}
: null} + {table.isView ? ( + + View + + ) : null}
{!readonly ? (