From 1e72d28ed378b9422c0e67cd2432dea243748fa7 Mon Sep 17 00:00:00 2001 From: zipg Date: Tue, 28 Jul 2026 11:47:58 +0800 Subject: [PATCH] feat(transfer): show per-table failure details --- .../export/ExportProgressPopover.vue | 29 +++- .../__tests__/ExportProgressPopover.spec.ts | 68 ++++++++ .../__tests__/useExportTracker.spec.ts | 105 +++++++++++- .../src/composables/useExportTracker.ts | 124 ++++++++++++++ apps/desktop/src/i18n/locales/en.ts | 4 + apps/desktop/src/i18n/locales/es.ts | 4 + apps/desktop/src/i18n/locales/it.ts | 4 + apps/desktop/src/i18n/locales/ja.ts | 4 + apps/desktop/src/i18n/locales/pt-BR.ts | 4 + apps/desktop/src/i18n/locales/zh-CN.ts | 4 + apps/desktop/src/i18n/locales/zh-TW.ts | 4 + apps/desktop/src/lib/backend/tauri.ts | 1 + crates/dbx-web/src/main.rs | 1 + crates/dbx-web/src/routes/connection.rs | 1 + crates/dbx-web/src/routes/mongo.rs | 1 + crates/dbx-web/src/routes/mq.rs | 1 + crates/dbx-web/src/routes/transfer.rs | 145 +++++++++-------- crates/dbx-web/src/sse.rs | 151 ++++++++++++++++++ crates/dbx-web/src/state.rs | 3 + packages/app-tests/useExportTracker.test.ts | 29 ++++ 20 files changed, 622 insertions(+), 65 deletions(-) diff --git a/apps/desktop/src/components/export/ExportProgressPopover.vue b/apps/desktop/src/components/export/ExportProgressPopover.vue index 7b5f71fdf9..ab225fa768 100644 --- a/apps/desktop/src/components/export/ExportProgressPopover.vue +++ b/apps/desktop/src/components/export/ExportProgressPopover.vue @@ -3,13 +3,14 @@ import { computed, ref } from "vue"; import { useI18n } from "vue-i18n"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Button } from "@/components/ui/button"; -import { Loader2, CheckCircle2, XCircle, AlertCircle, X, FileDown, DatabaseBackup, FileCode2, ArrowRightLeft } from "@lucide/vue"; +import { Loader2, CheckCircle2, XCircle, AlertCircle, X, FileDown, DatabaseBackup, FileCode2, ArrowRightLeft, ChevronRight } from "@lucide/vue"; import { formatDataTransferDuration, useExportTracker, type ExportTask } from "@/composables/useExportTracker"; const { t } = useI18n(); const { tasks, activeCount, hasActive, clearFinished, cancelTask, removeTask } = useExportTracker(); const open = ref(false); const showAll = ref(false); +const expandedFailureTaskIds = ref([]); const MAX_VISIBLE = 5; const reversedTasks = computed(() => { @@ -132,6 +133,18 @@ const statusColor = (status: string) => { function toggleShowAll() { showAll.value = !showAll.value; } + +function failureDetailsExpanded(exportId: string) { + return expandedFailureTaskIds.value.includes(exportId); +} + +function toggleFailureDetails(exportId: string) { + expandedFailureTaskIds.value = failureDetailsExpanded(exportId) ? expandedFailureTaskIds.value.filter((id) => id !== exportId) : [...expandedFailureTaskIds.value, exportId]; +} + +function failureDetailCount(task: ExportTask) { + return (task.transferFailures?.length ?? 0) + (task.transferFailuresOmitted ?? 0); +}