mirror of
				https://github.com/chartdb/chartdb.git
				synced 2025-11-03 21:43:23 +00:00 
			
		
		
		
	fix: allow hiding all schemas and add filtered tables message in side panel
This commit is contained in:
		
				
					committed by
					
						
						Guy Ben-Aharon
					
				
			
			
				
	
			
			
			
						parent
						
							fb54d73465
						
					
				
				
					commit
					4dd2a5742e
				
			@@ -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(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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">
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user