diff --git a/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorBootstrap.ts b/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorBootstrap.ts index 58bcb8a421..ec88013d17 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorBootstrap.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorBootstrap.ts @@ -12,15 +12,15 @@ import { ConnectionSchemaManagerService, isObjectCatalogProvider, isObjectSchemaProvider, DATA_CONTEXT_NAV_NODE, NavigationTabsService } from '@cloudbeaver/core-app'; -import { ConnectionsManagerService, IConnectionExecutorData, isConnectionProvider } from '@cloudbeaver/core-connections'; +import { isConnectionProvider } from '@cloudbeaver/core-connections'; import { Bootstrap, injectable } from '@cloudbeaver/core-di'; import { CommonDialogService, DialogueStateResult, RenameDialog } from '@cloudbeaver/core-dialogs'; -import { ExecutorInterrupter, IExecutionContextProvider, IExecutorHandler } from '@cloudbeaver/core-executor'; +import type { IExecutorHandler } from '@cloudbeaver/core-executor'; import { ExtensionUtils } from '@cloudbeaver/core-extensions'; import { ISessionAction, sessionActionContext, SessionActionService } from '@cloudbeaver/core-root'; import { ActionService, ACTION_RENAME, DATA_CONTEXT_MENU_NESTED, menuExtractActions, MenuService, ViewService } from '@cloudbeaver/core-view'; import { DATA_CONTEXT_CONNECTION } from '@cloudbeaver/plugin-connections'; -import { DATA_CONTEXT_SQL_EDITOR_STATE, LocalStorageSqlDataSource, SqlResultTabsService } from '@cloudbeaver/plugin-sql-editor'; +import { DATA_CONTEXT_SQL_EDITOR_STATE, LocalStorageSqlDataSource } from '@cloudbeaver/plugin-sql-editor'; import { ACTION_SQL_EDITOR_OPEN } from './ACTION_SQL_EDITOR_OPEN'; import { DATA_CONTEXT_SQL_EDITOR_TAB } from './DATA_CONTEXT_SQL_EDITOR_TAB'; @@ -42,15 +42,11 @@ export class SqlEditorBootstrap extends Bootstrap { private readonly sessionActionService: SessionActionService, private readonly commonDialogService: CommonDialogService, private readonly sqlEditorTabService: SqlEditorTabService, - private readonly sqlResultTabsService: SqlResultTabsService, - private readonly connectionsManagerService: ConnectionsManagerService, ) { super(); } register(): void { - this.connectionsManagerService.onDisconnect.addHandler(this.disconnectHandler.bind(this)); - this.mainMenuService.registerRootItem( { id: 'sql-editor', @@ -199,24 +195,4 @@ export class SqlEditorBootstrap extends Bootstrap { } } }; - - private async disconnectHandler( - data: IConnectionExecutorData, - contexts: IExecutionContextProvider - ) { - if (data.state === 'before') { - for (const tab of this.sqlEditorTabService.sqlEditorTabs) { - if (!data.connections.includes(tab.handlerState.executionContext?.connectionId ?? '')) { - continue; - } - - const canDisconnect = await this.sqlResultTabsService.canCloseResultTabs(tab.handlerState); - - if (!canDisconnect) { - ExecutorInterrupter.interrupt(contexts); - return; - } - } - } - } } diff --git a/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorTabService.ts b/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorTabService.ts index 15b613d314..fd5086720f 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorTabService.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorTabService.ts @@ -28,10 +28,12 @@ import { ConnectionInfoResource, connectionProvider, connectionSetter, + ConnectionsManagerService, + IConnectionExecutorData, } from '@cloudbeaver/core-connections'; import { Bootstrap, injectable } from '@cloudbeaver/core-di'; import { NotificationService } from '@cloudbeaver/core-events'; -import { Executor, ExecutorInterrupter } from '@cloudbeaver/core-executor'; +import { Executor, ExecutorInterrupter, IExecutionContextProvider } from '@cloudbeaver/core-executor'; import { CachedMapAllKey, ResourceKey, ResourceKeyUtils } from '@cloudbeaver/core-sdk'; import { SqlResultTabsService, ISqlEditorTabState, SqlEditorService, getSqlEditorName, SqlDataSourceService } from '@cloudbeaver/plugin-sql-editor'; @@ -58,7 +60,8 @@ export class SqlEditorTabService extends Bootstrap { private readonly connectionInfoResource: ConnectionInfoResource, private readonly connectionSchemaManagerService: ConnectionSchemaManagerService, private readonly navNodeManagerService: NavNodeManagerService, - private readonly sqlDataSourceService: SqlDataSourceService + private readonly sqlDataSourceService: SqlDataSourceService, + private readonly connectionsManagerService: ConnectionsManagerService, ) { super(); @@ -89,6 +92,7 @@ export class SqlEditorTabService extends Bootstrap { } register(): void { + this.connectionsManagerService.onDisconnect.addHandler(this.disconnectHandler.bind(this)); this.connectionInfoResource.onItemDelete.addHandler(this.handleConnectionDelete.bind(this)); this.connectionExecutionContextResource.onItemAdd.addHandler(this.handleExecutionContextUpdate.bind(this)); this.connectionExecutionContextResource.onItemDelete.addHandler(this.handleExecutionContextDelete.bind(this)); @@ -347,6 +351,28 @@ export class SqlEditorTabService extends Bootstrap { } } + private async disconnectHandler( + data: IConnectionExecutorData, + contexts: IExecutionContextProvider + ) { + if (data.state === 'before') { + for (const tab of this.sqlEditorTabs) { + const dataSource = this.sqlDataSourceService.get(tab.handlerState.editorId); + + if (!data.connections.includes(dataSource?.executionContext?.connectionId ?? '')) { + continue; + } + + const canDisconnect = await this.handleCanTabClose(tab); + + if (!canDisconnect) { + ExecutorInterrupter.interrupt(contexts); + return; + } + } + } + } + private async handleCanTabClose(editorTab: ITab) { const canCloseTabs = await this.sqlResultTabsService.canCloseResultTabs(editorTab.handlerState);