diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/Actions/GenerateSQL/ACTION_DATA_GRID_GENERATE_SQL_CREATE.ts b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/Actions/GenerateSQL/ACTION_DATA_GRID_GENERATE_SQL_CREATE.ts new file mode 100644 index 00000000000..b2c679e37af --- /dev/null +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/Actions/GenerateSQL/ACTION_DATA_GRID_GENERATE_SQL_CREATE.ts @@ -0,0 +1,13 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2026 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ +import { createAction } from '@cloudbeaver/core-view'; + +export const ACTION_DATA_GRID_GENERATE_SQL_CREATE = createAction('data-grid-generate-sql-create', { + label: 'data_grid_table_generate_sql_create', + tooltip: 'data_grid_table_generate_sql_create_tooltip', +}); diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridContextMenu/DataGridContextMenuGenerateSqlService.ts b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridContextMenu/DataGridContextMenuGenerateSqlService.ts index 8d519ffe7dd..26a6c731d1f 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridContextMenu/DataGridContextMenuGenerateSqlService.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridContextMenu/DataGridContextMenuGenerateSqlService.ts @@ -24,12 +24,14 @@ import { IDatabaseDataSource, isResultSetDataModel, ResultSetDataAction, + type IDataContainerOptions, type IDatabaseDataModel, type IGridColumnKey, type IGridDataKey, type IGridRowKey, } from '@cloudbeaver/plugin-data-viewer'; +import { ACTION_DATA_GRID_GENERATE_SQL_CREATE } from '../Actions/GenerateSQL/ACTION_DATA_GRID_GENERATE_SQL_CREATE.js'; import { ACTION_DATA_GRID_GENERATE_SQL_DELETE } from '../Actions/GenerateSQL/ACTION_DATA_GRID_GENERATE_SQL_DELETE.js'; import { ACTION_DATA_GRID_GENERATE_SQL_INSERT } from '../Actions/GenerateSQL/ACTION_DATA_GRID_GENERATE_SQL_INSERT.js'; import { ACTION_DATA_GRID_GENERATE_SQL_SELECT } from '../Actions/GenerateSQL/ACTION_DATA_GRID_GENERATE_SQL_SELECT.js'; @@ -37,7 +39,7 @@ import { ACTION_DATA_GRID_GENERATE_SQL_SELECT_MANY } from '../Actions/GenerateSQ import { ACTION_DATA_GRID_GENERATE_SQL_UPDATE } from '../Actions/GenerateSQL/ACTION_DATA_GRID_GENERATE_SQL_UPDATE.js'; import { MENU_DATA_GRID_GENERATE_SQL } from './GenerateSQL/MENU_DATA_GRID_GENERATE_SQL.js'; import type { IDataContextProvider } from '@cloudbeaver/core-data-context'; -import { getDefaultQueryGeneratorOptions, GeneratedSqlDialog, SqlGeneratorsResource } from '@cloudbeaver/plugin-sql-generator'; +import { getDefaultQueryGeneratorOptions, GeneratedSqlDialog, SqlGeneratorsResource, DDL_GENERATOR_ID } from '@cloudbeaver/plugin-sql-generator'; import { isNotNullDefined } from '@dbeaver/js-helpers'; @injectable(() => [ActionService, MenuService, CommonDialogService, NotificationService, SqlGeneratorsResource]) @@ -78,6 +80,7 @@ export class DataGridContextMenuGenerateSqlService { ACTION_DATA_GRID_GENERATE_SQL_DELETE, ACTION_DATA_GRID_GENERATE_SQL_SELECT, ACTION_DATA_GRID_GENERATE_SQL_SELECT_MANY, + ACTION_DATA_GRID_GENERATE_SQL_CREATE, ], }); @@ -91,6 +94,7 @@ export class DataGridContextMenuGenerateSqlService { ACTION_DATA_GRID_GENERATE_SQL_DELETE, ACTION_DATA_GRID_GENERATE_SQL_SELECT, ACTION_DATA_GRID_GENERATE_SQL_SELECT_MANY, + ACTION_DATA_GRID_GENERATE_SQL_CREATE, ], isDisabled: context => { const model = context.get(DATA_CONTEXT_DV_DDM)!; @@ -98,6 +102,11 @@ export class DataGridContextMenuGenerateSqlService { return model.isLoading(); }, handler: async (context, action) => { + if (action === ACTION_DATA_GRID_GENERATE_SQL_CREATE) { + await this.openEntitySqlDialog(context); + return; + } + await this.openSqlDialog(context, mapGeneratorIdFromAction(action)); }, }); @@ -171,6 +180,50 @@ export class DataGridContextMenuGenerateSqlService { } } + private async openEntitySqlDialog(context: IDataContextProvider): Promise { + const model = context.get(DATA_CONTEXT_DV_DDM)!; + const options = model.source.options as IDataContainerOptions | undefined; + const nodePathList = options?.containerNodePath; + + if (!isResultSetDataModel(model)) { + return; + } + + const connectionId = model.source.executionContext?.context?.connectionId; + + if (!nodePathList || !isNotNullDefined(connectionId)) { + this.notificationService.logError({ + title: 'data_grid_table_generate_sql_error_title', + message: 'data_grid_table_generate_sql_error_no_connection', + }); + return; + } + + try { + const generators = await this.sqlGenerationResource.load(nodePathList); + const createGenerator = generators.find(g => g.id.toLowerCase().includes(DDL_GENERATOR_ID.toLowerCase())); + + if (!createGenerator) { + this.notificationService.logError({ + title: 'data_grid_table_generate_sql_error_title', + message: 'data_grid_table_generate_sql_error_no_query', + }); + return; + } + + const query = await this.sqlGenerationResource.generateEntityQuery(createGenerator.id, nodePathList, getDefaultQueryGeneratorOptions()); + + await this.commonDialogService.open(GeneratedSqlDialog, { + query, + nodeId: connectionId, + options: getDefaultQueryGeneratorOptions(), + regenerateQuery: genOptions => this.sqlGenerationResource.generateEntityQuery(createGenerator.id, nodePathList, genOptions), + }); + } catch (e: any) { + this.notificationService.logException(e, 'data_grid_table_generate_sql_error_title'); + } + } + private async generateQuery({ projectId, connectionId, diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/locales/de.ts b/webapp/packages/plugin-data-spreadsheet-new/src/locales/de.ts index 497bdffcd9f..5e8516039ae 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/locales/de.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/locales/de.ts @@ -50,6 +50,8 @@ export default [ ['data_grid_table_generate_sql_select_tooltip', 'SELECT-Anweisung mit WHERE-Klausel generieren'], ['data_grid_table_generate_sql_select_many', 'SELECT .. WHERE .. IN'], ['data_grid_table_generate_sql_select_many_tooltip', 'SELECT-Anweisung mit WHERE IN-Klausel generieren'], + ['data_grid_table_generate_sql_create', 'DDL'], + ['data_grid_table_generate_sql_create_tooltip', 'DDL-Anweisung für Entität generieren'], ['data_grid_table_generate_sql_error_title', 'SQL-Generierungsfehler'], ['data_grid_table_generate_sql_error_no_query', 'Keine Abfrage für das aktuelle Ergebnis verfügbar'], ['data_grid_table_generate_sql_error_no_connection', 'Unbekannter Ausführungskontext'], diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/locales/en.ts b/webapp/packages/plugin-data-spreadsheet-new/src/locales/en.ts index f4838133f20..2190c43228a 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/locales/en.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/locales/en.ts @@ -56,6 +56,8 @@ export default [ ['data_grid_table_generate_sql_select_tooltip', 'Generate SELECT statement with WHERE clause'], ['data_grid_table_generate_sql_select_many', 'SELECT .. WHERE .. IN'], ['data_grid_table_generate_sql_select_many_tooltip', 'Generate SELECT statement with WHERE IN clause'], + ['data_grid_table_generate_sql_create', 'DDL'], + ['data_grid_table_generate_sql_create_tooltip', 'Generate DDL statement for entity'], ['data_grid_table_generate_sql_error_title', 'SQL Generation Error'], ['data_grid_table_generate_sql_error_no_query', 'No query available for the current result'], ['data_grid_table_generate_sql_error_no_connection', 'Unknown execution context'], diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/locales/fr.ts b/webapp/packages/plugin-data-spreadsheet-new/src/locales/fr.ts index 88fb178e177..8ee3d78342d 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/locales/fr.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/locales/fr.ts @@ -55,6 +55,8 @@ export default [ ['data_grid_table_generate_sql_select_tooltip', 'Générer une instruction SELECT avec clause WHERE'], ['data_grid_table_generate_sql_select_many', 'SELECT .. WHERE .. IN'], ['data_grid_table_generate_sql_select_many_tooltip', 'Générer une instruction SELECT avec clause WHERE IN'], + ['data_grid_table_generate_sql_create', 'DDL'], + ['data_grid_table_generate_sql_create_tooltip', "Générer une instruction DDL pour l'entité"], ['data_grid_table_generate_sql_error_title', 'Erreur de génération SQL'], ['data_grid_table_generate_sql_error_no_query', 'Aucune requête disponible pour le résultat actuel'], ['data_grid_table_generate_sql_error_no_connection', "Contexte d'exécution inconnu"], diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/locales/it.ts b/webapp/packages/plugin-data-spreadsheet-new/src/locales/it.ts index c884985c1ad..adc3a8d40bf 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/locales/it.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/locales/it.ts @@ -57,6 +57,8 @@ export default [ ['data_grid_table_generate_sql_select_tooltip', 'Genera istruzione SELECT con clausola WHERE'], ['data_grid_table_generate_sql_select_many', 'SELECT .. WHERE .. IN'], ['data_grid_table_generate_sql_select_many_tooltip', 'Genera istruzione SELECT con clausola WHERE IN'], + ['data_grid_table_generate_sql_create', 'DDL'], + ['data_grid_table_generate_sql_create_tooltip', "Genera istruzione DDL per l'entità"], ['data_grid_table_generate_sql_error_title', 'Errore di generazione SQL'], ['data_grid_table_generate_sql_error_no_query', 'Nessuna query disponibile per il risultato attuale'], ['data_grid_table_generate_sql_error_no_connection', 'Contesto di esecuzione sconosciuto'], diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/locales/ru.ts b/webapp/packages/plugin-data-spreadsheet-new/src/locales/ru.ts index 17438a4b10c..e468993c51d 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/locales/ru.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/locales/ru.ts @@ -56,6 +56,8 @@ export default [ ['data_grid_table_generate_sql_select_tooltip', 'Сгенерировать SELECT-запрос с WHERE'], ['data_grid_table_generate_sql_select_many', 'SELECT .. WHERE .. IN'], ['data_grid_table_generate_sql_select_many_tooltip', 'Сгенерировать SELECT-запрос с WHERE IN'], + ['data_grid_table_generate_sql_create', 'DDL'], + ['data_grid_table_generate_sql_create_tooltip', 'Сгенерировать DDL-запрос для сущности'], ['data_grid_table_generate_sql_error_title', 'Ошибка генерации SQL'], ['data_grid_table_generate_sql_error_no_query', 'Нет запроса для текущего результата'], ['data_grid_table_generate_sql_error_no_connection', 'Неизвестный контекст выполнения'], diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/locales/vi.ts b/webapp/packages/plugin-data-spreadsheet-new/src/locales/vi.ts index e377d99af3c..05ea4c5f279 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/locales/vi.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/locales/vi.ts @@ -56,6 +56,8 @@ export default [ ['data_grid_table_generate_sql_select_tooltip', 'Tạo câu lệnh SELECT với điều kiện WHERE'], ['data_grid_table_generate_sql_select_many', 'SELECT .. WHERE .. IN'], ['data_grid_table_generate_sql_select_many_tooltip', 'Tạo câu lệnh SELECT với điều kiện WHERE IN'], + ['data_grid_table_generate_sql_create', 'DDL'], + ['data_grid_table_generate_sql_create_tooltip', 'Tạo câu lệnh DDL cho thực thể'], ['data_grid_table_generate_sql_error_title', 'Lỗi Tạo SQL'], ['data_grid_table_generate_sql_error_no_query', 'Không có truy vấn nào cho kết quả hiện tại'], ['data_grid_table_generate_sql_error_no_connection', 'Ngữ cảnh thực thi không xác định'], diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/locales/zh.ts b/webapp/packages/plugin-data-spreadsheet-new/src/locales/zh.ts index 0939241f3b5..7d00200ddb4 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/locales/zh.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/locales/zh.ts @@ -55,6 +55,8 @@ export default [ ['data_grid_table_generate_sql_select_tooltip', '生成带 WHERE 子句的 SELECT 语句'], ['data_grid_table_generate_sql_select_many', 'SELECT .. WHERE .. IN'], ['data_grid_table_generate_sql_select_many_tooltip', '生成带 WHERE IN 子句的 SELECT 语句'], + ['data_grid_table_generate_sql_create', 'DDL'], + ['data_grid_table_generate_sql_create_tooltip', '为实体生成 DDL 语句'], ['data_grid_table_generate_sql_error_title', 'SQL 生成错误'], ['data_grid_table_generate_sql_error_no_query', '当前结果没有可用的查询'], ['data_grid_table_generate_sql_error_no_connection', '未知的执行上下文'], diff --git a/webapp/packages/plugin-sql-generator/src/SqlGenerators/SqlGeneratorsResource.ts b/webapp/packages/plugin-sql-generator/src/SqlGenerators/SqlGeneratorsResource.ts index 4f7e2a73085..95eaf63a122 100644 --- a/webapp/packages/plugin-sql-generator/src/SqlGenerators/SqlGeneratorsResource.ts +++ b/webapp/packages/plugin-sql-generator/src/SqlGenerators/SqlGeneratorsResource.ts @@ -20,6 +20,7 @@ export const getDefaultQueryGeneratorOptions = (): SqlQueryGeneratorOptions => ( useFullyQualifiedNames: true, compactSql: false, }); +export const DDL_GENERATOR_ID = 'tableDDL'; @injectable(() => [GraphQLService, NavNodeInfoResource]) export class SqlGeneratorsResource extends CachedMapResource {