mirror of
https://github.com/dbeaver/cloudbeaver.git
synced 2026-09-24 16:04:36 +08:00
fix(plugin-sql-editor-navigation-tab): CB-2092 connection close behaviour
This commit is contained in:
@@ -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<IConnectionExecutorData>
|
||||
) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<IConnectionExecutorData>
|
||||
) {
|
||||
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<ISqlEditorTabState>) {
|
||||
const canCloseTabs = await this.sqlResultTabsService.canCloseResultTabs(editorTab.handlerState);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user