From 333c3a3f441db63aafcef1d16ea3ec112da86f34 Mon Sep 17 00:00:00 2001 From: Ryan Liu Date: Tue, 1 Sep 2026 12:33:59 +0800 Subject: [PATCH] feat(editor): preview dml changes as readonly select --- apps/desktop/src/App.vue | 8 + .../src/components/editor/QueryEditor.vue | 75 ++- .../src/components/layout/ContentArea.vue | 7 + .../src/components/layout/EditorToolbar.vue | 19 +- apps/desktop/src/i18n/locales/en.ts | 4 + apps/desktop/src/i18n/locales/es.ts | 4 + apps/desktop/src/i18n/locales/it.ts | 4 + apps/desktop/src/i18n/locales/ja.ts | 4 + apps/desktop/src/i18n/locales/ko.ts | 4 + apps/desktop/src/i18n/locales/pt-BR.ts | 4 + apps/desktop/src/i18n/locales/zh-CN.ts | 4 + apps/desktop/src/i18n/locales/zh-TW.ts | 4 + apps/desktop/src/lib/backend/api.ts | 1 + apps/desktop/src/lib/backend/http.ts | 5 + apps/desktop/src/lib/backend/tauri.ts | 5 + .../sql/__tests__/dmlChangePreview.spec.ts | 20 + apps/desktop/src/lib/sql/dmlChangePreview.ts | 37 ++ crates/dbx-core/src/dml_preview_sql.rs | 599 ++++++++++++++++++ crates/dbx-core/src/lib.rs | 1 + crates/dbx-web/src/main.rs | 1 + crates/dbx-web/src/routes/query.rs | 14 + docs/content/docs/query-editor.cn.mdx | 10 + docs/content/docs/query-editor.mdx | 10 + src-tauri/src/commands/query.rs | 7 + src-tauri/src/lib.rs | 1 + 25 files changed, 848 insertions(+), 4 deletions(-) create mode 100644 apps/desktop/src/lib/sql/__tests__/dmlChangePreview.spec.ts create mode 100644 apps/desktop/src/lib/sql/dmlChangePreview.ts create mode 100644 crates/dbx-core/src/dml_preview_sql.rs diff --git a/apps/desktop/src/App.vue b/apps/desktop/src/App.vue index db2905874b..34322c3bcb 100644 --- a/apps/desktop/src/App.vue +++ b/apps/desktop/src/App.vue @@ -281,6 +281,7 @@ const contentAreaRef = ref | null>(null); const selectedSql = ref(""); const cursorPos = ref(0); +const previewChangesAvailable = ref(false); const formatSqlRequest = ref<{ id: number; tabId: string } | null>(null); const compressSqlRequest = ref<{ id: number; tabId: string } | null>(null); const activeOutputView = ref<"result" | "summary" | "explain" | "chart" | "messages">("result"); @@ -490,6 +491,10 @@ function requestActiveEditorExecuteInNewResultTab() { void tryExecuteInNewResultTab(); } +function requestActiveEditorPreviewChanges() { + void contentAreaRef.value?.requestQueryEditorPreviewChanges?.(); +} + const multiExecuteDatabaseType = ref(); const multiExecuteInitialTargets = ref>([]); const multiExecuteLaunchId = ref(0); @@ -3102,6 +3107,7 @@ onUnmounted(() => { :active-tab="activeTab" :active-connection="activeConnection" :executable-sql="executableSql" + :can-preview-changes="previewChangesAvailable" :explain-mode="explainMode" :block-dangerous-redis-commands="blockDangerousRedisCommands" :sql-keyword-case="settingsStore.editorSettings.sqlFormatter.keywordCase" @@ -3123,6 +3129,7 @@ onUnmounted(() => { @dismiss-txn-rolled-back="activeTab && (activeTab.txnAutoRolledBack = false)" @execute-pointer-down="captureActiveEditorExecutionSnapshot()" @execute="requestActiveEditorExecute($event)" + @preview-changes="requestActiveEditorPreviewChanges()" @multi-execute="requestMultiDbExecute()" @cancel="cancelActiveExecution()" @explain="tryExplain()" @@ -3163,6 +3170,7 @@ onUnmounted(() => { @editor-update="(tabId: string, v: string) => queryStore.updateSql(tabId, v)" @editor-selection-change="(v: string) => (selectedSql = v)" @editor-cursor-change="(p: number) => (cursorPos = p)" + @preview-changes-available="(v: boolean) => (previewChangesAvailable = v)" @editor-viewport-change="(tabId: string, viewport: { scrollTop: number; scrollLeft: number }) => queryStore.updateEditorViewport(tabId, viewport)" @editor-selection-state-change="(tabId: string, selection: { anchor: number; head: number }) => queryStore.updateEditorSelection(tabId, selection)" @format-error="toast(t('toolbar.formatSqlFailed'))" diff --git a/apps/desktop/src/components/editor/QueryEditor.vue b/apps/desktop/src/components/editor/QueryEditor.vue index 28fc03fd10..41e34a9280 100644 --- a/apps/desktop/src/components/editor/QueryEditor.vue +++ b/apps/desktop/src/components/editor/QueryEditor.vue @@ -1,6 +1,6 @@