From ca303e555379b435ff19862946536428352334ee Mon Sep 17 00:00:00 2001 From: zipg Date: Wed, 12 Aug 2026 00:09:46 +0800 Subject: [PATCH] fix(schema): keep create-table SQL preview visible --- .../TableStructureEditor.primaryKey.spec.ts | 30 +++++++++++++++++++ .../structure/TableStructureEditor.vue | 6 ++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/apps/desktop/src/components/structure/TableStructureEditor.primaryKey.spec.ts b/apps/desktop/src/components/structure/TableStructureEditor.primaryKey.spec.ts index 20a8564437..2d6b1dcddb 100644 --- a/apps/desktop/src/components/structure/TableStructureEditor.primaryKey.spec.ts +++ b/apps/desktop/src/components/structure/TableStructureEditor.primaryKey.spec.ts @@ -362,6 +362,36 @@ describe("TableStructureEditor primary key editing", () => { }), ); }); + + it("keeps the current SQL preview visible while a newer preview is loading", async () => { + const root = await mountEditor("dameng", true); + const primaryKey = columnCheckbox(root, "structureEditor.primaryKey"); + const nullable = columnCheckbox(root, "structureEditor.nullable"); + const firstSql = "ALTER TABLE users DROP CONSTRAINT users_pkey;"; + + mocks.buildTableStructureChangeSql.mockResolvedValueOnce({ statements: [firstSql], warnings: [] }); + primaryKey.checked = false; + primaryKey.dispatchEvent(new Event("change", { bubbles: true })); + + await vi.waitFor(() => expect(root.textContent).toContain(firstSql)); + + let resolveLatestPreview!: (value: { statements: string[]; warnings: string[] }) => void; + mocks.buildTableStructureChangeSql.mockImplementationOnce( + () => + new Promise((resolve) => { + resolveLatestPreview = resolve; + }), + ); + nullable.checked = true; + nullable.dispatchEvent(new Event("change", { bubbles: true })); + + await vi.waitFor(() => expect(mocks.buildTableStructureChangeSql).toHaveBeenCalledTimes(2)); + expect(root.textContent).toContain(firstSql); + expect(root.textContent).not.toContain("structureEditor.noChanges"); + + resolveLatestPreview({ statements: ["ALTER TABLE users ALTER COLUMN id DROP NOT NULL;"], warnings: [] }); + await vi.waitFor(() => expect(root.textContent).toContain("ALTER TABLE users ALTER COLUMN id DROP NOT NULL;")); + }); }); describe("TableStructureEditor local column order notice", () => { diff --git a/apps/desktop/src/components/structure/TableStructureEditor.vue b/apps/desktop/src/components/structure/TableStructureEditor.vue index af9be48111..d4df49db3b 100644 --- a/apps/desktop/src/components/structure/TableStructureEditor.vue +++ b/apps/desktop/src/components/structure/TableStructureEditor.vue @@ -1119,10 +1119,10 @@ function scheduleSqlPreviewRefresh() { } sqlPreviewRequestId++; deferredSqlPreviewRefresh = false; - pendingStatements.value = []; - warnings.value = []; - sqliteSchemaRevision.value = undefined; if (!hasPendingStructureChanges()) { + pendingStatements.value = []; + warnings.value = []; + sqliteSchemaRevision.value = undefined; sqlPreviewLoading.value = false; return; }