fix(sidebar): follow activation mode for object browsing
This commit is contained in:
1 parent
ef2fdb941c
commit
f958bf4602
19 files changed
+117
-95
No files matched your search
+30
-26
@@ -5,7 +5,7 @@ import {
|
||||
objectSourceKindForTreeNode,
|
||||
objectSourceTargetForTreeNode,
|
||||
shouldActivateTreeNodeOnSingleClick,
|
||||
shouldOpenObjectBrowserOnSingleClick,
|
||||
shouldBrowseObjectsOnDatabaseActivation,
|
||||
shouldRunTreeNodeRowAction,
|
||||
treeNodeRowAction,
|
||||
treeNodeRowDoubleClickAction,
|
||||
@@ -90,51 +90,55 @@ describe("treeNodeClick", () => {
|
||||
expect(treeNodeRowDoubleClickAction("connection", false, "double", false, "postgres", true)).toBe("none");
|
||||
});
|
||||
|
||||
it("opens the object browser on single click when the database single-click switch is on", () => {
|
||||
it("browses objects on single-click activation only when enabled", () => {
|
||||
expect(treeNodeRowAction("database", true, "single", "postgres", true, true)).toBe("open-object-browser-and-expand");
|
||||
expect(treeNodeRowAction("database", false, "single", "postgres", true, true)).toBe("open-object-browser");
|
||||
expect(treeNodeRowAction("schema", true, "single", "postgres", true, true)).toBe("open-object-browser-and-expand");
|
||||
expect(treeNodeRowAction("object-browser", false, "single", "postgres", true, true)).toBe("open-object-browser");
|
||||
expect(treeNodeRowAction("database", true, "single", "postgres", false, true)).toBe("toggle");
|
||||
expect(treeNodeRowAction("schema", true, "single", "postgres", false, true)).toBe("toggle");
|
||||
});
|
||||
|
||||
it("lets the database single-click switch override double-click activation", () => {
|
||||
expect(treeNodeRowAction("database", true, "double", "postgres", true, true)).toBe("open-object-browser-and-expand");
|
||||
expect(treeNodeRowAction("schema", false, "double", "postgres", true, true)).toBe("open-object-browser");
|
||||
it("keeps the first click selection-only in double-click activation", () => {
|
||||
expect(treeNodeRowAction("database", true, "double", "postgres", true, true)).toBe("none");
|
||||
expect(treeNodeRowAction("schema", true, "double", "postgres", true, true)).toBe("none");
|
||||
expect(treeNodeRowAction("database", true, "double", "postgres", false, true)).toBe("none");
|
||||
});
|
||||
|
||||
it("does not reopen the object browser when the single-click switch already handled the gesture", () => {
|
||||
it("does not run a second database action after single-click activation", () => {
|
||||
expect(treeNodeRowDoubleClickAction("database", true, "single", true, "postgres", false, true)).toBe("none");
|
||||
expect(treeNodeRowDoubleClickAction("schema", true, "double", true, "postgres", false, true)).toBe("none");
|
||||
expect(treeNodeRowDoubleClickAction("object-browser", true, "single", false, "postgres", false, true)).toBe("none");
|
||||
expect(treeNodeRowDoubleClickAction("database", true, "single", true, "postgres", false, false)).toBe("none");
|
||||
expect(treeNodeRowDoubleClickAction("schema", true, "single", true, "postgres", false, true)).toBe("none");
|
||||
});
|
||||
|
||||
it("keeps the existing double-click fallback when single-click browsing is unavailable", () => {
|
||||
expect(treeNodeRowDoubleClickAction("database", true, "single", true, "postgres", false, false)).toBe("open-object-browser");
|
||||
it("browses objects on double-click activation only when enabled", () => {
|
||||
expect(treeNodeRowDoubleClickAction("database", true, "double", true, "postgres", false, true)).toBe("open-object-browser-and-expand");
|
||||
expect(treeNodeRowDoubleClickAction("schema", true, "double", false, "postgres", false, true)).toBe("open-object-browser");
|
||||
expect(treeNodeRowDoubleClickAction("database", true, "double", true, "postgres", false, false)).toBe("toggle");
|
||||
expect(treeNodeRowDoubleClickAction("schema", true, "double", false, "postgres", false, false)).toBe("none");
|
||||
});
|
||||
|
||||
it("falls back to expansion when object browsing is unsupported", () => {
|
||||
expect(treeNodeRowAction("database", true, "single", "postgres", true, false)).toBe("toggle");
|
||||
expect(treeNodeRowAction("database", true, "double", "postgres", true, false)).toBe("none");
|
||||
expect(treeNodeRowDoubleClickAction("database", false, "double", true, "postgres", false, true)).toBe("toggle");
|
||||
});
|
||||
|
||||
it("keeps the original single-click behavior when the database single-click switch is off or unsupported", () => {
|
||||
expect(treeNodeRowAction("database", true, "single", "postgres", false, true)).toBe("toggle");
|
||||
expect(treeNodeRowAction("database", true, "double", "postgres", false, true)).toBe("none");
|
||||
// Capability off (e.g. unsupported database type) falls back to the previous behavior.
|
||||
expect(treeNodeRowAction("database", true, "single", "postgres", true, false)).toBe("toggle");
|
||||
expect(treeNodeRowAction("database", true, "double", "postgres", true, false)).toBe("none");
|
||||
});
|
||||
|
||||
it("does not route non-database nodes through the database single-click switch", () => {
|
||||
it("does not route non-database nodes through the database activation switch", () => {
|
||||
expect(treeNodeRowAction("table", false, "single", "postgres", true, true)).toBe("open-data");
|
||||
expect(treeNodeRowAction("table", false, "double", "postgres", true, true)).toBe("none");
|
||||
expect(shouldOpenObjectBrowserOnSingleClick("table", true)).toBe(false);
|
||||
expect(shouldOpenObjectBrowserOnSingleClick("database", true)).toBe(true);
|
||||
expect(shouldOpenObjectBrowserOnSingleClick("database", false)).toBe(false);
|
||||
expect(shouldOpenObjectBrowserOnSingleClick("mongo-db", true)).toBe(true);
|
||||
expect(shouldOpenObjectBrowserOnSingleClick("mongo-db", false)).toBe(false);
|
||||
expect(shouldBrowseObjectsOnDatabaseActivation("table", true)).toBe(false);
|
||||
expect(shouldBrowseObjectsOnDatabaseActivation("database", true)).toBe(true);
|
||||
expect(shouldBrowseObjectsOnDatabaseActivation("database", false)).toBe(false);
|
||||
expect(shouldBrowseObjectsOnDatabaseActivation("mongo-db", true)).toBe(true);
|
||||
expect(shouldBrowseObjectsOnDatabaseActivation("object-browser", true)).toBe(false);
|
||||
expect(treeNodeRowDoubleClickAction("object-browser", true, "double", false, "postgres", false, false)).toBe("open-object-browser");
|
||||
});
|
||||
|
||||
it("opens the MongoDB object browser from mongo-db nodes like SQL databases", () => {
|
||||
expect(treeNodeRowAction("mongo-db", true, "single", "mongodb", true, true)).toBe("open-object-browser-and-expand");
|
||||
expect(treeNodeRowAction("mongo-db", true, "single", "mongodb", false, true)).toBe("toggle");
|
||||
expect(treeNodeRowDoubleClickAction("mongo-db", true, "single", true, "mongodb")).toBe("open-object-browser");
|
||||
expect(treeNodeRowDoubleClickAction("mongo-db", true, "single", true, "mongodb", false, true)).toBe("none");
|
||||
expect(treeNodeRowDoubleClickAction("mongo-db", true, "double", true, "mongodb", false, true)).toBe("open-object-browser-and-expand");
|
||||
});
|
||||
|
||||
it("expands package containers while preserving source behavior for leaf packages", () => {
|
||||
|
||||
@@ -65,7 +65,7 @@ export const EDITOR_SETTINGS_DRAFT_KEYS = [
|
||||
"routineSourceOpenMode",
|
||||
"sidebarTableSearchEnabled",
|
||||
"autoSelectActiveSidebarNode",
|
||||
"sidebarOpenDatabaseOnSingleClick",
|
||||
"sidebarBrowseObjectsOnDatabaseActivation",
|
||||
"openTabsRestoreMode",
|
||||
"disconnectTabHandlingMode",
|
||||
"dataTabReuseMode",
|
||||
|
||||
@@ -170,7 +170,7 @@ export const SETTINGS_SEARCH_DEFINITIONS: readonly SettingsSearchDefinition[] =
|
||||
{ id: "navigation-object-info", category: "navigation", titleKey: "settings.sidebarObjectInfoMode", descriptionKey: "settings.sidebarObjectInfoModeDescription", targetId: "navigation" },
|
||||
{ id: "navigation-table-search", category: "navigation", titleKey: "settings.sidebarTableSearchEnabled", descriptionKey: "settings.sidebarTableSearchEnabledDescription", targetId: "navigation" },
|
||||
{ id: "navigation-active-node", category: "navigation", titleKey: "settings.autoSelectActiveSidebarNode", descriptionKey: "settings.autoSelectActiveSidebarNodeDescription", targetId: "navigation" },
|
||||
{ id: "navigation-open-database-on-single-click", category: "navigation", titleKey: "settings.sidebarOpenDatabaseOnSingleClick", descriptionKey: "settings.sidebarOpenDatabaseOnSingleClickDescription", targetId: "navigation" },
|
||||
{ id: "navigation-browse-objects-on-database-activation", category: "navigation", titleKey: "settings.sidebarBrowseObjectsOnDatabaseActivation", descriptionKey: "settings.sidebarBrowseObjectsOnDatabaseActivationDescription", targetId: "navigation" },
|
||||
{ id: "navigation-tabs-restore", category: "navigation", titleKey: "settings.openTabsRestoreMode", descriptionKey: "settings.openTabsRestoreModeDescription", targetId: "navigation" },
|
||||
{ id: "navigation-sidebar-scroll", category: "navigation", titleKey: "settings.sidebarAllowHorizontalScroll", descriptionKey: "settings.sidebarAllowHorizontalScrollDescription", targetId: "navigation" },
|
||||
{ id: "navigation-sidebar-indent", category: "navigation", titleKey: "settings.sidebarIndent", descriptionKey: "settings.sidebarIndentDescription", targetId: "navigation" },
|
||||
|
||||
@@ -49,11 +49,10 @@ export function isRepeatableNavigationTreeNode(type: TreeNodeType): boolean {
|
||||
export function shouldActivateTreeNodeOnSingleClick(type: TreeNodeType, activation: SidebarActivation = "single"): boolean {
|
||||
return activation !== "double" || isDirectNavigationTreeNode(type);
|
||||
}
|
||||
const objectBrowserNodeTypes = new Set<TreeNodeType>(["database", "schema", "object-browser", "mongo-db"]);
|
||||
const databaseActivationNodeTypes = new Set<TreeNodeType>(["database", "schema", "mongo-db"]);
|
||||
|
||||
/** 开关“单击数据库同时打开数据库项目”命中时,单击数据库类节点直接打开对象浏览器标签页。 */
|
||||
export function shouldOpenObjectBrowserOnSingleClick(type: TreeNodeType, enabled: boolean): boolean {
|
||||
return enabled && objectBrowserNodeTypes.has(type);
|
||||
export function shouldBrowseObjectsOnDatabaseActivation(type: TreeNodeType, enabled: boolean): boolean {
|
||||
return enabled && databaseActivationNodeTypes.has(type);
|
||||
}
|
||||
const sourceNodeTypes = new Set<TreeNodeType>(["materialized_view", "procedure", "function", "trigger", "event", "sequence", "synonym", "job", "package", "package-body", "type", "type-body"]);
|
||||
const savedSqlNodeTypes = new Set<TreeNodeType>(["saved-sql-file"]);
|
||||
@@ -132,12 +131,11 @@ function canOpenTreeNodeSource(type: TreeNodeType, dbType?: DatabaseType): boole
|
||||
return true;
|
||||
}
|
||||
|
||||
export function treeNodeRowAction(type: TreeNodeType, canExpand: boolean, activation: SidebarActivation = "single", dbType?: DatabaseType, openDatabaseOnSingleClick = false, canOpenObjectBrowser = false): TreeNodeRowAction {
|
||||
// “单击数据库同时打开数据库项目”开关优先于激活方式:单击即等效双击的打开行为。
|
||||
if (openDatabaseOnSingleClick && canOpenObjectBrowser && shouldOpenObjectBrowserOnSingleClick(type, true)) {
|
||||
export function treeNodeRowAction(type: TreeNodeType, canExpand: boolean, activation: SidebarActivation = "single", dbType?: DatabaseType, browseObjectsOnDatabaseActivation = false, canOpenObjectBrowser = false): TreeNodeRowAction {
|
||||
if (!shouldActivateTreeNodeOnSingleClick(type, activation)) return "none";
|
||||
if (canOpenObjectBrowser && shouldBrowseObjectsOnDatabaseActivation(type, browseObjectsOnDatabaseActivation)) {
|
||||
return canExpand ? "open-object-browser-and-expand" : "open-object-browser";
|
||||
}
|
||||
if (!shouldActivateTreeNodeOnSingleClick(type, activation)) return "none";
|
||||
if (type === "extension") return "open-extension-details";
|
||||
if (savedSqlNodeTypes.has(type)) return "open-saved-sql";
|
||||
if (dataNodeTypes.has(type)) return "open-data";
|
||||
@@ -158,26 +156,26 @@ export function shouldRunTreeNodeRowAction(action: TreeNodeRowAction, clickDetai
|
||||
return action !== "none" && clickDetail <= 1;
|
||||
}
|
||||
|
||||
export function treeNodeRowDoubleClickAction(type: TreeNodeType, canOpenObjectBrowser: boolean, activation: SidebarActivation = "single", canExpand = false, dbType?: DatabaseType, canOpenDatabaseBrowser = false, openDatabaseOnSingleClick = false): TreeNodeRowDoubleClickAction {
|
||||
export function treeNodeRowDoubleClickAction(type: TreeNodeType, canOpenObjectBrowser: boolean, activation: SidebarActivation = "single", canExpand = false, dbType?: DatabaseType, canOpenDatabaseBrowser = false, browseObjectsOnDatabaseActivation = false): TreeNodeRowDoubleClickAction {
|
||||
// Single-click activation already handles the first click in a dblclick
|
||||
// sequence. Only double-click activation needs a second-stage table action.
|
||||
if (type === "table") return activation === "double" ? "activate-data" : "none";
|
||||
if (openDatabaseOnSingleClick && canOpenObjectBrowser && shouldOpenObjectBrowserOnSingleClick(type, true)) return "none";
|
||||
// 双击激活模式下,双击连接节点应当展开树(与单击模式下单击展开一致),
|
||||
// “打开数据库浏览”只保留给单击激活模式下的双击手势。
|
||||
if (type === "connection" && canOpenDatabaseBrowser && activation !== "double") return "open-database-browser";
|
||||
if (activation === "double") {
|
||||
if (canOpenObjectBrowser && shouldBrowseObjectsOnDatabaseActivation(type, browseObjectsOnDatabaseActivation)) {
|
||||
return canExpand ? "open-object-browser-and-expand" : "open-object-browser";
|
||||
}
|
||||
if (canOpenObjectBrowser && type === "object-browser") return "open-object-browser";
|
||||
if (type === "extension") return "open-extension-details";
|
||||
if (dataNodeTypes.has(type)) return "open-data";
|
||||
if (type === "type" && customTypeCapabilities(dbType).details) return canExpand ? "toggle" : "none";
|
||||
if (sourceNodeTypes.has(type) && canOpenTreeNodeSource(type, dbType)) return "open-source";
|
||||
if (savedSqlNodeTypes.has(type)) return "open-saved-sql";
|
||||
if (toggleLeafNodeTypes.has(type)) return "toggle";
|
||||
if (canOpenObjectBrowser && objectBrowserNodeTypes.has(type) && canExpand) return "open-object-browser-and-expand";
|
||||
if (canOpenObjectBrowser && objectBrowserNodeTypes.has(type)) return "open-object-browser";
|
||||
if (canExpand) return "toggle";
|
||||
}
|
||||
if (canOpenObjectBrowser && objectBrowserNodeTypes.has(type)) return "open-object-browser";
|
||||
return "none";
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user