From dd708fc0521e9bcc9e0a5eab1d12531606ade162 Mon Sep 17 00:00:00 2001
From: CSXFanMeng <105690322+CSXFanMeng@users.noreply.github.com>
Date: Thu, 10 Sep 2026 12:46:56 +0800
Subject: [PATCH] feat(backup): show connection groups in backup selector
---
.../backup/DatabaseBackupConfigFields.vue | 2 ++
.../ScheduledDatabaseBackupSettings.spec.ts | 23 +++++++++++++++++++
2 files changed, 25 insertions(+)
diff --git a/apps/desktop/src/components/backup/DatabaseBackupConfigFields.vue b/apps/desktop/src/components/backup/DatabaseBackupConfigFields.vue
index 24677f19d0..53f3a17796 100644
--- a/apps/desktop/src/components/backup/DatabaseBackupConfigFields.vue
+++ b/apps/desktop/src/components/backup/DatabaseBackupConfigFields.vue
@@ -8,6 +8,7 @@ import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { HelpTooltip } from "@/components/ui/tooltip";
import { Check, ChevronDown, FolderOpen, Loader2, Search } from "@lucide/vue";
+import ConnectionGroupBadge from "@/components/connection/ConnectionGroupBadge.vue";
import { databaseBackupFileNamePatternIsValid, type DatabaseBackupExecutionConfig } from "@/lib/backup/scheduledDatabaseBackup";
import type { ConnectionConfig } from "@/types/database";
@@ -123,6 +124,7 @@ watch(
@click="selectConnection(connection.id)"
>
+
{{ connection.name }}
{{ t("databaseBackup.noMatchingConnections") }}
diff --git a/apps/desktop/src/components/backup/__tests__/ScheduledDatabaseBackupSettings.spec.ts b/apps/desktop/src/components/backup/__tests__/ScheduledDatabaseBackupSettings.spec.ts
index cb1a421f5f..1b9bbdf69d 100644
--- a/apps/desktop/src/components/backup/__tests__/ScheduledDatabaseBackupSettings.spec.ts
+++ b/apps/desktop/src/components/backup/__tests__/ScheduledDatabaseBackupSettings.spec.ts
@@ -63,6 +63,16 @@ vi.mock("@/composables/useToast", () => ({
useToast: () => ({ toast: mocks.toast }),
}));
+vi.mock("@/components/connection/ConnectionGroupBadge.vue", async () => {
+ const { defineComponent, h } = await import("vue");
+ return {
+ default: defineComponent({
+ props: { connectionId: { type: String, required: true } },
+ setup: (props) => () => h("span", { "data-connection-group-badge": "", "data-connection-id": props.connectionId }),
+ }),
+ };
+});
+
vi.mock("@tauri-apps/plugin-dialog", () => ({
open: mocks.openDirectory,
}));
@@ -460,6 +470,19 @@ describe("ScheduledDatabaseBackupSettings schedule dialog", () => {
expect(currentDialog().querySelector("[data-backup-output-path-preview]")?.textContent).toContain("/backups/archive/");
});
+ it("shows connection group badges in the backup connection picker", async () => {
+ mocks.connections.push({ id: "mysql-primary", name: "Shared name", db_type: "mysql" }, { id: "mysql-archive", name: "Shared name", db_type: "mysql" });
+ await mountSettings();
+
+ addScheduleButton().click();
+ await flush();
+ currentDialog().querySelector("[data-backup-connection-picker]")?.click();
+ await flush();
+
+ const connectionIds = Array.from(document.body.querySelectorAll("[data-connection-group-badge]")).map((badge) => badge.dataset.connectionId);
+ expect(connectionIds).toEqual(["mysql-primary", "mysql-archive"]);
+ });
+
it("opens an independent one-shot dialog without schedule fields", async () => {
mocks.connections.push({ id: "mysql-1", name: "Local MySQL", db_type: "mysql" });
await mountSettings();