From 8b8b2149d4c5abc7105afb1bf74d6d8f70c20474 Mon Sep 17 00:00:00 2001 From: Wroud Date: Fri, 12 Jun 2020 20:03:16 +0300 Subject: [PATCH 1/4] fix(core): connection info loading behavior --- .../NavigationTreeNode/useNavigationTree.ts | 15 ++- .../NavigationTree/NavigationTreeService.ts | 14 +- .../ConnectionSchemaManagerService.ts | 2 + webapp/packages/core/src/app/index.ts | 2 + .../ConnectionsManagerService.ts | 122 +++++++++++++++--- .../ConnectionsManager/EConnectionFeature.ts | 15 +++ .../queries/connectionState.gql | 1 + .../queries/createConnection.gql | 1 + .../queries/openConnection.gql | 1 + .../ConnectionsManager/useConnectionInfo.ts | 31 +++++ .../packages/core/src/root/SessionService.ts | 2 +- .../core/src/root/queries/openSession.gql | 1 + .../core/src/root/queries/sessionState.gql | 1 + webapp/packages/core/src/sdk/sdk.ts | 15 ++- 14 files changed, 192 insertions(+), 31 deletions(-) create mode 100644 webapp/packages/core/src/app/shared/ConnectionsManager/EConnectionFeature.ts create mode 100644 webapp/packages/core/src/app/shared/ConnectionsManager/useConnectionInfo.ts diff --git a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/useNavigationTree.ts b/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/useNavigationTree.ts index b96cc9c6bd..1985355b02 100644 --- a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/useNavigationTree.ts +++ b/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/useNavigationTree.ts @@ -10,6 +10,8 @@ import { useState, useCallback, useEffect } from 'react'; import { useService } from '@dbeaver/core/di'; +import { EConnectionFeature } from '../../shared/ConnectionsManager/EConnectionFeature'; +import { useConnectionInfo } from '../../shared/ConnectionsManager/useConnectionInfo'; import { NavNode } from '../../shared/NodesManager/EntityTypes'; import { EObjectFeature } from '../../shared/NodesManager/EObjectFeature'; import { NavNodeManagerService } from '../../shared/NodesManager/NavNodeManagerService'; @@ -32,11 +34,14 @@ export function useNavigationTree(nodeId: string, parentId: string) { const isLoaded = children.isLoaded; const isExpandable = isExpandableFilter(node) && (!isLoaded || children.children!.length > 0); - const isExpandedFiltered = isExpanded - && ( - !node.objectFeatures.includes(EObjectFeature.dataSource) - || node.objectFeatures.includes(EObjectFeature.dataSourceConnected) - ); + let isExpandedFiltered = isExpanded; + + if (node.objectFeatures.includes(EObjectFeature.dataSource)) { + const { connectionInfo } = useConnectionInfo(nodeId); + if (!connectionInfo?.features.includes(EConnectionFeature.connected)) { + isExpandedFiltered = false; + } + } const handleDoubleClick = useCallback( () => navNodeManagerService.navToNode(nodeId, parentId), diff --git a/webapp/packages/core/src/app/NavigationTree/NavigationTreeService.ts b/webapp/packages/core/src/app/NavigationTree/NavigationTreeService.ts index 974344d11d..d8a5bb83d3 100644 --- a/webapp/packages/core/src/app/NavigationTree/NavigationTreeService.ts +++ b/webapp/packages/core/src/app/NavigationTree/NavigationTreeService.ts @@ -12,6 +12,8 @@ import { Subject, Observable } from 'rxjs'; import { injectable } from '@dbeaver/core/di'; import { NotificationService } from '@dbeaver/core/eventsLog'; +import { ConnectionsManagerService } from '../shared/ConnectionsManager/ConnectionsManagerService'; +import { EObjectFeature } from '../shared/NodesManager/EObjectFeature'; import { NavNodeManagerService, ROOT_NODE_PATH } from '../shared/NodesManager/NavNodeManagerService'; @injectable() @@ -22,8 +24,9 @@ export class NavigationTreeService { private nodeSelectSubject: Subject<[string, boolean]>; constructor( - private NavNodeManagerService: NavNodeManagerService, - private notificationService: NotificationService + private navNodeManagerService: NavNodeManagerService, + private notificationService: NotificationService, + private connectionsManagerService: ConnectionsManagerService ) { this.nodeSelectSubject = new Subject(); this.onNodeSelect = this.nodeSelectSubject.asObservable(); @@ -31,7 +34,12 @@ export class NavigationTreeService { async loadNestedNodes(id = ROOT_NODE_PATH) { try { - await this.NavNodeManagerService.loadTree(id); + await this.navNodeManagerService.loadTree(id); + const node = this.navNodeManagerService.getNode(id); + + if (node?.objectFeatures.includes(EObjectFeature.dataSource)) { + await this.connectionsManagerService.refreshConnectionInfoAsync(id); + } return true; } catch (exception) { this.notificationService.logException(exception, `Can't load tree node: ${id}`); diff --git a/webapp/packages/core/src/app/TopNavBar/ConnectionSchemaManager/ConnectionSchemaManagerService.ts b/webapp/packages/core/src/app/TopNavBar/ConnectionSchemaManager/ConnectionSchemaManagerService.ts index 155d942532..a6effa56e5 100644 --- a/webapp/packages/core/src/app/TopNavBar/ConnectionSchemaManager/ConnectionSchemaManagerService.ts +++ b/webapp/packages/core/src/app/TopNavBar/ConnectionSchemaManager/ConnectionSchemaManagerService.ts @@ -177,6 +177,8 @@ export class ConnectionSchemaManagerService { return; } + await this.connectionsManagerService.loadConnectionInfoAsync(connectionId); + try { await this.connectionsManagerService.dbDrivers.load(); } catch (exception) { diff --git a/webapp/packages/core/src/app/index.ts b/webapp/packages/core/src/app/index.ts index a2ee8b941b..09b130ab77 100644 --- a/webapp/packages/core/src/app/index.ts +++ b/webapp/packages/core/src/app/index.ts @@ -37,9 +37,11 @@ export * from './shared/TabEntity/TabEntity'; // Enums export * from './shared/NodesManager/ENodeFeature'; export * from './shared/NodesManager/EObjectFeature'; +export * from './shared/ConnectionsManager/EConnectionFeature'; // hooks export * from './shared/useChildren'; +export * from './shared/ConnectionsManager/useConnectionInfo'; export * from './shared/NavigationTabs/NavigationTabsBar/Tabs/useTab'; export * from './shared/NodesManager/useDatabaseObjectInfo'; export * from './shared/NodesManager/useNode'; diff --git a/webapp/packages/core/src/app/shared/ConnectionsManager/ConnectionsManagerService.ts b/webapp/packages/core/src/app/shared/ConnectionsManager/ConnectionsManagerService.ts index 3a84a29198..c7655e4cc4 100644 --- a/webapp/packages/core/src/app/shared/ConnectionsManager/ConnectionsManagerService.ts +++ b/webapp/packages/core/src/app/shared/ConnectionsManager/ConnectionsManagerService.ts @@ -20,9 +20,11 @@ import { CachedResource, DatabaseObjectInfo, } from '@dbeaver/core/sdk'; +import { MetadataMap } from '@dbeaver/core/utils'; import { NavNodeManagerService } from '../NodesManager/NavNodeManagerService'; import { NodeManagerUtils } from '../NodesManager/NodeManagerUtils'; +import { EConnectionFeature } from './EConnectionFeature'; export type DBDriver = Pick< DriverInfo, @@ -37,23 +39,47 @@ export type DBDriver = Pick< | 'promotedScore' > export type DBSource = Pick -export type Connection = Pick +export type Connection = Pick export type ObjectContainer = Pick +type ConnectionLoadArgs = { + connectionId: string; + close?: boolean; + remove?: boolean; + connection?: never; +} + +type ConnectionSetArgs = { + connection: Connection; + connectionId?: never; + remove?: never; + close?: never; +} + type DBDriversMetadata = { loaded: boolean; } +type ConnectionInfoMetadata = { + loading: boolean; + loaded: boolean; +} + @injectable() export class ConnectionsManagerService { - - @observable private connectionsMap: Map = new Map(); readonly dbDrivers = new CachedResource( new Map(), this.refreshDriversAsync.bind(this), (_, { loaded }) => loaded, { loaded: false } ); + readonly connectionInfo = new CachedResource( + new Map(), + this.loadConnectionInfo.bind(this), + (_, metadata, args) => metadata.get(args.connectionId || args.connection!.id).loaded, + new MetadataMap(() => ({ loaded: false, loading: false })), + (_, metadata, args) => metadata.get(args.connectionId || args.connection!.id).loading + ); readonly connectionObjectContainers = new CachedResource( new Map(), this.refreshObjectContainersAsync.bind(this), @@ -61,7 +87,7 @@ export class ConnectionsManagerService { ); @computed get connections(): Connection[] { - return Array.from(this.connectionsMap.values()); + return Array.from(this.connectionInfo.data.values()); } onOpenConnection = new Subject(); @@ -80,18 +106,35 @@ export class ConnectionsManagerService { return this.dbDrivers.data; } + async loadConnectionInfoAsync(connectionId: string): Promise { + const connections = await this.connectionInfo.load({ connectionId }); + + return connections.get(connectionId)!; + } + + async refreshConnectionInfoAsync(connectionId: string): Promise { + const connections = await this.connectionInfo.refresh(true, { connectionId }); + + return connections.get(connectionId)!; + } + async loadDriversAsync(): Promise> { return this.dbDrivers.load(); } async addOpenedConnection(connection: Connection) { - this.connectionsMap.set(connection.id, connection); + await this.connectionInfo.refresh( + true, + { + connection, + } + ); this.onOpenConnection.next(connection); await this.navNodeManagerService.updateRootChildren(); // Update connections list, probably here we must also request node info and add it to nodes manager } getConnectionById(connectionId: string): Connection | undefined { - return this.connectionsMap.get(connectionId); + return this.connectionInfo.data.get(connectionId); } getObjectContainerById( @@ -122,7 +165,7 @@ export class ConnectionsManagerService { async closeConnectionAsync(id: string, skipNodesRefresh?: boolean): Promise { await this.graphQLService.gql.closeConnection({ id }); await this.afterConnectionClose(id); - this.connectionsMap.delete(id); + await this.connectionInfo.refresh(true, { connectionId: id, close: true }); if (!skipNodesRefresh) { await this.navNodeManagerService.updateRootChildren(); // Update connections list, probably here we must just remove nodes from nodes manager @@ -139,10 +182,9 @@ export class ConnectionsManagerService { const connectionId = NodeManagerUtils.connectionNodeIdToConnectionId(navNodeId); await this.graphQLService.gql.closeConnection({ id: connectionId }); await this.afterConnectionClose(connectionId); - this.connectionsMap.delete(connectionId); + await this.connectionInfo.refresh(true, { connectionId, close: true }); if (node.objectFeatures.includes('dataSourceTemporary')) { - await this.navNodeManagerService.removeNode(navNodeId); } else { await this.navNodeManagerService.refreshNode(navNodeId); } @@ -177,7 +219,10 @@ export class ConnectionsManagerService { for (const connection of connectionsToRemove) { await this.afterConnectionClose(connection.id); - this.connectionsMap.delete(connection.id); + await this.connectionInfo.refresh(true, { + connectionId: connection.id, + remove: true, + }); } await this.navNodeManagerService.updateRootChildren(); @@ -224,14 +269,57 @@ export class ConnectionsManagerService { return data; } - private async restoreConnection(connection: Connection) { - // TODO: Must be loaded based on connection id - // const { connection } = await this.graphQLService.gql.connectionState({ id }); - - if (this.connectionsMap.has(connection.id)) { - return; + private async loadConnectionInfo( + data: Map, + metadata: MetadataMap, + load: boolean, + args: ConnectionLoadArgs | ConnectionSetArgs, + ): Promise> { + let connectionId: string; + if (args.connection) { + connectionId = args.connection.id; + } else { + connectionId = args.connectionId; } - this.connectionsMap.set(connection.id, connection); + const connectionInfo = data.get(connectionId); + + const itemMetadata = metadata.get(connectionId); + + if (args.connection) { + data.set(connectionId, args.connection); + itemMetadata.loaded = true; + return data; + } + + if (args.remove || (args.close && connectionInfo?.features.includes(EConnectionFeature.temporary))) { + data.delete(connectionId); + metadata.delete(connectionId); + return data; + } + + + if (load) { + try { + itemMetadata.loading = true; + const { connection } = await this.graphQLService.gql.connectionState({ id: connectionId }); + + data.set(connectionId, connection); + itemMetadata.loaded = true; + } finally { + itemMetadata.loading = false; + } + } + + return data; + } + + private async restoreConnection(connection: Connection) { + await this.connectionInfo.refresh( + true, + { + connection, + } + ); this.onOpenConnection.next(connection); } } diff --git a/webapp/packages/core/src/app/shared/ConnectionsManager/EConnectionFeature.ts b/webapp/packages/core/src/app/shared/ConnectionsManager/EConnectionFeature.ts new file mode 100644 index 0000000000..0d30c55f25 --- /dev/null +++ b/webapp/packages/core/src/app/shared/ConnectionsManager/EConnectionFeature.ts @@ -0,0 +1,15 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +export enum EConnectionFeature { + connected = 'connected', + virtual = 'virtual', + temporary = 'temporary', + readOnly = 'readOnly', + provided = 'provided' +} diff --git a/webapp/packages/core/src/app/shared/ConnectionsManager/queries/connectionState.gql b/webapp/packages/core/src/app/shared/ConnectionsManager/queries/connectionState.gql index 6c9eb8d3a3..9a50809f1a 100644 --- a/webapp/packages/core/src/app/shared/ConnectionsManager/queries/connectionState.gql +++ b/webapp/packages/core/src/app/shared/ConnectionsManager/queries/connectionState.gql @@ -4,5 +4,6 @@ query connectionState($id: ID!) { name driverId connected + features } } diff --git a/webapp/packages/core/src/app/shared/ConnectionsManager/queries/createConnection.gql b/webapp/packages/core/src/app/shared/ConnectionsManager/queries/createConnection.gql index 56ff0a5bce..d6f4c1b171 100644 --- a/webapp/packages/core/src/app/shared/ConnectionsManager/queries/createConnection.gql +++ b/webapp/packages/core/src/app/shared/ConnectionsManager/queries/createConnection.gql @@ -4,5 +4,6 @@ mutation createConnection($config: ConnectionConfig!) { name driverId connected + features } } diff --git a/webapp/packages/core/src/app/shared/ConnectionsManager/queries/openConnection.gql b/webapp/packages/core/src/app/shared/ConnectionsManager/queries/openConnection.gql index 3e837f0fcf..7526a45ee4 100644 --- a/webapp/packages/core/src/app/shared/ConnectionsManager/queries/openConnection.gql +++ b/webapp/packages/core/src/app/shared/ConnectionsManager/queries/openConnection.gql @@ -4,5 +4,6 @@ mutation openConnection($config: ConnectionConfig!) { name driverId connected + features } } diff --git a/webapp/packages/core/src/app/shared/ConnectionsManager/useConnectionInfo.ts b/webapp/packages/core/src/app/shared/ConnectionsManager/useConnectionInfo.ts new file mode 100644 index 0000000000..b1621706a5 --- /dev/null +++ b/webapp/packages/core/src/app/shared/ConnectionsManager/useConnectionInfo.ts @@ -0,0 +1,31 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 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 { useCallback } from 'react'; + +import { useService } from '@dbeaver/core/di'; + +import { ConnectionsManagerService } from './ConnectionsManagerService'; + +export function useConnectionInfo(connectionId: string) { + const service = useService(ConnectionsManagerService); + + const connectionInfo = service.getConnectionById(connectionId); + const load = useCallback(() => service.loadConnectionInfoAsync(connectionId), [service, connectionId]); + const refresh = useCallback(() => service.refreshConnectionInfoAsync(connectionId), [service, connectionId]); + const isLoading = useCallback(() => service.connectionInfo.isDataLoading({ connectionId }), [service, connectionId]); + const isLoaded = useCallback(() => service.connectionInfo.isLoaded({ connectionId }), [service, connectionId]); + + return { + connectionInfo, + isLoading, + isLoaded, + load, + refresh, + }; +} diff --git a/webapp/packages/core/src/root/SessionService.ts b/webapp/packages/core/src/root/SessionService.ts index 37d23a0900..b52269a533 100644 --- a/webapp/packages/core/src/root/SessionService.ts +++ b/webapp/packages/core/src/root/SessionService.ts @@ -16,7 +16,7 @@ import { import { SessionSettingsService } from '../settings/SessionSettingsService'; export type SessionState = Pick & { - connections: Array>; + connections: Array>; }; @injectable() diff --git a/webapp/packages/core/src/root/queries/openSession.gql b/webapp/packages/core/src/root/queries/openSession.gql index 9beeda52e2..d8af77cada 100644 --- a/webapp/packages/core/src/root/queries/openSession.gql +++ b/webapp/packages/core/src/root/queries/openSession.gql @@ -9,6 +9,7 @@ mutation openSession { name driverId connected + features } } } diff --git a/webapp/packages/core/src/root/queries/sessionState.gql b/webapp/packages/core/src/root/queries/sessionState.gql index f654c04cf0..373500a2ed 100644 --- a/webapp/packages/core/src/root/queries/sessionState.gql +++ b/webapp/packages/core/src/root/queries/sessionState.gql @@ -9,6 +9,7 @@ query sessionState { name driverId connected + features } } } diff --git a/webapp/packages/core/src/sdk/sdk.ts b/webapp/packages/core/src/sdk/sdk.ts index 36bef9d927..733456078c 100644 --- a/webapp/packages/core/src/sdk/sdk.ts +++ b/webapp/packages/core/src/sdk/sdk.ts @@ -701,14 +701,14 @@ export type ConnectionStateQueryVariables = { }; -export type ConnectionStateQuery = { connection: Pick }; +export type ConnectionStateQuery = { connection: Pick }; export type CreateConnectionMutationVariables = { config: ConnectionConfig; }; -export type CreateConnectionMutation = { createConnection: Pick }; +export type CreateConnectionMutation = { createConnection: Pick }; export type DataSourceListQueryVariables = {}; @@ -742,7 +742,7 @@ export type OpenConnectionMutationVariables = { }; -export type OpenConnectionMutation = { openConnection: Pick }; +export type OpenConnectionMutation = { openConnection: Pick }; export type TestConnectionMutationVariables = { config: ConnectionConfig; @@ -1118,7 +1118,7 @@ export type OpenSessionMutationVariables = {}; export type OpenSessionMutation = { session: ( Pick - & { connections: Array> } + & { connections: Array> } ); }; export type ServerConfigQueryVariables = {}; @@ -1139,7 +1139,7 @@ export type SessionStateQueryVariables = {}; export type SessionStateQuery = { sessionState: ( Pick - & { connections: Array> } + & { connections: Array> } ); }; export type TouchSessionMutationVariables = {}; @@ -1178,6 +1178,7 @@ export const ConnectionStateDocument = ` name driverId connected + features } } `; @@ -1188,6 +1189,7 @@ export const CreateConnectionDocument = ` name driverId connected + features } } `; @@ -1248,6 +1250,7 @@ export const OpenConnectionDocument = ` name driverId connected + features } } `; @@ -1766,6 +1769,7 @@ export const OpenSessionDocument = ` name driverId connected + features } } } @@ -1809,6 +1813,7 @@ export const SessionStateDocument = ` name driverId connected + features } } } From 00079bb6a177e2a892c16acb8718222433527a8e Mon Sep 17 00:00:00 2001 From: Wroud Date: Fri, 12 Jun 2020 20:11:04 +0300 Subject: [PATCH 2/4] chore(core): add exception message for connection info loading --- .../ConnectionSchemaManagerService.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/webapp/packages/core/src/app/TopNavBar/ConnectionSchemaManager/ConnectionSchemaManagerService.ts b/webapp/packages/core/src/app/TopNavBar/ConnectionSchemaManager/ConnectionSchemaManagerService.ts index a6effa56e5..4053d4fc02 100644 --- a/webapp/packages/core/src/app/TopNavBar/ConnectionSchemaManager/ConnectionSchemaManagerService.ts +++ b/webapp/packages/core/src/app/TopNavBar/ConnectionSchemaManager/ConnectionSchemaManagerService.ts @@ -177,7 +177,11 @@ export class ConnectionSchemaManagerService { return; } - await this.connectionsManagerService.loadConnectionInfoAsync(connectionId); + try { + await this.connectionsManagerService.loadConnectionInfoAsync(connectionId); + } catch (exception) { + this.notificationService.logException(exception, 'Can\'t load connection info'); + } try { await this.connectionsManagerService.dbDrivers.load(); From 184ee5fce6130d893034ec776ce2551c1dc7c49b Mon Sep 17 00:00:00 2001 From: Wroud Date: Sat, 13 Jun 2020 19:29:00 +0300 Subject: [PATCH 3/4] fix(core): cleanup nav tree if has no rights for show CB-130 --- .../core/src/app/shared/NodesManager/NavNodeManagerService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp/packages/core/src/app/shared/NodesManager/NavNodeManagerService.ts b/webapp/packages/core/src/app/shared/NodesManager/NavNodeManagerService.ts index fffaf9bfd9..a6af8cb0ee 100644 --- a/webapp/packages/core/src/app/shared/NodesManager/NavNodeManagerService.ts +++ b/webapp/packages/core/src/app/shared/NodesManager/NavNodeManagerService.ts @@ -166,6 +166,7 @@ export class NavNodeManagerService { async updateRootChildren() { if (!await this.permissionsService.hasAsync(EPermission.public)) { + await this.navTree.refresh(true, ROOT_NODE_PATH, true); return; } await this.navTree.refresh(true, ROOT_NODE_PATH, false); From a699d7f875189aa6dc81fc01d3ada5a0fc35c1be Mon Sep 17 00:00:00 2001 From: Wroud Date: Sun, 14 Jun 2020 13:57:43 +0300 Subject: [PATCH 4/4] fix(core): connection info access --- .../NavigationTree/NavigationTreeNode/useNavigationTree.ts | 4 +++- .../core/src/app/NavigationTree/NavigationTreeService.ts | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/useNavigationTree.ts b/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/useNavigationTree.ts index 1985355b02..90df0fe399 100644 --- a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/useNavigationTree.ts +++ b/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/useNavigationTree.ts @@ -15,6 +15,7 @@ import { useConnectionInfo } from '../../shared/ConnectionsManager/useConnection import { NavNode } from '../../shared/NodesManager/EntityTypes'; import { EObjectFeature } from '../../shared/NodesManager/EObjectFeature'; import { NavNodeManagerService } from '../../shared/NodesManager/NavNodeManagerService'; +import { NodeManagerUtils } from '../../shared/NodesManager/NodeManagerUtils'; import { useNode } from '../../shared/NodesManager/useNode'; import { useChildren } from '../../shared/useChildren'; import { NavigationTreeService } from '../NavigationTreeService'; @@ -37,7 +38,8 @@ export function useNavigationTree(nodeId: string, parentId: string) { let isExpandedFiltered = isExpanded; if (node.objectFeatures.includes(EObjectFeature.dataSource)) { - const { connectionInfo } = useConnectionInfo(nodeId); + const connectionId = NodeManagerUtils.connectionNodeIdToConnectionId(nodeId); + const { connectionInfo } = useConnectionInfo(connectionId); if (!connectionInfo?.features.includes(EConnectionFeature.connected)) { isExpandedFiltered = false; } diff --git a/webapp/packages/core/src/app/NavigationTree/NavigationTreeService.ts b/webapp/packages/core/src/app/NavigationTree/NavigationTreeService.ts index d8a5bb83d3..a065295886 100644 --- a/webapp/packages/core/src/app/NavigationTree/NavigationTreeService.ts +++ b/webapp/packages/core/src/app/NavigationTree/NavigationTreeService.ts @@ -15,6 +15,7 @@ import { NotificationService } from '@dbeaver/core/eventsLog'; import { ConnectionsManagerService } from '../shared/ConnectionsManager/ConnectionsManagerService'; import { EObjectFeature } from '../shared/NodesManager/EObjectFeature'; import { NavNodeManagerService, ROOT_NODE_PATH } from '../shared/NodesManager/NavNodeManagerService'; +import { NodeManagerUtils } from '../shared/NodesManager/NodeManagerUtils'; @injectable() export class NavigationTreeService { @@ -38,7 +39,9 @@ export class NavigationTreeService { const node = this.navNodeManagerService.getNode(id); if (node?.objectFeatures.includes(EObjectFeature.dataSource)) { - await this.connectionsManagerService.refreshConnectionInfoAsync(id); + await this.connectionsManagerService.refreshConnectionInfoAsync( + NodeManagerUtils.connectionNodeIdToConnectionId(id) + ); } return true; } catch (exception) {