diff --git a/apps/desktop/src/App.vue b/apps/desktop/src/App.vue index 6f539de8d..effe31860 100644 --- a/apps/desktop/src/App.vue +++ b/apps/desktop/src/App.vue @@ -11,6 +11,7 @@ import EditorToolbar from "@/components/layout/EditorToolbar.vue"; import ContentArea from "@/components/layout/ContentArea.vue"; import AppDialogs from "@/components/layout/AppDialogs.vue"; import WelcomeScreen from "@/components/layout/WelcomeScreen.vue"; +import DdlViewDialog from "@/components/objects/DdlViewDialog.vue"; import { useConnectionStore } from "@/stores/connectionStore"; import { useQueryStore } from "@/stores/queryStore"; import { useSettingsStore } from "@/stores/settingsStore"; @@ -68,7 +69,7 @@ import { countAvailableAgentDriverUpdates, type AgentDriverUpdateBadgeState } fr import { safeLocalStorageGet, safeLocalStorageSet } from "@/lib/safeStorage"; import { rankSavedSqlHistory } from "@/lib/savedSqlHistory"; import { isSchemaAware, isSingleDatabase, usesTreeSchemaMode } from "@/lib/databaseFeatureSupport"; -import { connectionUsesDatabaseObjectTreeMode, effectiveDatabaseTypeForConnection } from "@/lib/jdbcDialect"; +import { codeMirrorSqlDialect, connectionUsesDatabaseObjectTreeMode, effectiveDatabaseTypeForConnection } from "@/lib/jdbcDialect"; import { detectDatabaseFileType } from "@/lib/databaseFileDetection"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; @@ -110,6 +111,7 @@ const setupRequired = ref(false); const showConnectionDialog = ref(false); const connectionDialogPrefill = ref(null); const showSettingsDialog = ref(false); +const showQueryEditorDdlDialog = ref(false); const showDriverStore = ref(false); const showQuickOpen = ref(false); const agentDriverUpdateCount = ref(0); @@ -128,6 +130,7 @@ const cursorPos = ref(0); const formatSqlRequest = ref<{ id: number; tabId: string } | null>(null); const activeOutputView = ref<"result" | "summary" | "explain" | "chart">("result"); const newQueryContextSource = ref<"tab" | "sidebar">("tab"); +const queryEditorDdlTarget = ref<{ connectionId: string; database: string; schema?: string; tableName: string } | null>(null); const showSaveSqlDialog = ref(false); const saveSqlName = ref(""); const saveSqlFolderId = ref(""); @@ -232,6 +235,10 @@ const updateNotificationsEnabled = computed(() => settingsStore.editorSettings.u const toolbarAgentDriverUpdateCount = computed(() => (updateNotificationsEnabled.value ? agentDriverUpdateCount.value : 0)); const toolbarHasUpdateAvailable = computed(() => updateNotificationsEnabled.value && hasUpdateAvailable.value); const hasSqlFileConnections = computed(() => connectionStore.connections.some((c) => supportsSqlFileExecution(c.db_type))); +const queryEditorDdlDialect = computed(() => { + if (!queryEditorDdlTarget.value?.connectionId) return "mysql"; + return codeMirrorSqlDialect(effectiveDatabaseTypeForConnection(connectionStore.getConfig(queryEditorDdlTarget.value.connectionId))); +}); const connectionStats = computed(() => ({ total: connectionStore.connections.length, connected: connectionStore.connectedIds.size, @@ -830,6 +837,13 @@ async function onViewTableData(tableName: string) { } } +function onViewTableDdl(tableName: string) { + const target = tableTargetFromActiveTab(tableName); + if (!target) return; + queryEditorDdlTarget.value = target; + showQueryEditorDdlDialog.value = true; +} + async function changeActiveConnection(connectionId: string) { const tab = activeTab.value; if (!tab) return; @@ -1423,6 +1437,7 @@ onUnmounted(() => { @execute-sql="onExecuteSql" @click-table="onClickTable" @view-table-data="onViewTableData" + @view-table-ddl="onViewTableDdl" @open-object-table=" (target) => activeTab && @@ -1592,6 +1607,7 @@ onUnmounted(() => { + diff --git a/apps/desktop/src/components/editor/QueryEditor.vue b/apps/desktop/src/components/editor/QueryEditor.vue index fcc75425c..2f1852d1e 100644 --- a/apps/desktop/src/components/editor/QueryEditor.vue +++ b/apps/desktop/src/components/editor/QueryEditor.vue @@ -1,6 +1,6 @@