diff --git a/packages/api/src/controllers/databaseConnections.js b/packages/api/src/controllers/databaseConnections.js index fd51b5b32..b81fe77cc 100644 --- a/packages/api/src/controllers/databaseConnections.js +++ b/packages/api/src/controllers/databaseConnections.js @@ -34,6 +34,8 @@ const pipeForkLogs = require('../utility/pipeForkLogs'); const crypto = require('crypto'); const loadModelTransform = require('../utility/loadModelTransform'); const exportDbModelSql = require('../utility/exportDbModelSql'); +const axios = require('axios'); +const { getAuthProxyUrl } = require('../utility/authProxy'); const logger = getLogger('databaseConnections'); @@ -562,4 +564,35 @@ module.exports = { return true; }, + + textToSql_meta: true, + async textToSql({ conid, database, text, dialect }) { + const existing = this.opened.find(x => x.conid == conid && x.database == database); + const { structure } = existing || {}; + if (!structure) return { errorMessage: 'No database structure' }; + const model = { + tables: structure.tables.map(table => ({ + name: table.pureName, + columns: table.columns.map(column => column.columnName), + primaryKey: table.primaryKey?.columns?.map(column => column.columnName), + foreignKeys: table.foreignKeys.map(fk => ({ + refTable: fk.refTableName, + column: fk.columns[0]?.columnName, + refColumn: fk.columns[0]?.refColumnName, + })), + })), + }; + + const resp = await axios.default.post(`${getAuthProxyUrl()}/text-to-sql`, { + text, + model, + dialect, + }); + + if (!resp.data.sql) { + return { errorMessage: 'No SQL generated' }; + } + + return resp.data; + }, }; diff --git a/packages/web/src/tabs/QueryTab.svelte b/packages/web/src/tabs/QueryTab.svelte index 4ebd0b50a..c81d2e56f 100644 --- a/packages/web/src/tabs/QueryTab.svelte +++ b/packages/web/src/tabs/QueryTab.svelte @@ -512,7 +512,14 @@ - + { + isAiAssistantVisible = false; + }} + /> diff --git a/packages/web/src/widgets/WidgetColumnBarItem.svelte b/packages/web/src/widgets/WidgetColumnBarItem.svelte index f973957cd..f52f95654 100644 --- a/packages/web/src/widgets/WidgetColumnBarItem.svelte +++ b/packages/web/src/widgets/WidgetColumnBarItem.svelte @@ -16,6 +16,7 @@ export let collapsed = null; export let storageName = null; + export let onClose = null; let size = 0; @@ -70,7 +71,8 @@ (visible = !visible) : null} - data-testid={$$props['data-testid']}>{title}{title} {#if visible} diff --git a/packages/web/src/widgets/WidgetTitle.svelte b/packages/web/src/widgets/WidgetTitle.svelte index a4a3bd0f3..b7c692277 100644 --- a/packages/web/src/widgets/WidgetTitle.svelte +++ b/packages/web/src/widgets/WidgetTitle.svelte @@ -1,18 +1,35 @@ -
+
+ {#if onClose} +
+ +
+ {/if}