From 73c167bed32cb7b8dfcb91e040aebf063ac05218 Mon Sep 17 00:00:00 2001 From: Lem26 <38876848+Lem26@users.noreply.github.com> Date: Sat, 5 Sep 2026 13:02:41 +0800 Subject: [PATCH] fix(editor): let mouse hide/re-show the shared query results pane --- .../src/components/layout/ContentArea.vue | 17 +++++- .../components/layout/SqlEditorWorkspace.vue | 55 ++++++++++++++++--- .../__tests__/SqlEditorWorkspace.spec.ts | 21 +++++++ .../src/components/layout/querySurfaces.ts | 1 + .../src/lib/tabs/contentSurfaceEvents.ts | 1 + 5 files changed, 85 insertions(+), 10 deletions(-) diff --git a/apps/desktop/src/components/layout/ContentArea.vue b/apps/desktop/src/components/layout/ContentArea.vue index 2807cbcabc..1bf288f0c5 100644 --- a/apps/desktop/src/components/layout/ContentArea.vue +++ b/apps/desktop/src/components/layout/ContentArea.vue @@ -664,6 +664,21 @@ function toggleResultsPane(): boolean { return true; } +/** + * The "hide results" chevron. In the shared result surface (result-only) the + * local resultsPaneOpen ref is inert — the pane is always rendered there and + * the real collapse state lives in SqlEditorWorkspace.showResultPane — so the + * chevron bubbles a toggle event up instead. Per-tab surfaces (data tabs) + * keep the local collapse behavior. + */ +function handleHideResultsPane() { + if (props.resultOnly) { + emit("toggleResultsPane"); + } else { + resultsPaneOpen.value = false; + } +} + function onResultsResized(payload: { panes: { size: number }[] }) { const resultsPane = payload.panes[1]; if (resultsPane?.size != null && resultsPane.size >= 20 && resultsPane.size <= 85) { @@ -1664,7 +1679,7 @@ defineExpose({ - diff --git a/apps/desktop/src/components/layout/SqlEditorWorkspace.vue b/apps/desktop/src/components/layout/SqlEditorWorkspace.vue index 296907ad80..9e63d79765 100644 --- a/apps/desktop/src/components/layout/SqlEditorWorkspace.vue +++ b/apps/desktop/src/components/layout/SqlEditorWorkspace.vue @@ -1,10 +1,12 @@ diff --git a/apps/desktop/src/components/layout/__tests__/SqlEditorWorkspace.spec.ts b/apps/desktop/src/components/layout/__tests__/SqlEditorWorkspace.spec.ts index 321909dd79..2780245514 100644 --- a/apps/desktop/src/components/layout/__tests__/SqlEditorWorkspace.spec.ts +++ b/apps/desktop/src/components/layout/__tests__/SqlEditorWorkspace.spec.ts @@ -9,6 +9,7 @@ const editorSurfaceSource = readFileSync(new URL("../QueryEditorSurface.vue", im const resultSurfaceSource = readFileSync(new URL("../QueryResultSurface.vue", import.meta.url), "utf8"); const contentAreaSource = readFileSync(new URL("../ContentArea.vue", import.meta.url), "utf8"); const surfaceContractSource = readFileSync(new URL("../querySurfaces.ts", import.meta.url), "utf8"); +const surfaceEventsSource = readFileSync(new URL("../../../lib/tabs/contentSurfaceEvents.ts", import.meta.url), "utf8"); describe("SQL editor workspace single-group tracer bullet", () => { it("composes splitpanes editor groups and one shared result surface", () => { @@ -81,6 +82,26 @@ describe("SQL editor workspace single-group tracer bullet", () => { expect(resultSurfaceSource).toContain('v-bind="bindings"'); }); + it("lets the mouse hide and re-show the shared query results pane", () => { + // Regression (#8076 refactor): the shared result surface's "hide results" + // chevron wrote the inert per-instance resultsPaneOpen ref, so query-tab + // results could no longer be collapsed by mouse — the pane was pinned + // open. The chevron must bubble a toggleResultsPane event up through the + // surface contract to the workspace, which owns the real collapse state. + expect(surfaceContractSource).toContain("toggleResultsPane: []"); + expect(surfaceEventsSource).toContain('"toggleResultsPane",'); + expect(contentAreaSource).toContain('emit("toggleResultsPane")'); + expect(contentAreaSource).toContain('@click="handleHideResultsPane"'); + expect(workspaceSource).toContain('@toggle-results-pane="toggleSharedResultsPane"'); + expect(workspaceSource).toContain("showResultPane.value = !showResultPane.value"); + // Collapsing unmounts the shared surface, so the mouse re-show affordance + // must live at the workspace level, not inside the collapsible pane. + expect(workspaceSource).toContain("editor.showResultsPane"); + expect(workspaceSource).toContain("showSharedResult && !showResultPane"); + // Running a query re-expands a collapsed pane (issue #6193 promise). + expect(workspaceSource).toContain("if (isExecuting) showResultPane.value = true;"); + }); + it("animates layout transitions for split groups and the shared result surface", () => { const workspaceCssSource = readFileSync(new URL("../sqlEditorWorkspace.css", import.meta.url), "utf8"); expect(workspaceSource).toContain('import "./sqlEditorWorkspace.css"'); diff --git a/apps/desktop/src/components/layout/querySurfaces.ts b/apps/desktop/src/components/layout/querySurfaces.ts index 72610d78ab..aa260991fd 100644 --- a/apps/desktop/src/components/layout/querySurfaces.ts +++ b/apps/desktop/src/components/layout/querySurfaces.ts @@ -95,4 +95,5 @@ export interface ContentAreaSurfaceEmits { openSettings: [initialTab?: string, initialSection?: string]; openConnectionSettings: [connectionId: string, initialTab: "advanced"]; toggleZenMode: []; + toggleResultsPane: []; } diff --git a/apps/desktop/src/lib/tabs/contentSurfaceEvents.ts b/apps/desktop/src/lib/tabs/contentSurfaceEvents.ts index 485a65485f..cb7272a430 100644 --- a/apps/desktop/src/lib/tabs/contentSurfaceEvents.ts +++ b/apps/desktop/src/lib/tabs/contentSurfaceEvents.ts @@ -41,6 +41,7 @@ export const contentSurfaceEventNames = [ "openSettings", "openConnectionSettings", "toggleZenMode", + "toggleResultsPane", ] as const satisfies Array; export type ContentSurfaceEventName = (typeof contentSurfaceEventNames)[number];