diff --git a/apps/desktop/src/components/transfer/DataTransferDialog.vue b/apps/desktop/src/components/transfer/DataTransferDialog.vue index e765ba008..a2969d7e3 100644 --- a/apps/desktop/src/components/transfer/DataTransferDialog.vue +++ b/apps/desktop/src/components/transfer/DataTransferDialog.vue @@ -279,9 +279,11 @@ async function startTransfer() { try { await api.startTransfer(request, (progress) => { - transferProgress.value.set(progress.table, progress); - transferProgress.value = new Map(transferProgress.value); - currentTable.value = progress.table; + if (progress.table) { + transferProgress.value.set(progress.table, progress); + transferProgress.value = new Map(transferProgress.value); + currentTable.value = progress.table; + } const nextState = nextTransferTerminalState( { @@ -317,13 +319,38 @@ function getConnectionType(id: string): DatabaseType { return store.connections.find((c) => c.id === id)?.db_type ?? "mysql"; } +const processedStatuses = new Set(["tableDone", "done", "error", "cancelled"]); + +function formatRowCount(count: number) { + return count.toLocaleString(); +} + +function formatTableRows(progress: TransferProgress) { + if (typeof progress.totalRows === "number") { + return `${formatRowCount(progress.rowsTransferred)} / ${formatRowCount(progress.totalRows)}`; + } + return formatRowCount(progress.rowsTransferred); +} + const completedTables = computed( - () => [...transferProgress.value.values()].filter((p) => p.status === "tableDone" || p.status === "done").length, + () => [...transferProgress.value.values()].filter((p) => processedStatuses.has(p.status)).length, ); +const failedTables = computed(() => [...transferProgress.value.values()].filter((p) => p.status === "error").length); + const totalTransferred = computed(() => [...transferProgress.value.values()].reduce((sum, p) => sum + p.rowsTransferred, 0), ); + +const knownTotalRows = computed(() => + [...transferProgress.value.values()].reduce((sum, p) => sum + (typeof p.totalRows === "number" ? p.totalRows : 0), 0), +); + +const overallRowsLabel = computed(() => + knownTotalRows.value > 0 + ? `${formatRowCount(totalTransferred.value)} / ${formatRowCount(knownTotalRows.value)}` + : formatRowCount(totalTransferred.value), +);