From d124b444c705e470e6fa5c1a86533f2906a3a92c Mon Sep 17 00:00:00 2001 From: Sychev Andrey Date: Tue, 19 Aug 2025 16:27:55 +0200 Subject: [PATCH] dbeaver/pro#6605 fix: reset filters on logout This commit adds onLogout handler in DataViewerTabService which disposes opened tabs on logout. Previously we didn't handle that at all and model was persisted in the memory after logout. On next login, if there was any filters, we would try to send them to backend and got an error, because backend doesn't support initial requests(without resultId) with filters. The main logic of a handler repeats the already existed onDisconnect handler logic, which was extracted to handleTabsCleanup method. The difference between handlers is only in a set of tabs(onLogout we dispose all of them, onDisconnect - only tabs of a selected connection) and ability to interrupt the process. --- .../packages/plugin-data-viewer/package.json | 1 + .../src/DataViewerTabService.ts | 36 ++++++++++++++++--- .../packages/plugin-data-viewer/tsconfig.json | 3 ++ webapp/yarn.lock | 1 + 4 files changed, 36 insertions(+), 5 deletions(-) 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:*"