From de00ff46e437ba00423cd4293119857d508dfef8 Mon Sep 17 00:00:00 2001 From: lxk955 <164191365+lxk955@users.noreply.github.com> Date: Sun, 18 Oct 2026 08:34:56 +0800 Subject: [PATCH] fix(query): redirect to result view when live-message query returns rows --- .../src/components/layout/ContentArea.vue | 29 ++- .../ContentArea.serverMessages.spec.ts | 32 +++- .../__tests__/useSqlExecution.spec.ts | 180 +++++++++++++++++- .../src/composables/useSqlExecution.ts | 63 +++--- apps/desktop/src/types/database.ts | 2 + 5 files changed, 273 insertions(+), 33 deletions(-) diff --git a/apps/desktop/src/components/layout/ContentArea.vue b/apps/desktop/src/components/layout/ContentArea.vue index d2de4b4eb2..97ad5d559f 100644 --- a/apps/desktop/src/components/layout/ContentArea.vue +++ b/apps/desktop/src/components/layout/ContentArea.vue @@ -210,7 +210,7 @@ import { loadQueryResultTransferSourceDdl } from "@/components/transfer/queryRes import { formatDdlForDisplay } from "@/lib/sql/ddlDisplay"; import { sqlObjectNavigationTypeFromTableType } from "@/lib/sql/sqlNavigation"; import type { CustomSaveHandler } from "@/composables/useDataGridEditor"; -import type { QueryMessage, QueryResult, QueryTab, RedisResultViewMode, TableInfoTab, TreeNode, VectorCollectionMeta } from "@/types/database"; +import type { QueryMessage, QueryResult, QueryTab, RedisResultViewMode, TableInfoTab, TabOutputView, TreeNode, VectorCollectionMeta } from "@/types/database"; import type { SqlObjectNavigationTarget } from "@/lib/sql/sqlNavigation"; import { sqlFormatDialectForDbType, type SqlFormatDialect } from "@/lib/sql/sqlFormatter"; import { productionContextForDatabase } from "@/lib/database/productionSafety"; @@ -871,6 +871,14 @@ function setRedisResultViewMode(mode: RedisResultViewMode) { queryStore.updateTabUiState(props.activeTab.id, { redisResultViewMode: mode }); } +function selectOutputView(tabId: string, view: TabOutputView) { + queryStore.updateTabUiState(tabId, { + activeOutputView: view, + autoSwitchedToMessagesDuringExecution: false, + }); + emit("update:activeOutputView", tabId, view); +} + function observeStandaloneResultToolbar() { standaloneResultToolbarResizeObserver?.disconnect(); standaloneResultToolbarResizeObserver = undefined; @@ -1106,6 +1114,10 @@ watch( () => props.activeTab.liveQueryMessages?.length ?? 0, (count, previousCount) => { if (count > 0 && !previousCount && props.activeTab.isExecuting && !props.editorOnly && !hasTabularResult.value && (props.activeOutputView === "result" || props.activeOutputView === "summary")) { + queryStore.updateTabUiState(props.activeTab.id, { + activeOutputView: "messages", + autoSwitchedToMessagesDuringExecution: true, + }); emit("update:activeOutputView", props.activeTab.id, "messages"); } }, @@ -1126,6 +1138,7 @@ watch( if (hasExecutionSummary.value && (!hasTabularResult.value || props.activeTab.result?.server_message === true) && props.activeOutputView === "result") { const result = props.activeTab.result; emit("update:activeOutputView", props.activeTab.id, result ? defaultViewForResult(result) : "summary"); + return; } }, { immediate: true }, @@ -2539,7 +2552,7 @@ defineExpose({ :result-mode="redisResultViewMode" :message-count="resultMessageCount" :compact="standaloneResultToolbarCompact" - @select-view="emit('update:activeOutputView', activeTab.id, $event)" + @select-view="selectOutputView(activeTab.id, $event)" @select-result-mode="setRedisResultViewMode" /> @@ -2809,7 +2822,7 @@ defineExpose({ :result-mode="redisResultViewMode" :message-count="resultMessageCount" :compact="compact" - @select-view="emit('update:activeOutputView', activeTab.id, $event)" + @select-view="selectOutputView(activeTab.id, $event)" @select-result-mode="setRedisResultViewMode" />