From b7e3b2ee572d1e5cce04ef9da7268aba70264d76 Mon Sep 17 00:00:00 2001 From: GIWTO <40267153+GIWTO@users.noreply.github.com> Date: Wed, 29 Jul 2026 01:05:23 +0800 Subject: [PATCH] fix(query): isolate duplicated tab rename state --- .../src/components/layout/AppTabBar.vue | 8 ++++++-- apps/desktop/src/stores/queryStore.ts | 4 +++- packages/app-tests/queryStore.test.ts | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/apps/desktop/src/components/layout/AppTabBar.vue b/apps/desktop/src/components/layout/AppTabBar.vue index 2e7e2f0ef..e77b6bf5e 100644 --- a/apps/desktop/src/components/layout/AppTabBar.vue +++ b/apps/desktop/src/components/layout/AppTabBar.vue @@ -129,8 +129,12 @@ function startRenameTab(tab: QueryTab) { editingTitle.value = tab.title; nextTick(() => { const input = document.querySelector(`[data-tab-title-input="${tab.id}"]`); - input?.focus(); - input?.select(); + if (input) { + input.focus(); + const dotIndex = input.value.lastIndexOf("."); + const selectEnd = dotIndex > 0 ? dotIndex : input.value.length; + input.setSelectionRange(0, selectEnd); + } }); } diff --git a/apps/desktop/src/stores/queryStore.ts b/apps/desktop/src/stores/queryStore.ts index 80829ace3..d3bd448f7 100644 --- a/apps/desktop/src/stores/queryStore.ts +++ b/apps/desktop/src/stores/queryStore.ts @@ -1933,7 +1933,9 @@ export const useQueryStore = defineStore("query", () => { database: original.database, schema: original.schema, sql: original.sql, - savedSqlId: original.savedSqlId, + originalSql: "", + savedSqlId: undefined, + externalSqlPath: undefined, lastExecutedSql: undefined, resultBaseSql: original.resultBaseSql, resultSortedSql: undefined, diff --git a/packages/app-tests/queryStore.test.ts b/packages/app-tests/queryStore.test.ts index 2b42036ed..35299e146 100644 --- a/packages/app-tests/queryStore.test.ts +++ b/packages/app-tests/queryStore.test.ts @@ -6119,6 +6119,25 @@ test("duplicating a table structure tab clones its unsaved draft", () => { assert.equal(tab.structureDraft.columns[0]!.name, "draft_name"); }); +test("duplicateTab does not inherit savedSqlId or externalSqlPath", () => { + setActivePinia(createPinia()); + const store = useQueryStore(); + + const tabId = store.createTab("conn-1", "db", "A", "query"); + const tab = store.tabs.find((t) => t.id === tabId)!; + tab.savedSqlId = "saved-sql-1"; + tab.externalSqlPath = "/path/to/sql"; + tab.sql = "SELECT 1;"; + + store.duplicateTab(tabId); + + const copy = store.tabs.find((item) => item.id !== tabId)!; + assert.equal(copy.savedSqlId, undefined); + assert.equal(copy.externalSqlPath, undefined); + assert.equal(copy.originalSql, ""); + assert.equal(store.isTabDirty(copy), true); +}); + test("reorderTab keeps pinned tabs before unpinned tabs after reorder", () => { setActivePinia(createPinia()); const store = useQueryStore();