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); +}