From d30d47ccdac472e4ca08ef323254f6204fe20731 Mon Sep 17 00:00:00 2001 From: LRcoding <38545827+LwClick@users.noreply.github.com> Date: Wed, 1 Jul 2026 14:43:13 +0800 Subject: [PATCH] =?UTF-8?q?fix(app):=20=E4=BF=AE=E5=A4=8D=E5=8F=AF?= =?UTF-8?q?=E8=A7=81=E5=AF=B9=E8=B1=A1=E8=BF=87=E6=BB=A4=E5=99=A8=E5=80=99?= =?UTF-8?q?=E9=80=89=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复 #2272:已保存可见对象过滤后,再次打开过滤器时仍显示当前连接可选对象全集。 已有 visible_databases 只用于初始勾选状态,侧边栏树展示仍继续应用已保存过滤。 Co-authored-by: zero --- .../connection/ConnectionDialog.vue | 4 ++-- .../sidebar/VisibleDatabasesDialog.vue | 4 ++-- .../src/lib/connectionVisibleDatabases.ts | 4 ++-- apps/desktop/src/lib/visibleDatabases.ts | 4 ++++ .../connectionVisibleDatabases.test.ts | 20 ++++++++++++++++++- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/apps/desktop/src/components/connection/ConnectionDialog.vue b/apps/desktop/src/components/connection/ConnectionDialog.vue index a2322339e..c5c0f23a2 100644 --- a/apps/desktop/src/components/connection/ConnectionDialog.vue +++ b/apps/desktop/src/components/connection/ConnectionDialog.vue @@ -38,7 +38,7 @@ import { SQLITE_DATABASE_FILE_EXTENSIONS } from "@/lib/databaseFileDetection"; import { connectionAttemptOriginalErrorMessage, connectionAttemptTimeoutMessage, connectionAttemptTimeoutMs } from "@/lib/connectionAttemptTimeout"; import { ArrowLeft, ArrowDown, ArrowUp, CheckSquare, ChevronRight, CircleHelp, Copy, ExternalLink, FilePlus2, FolderOpen, GripVertical, Grid3X3, KeyRound, Link2, List, ListFilter, Loader2, Pipette, Plus, Search, ShieldCheck, Square, Trash2 } from "@lucide/vue"; import { buildDraftVisibleDatabasesConnectionId, connectionCanChooseVisibleDatabases, initialVisibleDatabaseSelection, visibleDatabaseSelectionIsStale } from "@/lib/connectionVisibleDatabases"; -import { canSaveVisibleDatabaseSelection, connectionUsesVisibleSchemaFilter, filterDatabaseNamesForConnection, isSystemDatabaseName, normalizeVisibleDatabaseSelection, buildDraftVisibleSchemasConnectionId, normalizeVisibleSchemaSelection } from "@/lib/visibleDatabases"; +import { canSaveVisibleDatabaseSelection, connectionUsesVisibleSchemaFilter, filterDatabaseNamesForVisiblePicker, isSystemDatabaseName, normalizeVisibleDatabaseSelection, buildDraftVisibleSchemasConnectionId, normalizeVisibleSchemaSelection } from "@/lib/visibleDatabases"; import { isSchemaAware } from "@/lib/databaseFeatureSupport"; import VisibleSchemasDialog from "@/components/sidebar/VisibleSchemasDialog.vue"; import { oceanbaseModeConnectionPatch, oceanbaseSubModeFromConfig } from "@/lib/oceanbaseConnectionMode"; @@ -1582,7 +1582,7 @@ const listedVisibleDatabaseNames = computed(() => { if (visibleFilterUsesSchemas.value) return visibleDatabaseNames.value; const connection = connectionConfigSnapshotForVisibleDatabases(); if (visibleDatabaseShowSystem.value) return visibleDatabaseNames.value; - return filterDatabaseNamesForConnection(visibleDatabaseNames.value, connection); + return filterDatabaseNamesForVisiblePicker(visibleDatabaseNames.value, connection); }); const filteredVisibleDatabaseNames = computed(() => { const query = visibleDatabaseSearchText.value.trim().toLowerCase(); diff --git a/apps/desktop/src/components/sidebar/VisibleDatabasesDialog.vue b/apps/desktop/src/components/sidebar/VisibleDatabasesDialog.vue index 5322f7158..d05b6ea52 100644 --- a/apps/desktop/src/components/sidebar/VisibleDatabasesDialog.vue +++ b/apps/desktop/src/components/sidebar/VisibleDatabasesDialog.vue @@ -6,7 +6,7 @@ import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { useConnectionStore } from "@/stores/connectionStore"; -import { canSaveVisibleDatabaseSelection, connectionUsesVisibleSchemaFilter, filterDatabaseNamesForConnection, isSystemDatabaseName, normalizeVisibleDatabaseSelection } from "@/lib/visibleDatabases"; +import { canSaveVisibleDatabaseSelection, connectionUsesVisibleSchemaFilter, filterDatabaseNamesForVisiblePicker, isSystemDatabaseName, normalizeVisibleDatabaseSelection } from "@/lib/visibleDatabases"; import * as api from "@/lib/api"; const props = defineProps<{ @@ -43,7 +43,7 @@ const loadFailedKey = computed(() => (isSchemaFilterMode.value ? "visibleSchemas const listedObjectNames = computed(() => { if (isSchemaFilterMode.value) return objectNames.value; if (showSystemDatabases.value) return objectNames.value; - return filterDatabaseNamesForConnection(objectNames.value, connection.value); + return filterDatabaseNamesForVisiblePicker(objectNames.value, connection.value); }); const filteredObjectNames = computed(() => { const query = searchText.value.trim().toLowerCase(); diff --git a/apps/desktop/src/lib/connectionVisibleDatabases.ts b/apps/desktop/src/lib/connectionVisibleDatabases.ts index 39aa23ca3..8bb9df6e6 100644 --- a/apps/desktop/src/lib/connectionVisibleDatabases.ts +++ b/apps/desktop/src/lib/connectionVisibleDatabases.ts @@ -1,5 +1,5 @@ import type { ConnectionConfig, DatabaseType } from "@/types/database"; -import { filterDatabaseNamesForConnection, normalizeVisibleDatabaseSelection } from "@/lib/visibleDatabases"; +import { filterDatabaseNamesForVisiblePicker, normalizeVisibleDatabaseSelection } from "@/lib/visibleDatabases"; const DRAFT_VISIBLE_DATABASES_PREFIX = "__visible_draft_"; @@ -22,7 +22,7 @@ export function initialVisibleDatabaseSelection(databaseNames: string[], visible if (Array.isArray(visibleDatabases)) { return normalizeVisibleDatabaseSelection(visibleDatabases, databaseNames); } - return filterDatabaseNamesForConnection(databaseNames, connection); + return filterDatabaseNamesForVisiblePicker(databaseNames, connection); } export function visibleDatabaseSelectionIsStale(previous: VisibleDatabaseConnectionFields, current: VisibleDatabaseConnectionFields): boolean { diff --git a/apps/desktop/src/lib/visibleDatabases.ts b/apps/desktop/src/lib/visibleDatabases.ts index eac168903..26e48cd2f 100644 --- a/apps/desktop/src/lib/visibleDatabases.ts +++ b/apps/desktop/src/lib/visibleDatabases.ts @@ -93,6 +93,10 @@ export function filterDatabaseNamesForConnection(databaseNames: string[], connec if (visibleDatabaseFilterIsEnabled(visibleDatabases)) { return filterVisibleDatabaseNames(databaseNames, visibleDatabases); } + return filterDatabaseNamesForVisiblePicker(databaseNames, connection); +} + +export function filterDatabaseNamesForVisiblePicker(databaseNames: string[], connection: Pick | undefined): string[] { if (connection?.db_type === "gbase" && connection.driver_profile === "gbase8s") { return databaseNames; } diff --git a/packages/app-tests/connectionVisibleDatabases.test.ts b/packages/app-tests/connectionVisibleDatabases.test.ts index 3237493f3..96e769a13 100644 --- a/packages/app-tests/connectionVisibleDatabases.test.ts +++ b/packages/app-tests/connectionVisibleDatabases.test.ts @@ -1,7 +1,7 @@ import assert from "node:assert/strict"; import { test } from "vitest"; import { buildDraftVisibleDatabasesConnectionId, connectionCanChooseVisibleDatabases, visibleDatabaseSelectionIsStale, initialVisibleDatabaseSelection } from "../../apps/desktop/src/lib/connectionVisibleDatabases.ts"; -import { connectionUsesVisibleSchemaFilter, filterDatabaseNamesForConnection } from "../../apps/desktop/src/lib/visibleDatabases.ts"; +import { connectionUsesVisibleSchemaFilter, filterDatabaseNamesForConnection, filterDatabaseNamesForVisiblePicker } from "../../apps/desktop/src/lib/visibleDatabases.ts"; import type { ConnectionConfig } from "../../apps/desktop/src/types/database.ts"; function config(overrides: Partial = {}): ConnectionConfig { @@ -49,6 +49,24 @@ test("initial selection uses default visible database names when no filter is co assert.deepEqual(initialVisibleDatabaseSelection(["app", "mysql", "sys"], undefined, config()), ["app"]); }); +test("visible database picker ignores saved filters while keeping default system database hiding", () => { + const databaseNames = ["app", "analytics", "mysql", "sys"]; + const connection = config({ visible_databases: ["app"] }); + assert.deepEqual(filterDatabaseNamesForVisiblePicker(databaseNames, connection), ["app", "analytics"]); + assert.deepEqual(initialVisibleDatabaseSelection(databaseNames, connection.visible_databases, connection), ["app"]); +}); + +test("Redis visible database picker keeps every database and initial selection uses saved filters", () => { + const databaseNames = ["0", "1", "2"]; + const connection = config({ db_type: "redis", driver_profile: "redis", visible_databases: ["0"] }); + assert.deepEqual(filterDatabaseNamesForVisiblePicker(databaseNames, connection), ["0", "1", "2"]); + assert.deepEqual(initialVisibleDatabaseSelection(databaseNames, connection.visible_databases, connection), ["0"]); +}); + +test("connection database filtering still applies saved visible database filters for sidebar display", () => { + assert.deepEqual(filterDatabaseNamesForConnection(["app", "analytics", "mysql", "sys"], config({ visible_databases: ["app"] })), ["app"]); +}); + test("ZooKeeper connections do not offer visible database selection", () => { assert.equal(connectionCanChooseVisibleDatabases(config({ db_type: "zookeeper" })), false); });