From 76a440c4826332c3104782e9053913195474e365 Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 28 Nov 2023 15:57:25 +0300 Subject: [PATCH] CB-2974 feat: allow private connections selecting for sql editor (#2167) * CB-2974 feat: allow private connections selecting for sql editor * CB-2974 fix: typo * CB-2974 chore: decrease message delay --------- Co-authored-by: Evgenia Bezborodova <139753579+EvgeniaBzzz@users.noreply.github.com> --- .../ConnectionSchemaManagerBootstrap.ts | 11 ++++++++-- .../src/ResourceManagerScriptsService.ts | 6 ++++-- .../src/ResourceSqlDataSource.ts | 21 ++++++++++++------- .../src/ResourceSqlDataSourceBootstrap.ts | 4 +++- .../src/locales/en.ts | 4 ++++ .../src/locales/it.ts | 4 ++++ .../src/locales/ru.ts | 4 ++++ .../src/locales/zh.ts | 4 ++++ .../LocalStorage/LocalStorageSqlDataSource.ts | 5 +++++ .../src/SqlDataSource/MemorySqlDataSource.ts | 5 +++++ 10 files changed, 56 insertions(+), 12 deletions(-) diff --git a/webapp/packages/plugin-datasource-context-switch/src/ConnectionSchemaManager/ConnectionSchemaManagerBootstrap.ts b/webapp/packages/plugin-datasource-context-switch/src/ConnectionSchemaManager/ConnectionSchemaManagerBootstrap.ts index 2bfa8e7dd4..2096429982 100644 --- a/webapp/packages/plugin-datasource-context-switch/src/ConnectionSchemaManager/ConnectionSchemaManagerBootstrap.ts +++ b/webapp/packages/plugin-datasource-context-switch/src/ConnectionSchemaManager/ConnectionSchemaManagerBootstrap.ts @@ -18,6 +18,7 @@ import { import { Bootstrap, injectable } from '@cloudbeaver/core-di'; import { LocalizationService } from '@cloudbeaver/core-localization'; import { EObjectFeature, NodeManagerUtils } from '@cloudbeaver/core-navigation-tree'; +import { ProjectsService } from '@cloudbeaver/core-projects'; import { getCachedMapResourceLoaderState } from '@cloudbeaver/core-resource'; import { OptionsPanelService } from '@cloudbeaver/core-ui'; import { DATA_CONTEXT_MENU, MenuBaseItem, menuExtractItems, MenuSeparatorItem, MenuService } from '@cloudbeaver/core-view'; @@ -46,6 +47,7 @@ export class ConnectionSchemaManagerBootstrap extends Bootstrap { private readonly menuService: MenuService, private readonly connectionsSettingsService: ConnectionsSettingsService, private readonly localizationService: LocalizationService, + private readonly projectsService: ProjectsService, ) { super(); } @@ -105,13 +107,18 @@ export class ConnectionSchemaManagerBootstrap extends Bootstrap { isApplicable: () => this.connectionsManagerService.hasAnyConnection() && this.connectionSchemaManagerService.isConnectionChangeable, getItems: (context, items) => { items = [...items]; + const userProjectId = this.projectsService.userProject?.id; + const activeProjectId = this.connectionSchemaManagerService.activeProjectId; const connections = this.connectionsManagerService.projectConnections .filter(connection => { + // we want to show connections from active project and user project if ( !this.connectionSchemaManagerService.isProjectChangeable && - this.connectionSchemaManagerService.activeProjectId && - connection.projectId !== this.connectionSchemaManagerService.activeProjectId + activeProjectId && + activeProjectId !== connection.projectId && + activeProjectId !== userProjectId && + connection.projectId !== userProjectId ) { return false; } diff --git a/webapp/packages/plugin-resource-manager-scripts/src/ResourceManagerScriptsService.ts b/webapp/packages/plugin-resource-manager-scripts/src/ResourceManagerScriptsService.ts index ce700abdb8..1f6f73dffc 100644 --- a/webapp/packages/plugin-resource-manager-scripts/src/ResourceManagerScriptsService.ts +++ b/webapp/packages/plugin-resource-manager-scripts/src/ResourceManagerScriptsService.ts @@ -25,6 +25,7 @@ interface ISettings { } interface IResourceProperties { + 'default-projectId'?: string; 'default-datasource'?: string; 'default-catalog'?: string; 'default-schema'?: string; @@ -86,6 +87,7 @@ export class ResourceManagerScriptsService { const resourceKey = getRmResourceKey(path); const properties: IResourceProperties = await this.resourceManagerResource.setProperties(path, { + 'default-projectId': executionContext?.projectId, 'default-datasource': executionContext?.connectionId, 'default-catalog': executionContext?.defaultCatalog, 'default-schema': executionContext?.defaultSchema, @@ -97,7 +99,7 @@ export class ResourceManagerScriptsService { return { id: NOT_INITIALIZED_CONTEXT_ID, - projectId: resourceKey.projectId, + projectId: properties['default-projectId'] ?? resourceKey.projectId, connectionId: properties['default-datasource'], defaultCatalog: properties['default-catalog'], defaultSchema: properties['default-schema'], @@ -115,7 +117,7 @@ export class ResourceManagerScriptsService { return { id: NOT_INITIALIZED_CONTEXT_ID, - projectId: resourceKey.projectId, + projectId: properties['default-projectId'] ?? resourceKey.projectId, connectionId: properties['default-datasource'], defaultCatalog: properties['default-catalog'], defaultSchema: properties['default-schema'], diff --git a/webapp/packages/plugin-sql-editor-navigation-tab-script/src/ResourceSqlDataSource.ts b/webapp/packages/plugin-sql-editor-navigation-tab-script/src/ResourceSqlDataSource.ts index 1d7f71fd93..3a94d95200 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab-script/src/ResourceSqlDataSource.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab-script/src/ResourceSqlDataSource.ts @@ -14,7 +14,7 @@ import { NOT_INITIALIZED_CONTEXT_ID, } from '@cloudbeaver/core-connections'; import { TaskScheduler } from '@cloudbeaver/core-executor'; -import type { ProjectInfoResource } from '@cloudbeaver/core-projects'; +import type { ProjectInfoResource, ProjectsService } from '@cloudbeaver/core-projects'; import { isResourceAlias, ResourceKey, ResourceKeyUtils } from '@cloudbeaver/core-resource'; import { getRmResourceKey, ResourceManagerResource } from '@cloudbeaver/core-resource-manager'; import type { NetworkStateService } from '@cloudbeaver/core-root'; @@ -37,6 +37,7 @@ interface IResourceActions { } const VALUE_SYNC_DELAY = 1 * 1000; +const DIFFERENT_PROJECT_MESSAGE_DISPLAY_DELAY = 4 * 1000; export class ResourceSqlDataSource extends BaseSqlDataSource { static key = 'resource'; @@ -113,6 +114,7 @@ export class ResourceSqlDataSource extends BaseSqlDataSource { private readonly connectionInfoResource: ConnectionInfoResource, private readonly resourceManagerResource: ResourceManagerResource, private readonly sqlEditorService: SqlEditorService, + private readonly projectsService: ProjectsService, state: IResourceSqlDataSourceState, ) { super(); @@ -235,12 +237,6 @@ export class ResourceSqlDataSource extends BaseSqlDataSource { executionContext = JSON.parse(JSON.stringify(toJS(executionContext) ?? {})); } - const projectId = executionContext?.projectId; - - if (this.resourceKey && isNotNullDefined(projectId) && getRmResourceKey(this.resourceKey).projectId !== projectId) { - throw new Error('Resource SQL Data Source and Execution context projects don\t match'); - } - if (!isObjectsEqual(toJS(this.state.executionContext), executionContext)) { const initNew = !isValuesEqual(executionContext?.connectionId, this.executionContext?.connectionId, undefined) || @@ -371,6 +367,17 @@ export class ResourceSqlDataSource extends BaseSqlDataSource { try { this.exception = null; + const projectId = this.executionContext?.projectId; + const resourceProjectId = getRmResourceKey(this.resourceKey).projectId; + const userProjectId = this.projectsService.userProject?.id; + + if (isNotNullDefined(projectId) && resourceProjectId !== projectId && resourceProjectId !== userProjectId) { + this.message = 'plugin_sql_editor_navigation_tab_script_state_different_project'; + + await new Promise(resolve => setTimeout(resolve, DIFFERENT_PROJECT_MESSAGE_DISPLAY_DELAY)); + return; + } + if (!this.isReadonly()) { this.message = 'plugin_sql_editor_navigation_tab_script_state_updating'; const executionContext = await this.actions.setProperties(this, this.resourceKey, this.executionContext); diff --git a/webapp/packages/plugin-sql-editor-navigation-tab-script/src/ResourceSqlDataSourceBootstrap.ts b/webapp/packages/plugin-sql-editor-navigation-tab-script/src/ResourceSqlDataSourceBootstrap.ts index 3d1e066aa7..7348fcf22f 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab-script/src/ResourceSqlDataSourceBootstrap.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab-script/src/ResourceSqlDataSourceBootstrap.ts @@ -12,7 +12,7 @@ import { ConnectionInfoResource, IConnectionExecutionContextInfo } from '@cloudb import { Bootstrap, injectable } from '@cloudbeaver/core-di'; import { CommonDialogService, DialogueStateResult } from '@cloudbeaver/core-dialogs'; import { NotificationService } from '@cloudbeaver/core-events'; -import { ProjectInfoResource } from '@cloudbeaver/core-projects'; +import { ProjectInfoResource, ProjectsService } from '@cloudbeaver/core-projects'; import { ICachedTreeMoveData, resourceKeyList, ResourceKeySimple, ResourceKeyUtils } from '@cloudbeaver/core-resource'; import { ResourceManagerResource } from '@cloudbeaver/core-resource-manager'; import { NetworkStateService } from '@cloudbeaver/core-root'; @@ -50,6 +50,7 @@ export class ResourceSqlDataSourceBootstrap extends Bootstrap { private readonly projectInfoResource: ProjectInfoResource, private readonly sqlEditorTabResourceService: SqlEditorTabResourceService, private readonly sqlEditorService: SqlEditorService, + private readonly projectsService: ProjectsService, localStorageSaveService: LocalStorageSaveService, ) { super(); @@ -96,6 +97,7 @@ export class ResourceSqlDataSourceBootstrap extends Bootstrap { this.connectionInfoResource, this.resourceManagerResource, this.sqlEditorService, + this.projectsService, this.createState(editorId, options?.script), ); diff --git a/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/en.ts b/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/en.ts index d32911cf65..5a19af588e 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/en.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/en.ts @@ -4,6 +4,10 @@ export default [ ['plugin_sql_editor_navigation_tab_script_state_reading', 'Reading script...'], ['plugin_sql_editor_navigation_tab_script_state_saving', 'Saving script...'], ['plugin_sql_editor_navigation_tab_script_state_updating', 'Updating script info...'], + [ + 'plugin_sql_editor_navigation_tab_script_state_different_project', + 'The connection project differs from the script project—the connection change is not saved.', + ], ['plugin_sql_editor_navigation_tab_resource_save_script_success', 'Script successfully saved'], ['plugin_sql_editor_navigation_tab_resource_open_script_error', 'Failed to open the script'], ['plugin_sql_editor_navigation_tab_resource_save_script_error', 'Error occurred while trying to save the script'], diff --git a/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/it.ts b/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/it.ts index d32911cf65..5a19af588e 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/it.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/it.ts @@ -4,6 +4,10 @@ export default [ ['plugin_sql_editor_navigation_tab_script_state_reading', 'Reading script...'], ['plugin_sql_editor_navigation_tab_script_state_saving', 'Saving script...'], ['plugin_sql_editor_navigation_tab_script_state_updating', 'Updating script info...'], + [ + 'plugin_sql_editor_navigation_tab_script_state_different_project', + 'The connection project differs from the script project—the connection change is not saved.', + ], ['plugin_sql_editor_navigation_tab_resource_save_script_success', 'Script successfully saved'], ['plugin_sql_editor_navigation_tab_resource_open_script_error', 'Failed to open the script'], ['plugin_sql_editor_navigation_tab_resource_save_script_error', 'Error occurred while trying to save the script'], diff --git a/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/ru.ts b/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/ru.ts index 8e20e5cff1..16ac881c9e 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/ru.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/ru.ts @@ -4,6 +4,10 @@ export default [ ['plugin_sql_editor_navigation_tab_script_state_reading', 'Чтение скрипта...'], ['plugin_sql_editor_navigation_tab_script_state_saving', 'Сохранение скрипта...'], ['plugin_sql_editor_navigation_tab_script_state_updating', 'Обновление информации о скрипте...'], + [ + 'plugin_sql_editor_navigation_tab_script_state_different_project', + 'Проект подключения отличается от проекта скрипта. Изменение подключения не сохранено.', + ], ['plugin_sql_editor_navigation_tab_resource_save_script_success', 'Скрипт успешно сохранен'], ['plugin_sql_editor_navigation_tab_resource_open_script_error', 'Не удалось открыть скрипт'], ['plugin_sql_editor_navigation_tab_resource_save_script_error', 'Возникла ошибка при попытки сохранить скрипт'], diff --git a/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/zh.ts b/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/zh.ts index 39c633324c..a63a7f423d 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/zh.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab-script/src/locales/zh.ts @@ -4,6 +4,10 @@ export default [ ['plugin_sql_editor_navigation_tab_script_state_reading', 'Reading script...'], ['plugin_sql_editor_navigation_tab_script_state_saving', 'Saving script...'], ['plugin_sql_editor_navigation_tab_script_state_updating', 'Updating script info...'], + [ + 'plugin_sql_editor_navigation_tab_script_state_different_project', + 'The connection project differs from the script project—the connection change is not saved.', + ], ['plugin_sql_editor_navigation_tab_resource_save_script_success', '脚本保存成功'], ['plugin_sql_editor_navigation_tab_resource_open_script_error', '打开脚本失败'], ['plugin_sql_editor_navigation_tab_resource_save_script_error', '打开脚本出错'], diff --git a/webapp/packages/plugin-sql-editor/src/SqlDataSource/LocalStorage/LocalStorageSqlDataSource.ts b/webapp/packages/plugin-sql-editor/src/SqlDataSource/LocalStorage/LocalStorageSqlDataSource.ts index 2c7707eaa5..494faa9f82 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlDataSource/LocalStorage/LocalStorageSqlDataSource.ts +++ b/webapp/packages/plugin-sql-editor/src/SqlDataSource/LocalStorage/LocalStorageSqlDataSource.ts @@ -44,6 +44,11 @@ export class LocalStorageSqlDataSource extends BaseSqlDataSource { return true; } + get projectId(): string | null { + // we will be able to attach any connection from any project + return null; + } + private state!: ILocalStorageSqlDataSourceState; constructor(state: ILocalStorageSqlDataSourceState) { diff --git a/webapp/packages/plugin-sql-editor/src/SqlDataSource/MemorySqlDataSource.ts b/webapp/packages/plugin-sql-editor/src/SqlDataSource/MemorySqlDataSource.ts index c9b3c24339..3273ce554c 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlDataSource/MemorySqlDataSource.ts +++ b/webapp/packages/plugin-sql-editor/src/SqlDataSource/MemorySqlDataSource.ts @@ -41,6 +41,11 @@ export class MemorySqlDataSource extends BaseSqlDataSource { return true; } + get projectId(): string | null { + // we will be able to attach any connection from any project + return null; + } + private _name: string | null; private _script: string; private _executionContext?: IConnectionExecutionContextInfo;