From b46ed58dff1ec74579fb1544dba46b0f77730c52 Mon Sep 17 00:00:00 2001 From: Guy Ben-Aharon Date: Wed, 23 Jul 2025 15:53:26 +0300 Subject: [PATCH] fix(table-select): add loading indication for import (#782) --- .../common/select-tables/select-tables.tsx | 74 ++++++++++++------- src/lib/domain/diagram.ts | 2 +- 2 files changed, 47 insertions(+), 29 deletions(-) diff --git a/src/dialogs/common/select-tables/select-tables.tsx b/src/dialogs/common/select-tables/select-tables.tsx index 5a3740a0..8e5a1d70 100644 --- a/src/dialogs/common/select-tables/select-tables.tsx +++ b/src/dialogs/common/select-tables/select-tables.tsx @@ -61,6 +61,7 @@ export const SelectTables: React.FC = ({ const [showTables, setShowTables] = useState(true); const [showViews, setShowViews] = useState(false); const { t } = useTranslation(); + const [isImporting, setIsImporting] = useState(false); // Prepare all tables and views with their metadata const allTables = useMemo(() => { @@ -258,22 +259,37 @@ export const SelectTables: React.FC = ({ setSelectedTables(new Set()); }, []); - const handleConfirm = useCallback(() => { - const selectedTableObjects: SelectedTable[] = Array.from(selectedTables) - .map((key): SelectedTable | null => { - const table = allTables.find((t) => t.key === key); - if (!table) return null; + const handleConfirm = useCallback(async () => { + if (isImporting) { + return; + } - return { - schema: table.schema, - table: table.tableName, - type: table.type, - } satisfies SelectedTable; - }) - .filter((t): t is SelectedTable => t !== null); + setIsImporting(true); - onImport({ selectedTables: selectedTableObjects, databaseMetadata }); - }, [selectedTables, allTables, onImport, databaseMetadata]); + try { + const selectedTableObjects: SelectedTable[] = Array.from( + selectedTables + ) + .map((key): SelectedTable | null => { + const table = allTables.find((t) => t.key === key); + if (!table) return null; + + return { + schema: table.schema, + table: table.tableName, + type: table.type, + } satisfies SelectedTable; + }) + .filter((t): t is SelectedTable => t !== null); + + await onImport({ + selectedTables: selectedTableObjects, + databaseMetadata, + }); + } finally { + setIsImporting(false); + } + }, [selectedTables, allTables, onImport, databaseMetadata, isImporting]); const { isMd: isDesktop } = useBreakpoint('md'); @@ -635,27 +651,29 @@ export const SelectTables: React.FC = ({ {isDesktop ? renderPagination() : null} - - {/* Desktop layout */} - - {!isDesktop ? renderPagination() : null} diff --git a/src/lib/domain/diagram.ts b/src/lib/domain/diagram.ts index 49081323..ed171e72 100644 --- a/src/lib/domain/diagram.ts +++ b/src/lib/domain/diagram.ts @@ -108,7 +108,7 @@ export const loadFromDatabaseMetadata = async ({ return a.isView ? 1 : -1; }); - const diagram = { + const diagram: Diagram = { id: generateDiagramId(), name: databaseMetadata.database_name ? `${databaseMetadata.database_name}-db`