fix(table-select): add loading indication for import (#782)

This commit is contained in:
Guy Ben-Aharon
2025-07-23 15:53:26 +03:00
committed by GitHub
parent 0d9f57a9c9
commit b46ed58dff
2 changed files with 47 additions and 29 deletions

View File

@@ -61,6 +61,7 @@ export const SelectTables: React.FC<SelectTablesProps> = ({
const [showTables, setShowTables] = useState(true); const [showTables, setShowTables] = useState(true);
const [showViews, setShowViews] = useState(false); const [showViews, setShowViews] = useState(false);
const { t } = useTranslation(); const { t } = useTranslation();
const [isImporting, setIsImporting] = useState(false);
// Prepare all tables and views with their metadata // Prepare all tables and views with their metadata
const allTables = useMemo(() => { const allTables = useMemo(() => {
@@ -258,22 +259,37 @@ export const SelectTables: React.FC<SelectTablesProps> = ({
setSelectedTables(new Set()); setSelectedTables(new Set());
}, []); }, []);
const handleConfirm = useCallback(() => { const handleConfirm = useCallback(async () => {
const selectedTableObjects: SelectedTable[] = Array.from(selectedTables) if (isImporting) {
.map((key): SelectedTable | null => { return;
const table = allTables.find((t) => t.key === key); }
if (!table) return null;
return { setIsImporting(true);
schema: table.schema,
table: table.tableName,
type: table.type,
} satisfies SelectedTable;
})
.filter((t): t is SelectedTable => t !== null);
onImport({ selectedTables: selectedTableObjects, databaseMetadata }); try {
}, [selectedTables, allTables, onImport, databaseMetadata]); 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'); const { isMd: isDesktop } = useBreakpoint('md');
@@ -635,27 +651,29 @@ export const SelectTables: React.FC<SelectTablesProps> = ({
</div> </div>
{isDesktop ? renderPagination() : null} {isDesktop ? renderPagination() : null}
</DialogInternalContent> </DialogInternalContent>
<DialogFooter <DialogFooter className="flex flex-col-reverse gap-2 sm:flex-row sm:justify-end sm:space-x-2 md:justify-between md:gap-0">
// className={cn( <Button
// 'gap-2', type="button"
// isDesktop variant="secondary"
// ? 'flex items-center justify-between' onClick={onBack}
// : 'flex flex-col' disabled={isImporting}
// )} >
className="flex flex-col-reverse gap-2 sm:flex-row sm:justify-end sm:space-x-2 md:justify-between md:gap-0"
>
{/* Desktop layout */}
<Button type="button" variant="secondary" onClick={onBack}>
{t('new_diagram_dialog.back')} {t('new_diagram_dialog.back')}
</Button> </Button>
<Button <Button
onClick={handleConfirm} onClick={handleConfirm}
disabled={selectedTables.size === 0} disabled={selectedTables.size === 0 || isImporting}
className="bg-pink-500 text-white hover:bg-pink-600" className="bg-pink-500 text-white hover:bg-pink-600"
> >
Import {selectedTables.size} Tables {isImporting ? (
<>
<Spinner className="mr-2 size-4 text-white" />
Importing...
</>
) : (
`Import ${selectedTables.size} Tables`
)}
</Button> </Button>
{!isDesktop ? renderPagination() : null} {!isDesktop ? renderPagination() : null}

View File

@@ -108,7 +108,7 @@ export const loadFromDatabaseMetadata = async ({
return a.isView ? 1 : -1; return a.isView ? 1 : -1;
}); });
const diagram = { const diagram: Diagram = {
id: generateDiagramId(), id: generateDiagramId(),
name: databaseMetadata.database_name name: databaseMetadata.database_name
? `${databaseMetadata.database_name}-db` ? `${databaseMetadata.database_name}-db`