From cb00b27963c13078ced2fcdf4fffc8ed32f7a25a Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Wed, 13 May 2026 18:12:55 +0800 Subject: [PATCH] fix(sidebar): refresh grouped object nodes --- src/lib/tableTree.ts | 14 ++++++++++++++ src/stores/connectionStore.ts | 14 +++++++++++++- tests/tableTree.test.ts | 16 +++++++++++++++- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/lib/tableTree.ts b/src/lib/tableTree.ts index 70fdf3f7d..bf9d3db4d 100644 --- a/src/lib/tableTree.ts +++ b/src/lib/tableTree.ts @@ -58,6 +58,20 @@ const groupDefs: Array<{ }, ]; +const objectGroupNodeTypes = new Set([ + "group-tables", + "group-views", + "group-procedures", + "group-functions", +]); + +export function objectGroupRefreshParentId(node: TreeNode): string | null { + if (!objectGroupNodeTypes.has(node.type)) return null; + const suffixStart = node.id.lastIndexOf(":__"); + if (suffixStart < 0) return null; + return node.id.slice(0, suffixStart); +} + export function buildGroupedObjectTreeNodes({ nodeId, connectionId, diff --git a/src/stores/connectionStore.ts b/src/stores/connectionStore.ts index e86deb7b1..dd7116c50 100644 --- a/src/stores/connectionStore.ts +++ b/src/stores/connectionStore.ts @@ -23,7 +23,12 @@ import { isTauriRuntime } from "@/lib/tauriRuntime"; import { isSchemaAware, TREE_SCHEMA_TYPES } from "@/lib/databaseCapabilities"; import { buildDatabaseTreeNodes } from "@/lib/databaseTree"; import { buildSqlServerDatabaseTreeNodes, SQLSERVER_DEFAULT_SCHEMA } from "@/lib/sqlServerTree"; -import { buildGroupedObjectTreeNodes, buildTableTreeNodes, expandCachedObjectBrowserNodes } from "@/lib/tableTree"; +import { + buildGroupedObjectTreeNodes, + buildTableTreeNodes, + expandCachedObjectBrowserNodes, + objectGroupRefreshParentId, +} from "@/lib/tableTree"; import { useSavedSqlStore } from "@/stores/savedSqlStore"; const PINNED_TREE_NODES_STORAGE_KEY = "dbx-pinned-tree-nodes"; @@ -964,6 +969,13 @@ export const useConnectionStore = defineStore("connection", () => { } async function refreshTreeNode(node: TreeNode) { + const parentId = objectGroupRefreshParentId(node); + const parentNode = parentId ? findNode(treeNodes.value, parentId) : null; + if (parentNode) { + await refreshTreeNode(parentNode); + return; + } + const expandedIds = collectExpandedNodeIds([node]); expandedIds.add(node.id); await clearPersistedTreeCacheForNode(node); diff --git a/tests/tableTree.test.ts b/tests/tableTree.test.ts index 01ac60aec..f256d9b08 100644 --- a/tests/tableTree.test.ts +++ b/tests/tableTree.test.ts @@ -1,6 +1,6 @@ import assert from "node:assert/strict"; import test from "node:test"; -import { buildTableTreeNodes, expandCachedObjectBrowserNodes } from "../src/lib/tableTree.ts"; +import { buildTableTreeNodes, expandCachedObjectBrowserNodes, objectGroupRefreshParentId } from "../src/lib/tableTree.ts"; import type { TableInfo } from "../src/types/database.ts"; function table(name: string, tableType: "TABLE" | "VIEW" = "TABLE"): TableInfo { @@ -82,3 +82,17 @@ test("expands cached object-browser nodes back into regular table nodes", () => ], ); }); + +test("resolves grouped object refreshes to the parent schema node", () => { + assert.equal( + objectGroupRefreshParentId({ + id: "conn:db:public:__tables", + label: "tree.tables", + type: "group-tables", + connectionId: "conn", + database: "db", + schema: "public", + }), + "conn:db:public", + ); +});