diff --git a/apps/desktop/src/components/editor/EditorSettingsDialog.vue b/apps/desktop/src/components/editor/EditorSettingsDialog.vue index e9aea5623..5cb1934ae 100644 --- a/apps/desktop/src/components/editor/EditorSettingsDialog.vue +++ b/apps/desktop/src/components/editor/EditorSettingsDialog.vue @@ -122,6 +122,7 @@ const editDisconnectTabHandlingMode = ref( const editSidebarHiddenTablePrefixes = ref(settingsStore.editorSettings.sidebarHiddenTablePrefixes.join("\n")); const editSidebarHideTableComments = ref(settingsStore.editorSettings.sidebarHideTableComments); const editSidebarAllowHorizontalScroll = ref(settingsStore.editorSettings.sidebarAllowHorizontalScroll); +const editExportBatchSize = ref(settingsStore.editorSettings.exportBatchSize); const redisScanPageSizeOptions = [200, 1000, 5000, 10000]; const systemFonts = ref([]); const systemFontsLoading = ref(false); @@ -269,6 +270,7 @@ watch( editSidebarHiddenTablePrefixes.value = settingsStore.editorSettings.sidebarHiddenTablePrefixes.join("\n"); editSidebarHideTableComments.value = settingsStore.editorSettings.sidebarHideTableComments; editSidebarAllowHorizontalScroll.value = settingsStore.editorSettings.sidebarAllowHorizontalScroll; + editExportBatchSize.value = settingsStore.editorSettings.exportBatchSize; editSnippets.value = settingsStore.editorSettings.snippets.map((s) => ({ ...s })); void loadSystemFontOptions(); } @@ -309,6 +311,7 @@ function hasChanges(): boolean { editDisconnectTabHandlingMode.value !== settingsStore.editorSettings.disconnectTabHandlingMode || editSidebarHideTableComments.value !== settingsStore.editorSettings.sidebarHideTableComments || editSidebarAllowHorizontalScroll.value !== settingsStore.editorSettings.sidebarAllowHorizontalScroll || + editExportBatchSize.value !== settingsStore.editorSettings.exportBatchSize || JSON.stringify(normalizeSidebarHiddenTablePrefixes(editSidebarHiddenTablePrefixes.value)) !== JSON.stringify(settingsStore.editorSettings.sidebarHiddenTablePrefixes) || JSON.stringify(editSnippets.value) !== JSON.stringify(settingsStore.editorSettings.snippets) @@ -338,6 +341,7 @@ async function persistSettings() { sidebarHideTableComments: editSidebarHideTableComments.value, sidebarAllowHorizontalScroll: editSidebarAllowHorizontalScroll.value, sidebarHiddenTablePrefixes: normalizeSidebarHiddenTablePrefixes(editSidebarHiddenTablePrefixes.value), + exportBatchSize: editExportBatchSize.value, snippets: editSnippets.value, }); await settingsStore.updateDesktopSettings({ @@ -379,6 +383,7 @@ function resetDefaults() { editSidebarHideTableComments.value = DEFAULT_EDITOR_SETTINGS.sidebarHideTableComments; editSidebarAllowHorizontalScroll.value = DEFAULT_EDITOR_SETTINGS.sidebarAllowHorizontalScroll; editSidebarHiddenTablePrefixes.value = DEFAULT_EDITOR_SETTINGS.sidebarHiddenTablePrefixes.join("\n"); + editExportBatchSize.value = DEFAULT_EDITOR_SETTINGS.exportBatchSize; editSnippets.value = DEFAULT_SQL_SNIPPETS.map((s) => ({ ...s })); } @@ -453,6 +458,7 @@ type SettingsCategory = | "editor" | "appearance" | "navigation" + | "data" | "redis" | "shortcuts" | "snippets" @@ -465,6 +471,7 @@ const settingsCategoryNav = computed<{ value: SettingsCategory; label: string }[ { value: "editor", label: t("settings.editorTab") }, { value: "appearance", label: t("settings.appearanceTab") }, { value: "navigation", label: t("settings.navigationTab") }, + { value: "data", label: t("settings.dataTab") }, { value: "redis", label: t("settings.redisTab") }, { value: "shortcuts", label: t("settings.shortcutsTab") }, { value: "snippets", label: t("settings.snippetsTab") }, @@ -478,6 +485,7 @@ const settingsTabsWithApplyFooter = new Set([ "editor", "appearance", "navigation", + "data", "redis", "shortcuts", "snippets", @@ -1622,6 +1630,35 @@ watch( + +
+
+
{{ t("settings.exportSection") }}
+
+ +
+ + + + {{ t("settings.exportBatchSizeDescription") }} +
+
+
+
+
diff --git a/apps/desktop/src/components/export/ExportProgressPopover.vue b/apps/desktop/src/components/export/ExportProgressPopover.vue new file mode 100644 index 000000000..3c0cc624c --- /dev/null +++ b/apps/desktop/src/components/export/ExportProgressPopover.vue @@ -0,0 +1,181 @@ + + + diff --git a/apps/desktop/src/components/layout/AppToolbar.vue b/apps/desktop/src/components/layout/AppToolbar.vue index 14b6d5efa..c7864867c 100644 --- a/apps/desktop/src/components/layout/AppToolbar.vue +++ b/apps/desktop/src/components/layout/AppToolbar.vue @@ -23,6 +23,7 @@ import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import LightDropdown from "@/components/ui/LightDropdown.vue"; import WindowControls from "@/components/layout/WindowControls.vue"; +import ExportProgressPopover from "@/components/export/ExportProgressPopover.vue"; import { shouldReserveMacTrafficLightInset, useWindowControls } from "@/composables/useWindowControls"; import { currentLocale, setLocale, type Locale } from "@/i18n"; import type { AppThemeMode } from "@/lib/appTheme"; @@ -193,6 +194,8 @@ function onToolbarDblClick(e: MouseEvent) { {{ t("updates.check") }} + +