From f3eaed955fc9e56be93e2306fdd89f0f4e4a8e68 Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Mon, 11 May 2026 16:14:13 +0200 Subject: [PATCH] [CB] Add ability to interrupt connection establishment (front-end) (#4321) * dbeaver/pro#8810 adds cancel action for auth via link * lint fix + handles edge case when no popup appeared * reverts eslint fix * adds synchronization to connection init with oauth cancelling to remove stuck loading state * reverts abort logic * removes onAuthCancelled --- .../core-session-actions/package.json | 1 + .../src/CoreSessionActionsBootstrap.ts | 9 +++++++- .../src/SessionActionsEventHandler.ts | 21 ++++++++++++++++--- .../core-session-actions/tsconfig.json | 3 +++ .../packages/plugin-connections/package.json | 1 + .../useDatabaseCredentialsAuthDialog.ts | 4 ++-- .../packages/plugin-connections/tsconfig.json | 3 +++ webapp/yarn.lock | 2 ++ 8 files changed, 38 insertions(+), 6 deletions(-) diff --git a/webapp/packages/core-session-actions/package.json b/webapp/packages/core-session-actions/package.json index b5dda707cf..0d8c3c641c 100644 --- a/webapp/packages/core-session-actions/package.json +++ b/webapp/packages/core-session-actions/package.json @@ -27,6 +27,7 @@ "@cloudbeaver/core-di": "workspace:*", "@cloudbeaver/core-dialogs": "workspace:*", "@cloudbeaver/core-events": "workspace:*", + "@cloudbeaver/core-executor": "workspace:*", "@cloudbeaver/core-localization": "workspace:*", "@cloudbeaver/core-root": "workspace:*", "@cloudbeaver/core-routing": "workspace:*", diff --git a/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts b/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts index f36caad83c..8a77c38b86 100644 --- a/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts +++ b/webapp/packages/core-session-actions/src/CoreSessionActionsBootstrap.ts @@ -31,7 +31,7 @@ export class CoreSessionActionsBootstrap extends Bootstrap { } private async handleOpenUrlEvent(event: WsOpenUrlEvent): Promise { - const { url, timestamp } = event; + const { url, timestamp, actionId } = event; try { const { status } = await this.commonDialogService.open(ConfirmationDialog, { @@ -52,8 +52,15 @@ export class CoreSessionActionsBootstrap extends Bootstrap { this.notificationService.logError({ title: 'core_session_actions_popup_blocked', }); + + this.sessionActionsEventHandler.cancelAuth(actionId); + return; } } + + if (status === DialogueStateResult.Rejected) { + this.sessionActionsEventHandler.cancelAuth(actionId); + } } catch (exception: any) { this.notificationService.logException(exception, 'core_session_actions_open_url_error'); } diff --git a/webapp/packages/core-session-actions/src/SessionActionsEventHandler.ts b/webapp/packages/core-session-actions/src/SessionActionsEventHandler.ts index 0d897305d8..630e2bf727 100644 --- a/webapp/packages/core-session-actions/src/SessionActionsEventHandler.ts +++ b/webapp/packages/core-session-actions/src/SessionActionsEventHandler.ts @@ -1,13 +1,20 @@ /* * CloudBeaver - Cloud Database Manager - * Copyright (C) 2020-2025 DBeaver Corp and others + * Copyright (C) 2020-2026 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. */ import { injectable } from '@cloudbeaver/core-di'; -import { type ISessionEvent, type SessionEventId, SessionEventSource, SessionEventTopic, TopicEventHandler } from '@cloudbeaver/core-root'; -import { CbEventTopic, type WsOpenUrlEvent } from '@cloudbeaver/core-sdk'; +import { + ClientEventId, + type ISessionEvent, + type SessionEventId, + SessionEventSource, + SessionEventTopic, + TopicEventHandler, +} from '@cloudbeaver/core-root'; +import { CbEventTopic, type CbActionCancelledEvent, type WsOpenUrlEvent } from '@cloudbeaver/core-sdk'; @injectable(() => [SessionEventSource]) export class SessionActionsEventHandler extends TopicEventHandler { @@ -15,6 +22,14 @@ export class SessionActionsEventHandler extends TopicEventHandler({ + id: ClientEventId.CbClientCancelAction, + topicId: SessionEventTopic.CbSessionAction, + actionId, + }); + } + map(event: WsOpenUrlEvent): WsOpenUrlEvent { return event; } diff --git a/webapp/packages/core-session-actions/tsconfig.json b/webapp/packages/core-session-actions/tsconfig.json index 7d750a4fd9..731ab120f7 100644 --- a/webapp/packages/core-session-actions/tsconfig.json +++ b/webapp/packages/core-session-actions/tsconfig.json @@ -28,6 +28,9 @@ { "path": "../core-events" }, + { + "path": "../core-executor" + }, { "path": "../core-localization" }, diff --git a/webapp/packages/plugin-connections/package.json b/webapp/packages/plugin-connections/package.json index c868732bfc..b785807be2 100644 --- a/webapp/packages/plugin-connections/package.json +++ b/webapp/packages/plugin-connections/package.json @@ -37,6 +37,7 @@ "@cloudbeaver/core-resource": "workspace:*", "@cloudbeaver/core-root": "workspace:*", "@cloudbeaver/core-sdk": "workspace:*", + "@cloudbeaver/core-session-actions": "workspace:*", "@cloudbeaver/core-settings": "workspace:*", "@cloudbeaver/core-ui": "workspace:*", "@cloudbeaver/core-utils": "workspace:*", diff --git a/webapp/packages/plugin-connections/src/DatabaseAuthDialog/DatabaseCredentialsAuthDialog/useDatabaseCredentialsAuthDialog.ts b/webapp/packages/plugin-connections/src/DatabaseAuthDialog/DatabaseCredentialsAuthDialog/useDatabaseCredentialsAuthDialog.ts index 5483daf723..7a7e57dcc8 100644 --- a/webapp/packages/plugin-connections/src/DatabaseAuthDialog/DatabaseCredentialsAuthDialog/useDatabaseCredentialsAuthDialog.ts +++ b/webapp/packages/plugin-connections/src/DatabaseAuthDialog/DatabaseCredentialsAuthDialog/useDatabaseCredentialsAuthDialog.ts @@ -1,6 +1,6 @@ /* * CloudBeaver - Cloud Database Manager - * Copyright (C) 2020-2025 DBeaver Corp and others + * Copyright (C) 2020-2026 DBeaver Corp and others * * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. @@ -133,7 +133,7 @@ export function useDatabaseCredentialsAuthDialog( await this.connectionInfoResource.init(this.getConfig()); this.onInit?.(); } catch (exception: any) { - this.authException = exception; + this.authException = exception; } finally { this.authenticating = false; } diff --git a/webapp/packages/plugin-connections/tsconfig.json b/webapp/packages/plugin-connections/tsconfig.json index 28285cbd4c..0c3290a5ec 100644 --- a/webapp/packages/plugin-connections/tsconfig.json +++ b/webapp/packages/plugin-connections/tsconfig.json @@ -61,6 +61,9 @@ { "path": "../core-sdk" }, + { + "path": "../core-session-actions" + }, { "path": "../core-settings" }, diff --git a/webapp/yarn.lock b/webapp/yarn.lock index bfded623ae..ea9b67f839 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -2037,6 +2037,7 @@ __metadata: "@cloudbeaver/core-di": "workspace:*" "@cloudbeaver/core-dialogs": "workspace:*" "@cloudbeaver/core-events": "workspace:*" + "@cloudbeaver/core-executor": "workspace:*" "@cloudbeaver/core-localization": "workspace:*" "@cloudbeaver/core-root": "workspace:*" "@cloudbeaver/core-routing": "workspace:*" @@ -2798,6 +2799,7 @@ __metadata: "@cloudbeaver/core-resource": "workspace:*" "@cloudbeaver/core-root": "workspace:*" "@cloudbeaver/core-sdk": "workspace:*" + "@cloudbeaver/core-session-actions": "workspace:*" "@cloudbeaver/core-settings": "workspace:*" "@cloudbeaver/core-ui": "workspace:*" "@cloudbeaver/core-utils": "workspace:*"