From 2dc712238704f1f4dee568881e1207c5b8701c22 Mon Sep 17 00:00:00 2001 From: Wroud Date: Sun, 18 Oct 2020 01:08:38 +0300 Subject: [PATCH] fix(core-connections): throw error when required connection not established CB-339 --- .../NavigationNode/NavigationNode.tsx | 6 +++--- .../src/NavigationTree/NavigationTreeService.ts | 7 ++++++- .../src/ConnectionAuthService.ts | 4 ++-- .../DatabaseAuthDialog/DatabaseAuthDialog.tsx | 2 +- .../src/CommonDialog/CommonDialogService.ts | 17 +++++++++++------ 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/webapp/packages/core-app/src/NavigationTree/NavigationTreeNode/NavigationNode/NavigationNode.tsx b/webapp/packages/core-app/src/NavigationTree/NavigationTreeNode/NavigationNode/NavigationNode.tsx index 20e9c87ad9..6d60dc7920 100644 --- a/webapp/packages/core-app/src/NavigationTree/NavigationTreeNode/NavigationNode/NavigationNode.tsx +++ b/webapp/packages/core-app/src/NavigationTree/NavigationTreeNode/NavigationNode/NavigationNode.tsx @@ -8,7 +8,7 @@ import { observer } from 'mobx-react'; import { - MouseEvent, KeyboardEvent, useCallback, PropsWithChildren + MouseEvent, useCallback, PropsWithChildren } from 'react'; import styled, { use } from 'reshadow'; @@ -58,8 +58,8 @@ export const NavigationNode = observer(function NavigationNode({ ); const handleEnter = useCallback( - (event: KeyboardEvent) => { - switch (event.key) { + (event: React.KeyboardEvent) => { + switch ((event as unknown as KeyboardEvent).code) { case KEY.ENTER: controller.handleSelect(event.ctrlKey); break; diff --git a/webapp/packages/core-app/src/NavigationTree/NavigationTreeService.ts b/webapp/packages/core-app/src/NavigationTree/NavigationTreeService.ts index a230c4ec1e..85158a20e4 100644 --- a/webapp/packages/core-app/src/NavigationTree/NavigationTreeService.ts +++ b/webapp/packages/core-app/src/NavigationTree/NavigationTreeService.ts @@ -89,7 +89,12 @@ export class NavigationTreeService { const node = this.navNodeManagerService.getNode(navNodeId); if (node?.objectFeatures.includes(EObjectFeature.dataSource)) { - await this.connectionAuthService.auth(NodeManagerUtils.connectionNodeIdToConnectionId(navNodeId)); + const connection = await this.connectionAuthService.auth( + NodeManagerUtils.connectionNodeIdToConnectionId(navNodeId) + ); + if (!connection.connected) { + throw new Error('Connection not established'); + } } } } diff --git a/webapp/packages/core-connections/src/ConnectionAuthService.ts b/webapp/packages/core-connections/src/ConnectionAuthService.ts index 1fae84afa4..043dc55211 100644 --- a/webapp/packages/core-connections/src/ConnectionAuthService.ts +++ b/webapp/packages/core-connections/src/ConnectionAuthService.ts @@ -9,7 +9,7 @@ import { injectable } from '@cloudbeaver/core-di'; import { CommonDialogService } from '@cloudbeaver/core-dialogs'; -import { ConnectionInfoResource } from './ConnectionInfoResource'; +import { Connection, ConnectionInfoResource } from './ConnectionInfoResource'; import { DatabaseAuthDialog } from './DatabaseAuthDialog/DatabaseAuthDialog'; @injectable() @@ -19,7 +19,7 @@ export class ConnectionAuthService { private commonDialogService: CommonDialogService ) {} - async auth(connectionId: string) { + async auth(connectionId: string): Promise { let connection = this.connectionInfoResource.get(connectionId); if (!connection?.connected) { diff --git a/webapp/packages/core-connections/src/DatabaseAuthDialog/DatabaseAuthDialog.tsx b/webapp/packages/core-connections/src/DatabaseAuthDialog/DatabaseAuthDialog.tsx index 117a78c2e6..8115dbdbb4 100644 --- a/webapp/packages/core-connections/src/DatabaseAuthDialog/DatabaseAuthDialog.tsx +++ b/webapp/packages/core-connections/src/DatabaseAuthDialog/DatabaseAuthDialog.tsx @@ -59,7 +59,7 @@ export const DatabaseAuthDialog = observer(function DatabaseAuthDialog({ payload, options, rejectDialog, -}: DialogComponentProps) { +}: DialogComponentProps) { const connection = useConnectionInfo(payload); const [focusedRef] = useFocus({ focusFirstChild: true }); const { driver } = useDBDriver(connection.connectionInfo?.driverId || ''); diff --git a/webapp/packages/core-dialogs/src/CommonDialog/CommonDialogService.ts b/webapp/packages/core-dialogs/src/CommonDialog/CommonDialogService.ts index 5cc02fd4ee..67178f78bb 100644 --- a/webapp/packages/core-dialogs/src/CommonDialog/CommonDialogService.ts +++ b/webapp/packages/core-dialogs/src/CommonDialog/CommonDialogService.ts @@ -14,16 +14,21 @@ export interface DialogOptions { persistent?: boolean; } -export interface DialogComponentProps { +export interface DialogComponentProps { payload: TPayload; options?: DialogOptions; - resolveDialog: (result: TResult | null) => void; + resolveDialog: (result: TResult) => void; rejectDialog: () => void; // the dialog was closed by cancel button or backdrop click className?: string; } export type DialogComponent = React.ElementType>; +export enum DialogueStateResult { + Resolved, + Rejected +} + export interface DialogInternal { component: DialogComponent; payload: any; @@ -35,12 +40,12 @@ export interface DialogInternal { export class CommonDialogService { dialogs: DialogInternal[] = observable([]); - // note that if dialog is closed by user it will be resolved with null + // note that if dialog is closed by user it will be resolved with DialogueStateResult.Rejected async open( component: DialogComponent, payload: TPayload, options?: DialogOptions - ): Promise { + ): Promise { return new Promise((resolve, reject) => { const dialogInternal: DialogInternal = { component, @@ -53,12 +58,12 @@ export class CommonDialogService { } rejectDialog(dialog: DialogInternal): void { - dialog.resolve(null); + dialog.resolve(DialogueStateResult.Rejected); this.removeDialog(dialog); } resolveDialog(dialog: DialogInternal, result: TResult): void { - dialog.resolve(result); + dialog.resolve(result ?? DialogueStateResult.Resolved); this.removeDialog(dialog); }