fix: allow hiding all schemas and add filtered tables message in side panel

This commit is contained in:
johnnyfish
2025-07-31 23:20:01 +03:00
committed by Guy Ben-Aharon
parent fb54d73465
commit 4dd2a5742e
3 changed files with 49 additions and 11 deletions

View File

@@ -156,17 +156,18 @@ export const ChartDBProvider: React.FC<
return undefined; return undefined;
} }
const schemasFilterFromCache = const schemasFilterFromCache = schemasFilter[diagramId];
(schemasFilter[diagramId] ?? []).length === 0
? undefined // in case of empty filter, skip cache
: schemasFilter[diagramId];
return ( // If there's an explicit filter set (even if empty), use it
schemasFilterFromCache ?? [ if (schemasFilterFromCache !== undefined) {
schemas.find((s) => s.name === defaultSchemaName)?.id ?? return schemasFilterFromCache;
schemas[0]?.id, }
]
); // Only default to showing schemas if no filter has been set
return [
schemas.find((s) => s.name === defaultSchemaName)?.id ??
schemas[0]?.id,
];
}, [schemasFilter, diagramId, schemas, defaultSchemaName]); }, [schemasFilter, diagramId, schemas, defaultSchemaName]);
const currentDiagram: Diagram = useMemo( const currentDiagram: Diagram = useMemo(

View File

@@ -125,6 +125,8 @@ export const en = {
collapse: 'Collapse All', collapse: 'Collapse All',
clear: 'Clear Filter', clear: 'Clear Filter',
no_results: 'No tables found matching your filter.', no_results: 'No tables found matching your filter.',
all_tables_filtered: 'All tables are filtered.',
open_filter: 'Open Filter',
show_list: 'Show Table List', show_list: 'Show Table List',
show_dbml: 'Show DBML Editor', show_dbml: 'Show DBML Editor',

View File

@@ -1,7 +1,7 @@
import React, { useCallback, useMemo, useState } from 'react'; import React, { useCallback, useMemo, useState } from 'react';
import { TableList } from './table-list/table-list'; import { TableList } from './table-list/table-list';
import { Button } from '@/components/button/button'; import { Button } from '@/components/button/button';
import { Table, List, X, Code } from 'lucide-react'; import { Table, List, X, Code, Funnel } from 'lucide-react';
import { Input } from '@/components/input/input'; import { Input } from '@/components/input/input';
import type { DBTable } from '@/lib/domain/db-table'; import type { DBTable } from '@/lib/domain/db-table';
import { shouldShowTablesBySchemaFilter } from '@/lib/domain/db-table'; import { shouldShowTablesBySchemaFilter } from '@/lib/domain/db-table';
@@ -21,6 +21,7 @@ import { TableDBML } from './table-dbml/table-dbml';
import { useHotkeys } from 'react-hotkeys-hook'; import { useHotkeys } from 'react-hotkeys-hook';
import { getOperatingSystem } from '@/lib/utils'; import { getOperatingSystem } from '@/lib/utils';
import type { DBSchema } from '@/lib/domain'; import type { DBSchema } from '@/lib/domain';
import { useCanvas } from '@/hooks/use-canvas';
export interface TablesSectionProps {} export interface TablesSectionProps {}
@@ -34,6 +35,7 @@ export const TablesSection: React.FC<TablesSectionProps> = () => {
const [filterText, setFilterText] = React.useState(''); const [filterText, setFilterText] = React.useState('');
const [showDBML, setShowDBML] = useState(false); const [showDBML, setShowDBML] = useState(false);
const filterInputRef = React.useRef<HTMLInputElement>(null); const filterInputRef = React.useRef<HTMLInputElement>(null);
const { setShowFilter } = useCanvas();
const filteredTables = useMemo(() => { const filteredTables = useMemo(() => {
const filterTableName: (table: DBTable) => boolean = (table) => const filterTableName: (table: DBTable) => boolean = (table) =>
@@ -48,6 +50,18 @@ export const TablesSection: React.FC<TablesSectionProps> = () => {
return tables.filter(filterVisible).filter(filterTableName); return tables.filter(filterVisible).filter(filterTableName);
}, [tables, filterText, hiddenTableIds, filteredSchemas]); }, [tables, filterText, hiddenTableIds, filteredSchemas]);
// Check if all tables are filtered out by canvas filters (not text filter)
const allTablesFilteredByCanvas = useMemo(() => {
return (
tables.length > 0 &&
tables.every(
(table) =>
hiddenTableIds?.includes(table.id) ||
!shouldShowTablesBySchemaFilter(table, filteredSchemas)
)
);
}, [tables, hiddenTableIds, filteredSchemas]);
const createTableWithLocation = useCallback( const createTableWithLocation = useCallback(
async ({ schema }: { schema?: DBSchema }) => { async ({ schema }: { schema?: DBSchema }) => {
const padding = 80; const padding = 80;
@@ -100,6 +114,10 @@ export const TablesSection: React.FC<TablesSectionProps> = () => {
setFilterText(''); setFilterText('');
}, []); }, []);
const handleOpenCanvasFilter = useCallback(() => {
setShowFilter(true);
}, [setShowFilter]);
const operatingSystem = useMemo(() => getOperatingSystem(), []); const operatingSystem = useMemo(() => getOperatingSystem(), []);
useHotkeys( useHotkeys(
@@ -180,6 +198,23 @@ export const TablesSection: React.FC<TablesSectionProps> = () => {
)} )}
className="mt-20" className="mt-20"
/> />
) : allTablesFilteredByCanvas ? (
<div className="mt-10 flex flex-col items-center gap-2">
<div className="text-sm text-muted-foreground">
{t(
'side_panel.tables_section.all_tables_filtered'
)}
</div>
<Button
variant="outline"
size="sm"
onClick={handleOpenCanvasFilter}
className="gap-1"
>
<Funnel className="size-3.5" />
{t('side_panel.tables_section.open_filter')}
</Button>
</div>
) : filterText && filteredTables.length === 0 ? ( ) : filterText && filteredTables.length === 0 ? (
<div className="mt-10 flex flex-col items-center gap-2"> <div className="mt-10 flex flex-col items-center gap-2">
<div className="text-sm text-muted-foreground"> <div className="text-sm text-muted-foreground">