From 906ea8ba26bb60aa4f67f3aa4dc086fef65a3f78 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Sat, 22 Aug 2026 10:31:17 +0000 Subject: [PATCH] feat(tabs): locate tab objects in sidebar Closes #6681 --- apps/desktop/src/App.vue | 7 +++++ .../src/components/layout/AppSidebar.vue | 8 ++++-- .../src/components/layout/AppTabBar.vue | 10 ++++++- .../layout/__tests__/AppTabBar.spec.ts | 28 +++++++++++++++++++ .../src/components/sidebar/ConnectionTree.vue | 13 ++++++--- .../src/lib/sidebar/sidebarActiveTabTarget.ts | 23 +++++++++------ .../app-tests/sidebarActiveTabTarget.test.ts | 7 +++++ .../app-tests/sidebarContextMenuHost.test.ts | 24 +++++++++++++++- 8 files changed, 104 insertions(+), 16 deletions(-) diff --git a/apps/desktop/src/App.vue b/apps/desktop/src/App.vue index c43010ee7e..6227061579 100644 --- a/apps/desktop/src/App.vue +++ b/apps/desktop/src/App.vue @@ -2041,6 +2041,12 @@ function setSidebarOpen(open: boolean) { safeLocalStorageSet("dbx-sidebar-open", open ? "true" : "false"); } +async function locateTabInSidebar(tab: QueryTab) { + setSidebarOpen(true); + await nextTick(); + await appSidebarRef.value?.locateTabInSidebar(tab); +} + function ensureQueryTab(): string { const tab = activeTab.value; if (tab && tab.mode === "query") return tab.id; @@ -2847,6 +2853,7 @@ onUnmounted(() => { :agent-driver-update-count="toolbarAgentDriverUpdateCount" @activate-driver-store="openDriverStorePage" @activate-settings-page="activateSettingsPage" + @locate-tab="locateTabInSidebar" @activate-tab=" driverStoreActive = false; settingsStore.settingsPageActive = false; diff --git a/apps/desktop/src/components/layout/AppSidebar.vue b/apps/desktop/src/components/layout/AppSidebar.vue index cd284e6f43..3c006d1a59 100644 --- a/apps/desktop/src/components/layout/AppSidebar.vue +++ b/apps/desktop/src/components/layout/AppSidebar.vue @@ -12,7 +12,7 @@ import ConnectionTree from "@/components/sidebar/ConnectionTree.vue"; import { applyConnectionMultiSelection, emptyConnectionMultiSelection, isExitConnectionMultiSelectionShortcut } from "@/lib/sidebar/sidebarConnectionMultiSelect"; import { useConnectionStore } from "@/stores/connectionStore"; import { useToast } from "@/composables/useToast"; -import type { TreeNode } from "@/types/database"; +import type { QueryTab, TreeNode } from "@/types/database"; defineProps<{ sidebarWidth: number; @@ -88,6 +88,10 @@ function focusSearch(): boolean { return connectionTreeRef.value?.focusSearch() ?? false; } +function locateTabInSidebar(tab: QueryTab) { + return connectionTreeRef.value?.locateTabInSidebar(tab); +} + function clearConnectionMultiSelection() { applyConnectionMultiSelection(connectionStore, emptyConnectionMultiSelection()); } @@ -163,7 +167,7 @@ function confirmCreateSelectedGroup() { showCreateSelectedGroupDialog.value = false; } -defineExpose({ focusSearch }); +defineExpose({ focusSearch, locateTabInSidebar });