perf(export): 优化导出ui体验和性能

* docs(getting-started): set brew upgrade to use official homebrew cask

* fix(mysql): make admin show handling dialect aware

* fix(data-compare): create missing target tables during sync

* feat(sql): suggest join conditions from foreign keys

* fix(sidebar): use filtered order for range selection

* fix(tabs): close connection tabs on disconnect

* fix(sqlserver): execute cte queries without wrapping

* fix(opengauss): open table structure editor

* perf(export): 优化导出ui体验和性能

* perf(export): 优化导出ui体验和性能

* fix(export): normalize status casing and fix web route issues

- Add missing table export web routes (POST /export/table, SSE progress, cancel)
- Fix tauri table export Promise to wait for terminal events
- Change cancel to return Ok(()) so it doesn't get overwritten as Error
- Unify ExportStatus to PascalCase across all frontend components
- Fix http.ts table export POST body wrapping
- Fix duplicate pub mod in dbx-web routes

* fix(export): return export file for browser download in web mode

Write table export output to temp dir, register a download endpoint,
and trigger browser download from the frontend when export completes.

* fix(export): avoid table export progress races

---------

Co-authored-by: Francesco Lucarelli <francesco06lucarelli@gmail.com>
Co-authored-by: t8y2 <1156263951@qq.com>
Co-authored-by: dqn <someonegdeng@qq.com>
This commit is contained in:
authored and GitHub committed 2026-06-03 10:39:11 +08:00
1 parent bed72d2132
commit bea3b45fd8
22 files changed
+1282 -159

No files matched your search

@@ -181,6 +181,7 @@ import {
import { useToast } from "@/composables/useToast";
import { useDataGridExport } from "@/composables/useDataGridExport";
import ExportProgressDialog from "@/components/export/ExportProgressDialog.vue";
import { DATA_GRID_ROW_NUM_WIDTH, useDataGridColumnResize } from "@/composables/useDataGridColumnResize";
import { useDataGridSelection } from "@/composables/useDataGridSelection";
import { useDataGridEditor } from "@/composables/useDataGridEditor";
@@ -3432,6 +3433,18 @@ function setRowStatusFilter(value: string) {
rowStatusFilter.value = value as RowStatusFilter;
}
// --- Export progress dialog state ---
const exportProgressDialog = ref(false);
const exportProgressState = ref({
title: "",
tableName: "",
format: "csv" as string,
rowsExported: 0,
totalRows: null as number | null,
status: "",
errorMessage: null as string | null,
});
// --- Export composable ---
const {
copyText,
@@ -3473,6 +3486,8 @@ const {
selectedRowIds,
hasRowSelection,
fullExportResult: props.fullExportResult,
exportProgressDialog,
exportProgressState,
});
const pageSizeMenuItems = computed(() =>
@@ -7692,6 +7707,7 @@ const gridContextMenuItems = computed<ContextMenuItem[]>(() => {
@confirm="confirmDeleteRow"
/>
<ImagePreviewDialog v-model:open="imagePreviewOpen" :src="imagePreviewSrc" :title="imagePreviewTitle" />
<ExportProgressDialog v-model:open="exportProgressDialog" v-bind="exportProgressState" disable-cancel />
</div>
</template>