diff --git a/webapp/packages/plugin-data-viewer/package.json b/webapp/packages/plugin-data-viewer/package.json index da98ccfa20..0f5428c941 100644 --- a/webapp/packages/plugin-data-viewer/package.json +++ b/webapp/packages/plugin-data-viewer/package.json @@ -38,6 +38,7 @@ "@cloudbeaver/core-ui": "workspace:*", "@cloudbeaver/core-utils": "workspace:*", "@cloudbeaver/core-view": "workspace:*", + "@cloudbeaver/plugin-authentication": "workspace:*", "@cloudbeaver/plugin-codemirror6": "workspace:*", "@cloudbeaver/plugin-navigation-tabs": "workspace:*", "@cloudbeaver/plugin-object-viewer": "workspace:*", diff --git a/webapp/packages/plugin-data-viewer/src/DataViewerTabService.ts b/webapp/packages/plugin-data-viewer/src/DataViewerTabService.ts index 5d43ff40fb..0ee249a4ed 100644 --- a/webapp/packages/plugin-data-viewer/src/DataViewerTabService.ts +++ b/webapp/packages/plugin-data-viewer/src/DataViewerTabService.ts @@ -20,6 +20,7 @@ import { ObjectPage, ObjectViewerTabService, } from '@cloudbeaver/plugin-object-viewer'; +import { AuthenticationService } from '@cloudbeaver/plugin-authentication'; import type { IDataViewerPageState } from './IDataViewerPageState.js'; import { TableViewerStorageService } from './TableViewer/TableViewerStorageService.js'; @@ -40,6 +41,7 @@ export class DataViewerTabService { private readonly navigationTabsService: NavigationTabsService, private readonly connectionInfoResource: ConnectionInfoResource, private readonly tableViewerStorageService: TableViewerStorageService, + private readonly authService: AuthenticationService, ) { this.page = this.dbObjectPageService.register({ key: 'data_viewer_data', @@ -54,8 +56,9 @@ export class DataViewerTabService { }); } - register() { + register(): void { this.connectionsManagerService.onDisconnect.addHandler(this.disconnectHandler.bind(this)); + this.authService.onLogout.addHandler(this.logoutHandler.bind(this)); } registerTabHandler(): void { @@ -75,12 +78,35 @@ export class DataViewerTabService { ), ); + await this.handleTabsCleanup(tabs, { + canInterrupt: data.state === 'before', + contexts, + }); + } + + private async logoutHandler() { + const tabs = Array.from( + this.navigationTabsService.findTabs(tab => isObjectViewerTab(tab)), + ); + + await this.handleTabsCleanup(tabs, { + canInterrupt: false, + }); + } + + private async handleTabsCleanup( + tabs: ITab[], + options: { + canInterrupt: boolean; + contexts?: IExecutionContextProvider; + } + ) { for (const tab of tabs) { - if (data.state === 'before') { + if (options.canInterrupt) { const canDisconnect = await this.handleTabCanClose(tab); - if (!canDisconnect) { - ExecutorInterrupter.interrupt(contexts); + if (!canDisconnect && options.contexts) { + ExecutorInterrupter.interrupt(options.contexts); return; } } else if (isObjectViewerTab(tab) && tab.handlerState.tableId) { @@ -109,7 +135,7 @@ export class DataViewerTabService { } } - private handleTabRestore(tab: ITab) { + private handleTabRestore(): boolean { return true; } diff --git a/webapp/packages/plugin-data-viewer/tsconfig.json b/webapp/packages/plugin-data-viewer/tsconfig.json index 234bc77dcf..3e34d72136 100644 --- a/webapp/packages/plugin-data-viewer/tsconfig.json +++ b/webapp/packages/plugin-data-viewer/tsconfig.json @@ -73,6 +73,9 @@ { "path": "../core-view" }, + { + "path": "../plugin-authentication" + }, { "path": "../plugin-codemirror6" }, diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 0b21920a7e..cd1ada9a1d 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -2905,6 +2905,7 @@ __metadata: "@cloudbeaver/core-ui": "workspace:*" "@cloudbeaver/core-utils": "workspace:*" "@cloudbeaver/core-view": "workspace:*" + "@cloudbeaver/plugin-authentication": "workspace:*" "@cloudbeaver/plugin-codemirror6": "workspace:*" "@cloudbeaver/plugin-navigation-tabs": "workspace:*" "@cloudbeaver/plugin-object-viewer": "workspace:*"