From 3663dc4d7be79e6dbd1c09860452f083be92f7e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E4=B8=AB=E8=AE=B2=E6=A2=B5?= Date: Mon, 10 Aug 2026 22:40:36 +0800 Subject: [PATCH] feat(query): close individual query result and release result session --- apps/desktop/src/App.vue | 3 +- .../src/components/layout/ContentArea.vue | 9 +++ apps/desktop/src/i18n/locales/en.ts | 1 + apps/desktop/src/i18n/locales/es.ts | 1 + apps/desktop/src/i18n/locales/it.ts | 1 + apps/desktop/src/i18n/locales/ja.ts | 1 + apps/desktop/src/i18n/locales/ko.ts | 1 + apps/desktop/src/i18n/locales/pt-BR.ts | 1 + apps/desktop/src/i18n/locales/zh-CN.ts | 1 + apps/desktop/src/i18n/locales/zh-TW.ts | 1 + .../queryStore.multiStatementError.spec.ts | 70 +++++++++++++++++++ apps/desktop/src/stores/queryStore.ts | 41 +++++++++++ packages/app-tests/queryResultToolbar.test.ts | 15 ++++ packages/app-tests/queryStore.test.ts | 21 ++++++ 14 files changed, 166 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/App.vue b/apps/desktop/src/App.vue index 2fc9e75cb7..057bfb3f82 100644 --- a/apps/desktop/src/App.vue +++ b/apps/desktop/src/App.vue @@ -2182,7 +2182,7 @@ function handleNativeSelectAll(e: KeyboardEvent) { if (shouldBlockAppNativeSelectAll(e)) e.preventDefault(); } -function handleKeydown(e: KeyboardEvent) { +async function handleKeydown(e: KeyboardEvent) { if (e.defaultPrevented) return; const shortcuts = settingsStore.editorSettings.shortcuts; @@ -2260,6 +2260,7 @@ function handleKeydown(e: KeyboardEvent) { } else if (showDriverStore.value) { closeDriverStorePage(); } else if (queryStore.activeTabId) { + if (await queryStore.clearQueryResults(queryStore.activeTabId)) return; queryStore.closeTab(queryStore.activeTabId); } return; diff --git a/apps/desktop/src/components/layout/ContentArea.vue b/apps/desktop/src/components/layout/ContentArea.vue index 6bb529f395..73d33dde48 100644 --- a/apps/desktop/src/components/layout/ContentArea.vue +++ b/apps/desktop/src/components/layout/ContentArea.vue @@ -419,6 +419,7 @@ const resultAutoSave = computed(() => props.activeTab.resultAutoSave === true); const activeResultRunItem = computed(() => resultRuns.value.find((run) => run.active)); const showResultRunTabs = computed(() => resultRuns.value.length > 0 && resultRunDisplayMode.value === "tabs"); const showResultRunSelector = computed(() => resultRuns.value.length > 0 && resultRunDisplayMode.value === "list"); +const canCloseQueryResult = computed(() => props.activeTab.mode === "query" && !props.activeTab.isExecuting && !props.activeTab.activeResultRunId && (!!props.activeTab.result || !!props.activeTab.results?.length || props.activeTab.resultEvicted === true)); watch( () => `${resultRunDisplayMode.value}:${resultRuns.value.map((run) => run.id).join(",")}:${props.activeTab.activeResultRunId ?? ""}`, () => { @@ -853,6 +854,11 @@ async function removeResultRun(runId: string) { activeRunTab?.scrollIntoView({ block: "nearest", inline: "nearest" }); } +async function closeCurrentQueryResult() { + if (!(await queryStore.closeQueryResult(props.activeTab.id))) return; + emit("update:activeOutputView", "result"); +} + async function selectResultRun(runId: string) { if (!(await queryStore.setActiveResultRun(props.activeTab.id, runId))) { toast(t("tabs.missingResultRun"), 4000); @@ -1056,6 +1062,9 @@ defineExpose({ focusSearch, refreshData, refreshQueryEditorCompletionCache, hand > +