fix(objects): preserve category filter per tab

This commit is contained in:
Eve authored and GitHub committed 2026-09-10 15:57:15 +08:00
1 parent bd828076ab
commit 5b5d58cd2a
11 files changed
+47 -32

No files matched your search

@@ -80,21 +80,24 @@ describe("queryStore database open state", () => {
expect(store.tabs.filter((tab) => tab.mode === "dolt-version-control")).toHaveLength(2);
});
it("keeps object browser search and viewport per tab", async () => {
it("keeps object browser filter, search, and viewport per tab", async () => {
const { useQueryStore } = await import("@/stores/queryStore");
const store = useQueryStore();
const tabId = store.openObjectBrowser("pg-1", "app", "public");
store.updateObjectBrowserFilter(tabId, "views");
store.updateObjectBrowserSearch(tabId, "orders");
store.updateObjectBrowserViewport(tabId, { scrollTop: 340, viewMode: "list" });
const tab = store.tabs.find((item) => item.id === tabId);
expect(tab?.objectBrowser?.filter).toBe("views");
expect(tab?.objectBrowser?.searchQuery).toBe("orders");
expect(tab?.objectBrowser?.viewport).toEqual({ scrollTop: 340, viewMode: "list" });
const otherTabId = store.createTab("pg-1", "app", "query");
store.switchTab(otherTabId);
store.switchTab(tabId);
expect(store.tabs.find((item) => item.id === tabId)?.objectBrowser?.filter).toBe("views");
expect(store.tabs.find((item) => item.id === tabId)?.objectBrowser?.searchQuery).toBe("orders");
store.updateSchema(tabId, "archive");
@@ -102,6 +105,7 @@ describe("queryStore database open state", () => {
expect(tab?.objectBrowser?.schema).toBe("archive");
// The keyword intentionally survives a schema switch: the mounted browser keeps its local search too.
expect(tab?.objectBrowser?.searchQuery).toBe("orders");
expect(tab?.objectBrowser?.filter).toBeUndefined();
expect(tab?.objectBrowser?.viewport).toBeUndefined();
});
@@ -77,6 +77,10 @@ describe("queryStore MySQL Event create navigation", () => {
expect(tab.objectBrowser?.eventCreateRequestId).toBeUndefined();
expect(tab.objectBrowser?.initialObjectFilter).toBe("events");
store.updateObjectBrowserFilter(tabId, "tables");
expect(tab.objectBrowser?.filter).toBe("tables");
expect(tab.objectBrowser?.initialObjectFilter).toBe("events");
// Re-opening the same existing event on the reused tab increments edit request id
store.openObjectBrowser("mysql-1", "shop", undefined, undefined, "foo_event", true, "events");
expect(tab.objectBrowser?.eventOpenRequestId).toBe(2);
+9 -2
View File
@@ -3,7 +3,7 @@ import { defineStore } from "pinia";
import { uuid } from "@/lib/common/utils";
import { computed, markRaw, nextTick, onScopeDispose, reactive, ref, watch } from "vue";
import { useI18n } from "vue-i18n";
import type { BatchSqlExecution, ConnectionConfig, DatabaseType, IndexInfo, NacosConfigEditorViewport, ObjectBrowserViewport, QueryResult, QueryResultSourceColumnRef, QueryTab, TableInfoTab, TableStructureEditorTarget } from "@/types/database";
import type { BatchSqlExecution, ConnectionConfig, DatabaseType, IndexInfo, NacosConfigEditorViewport, ObjectBrowserFilter, ObjectBrowserViewport, QueryResult, QueryResultSourceColumnRef, QueryTab, TableInfoTab, TableStructureEditorTarget } from "@/types/database";
import { orderPinnedFirst } from "@/lib/app/pinnedItems";
import { canCancelQueryExecution } from "@/lib/sql/queryExecutionState";
import { buildExplainSql, parseExplainResult, parseDamengExplainText, parseOracleExplainText, sqlServerExplainResult, type BuildExplainSqlResult, type ExplainPlanDatabaseType } from "@/lib/diagram/explainPlan";
@@ -4193,6 +4193,12 @@ export const useQueryStore = defineStore("query", () => {
tab.objectBrowser = { ...tab.objectBrowser, searchQuery: query };
}
function updateObjectBrowserFilter(id: string, filter: ObjectBrowserFilter) {
const tab = tabs.value.find((t) => t.id === id);
if (!tab || tab.mode !== "objects" || tab.objectBrowser?.filter === filter) return;
tab.objectBrowser = { ...tab.objectBrowser, filter };
}
function updateNacosConfigEditorViewport(connectionId: string, namespace: string, viewport: NacosConfigEditorViewport) {
if (!Number.isFinite(viewport.scrollTop) || !Number.isFinite(viewport.scrollLeft)) return;
const tab = tabs.value.find((candidate) => candidate.mode === "nacos" && candidate.connectionId === connectionId && (candidate.nacosNamespace || "") === namespace);
@@ -4437,7 +4443,7 @@ export const useQueryStore = defineStore("query", () => {
clearExplain(tab);
}
tab.schema = schema;
if (tab.mode === "objects") tab.objectBrowser = { ...tab.objectBrowser, schema, viewport: undefined };
if (tab.mode === "objects") tab.objectBrowser = { ...tab.objectBrowser, schema, filter: undefined, viewport: undefined };
persistSavedSqlExecutionTarget(tab, options);
}
@@ -7903,6 +7909,7 @@ export const useQueryStore = defineStore("query", () => {
flushEditorState,
updateObjectBrowserViewport,
updateObjectBrowserSearch,
updateObjectBrowserFilter,
updateNacosConfigEditorViewport,
setAutoCommit,
markManualTransactionDirty,