mirror of
https://github.com/chartdb/chartdb.git
synced 2025-10-23 16:13:40 +00:00
fix(table-select): add loading indication for import (#782)
This commit is contained in:
@@ -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}
|
||||||
|
@@ -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`
|
||||||
|
Reference in New Issue
Block a user