diff --git a/webapp/packages/core-app/src/NavigationTree/ElementsTree.tsx b/webapp/packages/core-app/src/NavigationTree/ElementsTree.tsx index 1a7d091e54..72c9a6a056 100644 --- a/webapp/packages/core-app/src/NavigationTree/ElementsTree.tsx +++ b/webapp/packages/core-app/src/NavigationTree/ElementsTree.tsx @@ -73,6 +73,7 @@ export const ElementsTree: React.FC = observer(function ElementsTree({ {nodeChildren.children.map(id => ( ))} + ); diff --git a/webapp/packages/core-app/src/NavigationTree/NavigationTree.tsx b/webapp/packages/core-app/src/NavigationTree/NavigationTree.tsx index 14cde3f0bb..b426b721f2 100644 --- a/webapp/packages/core-app/src/NavigationTree/NavigationTree.tsx +++ b/webapp/packages/core-app/src/NavigationTree/NavigationTree.tsx @@ -31,6 +31,7 @@ const navigationTreeStyles = css` ElementsTree { padding-top: 16px; min-width: 100%; + min-height: 100%; width: max-content; } diff --git a/webapp/packages/core-app/src/NavigationTree/NavigationTreeNode/useNavigationNode.ts b/webapp/packages/core-app/src/NavigationTree/NavigationTreeNode/useNavigationNode.ts index 75d0c86e77..c872ced66b 100644 --- a/webapp/packages/core-app/src/NavigationTree/NavigationTreeNode/useNavigationNode.ts +++ b/webapp/packages/core-app/src/NavigationTree/NavigationTreeNode/useNavigationNode.ts @@ -8,12 +8,10 @@ import { useContext, useEffect, useState } from 'react'; -import { useConnectionInfo } from '@cloudbeaver/core-connections'; import { useService } from '@cloudbeaver/core-di'; import { NavNode } from '../../shared/NodesManager/EntityTypes'; import { EObjectFeature } from '../../shared/NodesManager/EObjectFeature'; -import { NodeManagerUtils } from '../../shared/NodesManager/NodeManagerUtils'; import { useNode } from '../../shared/NodesManager/useNode'; import { useChildren } from '../../shared/useChildren'; import { NavigationTreeService } from '../NavigationTreeService'; @@ -38,15 +36,19 @@ export function useNavigationNode(node: NavNode): INavigationNode { const [processing, setProcessing] = useState(false); const [isExpanded, switchExpand] = useState(false); const { isLoading, isOutdated } = useNode(node.id); - const connectionId = NodeManagerUtils.connectionNodeIdToConnectionId(node.id); - const { connectionInfo } = useConnectionInfo(connectionId); const children = useChildren(node.id); const loading = isLoading() || children.isLoading() || processing; let leaf = isLeaf(node) || (children.children?.length === 0 && !children.isOutdated()); let expanded = isExpanded && !leaf; - if (node.objectFeatures.includes(EObjectFeature.dataSource) && !connectionInfo?.connected) { + if ( + node.objectFeatures.includes(EObjectFeature.dataSource) + && ( + !node.objectFeatures.includes(EObjectFeature.dataSourceConnected) + || (!children.children && isOutdated()) + ) + ) { leaf = false; expanded = false; } diff --git a/webapp/packages/core-app/src/shared/NodesManager/NavNodeInfoResource.ts b/webapp/packages/core-app/src/shared/NodesManager/NavNodeInfoResource.ts index 62977bf0f2..acbee07541 100644 --- a/webapp/packages/core-app/src/shared/NodesManager/NavNodeInfoResource.ts +++ b/webapp/packages/core-app/src/shared/NodesManager/NavNodeInfoResource.ts @@ -8,13 +8,12 @@ import { injectable } from '@cloudbeaver/core-di'; import { - GraphQLService, CachedMapResource, ResourceKey, isResourceKeyList, NavigatorNodeInfo, DatabaseObjectInfo + GraphQLService, CachedMapResource, ResourceKey, isResourceKeyList, NavNodeInfoFragment } from '@cloudbeaver/core-sdk'; import { NavNode } from './EntityTypes'; -type NavNodeInfo = Pick -& { object?: Pick }; +type NavNodeInfo = NavNodeInfoFragment; export const ROOT_NODE_PATH = ''; diff --git a/webapp/packages/core-app/src/shared/NodesManager/NavNodeManagerService.ts b/webapp/packages/core-app/src/shared/NodesManager/NavNodeManagerService.ts index f47e7e94b7..50b8b4b832 100644 --- a/webapp/packages/core-app/src/shared/NodesManager/NavNodeManagerService.ts +++ b/webapp/packages/core-app/src/shared/NodesManager/NavNodeManagerService.ts @@ -11,7 +11,7 @@ import { } from '@cloudbeaver/core-connections'; import { injectable, Bootstrap } from '@cloudbeaver/core-di'; import { NotificationService } from '@cloudbeaver/core-events'; -import { IExecutor, Executor, IContextProvider } from '@cloudbeaver/core-executor'; +import { IExecutor, Executor, IExecutionContextProvider } from '@cloudbeaver/core-executor'; import { PermissionsService, EPermission, SessionResource, ServerService } from '@cloudbeaver/core-root'; @@ -119,7 +119,7 @@ export class NavNodeManagerService extends Bootstrap { register(): void { this.connectionInfo.onItemAdd.subscribe(this.connectionUpdateHandler.bind(this)); this.connectionInfo.onItemDelete.subscribe(this.connectionRemoveHandler.bind(this)); - this.connectionInfo.onConnectionCreate.subscribe(this.connectionCreateHandler.bind(this)); + this.connectionInfo.onConnectionCreate.addHandler(this.connectionCreateHandler.bind(this)); this.sessionResource.onDataUpdate.subscribe(this.refreshRoot.bind(this)); } @@ -253,7 +253,7 @@ export class NavNodeManagerService extends Bootstrap { } navigationNavNodeContext = async ( - contexts: IContextProvider, + contexts: IExecutionContextProvider, data: INodeNavigationData ): Promise => { let nodeId = data.nodeId; @@ -332,7 +332,7 @@ export class NavNodeManagerService extends Bootstrap { } } - private async connectionCreateHandler(connection: Connection) { + private async connectionCreateHandler(context: IExecutionContextProvider, connection: Connection) { if (!await this.isNavTreeEnabled()) { return; } @@ -340,7 +340,11 @@ export class NavNodeManagerService extends Bootstrap { const nodeId = NodeManagerUtils.connectionIdToConnectionNodeId(connection.id); this.markTreeOutdated(nodeId); - await this.navTree.refresh(ROOT_NODE_PATH); + const tree = await this.navTree.load(ROOT_NODE_PATH); + + if (!tree.includes(nodeId)) { + await this.navTree.refresh(ROOT_NODE_PATH); + } } private async connectionUpdateHandler(key: ResourceKey) { @@ -382,7 +386,7 @@ export class NavNodeManagerService extends Bootstrap { } private async navigateHandler( - contexts: IContextProvider, + contexts: IExecutionContextProvider, data: INodeNavigationData // eslint-disable-next-line @typescript-eslint/no-invalid-void-type ): Promise { diff --git a/webapp/packages/core-app/src/shared/NodesManager/useNode.ts b/webapp/packages/core-app/src/shared/NodesManager/useNode.ts index 3409d2db13..d238cb1523 100644 --- a/webapp/packages/core-app/src/shared/NodesManager/useNode.ts +++ b/webapp/packages/core-app/src/shared/NodesManager/useNode.ts @@ -6,6 +6,8 @@ * you may not use this file except in compliance with the License. */ +import { useCallback } from 'react'; + import { useService } from '@cloudbeaver/core-di'; import { NavNodeInfoResource } from './NavNodeInfoResource'; @@ -13,9 +15,12 @@ import { NavNodeInfoResource } from './NavNodeInfoResource'; export function useNode(navNodeId: string) { const navNodeInfoResource = useService(NavNodeInfoResource); const node = navNodeInfoResource.get(navNodeId); - const isLoading = () => navNodeInfoResource.isDataLoading(navNodeId); - const isLoaded = () => navNodeInfoResource.isLoaded(navNodeId); - const isOutdated = () => navNodeInfoResource.isOutdated(navNodeId); + + const deps = [navNodeId]; + + const isLoading = useCallback(() => navNodeInfoResource.isDataLoading(navNodeId), deps); + const isLoaded = useCallback(() => navNodeInfoResource.isLoaded(navNodeId), deps); + const isOutdated = useCallback(() => navNodeInfoResource.isOutdated(navNodeId), deps); return { node, isLoading, isLoaded, isOutdated, diff --git a/webapp/packages/core-app/src/shared/useChildren.ts b/webapp/packages/core-app/src/shared/useChildren.ts index 56084b6980..4c01981a2e 100644 --- a/webapp/packages/core-app/src/shared/useChildren.ts +++ b/webapp/packages/core-app/src/shared/useChildren.ts @@ -6,6 +6,8 @@ * you may not use this file except in compliance with the License. */ +import { useCallback } from 'react'; + import { useService } from '@cloudbeaver/core-di'; import { ROOT_NODE_PATH } from './NodesManager/NavNodeInfoResource'; @@ -21,9 +23,12 @@ interface Hook { export function useChildren(navNodeId = ROOT_NODE_PATH): Hook { const navTreeResource = useService(NavTreeResource); const children = navTreeResource.get(navNodeId); - const isLoading = () => navTreeResource.isDataLoading(navNodeId); - const isLoaded = () => navTreeResource.isLoaded(navNodeId); - const isOutdated = () => navTreeResource.isOutdated(navNodeId); + + const deps = [navNodeId]; + + const isLoading = useCallback(() => navTreeResource.isDataLoading(navNodeId), deps); + const isLoaded = useCallback(() => navTreeResource.isLoaded(navNodeId), deps); + const isOutdated = useCallback(() => navTreeResource.isOutdated(navNodeId), deps); return { children, diff --git a/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNode.tsx b/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNode.tsx index 08c90dc268..dd6ced0aa8 100644 --- a/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNode.tsx +++ b/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNode.tsx @@ -6,8 +6,7 @@ * you may not use this file except in compliance with the License. */ -import { observer } from 'mobx-react'; -import { useMemo, useRef } from 'react'; +import { useCallback, useMemo, useRef, memo } from 'react'; import styled, { use } from 'reshadow'; import { useStyles } from '@cloudbeaver/core-theming'; @@ -26,7 +25,7 @@ interface Props { onOpen?: () => void; } -export const TreeNode: React.FC = observer(function TreeNode({ +export const TreeNode: React.FC = memo(function TreeNode({ loading = false, selected = false, expanded = false, @@ -38,15 +37,18 @@ export const TreeNode: React.FC = observer(function TreeNode({ const handlersRef = useRef(handlers); handlersRef.current = handlers; - const handleExpand = () => { + const handleExpand = useCallback(() => { handlersRef.current.onExpand?.(); - }; + }, []); - const handleSelect = (multiple?: boolean): boolean => handlersRef.current.onSelect?.(multiple) || false; + const handleSelect = useCallback( + (multiple?: boolean): boolean => handlersRef.current.onSelect?.(multiple) || false, + [] + ); - const handleOpen = () => { + const handleOpen = useCallback(() => { handlersRef.current.onOpen?.(); - }; + }, []); const nodeContext = useMemo(() => ({ loading, diff --git a/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeControl.tsx b/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeControl.tsx index a66c33df62..f0e7c2aaa5 100644 --- a/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeControl.tsx +++ b/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeControl.tsx @@ -6,7 +6,6 @@ * you may not use this file except in compliance with the License. */ -import { observer } from 'mobx-react'; import { useContext } from 'react'; import { TreeNodeContext } from './TreeNodeContext'; @@ -20,7 +19,7 @@ interface Props { big?: boolean; } -export const TreeNodeControl: React.FC = observer(function TreeNodeControl({ +export const TreeNodeControl: React.FC = function TreeNodeControl({ className, children, }) { @@ -57,4 +56,4 @@ export const TreeNodeControl: React.FC = observer(function TreeNodeContro {children} ); -}); +}; diff --git a/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeExpand.tsx b/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeExpand.tsx index 97cf0b2cd3..07a3fd2f05 100644 --- a/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeExpand.tsx +++ b/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeExpand.tsx @@ -6,7 +6,6 @@ * you may not use this file except in compliance with the License. */ -import { observer } from 'mobx-react'; import { useContext } from 'react'; import styled from 'reshadow'; import { css } from 'reshadow'; @@ -33,7 +32,7 @@ interface Props { className?: string; } -export const TreeNodeExpand: React.FC = observer(function TreeNodeExpand({ +export const TreeNodeExpand: React.FC = function TreeNodeExpand({ leaf, big, className, @@ -62,4 +61,4 @@ export const TreeNodeExpand: React.FC = observer(function TreeNodeExpand( {!context.loading && !context.leaf && !leaf && !big && } ); -}); +}; diff --git a/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeSelect.tsx b/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeSelect.tsx index e99489fd81..4a8f5ea520 100644 --- a/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeSelect.tsx +++ b/webapp/packages/core-blocks/src/Tree/TreeNode/TreeNodeSelect.tsx @@ -6,7 +6,6 @@ * you may not use this file except in compliance with the License. */ -import { observer } from 'mobx-react'; import { useContext } from 'react'; import styled from 'reshadow'; import { css } from 'reshadow'; @@ -26,7 +25,7 @@ interface Props { className?: string; } -export const TreeNodeSelect: React.FC = observer(function TreeNodeSelect({ +export const TreeNodeSelect: React.FC = function TreeNodeSelect({ className, }) { const context = useContext(TreeNodeContext); @@ -49,4 +48,4 @@ export const TreeNodeSelect: React.FC = observer(function TreeNodeSelect( context.select(true)} /> ); -}); +}; diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionForm/IConnectionFormModel.ts b/webapp/packages/core-connections/src/Administration/Connections/ConnectionForm/IConnectionFormModel.ts index 765871d6b9..074c813f6d 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionForm/IConnectionFormModel.ts +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionForm/IConnectionFormModel.ts @@ -6,10 +6,12 @@ * you may not use this file except in compliance with the License. */ -import { ConnectionInfo, AdminConnectionGrantInfo } from '@cloudbeaver/core-sdk'; +import { AdminConnectionGrantInfo } from '@cloudbeaver/core-sdk'; + +import { AdminConnection } from '../../ConnectionsResource'; export interface IConnectionFormModel { - connection: ConnectionInfo; + connection: AdminConnection; credentials: Record; grantedSubjects: AdminConnectionGrantInfo[] | null; availableDrivers: string[]; diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionForm/Options/ParametersForm.tsx b/webapp/packages/core-connections/src/Administration/Connections/ConnectionForm/Options/ParametersForm.tsx index 3df89c540e..d91c4031d0 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionForm/Options/ParametersForm.tsx +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionForm/Options/ParametersForm.tsx @@ -11,11 +11,12 @@ import styled, { css, use } from 'reshadow'; import { FormGroup, InputField } from '@cloudbeaver/core-blocks'; import { useTranslate } from '@cloudbeaver/core-localization'; -import { ConnectionInfo } from '@cloudbeaver/core-sdk'; import { useStyles } from '@cloudbeaver/core-theming'; +import { AdminConnection } from '../../../ConnectionsResource'; + interface ParametersFormProps { - connection: ConnectionInfo; + connection: AdminConnection; disabled?: boolean; embedded?: boolean; } diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministrationController.ts b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministrationController.ts index 27c9c0388e..f2839dabd8 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministrationController.ts +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministrationController.ts @@ -11,9 +11,9 @@ import { observable, computed } from 'mobx'; import { injectable } from '@cloudbeaver/core-di'; import { CommonDialogService, ConfirmationDialog, DialogueStateResult } from '@cloudbeaver/core-dialogs'; import { NotificationService } from '@cloudbeaver/core-events'; -import { ConnectionInfo, resourceKeyList } from '@cloudbeaver/core-sdk'; +import { resourceKeyList } from '@cloudbeaver/core-sdk'; -import { ConnectionsResource } from '../ConnectionsResource'; +import { AdminConnection, ConnectionsResource } from '../ConnectionsResource'; import { ConnectionsAdministrationNavService } from './ConnectionsAdministrationNavService'; @injectable() @@ -22,7 +22,7 @@ export class ConnectionsAdministrationController { readonly selectedItems = observable(new Map()); readonly expandedItems = observable(new Map()); @computed - get connections(): ConnectionInfo[] { + get connections(): AdminConnection[] { return Array.from(this.connectionsResource.data.values()) .sort((a, b) => { const isANew = this.connectionsResource.isNew(a.id); diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsDrawerItem.tsx b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsDrawerItem.tsx index 2185218194..200955807b 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsDrawerItem.tsx +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsDrawerItem.tsx @@ -13,13 +13,13 @@ import { Tab, TabTitle, TabIcon } from '@cloudbeaver/core-blocks'; import { Translate } from '@cloudbeaver/core-localization'; import { useStyles } from '@cloudbeaver/core-theming'; -export function ConnectionsDrawerItem({ +export const ConnectionsDrawerItem: React.FC = function ConnectionsDrawerItem({ item, onSelect, style, disabled, configurationWizard, -}: AdministrationItemDrawerProps) { +}) { return styled(useStyles(...style))( onSelect(item.name)}> ); -} +}; diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/Connection.tsx b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/Connection.tsx index 034eb0dd81..ffd7146a93 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/Connection.tsx +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/Connection.tsx @@ -14,13 +14,13 @@ import { } from '@cloudbeaver/core-blocks'; import { DBDriverResource } from '@cloudbeaver/core-connections'; import { useService } from '@cloudbeaver/core-di'; -import { ConnectionInfo } from '@cloudbeaver/core-sdk'; import { useStyles } from '@cloudbeaver/core-theming'; +import { AdminConnection } from '../../ConnectionsResource'; import { ConnectionEdit } from './ConnectionEdit'; interface Props { - connection: ConnectionInfo; + connection: AdminConnection; } const styles = css` diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionEditController.ts b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionEditController.ts index e23a0c72a0..1a953943b0 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionEditController.ts +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionEditController.ts @@ -12,10 +12,10 @@ import { injectable, IInitializableController, IDestructibleController } from '@cloudbeaver/core-di'; import { NotificationService } from '@cloudbeaver/core-events'; -import { GQLErrorCatcher, AdminConnectionGrantInfo, ConnectionInfo } from '@cloudbeaver/core-sdk'; +import { GQLErrorCatcher, AdminConnectionGrantInfo } from '@cloudbeaver/core-sdk'; import { DBDriverResource } from '../../../DBDriverResource'; -import { ConnectionsResource } from '../../ConnectionsResource'; +import { AdminConnection, ConnectionsResource } from '../../ConnectionsResource'; @injectable() export class ConnectionEditController @@ -23,7 +23,7 @@ implements IInitializableController, IDestructibleController { @observable grantedSubjects: AdminConnectionGrantInfo[] | null = null; @observable isLoading = true; @observable credentials: Record = {}; - @observable connection: ConnectionInfo | null = null; + @observable connection: AdminConnection | null = null; @computed get isDisabled() { return this.isLoading; diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionsTable.tsx b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionsTable.tsx index 99a741aca5..fc1199a361 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionsTable.tsx +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionsTable.tsx @@ -13,9 +13,9 @@ import { Table, TableHeader, TableColumnHeader, TableBody } from '@cloudbeaver/core-blocks'; import { useTranslate } from '@cloudbeaver/core-localization'; -import { ConnectionInfo } from '@cloudbeaver/core-sdk'; import { useStyles, composes } from '@cloudbeaver/core-theming'; +import { AdminConnection } from '../../ConnectionsResource'; import { Connection } from './Connection'; const styles = composes( @@ -38,7 +38,7 @@ const styles = composes( ); interface Props { - connections: ConnectionInfo[]; + connections: AdminConnection[]; selectedItems: Map; expandedItems: Map; } diff --git a/webapp/packages/core-connections/src/Administration/Connections/CreateConnection/CreateConnectionController.tsx b/webapp/packages/core-connections/src/Administration/Connections/CreateConnection/CreateConnectionController.tsx index e860a129e5..e4e454dafa 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/CreateConnection/CreateConnectionController.tsx +++ b/webapp/packages/core-connections/src/Administration/Connections/CreateConnection/CreateConnectionController.tsx @@ -10,18 +10,18 @@ import { observable, computed } from 'mobx'; import { injectable } from '@cloudbeaver/core-di'; import { NotificationService } from '@cloudbeaver/core-events'; -import { AdminConnectionSearchInfo, ConnectionInfo } from '@cloudbeaver/core-sdk'; +import { AdminConnectionSearchInfo } from '@cloudbeaver/core-sdk'; import { uuid } from '@cloudbeaver/core-utils'; import { DBDriverResource } from '../../../DBDriverResource'; -import { ConnectionsResource } from '../../ConnectionsResource'; +import { AdminConnection, ConnectionsResource } from '../../ConnectionsResource'; @injectable() export class CreateConnectionController { @observable hosts = 'localhost'; @observable isProcessing = false; @observable databases: AdminConnectionSearchInfo[]; - @observable connection: ConnectionInfo | null; + @observable connection: AdminConnection | null; @observable availableDrivers: string[]; @observable credentials: Record; @observable grantedSubjects = []; @@ -77,7 +77,7 @@ export class CreateConnectionController { template: false, authProperties: [], properties: {}, - } as Partial as any; + } as Partial as any; this.availableDrivers = [driverId]; }; @@ -90,7 +90,7 @@ export class CreateConnectionController { port: `${database.port}`, authProperties: [], properties: {}, - } as Partial as any; + } as Partial as any; this.availableDrivers = database.possibleDrivers; }; diff --git a/webapp/packages/core-connections/src/Administration/ConnectionsResource.ts b/webapp/packages/core-connections/src/Administration/ConnectionsResource.ts index 1555b8b76e..92f5fee9a6 100644 --- a/webapp/packages/core-connections/src/Administration/ConnectionsResource.ts +++ b/webapp/packages/core-connections/src/Administration/ConnectionsResource.ts @@ -11,7 +11,7 @@ import { Observable, Subject } from 'rxjs'; import { injectable } from '@cloudbeaver/core-di'; import { GraphQLService, - ConnectionInfo, + AdminConnectionFragment, ConnectionConfig, CachedMapResource, ResourceKey, @@ -23,22 +23,23 @@ import { MetadataMap } from '@cloudbeaver/core-utils'; export const NEW_CONNECTION_SYMBOL = Symbol('new-connection'); -export type ConnectionNew = ConnectionInfo & { [NEW_CONNECTION_SYMBOL]: boolean }; +export type AdminConnection = AdminConnectionFragment; +export type ConnectionNew = AdminConnectionFragment & { [NEW_CONNECTION_SYMBOL]: boolean }; @injectable() -export class ConnectionsResource extends CachedMapResource { - readonly onConnectionCreate: Observable; +export class ConnectionsResource extends CachedMapResource { + readonly onConnectionCreate: Observable; private changed: boolean; private metadata: MetadataMap; - private connectionCreateSubject: Subject; + private connectionCreateSubject: Subject; constructor( private graphQLService: GraphQLService ) { super(new Map()); this.changed = false; - this.connectionCreateSubject = new Subject(); + this.connectionCreateSubject = new Subject(); this.onConnectionCreate = this.connectionCreateSubject.asObservable(); this.metadata = new MetadataMap(() => false); } @@ -59,7 +60,7 @@ export class ConnectionsResource extends CachedMapResource> { + async loadAll(): Promise> { await this.load('all'); return this.data; } @@ -70,16 +71,16 @@ export class ConnectionsResource extends CachedMapResource { + async create(config: ConnectionConfig): Promise { const { connection } = await this.graphQLService.sdk.createConnectionConfiguration({ config }); - return this.add(connection as ConnectionInfo, true); + return this.add(connection, true); } - async add(connection: ConnectionInfo, isNew = false): Promise { + async add(connection: AdminConnection, isNew = false): Promise { this.changed = true; const newConnection: ConnectionNew = { - ...connection as ConnectionInfo, + ...connection, [NEW_CONNECTION_SYMBOL]: isNew, }; this.set(newConnection.id, newConnection); @@ -95,7 +96,7 @@ export class ConnectionsResource extends CachedMapResource { + async update(id: string, config: ConnectionConfig): Promise { await this.performUpdate(id, () => this.updateConnection(id, config)); this.changed = true; return this.get(id)!; @@ -126,12 +127,12 @@ export class ConnectionsResource extends CachedMapResource): Promise> { + protected async loader(key: ResourceKey): Promise> { const { connections } = await this.graphQLService.sdk.getConnections(); this.data.clear(); for (const connection of connections) { - this.set(connection.id, connection as ConnectionInfo); + this.set(connection.id, connection); } this.markUpdated(key); @@ -165,6 +166,6 @@ export class ConnectionsResource extends CachedMapResource & { authProperties?: ObjectPropertyInfo[] }; +export type Connection = UserConnectionFragment & { authProperties?: UserConnectionAuthPropertiesFragment[] }; @injectable() export class ConnectionInfoResource extends CachedMapResource { - readonly onConnectionCreate: Observable; - private connectionCreateSubject: Subject; + readonly onConnectionCreate: IExecutor; constructor( private graphQLService: GraphQLService, sessionResource: SessionResource ) { super(new Map()); - this.connectionCreateSubject = new Subject(); - this.onConnectionCreate = this.connectionCreateSubject.asObservable(); + this.onConnectionCreate = new Executor(); sessionResource.onDataUpdate.subscribe(() => this.refreshSession(true)); } - async refreshSession(sessionUpdate?: boolean): Promise { + @action async refreshSession(sessionUpdate?: boolean): Promise { const { state: { connections } } = await this.graphQLService.sdk.getSessionConnections(); const restoredConnections = new Set(); for (const connection of connections) { - this.add(connection, sessionUpdate); + await this.add(connection, sessionUpdate); restoredConnections.add(connection.id); } @@ -64,32 +51,32 @@ export class ConnectionInfoResource extends CachedMapResource { + @action async createFromTemplate(templateId: string): Promise { const { connection } = await this.graphQLService.sdk.createConnectionFromTemplate({ templateId }); return this.add(connection); } - async createConnection(config: ConnectionConfig): Promise { + @action async createConnection(config: ConnectionConfig): Promise { const { connection } = await this.graphQLService.sdk.createConnection({ config, }); return this.add(connection); } - async createFromNode(nodeId: string): Promise { + @action async createFromNode(nodeId: string): Promise { const { connection } = await this.graphQLService.sdk.createConnectionFromNode({ nodePath: nodeId }); return this.add(connection); } - add(connection: Connection, update?: boolean): Connection { + @action async add(connection: Connection, update?: boolean): Promise { const exists = this.data.has(connection.id); this.set(connection.id, connection); const observedConnection = this.get(connection.id)!; if (!update && !exists) { - this.connectionCreateSubject.next(observedConnection); + await this.onConnectionCreate.execute(observedConnection); } return observedConnection; @@ -121,7 +108,7 @@ export class ConnectionInfoResource extends CachedMapResource { + async loadAuthModel(connectionId: string): Promise { const connection = await this.load(connectionId); if (connection?.authProperties) { @@ -145,7 +132,7 @@ export class ConnectionInfoResource extends CachedMapResource { + private async getAuthProperties(id: string): Promise { const { connection: { authProperties } } = await this.graphQLService.sdk.connectionAuthProperties({ id }); return authProperties; diff --git a/webapp/packages/core-connections/src/ConnectionsManagerService.ts b/webapp/packages/core-connections/src/ConnectionsManagerService.ts index 171f1fb6cc..920c8047f5 100644 --- a/webapp/packages/core-connections/src/ConnectionsManagerService.ts +++ b/webapp/packages/core-connections/src/ConnectionsManagerService.ts @@ -106,7 +106,7 @@ export class ConnectionsManagerService { async closeConnectionAsync(id: string): Promise { const connection = this.connectionInfo.get(id); - if (!connection) { + if (!connection || !connection.connected) { return; } diff --git a/webapp/packages/core-di/src/useService.ts b/webapp/packages/core-di/src/useService.ts index 527819c212..2265267ba1 100644 --- a/webapp/packages/core-di/src/useService.ts +++ b/webapp/packages/core-di/src/useService.ts @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. */ -import { useContext, useMemo } from 'react'; +import { useContext } from 'react'; import { appContext } from './AppContext'; import { IServiceConstructor } from './IApp'; @@ -14,10 +14,10 @@ import { ValueToken } from './InjectionToken'; export function useService(ctor: IServiceConstructor): T { const app = useContext(appContext); - return useMemo(() => app.getServiceByClass(ctor), [app, ctor]); + return app.getServiceByClass(ctor); } export function useServiceByToken(token: ValueToken): T { const app = useContext(appContext); - return useMemo(() => app.getServiceByToken(token), [app, token]); + return app.getServiceByToken(token); } diff --git a/webapp/packages/core-executor/src/ExecutionContext.ts b/webapp/packages/core-executor/src/ExecutionContext.ts index fa11879a39..fbd24048e7 100644 --- a/webapp/packages/core-executor/src/ExecutionContext.ts +++ b/webapp/packages/core-executor/src/ExecutionContext.ts @@ -6,14 +6,17 @@ * you may not use this file except in compliance with the License. */ -export interface IContextProvider { +export interface IExecutionContextProvider { hasContext: (token: IContextLoader) => boolean; getContext: (token: IContextLoader) => Promise; } -export type IContextLoader = (contexts: IContextProvider, data: TData) => Promise | T; +export type IContextLoader = ( + contexts: IExecutionContextProvider, + data: TData +) => Promise | T; -export class ExecutionContext implements IContextProvider { +export class ExecutionContext implements IExecutionContextProvider { private contexts = new Map, any>(); constructor(private data: TData) { } diff --git a/webapp/packages/core-executor/src/Executor.ts b/webapp/packages/core-executor/src/Executor.ts index b3c797dac2..3e37bea55c 100644 --- a/webapp/packages/core-executor/src/Executor.ts +++ b/webapp/packages/core-executor/src/Executor.ts @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. */ -import { ExecutionContext, IContextProvider } from './ExecutionContext'; +import { ExecutionContext, IExecutionContextProvider } from './ExecutionContext'; import { IExecutor } from './IExecutor'; import { IExecutorHandler } from './IExecutorHandler'; @@ -18,7 +18,7 @@ export class Executor implements IExecutor { private defaultData?: T | null ) { } - async execute(data: T): Promise> { + async execute(data: T): Promise> { if ((data === undefined || data === null) && this.defaultData !== undefined && this.defaultData !== null) { data = this.defaultData; } diff --git a/webapp/packages/core-executor/src/IExecutor.ts b/webapp/packages/core-executor/src/IExecutor.ts index 837b7e0e90..703c1f1615 100644 --- a/webapp/packages/core-executor/src/IExecutor.ts +++ b/webapp/packages/core-executor/src/IExecutor.ts @@ -6,11 +6,11 @@ * you may not use this file except in compliance with the License. */ -import { IContextProvider } from './ExecutionContext'; +import { IExecutionContextProvider } from './ExecutionContext'; import { IExecutorHandler } from './IExecutorHandler'; export interface IExecutor { - execute: (data: T) => Promise>; + execute: (data: T) => Promise>; addHandler: (handler: IExecutorHandler) => void; removeHandler: (handler: IExecutorHandler) => void; addPostHandler: (handler: IExecutorHandler) => void; diff --git a/webapp/packages/core-executor/src/IExecutorHandler.ts b/webapp/packages/core-executor/src/IExecutorHandler.ts index bb6d1a8341..44f386264b 100644 --- a/webapp/packages/core-executor/src/IExecutorHandler.ts +++ b/webapp/packages/core-executor/src/IExecutorHandler.ts @@ -6,10 +6,10 @@ * you may not use this file except in compliance with the License. */ -import { IContextProvider } from './ExecutionContext'; +import { IExecutionContextProvider } from './ExecutionContext'; export type IExecutorHandler = ( - contexts: IContextProvider, + contexts: IExecutionContextProvider, data: T // eslint-disable-next-line @typescript-eslint/no-invalid-void-type ) => void | false | Promise; diff --git a/webapp/packages/core-root/src/SessionResource.ts b/webapp/packages/core-root/src/SessionResource.ts index 5cfe2efa80..0bd115c0bf 100644 --- a/webapp/packages/core-root/src/SessionResource.ts +++ b/webapp/packages/core-root/src/SessionResource.ts @@ -12,12 +12,12 @@ import { injectable } from '@cloudbeaver/core-di'; import { GraphQLService, CachedDataResource, - SessionInfo + SessionStateFragment } from '@cloudbeaver/core-sdk'; import { ServerConfigResource } from './ServerConfigResource'; -export type SessionState = Pick; +export type SessionState = SessionStateFragment; @injectable() export class SessionResource extends CachedDataResource { diff --git a/webapp/packages/core-sdk/src/queries/connections/administration/createConnectionConfiguration.gql b/webapp/packages/core-sdk/src/queries/connections/administration/createConnectionConfiguration.gql index ae3a5db59a..89cb3ad0fe 100644 --- a/webapp/packages/core-sdk/src/queries/connections/administration/createConnectionConfiguration.gql +++ b/webapp/packages/core-sdk/src/queries/connections/administration/createConnectionConfiguration.gql @@ -1,29 +1,5 @@ query createConnectionConfiguration($config: ConnectionConfig!) { connection: createConnectionConfiguration(config: $config) { - id - name - description - driverId - - template - connected - readOnly - saveCredentials - - host - port - databaseName - url - properties - - features - - authNeeded - authModel - authProperties { - id - value - features - } + ...AdminConnection } } diff --git a/webapp/packages/core-sdk/src/queries/connections/administration/createConnectionConfigurationFromNode.gql b/webapp/packages/core-sdk/src/queries/connections/administration/createConnectionConfigurationFromNode.gql index daaa4e0930..dcbf793249 100644 --- a/webapp/packages/core-sdk/src/queries/connections/administration/createConnectionConfigurationFromNode.gql +++ b/webapp/packages/core-sdk/src/queries/connections/administration/createConnectionConfigurationFromNode.gql @@ -1,29 +1,5 @@ query createConnectionConfigurationFromNode($nodePath: String!) { connection: copyConnectionConfiguration(nodePath: $nodePath) { - id - name - description - driverId - - template - connected - readOnly - saveCredentials - - host - port - databaseName - url - properties - - features - - authNeeded - authModel - authProperties { - id - value - features - } + ...AdminConnection } } diff --git a/webapp/packages/core-sdk/src/queries/connections/administration/getConnections.gql b/webapp/packages/core-sdk/src/queries/connections/administration/getConnections.gql index 3b1d18c5fd..c4b2eea5f9 100644 --- a/webapp/packages/core-sdk/src/queries/connections/administration/getConnections.gql +++ b/webapp/packages/core-sdk/src/queries/connections/administration/getConnections.gql @@ -1,30 +1,5 @@ query getConnections { connections: allConnections { - id - name - description - driverId - - template - connected - readOnly - saveCredentials - - host - port - databaseName - url - properties - - authNeeded - authModel - authProperties { - id - value - features - } - - features - supportedDataFormats + ...AdminConnection } } \ No newline at end of file diff --git a/webapp/packages/core-sdk/src/queries/connections/administration/updateConnectionConfiguration.gql b/webapp/packages/core-sdk/src/queries/connections/administration/updateConnectionConfiguration.gql index ff6d3934a4..232654e5e9 100644 --- a/webapp/packages/core-sdk/src/queries/connections/administration/updateConnectionConfiguration.gql +++ b/webapp/packages/core-sdk/src/queries/connections/administration/updateConnectionConfiguration.gql @@ -1,30 +1,5 @@ query updateConnectionConfiguration($id: ID!, $config: ConnectionConfig!) { connection: updateConnectionConfiguration(id: $id, config: $config) { - id - name - description - driverId - - template - connected - readOnly - saveCredentials - - host - port - databaseName - url - properties - - authNeeded - authModel - authProperties { - id - value - features - } - - features - supportedDataFormats + ...AdminConnection } } diff --git a/webapp/packages/core-sdk/src/queries/connections/closeConnection.gql b/webapp/packages/core-sdk/src/queries/connections/closeConnection.gql index 1c48538064..ad82a6fe8d 100644 --- a/webapp/packages/core-sdk/src/queries/connections/closeConnection.gql +++ b/webapp/packages/core-sdk/src/queries/connections/closeConnection.gql @@ -1,16 +1,5 @@ mutation closeConnection($id: ID!) { connection: closeConnection(id: $id) { - id - name - description - driverId - connected - readOnly - - authNeeded - authModel - - features - supportedDataFormats + ...UserConnection } } \ No newline at end of file diff --git a/webapp/packages/core-sdk/src/queries/connections/connectionAuthProperties.gql b/webapp/packages/core-sdk/src/queries/connections/connectionAuthProperties.gql index 45a36cef72..dd28278686 100644 --- a/webapp/packages/core-sdk/src/queries/connections/connectionAuthProperties.gql +++ b/webapp/packages/core-sdk/src/queries/connections/connectionAuthProperties.gql @@ -1,15 +1,7 @@ query connectionAuthProperties($id: ID!) { connection: connectionInfo(id: $id) { authProperties { - id - displayName - description - category - dataType - value - validValues - defaultValue - features + ...UserConnectionAuthProperties } } } diff --git a/webapp/packages/core-sdk/src/queries/connections/connectionInfo.gql b/webapp/packages/core-sdk/src/queries/connections/connectionInfo.gql index dd408b868a..a8c1911f7d 100644 --- a/webapp/packages/core-sdk/src/queries/connections/connectionInfo.gql +++ b/webapp/packages/core-sdk/src/queries/connections/connectionInfo.gql @@ -1,16 +1,5 @@ query connectionInfo($id: ID!) { connection: connectionInfo(id: $id) { - id - name - description - driverId - connected - readOnly - - authNeeded - authModel - - features - supportedDataFormats + ...UserConnection } } diff --git a/webapp/packages/core-sdk/src/queries/connections/createConnection.gql b/webapp/packages/core-sdk/src/queries/connections/createConnection.gql index 7955283f69..9e9fa5d181 100644 --- a/webapp/packages/core-sdk/src/queries/connections/createConnection.gql +++ b/webapp/packages/core-sdk/src/queries/connections/createConnection.gql @@ -1,16 +1,5 @@ mutation createConnection($config: ConnectionConfig!) { connection: createConnection(config: $config) { - id - name - description - driverId - connected - readOnly - - authNeeded - authModel - - features - supportedDataFormats + ...UserConnection } } diff --git a/webapp/packages/core-sdk/src/queries/connections/createConnectionFromNode.gql b/webapp/packages/core-sdk/src/queries/connections/createConnectionFromNode.gql index e7f4ba8464..fa25bb0005 100644 --- a/webapp/packages/core-sdk/src/queries/connections/createConnectionFromNode.gql +++ b/webapp/packages/core-sdk/src/queries/connections/createConnectionFromNode.gql @@ -1,16 +1,5 @@ mutation createConnectionFromNode($nodePath: String!) { connection: copyConnectionFromNode(nodePath: $nodePath) { - id - name - description - driverId - connected - readOnly - - authNeeded - authModel - - features - supportedDataFormats + ...UserConnection } } diff --git a/webapp/packages/core-sdk/src/queries/connections/createConnectionFromTemplate.gql b/webapp/packages/core-sdk/src/queries/connections/createConnectionFromTemplate.gql index 33e8e159d6..efee81a42c 100644 --- a/webapp/packages/core-sdk/src/queries/connections/createConnectionFromTemplate.gql +++ b/webapp/packages/core-sdk/src/queries/connections/createConnectionFromTemplate.gql @@ -1,16 +1,5 @@ mutation createConnectionFromTemplate($templateId: ID!) { connection: createConnectionFromTemplate(templateId: $templateId) { - id - name - description - driverId - connected - readOnly - - authNeeded - authModel - - features - supportedDataFormats + ...UserConnection } } diff --git a/webapp/packages/core-sdk/src/queries/connections/initConnection.gql b/webapp/packages/core-sdk/src/queries/connections/initConnection.gql index c826fe1cdd..c64b0dab18 100644 --- a/webapp/packages/core-sdk/src/queries/connections/initConnection.gql +++ b/webapp/packages/core-sdk/src/queries/connections/initConnection.gql @@ -1,16 +1,5 @@ mutation initConnection($id: ID!, $credentials: Object) { connection: initConnection(id: $id, credentials: $credentials) { - id - name - description - driverId - connected - readOnly - - authNeeded - authModel - - features - supportedDataFormats + ...UserConnection } } diff --git a/webapp/packages/core-sdk/src/queries/fragments/AdminConnection.gql b/webapp/packages/core-sdk/src/queries/fragments/AdminConnection.gql new file mode 100644 index 0000000000..de19608ad2 --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/fragments/AdminConnection.gql @@ -0,0 +1,30 @@ +fragment AdminConnection on ConnectionInfo { + id + name + description + driverId + + template + connected + readOnly + saveCredentials + + host + port + databaseName + url + properties + + features + + authNeeded + authModel + authProperties { + id + value + features + } + + features + supportedDataFormats +} \ No newline at end of file diff --git a/webapp/packages/core-sdk/src/queries/fragments/NavNodeInfo.gql b/webapp/packages/core-sdk/src/queries/fragments/NavNodeInfo.gql new file mode 100644 index 0000000000..7f79e6c5e9 --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/fragments/NavNodeInfo.gql @@ -0,0 +1,14 @@ +fragment NavNodeInfo on NavigatorNodeInfo { + id + name + hasChildren + nodeType + icon + folder + inline + navigable + features + object { + features + } +} \ No newline at end of file diff --git a/webapp/packages/core-sdk/src/queries/fragments/NavNodeProperties.gql b/webapp/packages/core-sdk/src/queries/fragments/NavNodeProperties.gql new file mode 100644 index 0000000000..82c00d1f2d --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/fragments/NavNodeProperties.gql @@ -0,0 +1,9 @@ +fragment NavNodeProperties on ObjectPropertyInfo { + id + category + dataType + description + displayName + features + value +} \ No newline at end of file diff --git a/webapp/packages/core-sdk/src/queries/fragments/SessionState.gql b/webapp/packages/core-sdk/src/queries/fragments/SessionState.gql new file mode 100644 index 0000000000..e23cc7f1e2 --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/fragments/SessionState.gql @@ -0,0 +1,6 @@ +fragment SessionState on SessionInfo { + createTime + lastAccessTime + cacheExpired + locale +} \ No newline at end of file diff --git a/webapp/packages/core-sdk/src/queries/fragments/UserConnection.gql b/webapp/packages/core-sdk/src/queries/fragments/UserConnection.gql new file mode 100644 index 0000000000..a7001099c4 --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/fragments/UserConnection.gql @@ -0,0 +1,14 @@ +fragment UserConnection on ConnectionInfo { + id + name + description + driverId + connected + readOnly + + authNeeded + authModel + + features + supportedDataFormats +} \ No newline at end of file diff --git a/webapp/packages/core-sdk/src/queries/fragments/UserConnectionAuthProperties.gql b/webapp/packages/core-sdk/src/queries/fragments/UserConnectionAuthProperties.gql new file mode 100644 index 0000000000..ad51a4e6a4 --- /dev/null +++ b/webapp/packages/core-sdk/src/queries/fragments/UserConnectionAuthProperties.gql @@ -0,0 +1,11 @@ +fragment UserConnectionAuthProperties on ObjectPropertyInfo { + id + displayName + description + category + dataType + value + validValues + defaultValue + features +} \ No newline at end of file diff --git a/webapp/packages/core-sdk/src/queries/navigation-tree/getChildrenDBObjectInfo.gql b/webapp/packages/core-sdk/src/queries/navigation-tree/getChildrenDBObjectInfo.gql index 52b53e4f6c..46e46e4b8b 100644 --- a/webapp/packages/core-sdk/src/queries/navigation-tree/getChildrenDBObjectInfo.gql +++ b/webapp/packages/core-sdk/src/queries/navigation-tree/getChildrenDBObjectInfo.gql @@ -7,13 +7,7 @@ query getChildrenDBObjectInfo( object { features properties(filter: $filter) { - id - category - dataType - description - displayName - features - value + ...NavNodeProperties } } } diff --git a/webapp/packages/core-sdk/src/queries/navigation-tree/getDBObjectInfo.gql b/webapp/packages/core-sdk/src/queries/navigation-tree/getDBObjectInfo.gql index 753adf711d..b7081f9666 100644 --- a/webapp/packages/core-sdk/src/queries/navigation-tree/getDBObjectInfo.gql +++ b/webapp/packages/core-sdk/src/queries/navigation-tree/getDBObjectInfo.gql @@ -3,13 +3,7 @@ query getDBObjectInfo($navNodeId: ID!, $filter: ObjectPropertyFilter) { object { features properties(filter: $filter) { - id - category - dataType - description - displayName - features - value + ...NavNodeProperties } } } diff --git a/webapp/packages/core-sdk/src/queries/navigation-tree/navNodeChildren.gql b/webapp/packages/core-sdk/src/queries/navigation-tree/navNodeChildren.gql index e05bb3bba8..f7821345fe 100644 --- a/webapp/packages/core-sdk/src/queries/navigation-tree/navNodeChildren.gql +++ b/webapp/packages/core-sdk/src/queries/navigation-tree/navNodeChildren.gql @@ -1,31 +1,9 @@ query navNodeChildren($parentPath: ID!) { navNodeChildren(parentPath: $parentPath) { - id - name - hasChildren - nodeType - icon - folder - inline - navigable - features - object { - features - } + ...NavNodeInfo } navNodeInfo(nodePath: $parentPath) { - id - name - hasChildren - nodeType - icon - folder - inline - navigable - features - object { - features - } + ...NavNodeInfo } } diff --git a/webapp/packages/core-sdk/src/queries/navigation-tree/navNodeInfo.gql b/webapp/packages/core-sdk/src/queries/navigation-tree/navNodeInfo.gql index 03817d607b..a9eb05cf71 100644 --- a/webapp/packages/core-sdk/src/queries/navigation-tree/navNodeInfo.gql +++ b/webapp/packages/core-sdk/src/queries/navigation-tree/navNodeInfo.gql @@ -1,16 +1,5 @@ query navNodeInfo($nodePath: ID!) { navNodeInfo(nodePath: $nodePath) { - id - name - hasChildren - nodeType - icon - folder - inline - navigable - features - object { - features - } + ...NavNodeInfo } } diff --git a/webapp/packages/core-sdk/src/queries/session/getSessionConnections.gql b/webapp/packages/core-sdk/src/queries/session/getSessionConnections.gql index a858f8b2fc..0b261e8ad9 100644 --- a/webapp/packages/core-sdk/src/queries/session/getSessionConnections.gql +++ b/webapp/packages/core-sdk/src/queries/session/getSessionConnections.gql @@ -1,18 +1,7 @@ query getSessionConnections { state: sessionState { connections { - id - name - description - driverId - connected - readOnly - - authNeeded - authModel - - features - supportedDataFormats + ...UserConnection } } } diff --git a/webapp/packages/core-sdk/src/queries/session/openSession.gql b/webapp/packages/core-sdk/src/queries/session/openSession.gql index 12b8225e8a..537f85e338 100644 --- a/webapp/packages/core-sdk/src/queries/session/openSession.gql +++ b/webapp/packages/core-sdk/src/queries/session/openSession.gql @@ -1,8 +1,5 @@ mutation openSession { session: openSession { - createTime - lastAccessTime - cacheExpired - locale + ...SessionState } } diff --git a/webapp/packages/core-sdk/src/queries/session/sessionState.gql b/webapp/packages/core-sdk/src/queries/session/sessionState.gql index 60c04ea899..1a9ffdc08d 100644 --- a/webapp/packages/core-sdk/src/queries/session/sessionState.gql +++ b/webapp/packages/core-sdk/src/queries/session/sessionState.gql @@ -1,20 +1,5 @@ query sessionState { sessionState { - createTime - lastAccessTime - locale - cacheExpired - connections { - id - name - driverId - connected - - authNeeded - authModel - - features - supportedDataFormats - } + ...SessionState } } diff --git a/webapp/packages/core-sdk/src/sdk.ts b/webapp/packages/core-sdk/src/sdk.ts index f78eb9a9ce..9a0bf47c59 100644 --- a/webapp/packages/core-sdk/src/sdk.ts +++ b/webapp/packages/core-sdk/src/sdk.ts @@ -943,23 +943,13 @@ export type CreateConnectionConfigurationQueryVariables = Exact<{ config: ConnectionConfig; }>; -export interface CreateConnectionConfigurationQuery { - connection: ( - Pick - & { authProperties: Array> } - ); -} +export interface CreateConnectionConfigurationQuery { connection: AdminConnectionFragment } export type CreateConnectionConfigurationFromNodeQueryVariables = Exact<{ nodePath: Scalars['String']; }>; -export interface CreateConnectionConfigurationFromNodeQuery { - connection: ( - Pick - & { authProperties: Array> } - ); -} +export interface CreateConnectionConfigurationFromNodeQuery { connection: AdminConnectionFragment } export type DeleteConnectionConfigurationQueryVariables = Exact<{ id: Scalars['ID']; @@ -975,12 +965,7 @@ export interface GetConnectionAccessQuery { subjects: Array; -export interface GetConnectionsQuery { - connections: Array<( - Pick - & { authProperties: Array> } - )>; -} +export interface GetConnectionsQuery { connections: AdminConnectionFragment[] } export type SearchDatabasesQueryVariables = Exact<{ hosts: Array; @@ -1000,48 +985,43 @@ export type UpdateConnectionConfigurationQueryVariables = Exact<{ config: ConnectionConfig; }>; -export interface UpdateConnectionConfigurationQuery { - connection: ( - Pick - & { authProperties: Array> } - ); -} +export interface UpdateConnectionConfigurationQuery { connection: AdminConnectionFragment } export type CloseConnectionMutationVariables = Exact<{ id: Scalars['ID']; }>; -export interface CloseConnectionMutation { connection: Pick } +export interface CloseConnectionMutation { connection: UserConnectionFragment } export type ConnectionAuthPropertiesQueryVariables = Exact<{ id: Scalars['ID']; }>; -export interface ConnectionAuthPropertiesQuery { connection: { authProperties: Array> } } +export interface ConnectionAuthPropertiesQuery { connection: { authProperties: UserConnectionAuthPropertiesFragment[] } } export type ConnectionInfoQueryVariables = Exact<{ id: Scalars['ID']; }>; -export interface ConnectionInfoQuery { connection: Pick } +export interface ConnectionInfoQuery { connection: UserConnectionFragment } export type CreateConnectionMutationVariables = Exact<{ config: ConnectionConfig; }>; -export interface CreateConnectionMutation { connection: Pick } +export interface CreateConnectionMutation { connection: UserConnectionFragment } export type CreateConnectionFromNodeMutationVariables = Exact<{ nodePath: Scalars['String']; }>; -export interface CreateConnectionFromNodeMutation { connection: Pick } +export interface CreateConnectionFromNodeMutation { connection: UserConnectionFragment } export type CreateConnectionFromTemplateMutationVariables = Exact<{ templateId: Scalars['ID']; }>; -export interface CreateConnectionFromTemplateMutation { connection: Pick } +export interface CreateConnectionFromTemplateMutation { connection: UserConnectionFragment } export type DeleteConnectionMutationVariables = Exact<{ id: Scalars['ID']; @@ -1084,7 +1064,7 @@ export type InitConnectionMutationVariables = Exact<{ credentials?: Maybe; }>; -export interface InitConnectionMutation { connection: Pick } +export interface InitConnectionMutation { connection: UserConnectionFragment } export type RefreshSessionConnectionsMutationVariables = Exact<{ [key: string]: never }>; @@ -1149,6 +1129,24 @@ export type NavGetStructContainersQueryVariables = Exact<{ export interface NavGetStructContainersQuery { navGetStructContainers: { catalogList: Array>; schemaList: Array> } } +export type AdminConnectionFragment = ( + Pick + & { authProperties: Array> } +); + +export type NavNodeInfoFragment = ( + Pick + & { object?: Maybe> } +); + +export type NavNodePropertiesFragment = Pick; + +export type SessionStateFragment = Pick; + +export type UserConnectionFragment = Pick; + +export type UserConnectionAuthPropertiesFragment = Pick; + export type GetAsyncTaskInfoMutationVariables = Exact<{ taskId: Scalars['String']; removeOnFinish: Scalars['Boolean']; @@ -1267,7 +1265,7 @@ export interface GetChildrenDbObjectInfoQuery { Pick & { object?: Maybe<( Pick - & { properties?: Maybe>>> } + & { properties?: Maybe>> } )>; } )>; } @@ -1280,7 +1278,7 @@ export type GetDbObjectInfoQueryVariables = Exact<{ export interface GetDbObjectInfoQuery { objectInfo: { object?: Maybe<( Pick - & { properties?: Maybe>>> } + & { properties?: Maybe>> } )>; }; } @@ -1288,26 +1286,13 @@ export type NavNodeChildrenQueryVariables = Exact<{ parentPath: Scalars['ID']; }>; -export interface NavNodeChildrenQuery { - navNodeChildren: Array<( - Pick - & { object?: Maybe> } - )>; navNodeInfo: ( - Pick - & { object?: Maybe> } - ); -} +export interface NavNodeChildrenQuery { navNodeChildren: NavNodeInfoFragment[]; navNodeInfo: NavNodeInfoFragment } export type NavNodeInfoQueryVariables = Exact<{ nodePath: Scalars['ID']; }>; -export interface NavNodeInfoQuery { - navNodeInfo: ( - Pick - & { object?: Maybe> } - ); -} +export interface NavNodeInfoQuery { navNodeInfo: NavNodeInfoFragment } export type NavRefreshNodeQueryVariables = Exact<{ nodePath: Scalars['ID']; @@ -1351,11 +1336,11 @@ export type ChangeSessionLanguageMutation = Pick; -export interface GetSessionConnectionsQuery { state: { connections: Array> } } +export interface GetSessionConnectionsQuery { state: { connections: UserConnectionFragment[] } } export type OpenSessionMutationVariables = Exact<{ [key: string]: never }>; -export interface OpenSessionMutation { session: Pick } +export interface OpenSessionMutation { session: SessionStateFragment } export type ReadSessionLogQueryVariables = Exact<{ maxEntries: Scalars['Int']; @@ -1379,12 +1364,7 @@ export interface SessionPermissionsQuery { permissions: Query['sessionPermission export type SessionStateQueryVariables = Exact<{ [key: string]: never }>; -export interface SessionStateQuery { - sessionState: ( - Pick - & { connections: Array> } - ); -} +export interface SessionStateQuery { sessionState: SessionStateFragment } export type TouchSessionMutationVariables = Exact<{ [key: string]: never }>; @@ -1422,6 +1402,95 @@ export type SqlResultCloseMutationVariables = Exact<{ export interface SqlResultCloseMutation { result: Mutation['sqlResultClose'] } +export const AdminConnectionFragmentDoc = ` + fragment AdminConnection on ConnectionInfo { + id + name + description + driverId + template + connected + readOnly + saveCredentials + host + port + databaseName + url + properties + features + authNeeded + authModel + authProperties { + id + value + features + } + features + supportedDataFormats +} + `; +export const NavNodeInfoFragmentDoc = ` + fragment NavNodeInfo on NavigatorNodeInfo { + id + name + hasChildren + nodeType + icon + folder + inline + navigable + features + object { + features + } +} + `; +export const NavNodePropertiesFragmentDoc = ` + fragment NavNodeProperties on ObjectPropertyInfo { + id + category + dataType + description + displayName + features + value +} + `; +export const SessionStateFragmentDoc = ` + fragment SessionState on SessionInfo { + createTime + lastAccessTime + cacheExpired + locale +} + `; +export const UserConnectionFragmentDoc = ` + fragment UserConnection on ConnectionInfo { + id + name + description + driverId + connected + readOnly + authNeeded + authModel + features + supportedDataFormats +} + `; +export const UserConnectionAuthPropertiesFragmentDoc = ` + fragment UserConnectionAuthProperties on ObjectPropertyInfo { + id + displayName + description + category + dataType + value + validValues + defaultValue + features +} + `; export const AsyncTaskCancelDocument = ` mutation asyncTaskCancel($taskId: String!) { result: asyncTaskCancel(id: $taskId) @@ -1546,57 +1615,17 @@ export const SetUserCredentialsDocument = ` export const CreateConnectionConfigurationDocument = ` query createConnectionConfiguration($config: ConnectionConfig!) { connection: createConnectionConfiguration(config: $config) { - id - name - description - driverId - template - connected - readOnly - saveCredentials - host - port - databaseName - url - properties - features - authNeeded - authModel - authProperties { - id - value - features - } + ...AdminConnection } } - `; + ${AdminConnectionFragmentDoc}`; export const CreateConnectionConfigurationFromNodeDocument = ` query createConnectionConfigurationFromNode($nodePath: String!) { connection: copyConnectionConfiguration(nodePath: $nodePath) { - id - name - description - driverId - template - connected - readOnly - saveCredentials - host - port - databaseName - url - properties - features - authNeeded - authModel - authProperties { - id - value - features - } + ...AdminConnection } } - `; + ${AdminConnectionFragmentDoc}`; export const DeleteConnectionConfigurationDocument = ` query deleteConnectionConfiguration($id: ID!) { deleteConnectionConfiguration(id: $id) @@ -1614,31 +1643,10 @@ export const GetConnectionAccessDocument = ` export const GetConnectionsDocument = ` query getConnections { connections: allConnections { - id - name - description - driverId - template - connected - readOnly - saveCredentials - host - port - databaseName - url - properties - authNeeded - authModel - authProperties { - id - value - features - } - features - supportedDataFormats + ...AdminConnection } } - `; + ${AdminConnectionFragmentDoc}`; export const SearchDatabasesDocument = ` query searchDatabases($hosts: [String!]!) { databases: searchConnections(hostNames: $hosts) { @@ -1658,128 +1666,54 @@ export const SetConnectionAccessDocument = ` export const UpdateConnectionConfigurationDocument = ` query updateConnectionConfiguration($id: ID!, $config: ConnectionConfig!) { connection: updateConnectionConfiguration(id: $id, config: $config) { - id - name - description - driverId - template - connected - readOnly - saveCredentials - host - port - databaseName - url - properties - authNeeded - authModel - authProperties { - id - value - features - } - features - supportedDataFormats + ...AdminConnection } } - `; + ${AdminConnectionFragmentDoc}`; export const CloseConnectionDocument = ` mutation closeConnection($id: ID!) { connection: closeConnection(id: $id) { - id - name - description - driverId - connected - readOnly - authNeeded - authModel - features - supportedDataFormats + ...UserConnection } } - `; + ${UserConnectionFragmentDoc}`; export const ConnectionAuthPropertiesDocument = ` query connectionAuthProperties($id: ID!) { connection: connectionInfo(id: $id) { authProperties { - id - displayName - description - category - dataType - value - validValues - defaultValue - features + ...UserConnectionAuthProperties } } } - `; + ${UserConnectionAuthPropertiesFragmentDoc}`; export const ConnectionInfoDocument = ` query connectionInfo($id: ID!) { connection: connectionInfo(id: $id) { - id - name - description - driverId - connected - readOnly - authNeeded - authModel - features - supportedDataFormats + ...UserConnection } } - `; + ${UserConnectionFragmentDoc}`; export const CreateConnectionDocument = ` mutation createConnection($config: ConnectionConfig!) { connection: createConnection(config: $config) { - id - name - description - driverId - connected - readOnly - authNeeded - authModel - features - supportedDataFormats + ...UserConnection } } - `; + ${UserConnectionFragmentDoc}`; export const CreateConnectionFromNodeDocument = ` mutation createConnectionFromNode($nodePath: String!) { connection: copyConnectionFromNode(nodePath: $nodePath) { - id - name - description - driverId - connected - readOnly - authNeeded - authModel - features - supportedDataFormats + ...UserConnection } } - `; + ${UserConnectionFragmentDoc}`; export const CreateConnectionFromTemplateDocument = ` mutation createConnectionFromTemplate($templateId: ID!) { connection: createConnectionFromTemplate(templateId: $templateId) { - id - name - description - driverId - connected - readOnly - authNeeded - authModel - features - supportedDataFormats + ...UserConnection } } - `; + ${UserConnectionFragmentDoc}`; export const DeleteConnectionDocument = ` mutation deleteConnection($id: ID!) { deleteConnection(id: $id) @@ -1852,19 +1786,10 @@ export const GetDriverByIdDocument = ` export const InitConnectionDocument = ` mutation initConnection($id: ID!, $credentials: Object) { connection: initConnection(id: $id, credentials: $credentials) { - id - name - description - driverId - connected - readOnly - authNeeded - authModel - features - supportedDataFormats + ...UserConnection } } - `; + ${UserConnectionFragmentDoc}`; export const RefreshSessionConnectionsDocument = ` mutation refreshSessionConnections { refreshSessionConnections @@ -2108,86 +2033,41 @@ export const GetChildrenDbObjectInfoDocument = ` object { features properties(filter: $filter) { - id - category - dataType - description - displayName - features - value + ...NavNodeProperties } } } } - `; + ${NavNodePropertiesFragmentDoc}`; export const GetDbObjectInfoDocument = ` query getDBObjectInfo($navNodeId: ID!, $filter: ObjectPropertyFilter) { objectInfo: navNodeInfo(nodePath: $navNodeId) { object { features properties(filter: $filter) { - id - category - dataType - description - displayName - features - value + ...NavNodeProperties } } } } - `; + ${NavNodePropertiesFragmentDoc}`; export const NavNodeChildrenDocument = ` query navNodeChildren($parentPath: ID!) { navNodeChildren(parentPath: $parentPath) { - id - name - hasChildren - nodeType - icon - folder - inline - navigable - features - object { - features - } + ...NavNodeInfo } navNodeInfo(nodePath: $parentPath) { - id - name - hasChildren - nodeType - icon - folder - inline - navigable - features - object { - features - } + ...NavNodeInfo } } - `; + ${NavNodeInfoFragmentDoc}`; export const NavNodeInfoDocument = ` query navNodeInfo($nodePath: ID!) { navNodeInfo(nodePath: $nodePath) { - id - name - hasChildren - nodeType - icon - folder - inline - navigable - features - object { - features - } + ...NavNodeInfo } } - `; + ${NavNodeInfoFragmentDoc}`; export const NavRefreshNodeDocument = ` query navRefreshNode($nodePath: ID!) { navRefreshNode(nodePath: $nodePath) @@ -2243,30 +2123,18 @@ export const GetSessionConnectionsDocument = ` query getSessionConnections { state: sessionState { connections { - id - name - description - driverId - connected - readOnly - authNeeded - authModel - features - supportedDataFormats + ...UserConnection } } } - `; + ${UserConnectionFragmentDoc}`; export const OpenSessionDocument = ` mutation openSession { session: openSession { - createTime - lastAccessTime - cacheExpired - locale + ...SessionState } } - `; + ${SessionStateFragmentDoc}`; export const ReadSessionLogDocument = ` query readSessionLog($maxEntries: Int!, $clearEntries: Boolean!) { log: readSessionLog(maxEntries: $maxEntries, clearEntries: $clearEntries) { @@ -2317,23 +2185,10 @@ export const SessionPermissionsDocument = ` export const SessionStateDocument = ` query sessionState { sessionState { - createTime - lastAccessTime - locale - cacheExpired - connections { - id - name - driverId - connected - authNeeded - authModel - features - supportedDataFormats - } + ...SessionState } } - `; + ${SessionStateFragmentDoc}`; export const TouchSessionDocument = ` mutation touchSession { touchSession diff --git a/webapp/packages/plugin-authentication/src/Administration/Users/CreateUser.tsx b/webapp/packages/plugin-authentication/src/Administration/Users/CreateUser.tsx index 4f9419d506..f6d75edf96 100644 --- a/webapp/packages/plugin-authentication/src/Administration/Users/CreateUser.tsx +++ b/webapp/packages/plugin-authentication/src/Administration/Users/CreateUser.tsx @@ -14,18 +14,24 @@ import { useStyles, composes } from '@cloudbeaver/core-theming'; import { UserForm } from './UserForm/UserForm'; -interface Props { - user: AdminUserInfo; - onCancel: () => void; -} - const styles = composes( css` title-bar { composes: theme-border-color-background from global; } + + user-create-footer, user-create-content { + composes: theme-background-secondary theme-text-on-secondary from global; + } `, css` + user-create { + display: flex; + flex-direction: column; + height: 500px; + overflow: hidden; + } + title-bar { composes: theme-typography--headline6 from global; box-sizing: border-box; @@ -36,17 +42,38 @@ const styles = composes( font-weight: 400; flex: auto 0 0; } + + user-create-footer { + padding-bottom: 48px; + flex: auto 0 0; + } + + user-create-content { + position: relative; + display: flex; + flex-direction: column; + flex: 1; + overflow: auto; + } ` ); -export function CreateUser({ +interface Props { + user: AdminUserInfo; + onCancel: () => void; +} + +export const CreateUser: React.FC = function CreateUser({ user, onCancel, -}: Props) { +}) { return styled(useStyles(styles))( - + + + + ); -} +}; diff --git a/webapp/packages/plugin-authentication/src/Administration/Users/UserForm/GrantedConnections.tsx b/webapp/packages/plugin-authentication/src/Administration/Users/UserForm/GrantedConnections.tsx index 3602b48c74..4b4e639cd0 100644 --- a/webapp/packages/plugin-authentication/src/Administration/Users/UserForm/GrantedConnections.tsx +++ b/webapp/packages/plugin-authentication/src/Administration/Users/UserForm/GrantedConnections.tsx @@ -14,10 +14,10 @@ import { Table, TableHeader, TableColumnHeader, TableBody, TableItem, TableColumnValue, TableItemSelect, StaticImage, TextPlaceholder } from '@cloudbeaver/core-blocks'; -import { DBDriverResource } from '@cloudbeaver/core-connections'; +import { AdminConnection, DBDriverResource } from '@cloudbeaver/core-connections'; import { useService } from '@cloudbeaver/core-di'; import { useTranslate } from '@cloudbeaver/core-localization'; -import { AdminSubjectType, ConnectionInfo, AdminConnectionGrantInfo } from '@cloudbeaver/core-sdk'; +import { AdminSubjectType, AdminConnectionGrantInfo } from '@cloudbeaver/core-sdk'; import { useStyles, composes } from '@cloudbeaver/core-theming'; const styles = composes( @@ -42,7 +42,7 @@ const styles = composes( interface Props { grantedConnections: AdminConnectionGrantInfo[]; - connections: ConnectionInfo[]; + connections: AdminConnection[]; selectedConnection: Map; disabled: boolean; onChange?: () => void; diff --git a/webapp/packages/plugin-authentication/src/Administration/Users/UserForm/UserForm.tsx b/webapp/packages/plugin-authentication/src/Administration/Users/UserForm/UserForm.tsx index bef29e3a0f..4d92dab715 100644 --- a/webapp/packages/plugin-authentication/src/Administration/Users/UserForm/UserForm.tsx +++ b/webapp/packages/plugin-authentication/src/Administration/Users/UserForm/UserForm.tsx @@ -54,6 +54,21 @@ const styles = composes( } `, css` + box { + display: flex; + flex-direction: column; + flex: 1; + height: 100%; + overflow: auto; + } + + content-box { + display: flex; + flex: 1; + flex-direction: column; + overflow: auto; + } + SubmittingForm { flex: 1; display: flex; diff --git a/webapp/packages/plugin-authentication/src/locales/en.ts b/webapp/packages/plugin-authentication/src/locales/en.ts index 2f49304f9f..2cb05a4636 100644 --- a/webapp/packages/plugin-authentication/src/locales/en.ts +++ b/webapp/packages/plugin-authentication/src/locales/en.ts @@ -22,7 +22,7 @@ export default [ ['authentication_user_password', 'User password'], ['authentication_user_password_repeat', 'Repeat password'], ['authentication_user_role', 'User role'], - ['authentication_user_login_not_set', 'Login cant\'t be empty'], + ['authentication_user_login_not_set', 'Login can\'t be empty'], ['authentication_user_role_not_set', 'At least one role must be selected'], ['authentication_user_password_not_set', 'Password is required'], ['authentication_user_passwords_not_match', "Passwords don't match"], diff --git a/webapp/packages/plugin-data-viewer/src/DataViewerTabService.ts b/webapp/packages/plugin-data-viewer/src/DataViewerTabService.ts index f041a1e442..1ff65466da 100644 --- a/webapp/packages/plugin-data-viewer/src/DataViewerTabService.ts +++ b/webapp/packages/plugin-data-viewer/src/DataViewerTabService.ts @@ -14,7 +14,7 @@ import { } from '@cloudbeaver/core-app'; import { injectable } from '@cloudbeaver/core-di'; import { NotificationService } from '@cloudbeaver/core-events'; -import { IContextProvider } from '@cloudbeaver/core-executor'; +import { IExecutionContextProvider } from '@cloudbeaver/core-executor'; import { DBObjectPageService, ObjectPage, ObjectViewerTabService, IObjectViewerTabState } from '@cloudbeaver/plugin-object-viewer'; @@ -51,7 +51,7 @@ export class DataViewerTabService { this.navNodeManagerService.navigator.addHandler(this.navigationHandler.bind(this)); } - private async navigationHandler(contexts: IContextProvider) { + private async navigationHandler(contexts: IExecutionContextProvider) { try { const { nodeInfo, diff --git a/webapp/packages/plugin-ddl-viewer/src/DdlViewerTabService.ts b/webapp/packages/plugin-ddl-viewer/src/DdlViewerTabService.ts index 6408355e90..38f3b346b2 100644 --- a/webapp/packages/plugin-ddl-viewer/src/DdlViewerTabService.ts +++ b/webapp/packages/plugin-ddl-viewer/src/DdlViewerTabService.ts @@ -12,7 +12,7 @@ import { import { ITab } from '@cloudbeaver/core-blocks'; import { injectable } from '@cloudbeaver/core-di'; import { NotificationService } from '@cloudbeaver/core-events'; -import { IContextProvider } from '@cloudbeaver/core-executor'; +import { IExecutionContextProvider } from '@cloudbeaver/core-executor'; import { ObjectViewerTabService } from '@cloudbeaver/plugin-object-viewer'; import { ddlViewer } from './DdlViewer/DdlViewer'; @@ -47,7 +47,7 @@ export class DdlViewerTabService { return ddlTab; } - private async navigationHandler(contexts: IContextProvider) { + private async navigationHandler(contexts: IExecutionContextProvider) { try { const tabContext = await contexts.getContext(this.objectViewerTabService.objectViewerTabContext); diff --git a/webapp/packages/plugin-object-viewer/src/ObjectPropertiesPage/ObjectPropertiesPageService.ts b/webapp/packages/plugin-object-viewer/src/ObjectPropertiesPage/ObjectPropertiesPageService.ts index 1e0ea542c3..0246ddf905 100644 --- a/webapp/packages/plugin-object-viewer/src/ObjectPropertiesPage/ObjectPropertiesPageService.ts +++ b/webapp/packages/plugin-object-viewer/src/ObjectPropertiesPage/ObjectPropertiesPageService.ts @@ -11,7 +11,7 @@ import { } from '@cloudbeaver/core-app'; import { injectable } from '@cloudbeaver/core-di'; import { NotificationService } from '@cloudbeaver/core-events'; -import { IContextProvider } from '@cloudbeaver/core-executor'; +import { IExecutionContextProvider } from '@cloudbeaver/core-executor'; import { IObjectViewerTabState } from '../IObjectViewerTabState'; import { DBObjectPageService } from '../ObjectPage/DBObjectPageService'; @@ -50,7 +50,7 @@ export class ObjectPropertiesPageService { // await this.nodesManagerService.loadNodeInfo(tab.handlerState.objectId); } - private async navigationHandler(contexts: IContextProvider) { + private async navigationHandler(contexts: IExecutionContextProvider) { if (!this.page) { // TODO: it will be never true, because navHandler registers after page creation return; } diff --git a/webapp/packages/plugin-object-viewer/src/ObjectViewerTabService.ts b/webapp/packages/plugin-object-viewer/src/ObjectViewerTabService.ts index 89b69722ad..ee206a9aec 100644 --- a/webapp/packages/plugin-object-viewer/src/ObjectViewerTabService.ts +++ b/webapp/packages/plugin-object-viewer/src/ObjectViewerTabService.ts @@ -22,7 +22,7 @@ import { import { connectionProvider, ConnectionInfoResource } from '@cloudbeaver/core-connections'; import { injectable } from '@cloudbeaver/core-di'; import { NotificationService } from '@cloudbeaver/core-events'; -import { IContextProvider } from '@cloudbeaver/core-executor'; +import { IExecutionContextProvider } from '@cloudbeaver/core-executor'; import { ResourceKey, resourceKeyList, isResourceKeyList } from '@cloudbeaver/core-sdk'; import { IObjectViewerTabContext } from './IObjectViewerTabContext'; @@ -74,7 +74,7 @@ export class ObjectViewerTabService { } objectViewerTabContext = async ( - contexts: IContextProvider, + contexts: IExecutionContextProvider, data: INodeNavigationData ): Promise => { const tabInfo = await contexts.getContext(this.navigationTabsService.navigationTabContext); @@ -308,7 +308,7 @@ export class ObjectViewerTabService { await this.dbObjectPageService.closePages(tab); } - private async navigationHandler(contexts: IContextProvider) { + private async navigationHandler(contexts: IExecutionContextProvider) { try { const { tab, tabInfo, nodeInfo } = await contexts.getContext(this.objectViewerTabContext); diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditorNavigatorService.ts b/webapp/packages/plugin-sql-editor/src/SqlEditorNavigatorService.ts index 510d8f2ee9..6b6020feea 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlEditorNavigatorService.ts +++ b/webapp/packages/plugin-sql-editor/src/SqlEditorNavigatorService.ts @@ -10,7 +10,7 @@ import { NavigationTabsService } from '@cloudbeaver/core-app'; import { ConnectionsManagerService, ConnectionInfoResource } from '@cloudbeaver/core-connections'; import { injectable } from '@cloudbeaver/core-di'; import { NotificationService } from '@cloudbeaver/core-events'; -import { IExecutor, Executor, IContextProvider } from '@cloudbeaver/core-executor'; +import { IExecutor, Executor, IExecutionContextProvider } from '@cloudbeaver/core-executor'; import { SqlEditorTabService, isSQLEditorTab } from './SqlEditorTabService'; import { SqlExecutionState } from './SqlExecutionState'; @@ -97,7 +97,7 @@ export class SqlEditorNavigatorService { } private async navigateHandler( - contexts: IContextProvider, + contexts: IExecutionContextProvider, data: SQLCreateAction | SQLEditorAction ) { try {