Merge remote-tracking branch 'origin/devel' into devel

This commit is contained in:
Serge Rider
2021-11-09 18:44:57 +03:00
219 changed files with 1017 additions and 358 deletions
@@ -8,7 +8,7 @@
import { action, makeObservable } from 'mobx';
import { ConnectionAuthService, ConnectionInfoResource } from '@cloudbeaver/core-connections';
import { ConnectionInfoResource, ConnectionsManagerService } from '@cloudbeaver/core-connections';
import { injectable } from '@cloudbeaver/core-di';
import { NotificationService } from '@cloudbeaver/core-events';
import { Executor, IExecutor } from '@cloudbeaver/core-executor';
@@ -37,7 +37,7 @@ export class NavigationTreeService extends View<string> {
constructor(
private navNodeManagerService: NavNodeManagerService,
private notificationService: NotificationService,
private connectionAuthService: ConnectionAuthService,
private connectionsManagerService: ConnectionsManagerService,
private connectionInfoResource: ConnectionInfoResource,
private navNodeExtensionsService: NavNodeExtensionsService,
private navTreeResource: NavTreeResource
@@ -152,7 +152,7 @@ export class NavigationTreeService extends View<string> {
}
private async tryInitConnection(navNodeId: string): Promise<boolean> {
const connection = await this.connectionAuthService.auth(
const connection = await this.connectionsManagerService.requireConnection(
NodeManagerUtils.connectionNodeIdToConnectionId(navNodeId)
);
@@ -97,18 +97,24 @@ export function useElementsTree(options: IOptions): IElementsTree {
);
async function loadTree(nodeId: string) {
await connectionInfoResource.load(CachedMapAllKey);
let children = [nodeId];
while (children.length > 0) {
const nextChildren: string[] = [];
for (const child of children) {
await connectionInfoResource.load(CachedMapAllKey);
await navNodeInfoResource.waitLoad();
await navTreeResource.waitLoad();
const nodeState = state.get(child);
if (!nodeState.expanded && child !== options.root) {
if (navNodeInfoResource.isOutdated(child)) {
await navNodeInfoResource.load(child);
const node = navNodeInfoResource.get(child);
if (node?.parentId !== undefined && !navTreeResource.isOutdated(node.parentId)) {
await navNodeInfoResource.load(child);
}
}
continue;
}
@@ -6,12 +6,10 @@
* you may not use this file except in compliance with the License.
*/
import { EAdminPermission, AdministrationScreenService } from '@cloudbeaver/core-administration';
import { Bootstrap, injectable } from '@cloudbeaver/core-di';
import { IComputedMenuItemOptions, IMenuPanel, StaticMenu } from '@cloudbeaver/core-dialogs';
import { LocalizationService } from '@cloudbeaver/core-localization';
import { ServerConfigResource, PermissionsService } from '@cloudbeaver/core-root';
import { ScreenService } from '@cloudbeaver/core-routing';
import { ServerConfigResource } from '@cloudbeaver/core-root';
import { ThemeService } from '@cloudbeaver/core-theming';
@injectable()
@@ -25,10 +23,7 @@ export class SettingsMenuService extends Bootstrap {
constructor(
private localizationService: LocalizationService,
private themeService: ThemeService,
private permissionsService: PermissionsService,
private serverConfigResource: ServerConfigResource,
private screenService: ScreenService,
private administrationScreenService: AdministrationScreenService,
) {
super();
}
@@ -38,7 +33,6 @@ export class SettingsMenuService extends Bootstrap {
}
async load(): Promise<void> {
this.addAdministration();
this.addThemes();
await this.addLocales();
}
@@ -51,30 +45,6 @@ export class SettingsMenuService extends Bootstrap {
this.menu.addMenuItem(panelId, options);
}
private addAdministration() {
this.addMenuItem(
SettingsMenuService.settingsMenuToken,
{
id: 'administrationMenuEnter',
order: 0,
isHidden: () => !this.permissionsService.has(EAdminPermission.admin)
|| this.screenService.isActive(AdministrationScreenService.screenName),
title: 'administration_menu_enter',
onClick: () => this.administrationScreenService.navigateToRoot(),
}
);
this.addMenuItem(
SettingsMenuService.settingsMenuToken,
{
id: 'administrationMenuBack',
order: 0,
isHidden: () => !this.screenService.isActive(AdministrationScreenService.screenName),
title: 'administration_menu_back',
onClick: () => this.screenService.navigateToRoot(),
}
);
}
private addThemes() {
this.addMenuItem(
SettingsMenuService.settingsMenuToken,
@@ -7,7 +7,7 @@
*/
import {
ConnectionAuthService, Connection, ConnectionInfoResource
Connection, ConnectionInfoResource, ConnectionsManagerService
} from '@cloudbeaver/core-connections';
import { injectable, Bootstrap } from '@cloudbeaver/core-di';
import { NotificationService } from '@cloudbeaver/core-events';
@@ -94,7 +94,7 @@ export class NavNodeManagerService extends Bootstrap {
readonly connectionInfo: ConnectionInfoResource,
readonly navTree: NavTreeResource,
readonly navNodeInfoResource: NavNodeInfoResource,
private connectionAuthService: ConnectionAuthService,
private connectionsManagerService: ConnectionsManagerService,
private notificationService: NotificationService,
private serverService: ServerService,
navigationService: NavigationService
@@ -322,7 +322,7 @@ export class NavNodeManagerService extends Bootstrap {
if (NodeManagerUtils.isDatabaseObject(nodeInfo.nodeId) && nodeInfo.connection) {
let connection: Connection | null;
try {
connection = await this.connectionAuthService.auth(nodeInfo.connection.id);
connection = await this.connectionsManagerService.requireConnection(nodeInfo.connection.id);
} catch (exception) {
this.notificationService.logException(exception);
throw exception;
@@ -31,7 +31,7 @@ UserInfoIncludes
sessionResource: SessionResource,
private sessionDataResource: SessionDataResource
) {
super(null);
super(null, ['customIncludeOriginDetails']);
this.userChange = new SyncExecutor();
this.sync(sessionResource);
@@ -80,12 +80,12 @@ UserInfoIncludes
customIncludeOriginDetails: true,
});
this.resetIncludes();
if (this.data === null || link) {
this.setData(await this.loader());
} else {
this.data.authTokens.push(authToken as UserAuthToken);
}
this.resetIncludes();
});
this.sessionDataResource.markOutdated();
@@ -133,4 +133,10 @@ UserInfoIncludes
const metadata = this.getMetadata();
metadata.includes = [...this.defaultIncludes];
}
getIncludes(key: void): string[] {
key = this.transformParam(key);
const metadata = this.getMetadata(key);
return metadata.includes;
}
}
@@ -13,7 +13,6 @@ import { IServiceConstructor, useService } from '@cloudbeaver/core-di';
import { NotificationService } from '@cloudbeaver/core-events';
import { CachedResourceIncludeArgs, CachedMapResource, CachedMapResourceGetter, ResourceKey, CachedMapResourceValue, CachedMapResourceKey, CachedMapResourceArguments, CachedMapResourceLoader, ResourceKeyList, CachedMapResourceListGetter } from '@cloudbeaver/core-sdk';
import { getComputed } from './getComputed';
import type { ILoadableState } from './Loader/Loader';
import { useObservableRef } from './useObservableRef';
@@ -53,21 +53,7 @@ import {
DBDriverResource,
NetworkHandlerResource,
DatabaseAuthModelsResource,
ConnectionAuthService,
ConnectionsAdministrationService,
ConnectionsResource,
ConnectionsLocaleService,
ConnectionsAdministrationNavService,
CreateConnectionService,
ConnectionManualService,
ConnectionSearchService,
CreateConnectionBaseBootstrap,
ConnectionFormService,
ConnectionOptionsTabService,
ConnectionDriverPropertiesTabService,
ConnectionSSHTabService,
ConnectionOriginInfoTabService,
ConnectionAccessTabService
} from '@cloudbeaver/core-connections';
import type { PluginManifest } from '@cloudbeaver/core-di';
import { CommonDialogService, ContextMenuService } from '@cloudbeaver/core-dialogs';
@@ -132,12 +118,6 @@ export const coreManifests: PluginManifest[] = [
SessionExpireWarningDialogService,
SessionExpiredDialogService,
ConnectionsLocaleService,
ConnectionFormService,
ConnectionOptionsTabService,
ConnectionSSHTabService,
ConnectionOriginInfoTabService,
ConnectionAccessTabService,
ConnectionDriverPropertiesTabService,
ConnectionDialogsService,
ConnectionSchemaManagerService,
ConnectionInfoResource,
@@ -164,14 +144,6 @@ export const coreManifests: PluginManifest[] = [
TopNavService,
NavigationTabsService,
DatabaseAuthModelsResource,
ConnectionAuthService,
ConnectionsAdministrationNavService,
ConnectionManualService,
ConnectionSearchService,
CreateConnectionBaseBootstrap,
CreateConnectionService,
ConnectionsAdministrationService,
ConnectionsResource,
NavNodeContextMenuService,
NavigationTreeService,
NavNodeManagerService,
@@ -28,7 +28,8 @@ import {
CachedResourceIncludeArgs,
} from '@cloudbeaver/core-sdk';
import type { DatabaseConnection } from './Administration/ConnectionsResource';
import type { DatabaseConnection } from './DatabaseConnection';
import type { IConnectionsResource } from './IConnectionsResource';
export type Connection = DatabaseConnection & { authProperties?: UserConnectionAuthPropertiesFragment[] };
export type ConnectionInitConfig = Omit<InitConnectionMutationVariables, 'includeOrigin' | 'customIncludeOriginDetails' | 'includeAuthProperties' | 'customIncludeNetworkHandlerCredentials'>;
@@ -45,7 +46,8 @@ export const DEFAULT_NAVIGATOR_VIEW_SETTINGS: NavigatorSettingsInput = {
};
@injectable()
export class ConnectionInfoResource extends CachedMapResource<string, Connection, ConnectionInfoIncludes> {
export class ConnectionInfoResource extends CachedMapResource<string, Connection, ConnectionInfoIncludes>
implements IConnectionsResource {
readonly onConnectionCreate: ISyncExecutor<Connection>;
readonly onConnectionClose: ISyncExecutor<Connection>;
@@ -81,7 +83,7 @@ export class ConnectionInfoResource extends CachedMapResource<string, Connection
nodeIdMap: observable,
updateConnection: action,
createFromTemplate: action,
createConnection: action,
create: action,
createFromNode: action,
add: action,
});
@@ -103,17 +105,7 @@ export class ConnectionInfoResource extends CachedMapResource<string, Connection
return undefined;
}
async createFromTemplate(templateId: string, connectionName: string): Promise<Connection> {
const { connection } = await this.graphQLService.sdk.createConnectionFromTemplate({
templateId,
connectionName,
...this.getDefaultIncludes(),
...this.getIncludesMap(),
});
return this.add(connection);
}
async createConnection(config: ConnectionConfig): Promise<Connection> {
async create(config: ConnectionConfig): Promise<Connection> {
const { connection } = await this.graphQLService.sdk.createConnection({
config,
...this.getDefaultIncludes(),
@@ -122,7 +114,7 @@ export class ConnectionInfoResource extends CachedMapResource<string, Connection
return this.add(connection);
}
async testConnection(config: ConnectionConfig): Promise<TestConnectionMutation['connection']> {
async test(config: ConnectionConfig): Promise<TestConnectionMutation['connection']> {
const { connection } = await this.graphQLService.sdk.testConnection({
config,
});
@@ -141,6 +133,16 @@ export class ConnectionInfoResource extends CachedMapResource<string, Connection
return this.add(connection);
}
async createFromTemplate(templateId: string, connectionName: string): Promise<Connection> {
const { connection } = await this.graphQLService.sdk.createConnectionFromTemplate({
templateId,
connectionName,
...this.getDefaultIncludes(),
...this.getIncludesMap(),
});
return this.add(connection);
}
addList(connections: Connection[]): Connection[] {
const newConnections = connections.filter(connection => !this.data.has(connection.id));
const key = this.updateConnection(...connections);
@@ -6,35 +6,30 @@
* you may not use this file except in compliance with the License.
*/
import { Subject } from 'rxjs';
import { ProcessSnackbar } from '@cloudbeaver/core-blocks';
import { injectable } from '@cloudbeaver/core-di';
import { CommonDialogService, ConfirmationDialogDelete, DialogueStateResult } from '@cloudbeaver/core-dialogs';
import { NotificationService } from '@cloudbeaver/core-events';
import { Executor, IExecutionContextProvider, IExecutor } from '@cloudbeaver/core-executor';
import { Executor, IExecutor } from '@cloudbeaver/core-executor';
import { ConnectionAuthService } from './ConnectionAuthService';
import { ConnectionInfoResource, Connection } from './ConnectionInfoResource';
import { ContainerResource, ObjectContainer } from './ContainerResource';
import { EConnectionFeature } from './EConnectionFeature';
@injectable()
export class ConnectionsManagerService {
onOpenConnection = new Subject<Connection>();
readonly connectionExecutor: IExecutor<string | null>;
private disconnecting: boolean;
private connectionExecutor: IExecutor<string | null>;
constructor(
readonly connectionInfo: ConnectionInfoResource,
readonly connectionObjectContainers: ContainerResource,
private notificationService: NotificationService,
private connectionAuthService: ConnectionAuthService,
private commonDialogService: CommonDialogService
) {
this.disconnecting = false;
this.connectionExecutor = new Executor<string | null>(null, (active, current) => active === current);
this.connectionExecutor.addHandler(this.connectionDialog.bind(this));
}
async requireConnection(connectionId: string | null = null): Promise<Connection | null> {
@@ -88,35 +83,12 @@ export class ConnectionsManagerService {
return !!this.connectionInfo.values.length;
}
private connectionContext() {
connectionContext() {
return {
connection: null as (Connection | null),
};
}
private async connectionDialog(connectionId: string | null, context: IExecutionContextProvider<string | null>) {
const connection = context.getContext(this.connectionContext);
if (!connectionId) {
if (!this.hasAnyConnection()) {
return;
}
connectionId = this.connectionInfo.values[0].id;
}
try {
const tempConnection = await this.connectionAuthService.auth(connectionId);
if (!tempConnection?.connected) {
return;
}
connection.connection = tempConnection;
} catch (exception) {
this.notificationService.logException(exception);
throw exception;
}
}
private async _closeConnectionAsync(connection: Connection) {
if (!connection.connected) {
return;
@@ -165,6 +137,5 @@ export class ConnectionsManagerService {
private addConnection(connection: Connection) {
this.connectionInfo.set(connection.id, connection);
this.onOpenConnection.next(connection);
}
}
@@ -7,6 +7,7 @@
*/
import { injectable } from '@cloudbeaver/core-di';
import { EPermission, PermissionsResource } from '@cloudbeaver/core-root';
import {
GraphQLService,
CachedMapResource,
@@ -22,8 +23,12 @@ export type DBDriver = DatabaseDriverFragment;
@injectable()
export class DBDriverResource extends CachedMapResource<string, DBDriver, DriverListQueryVariables> {
constructor(private graphQLService: GraphQLService) {
constructor(
private graphQLService: GraphQLService,
permissionsResource: PermissionsResource,
) {
super();
permissionsResource.require(this, EPermission.public);
}
async loadAll(): Promise<Map<string, DBDriver>> {
@@ -0,0 +1,26 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2021 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 { AUTH_PROVIDER_LOCAL_ID } from '@cloudbeaver/core-authentication';
import type { DatabaseConnectionFragment } from '@cloudbeaver/core-sdk';
export type DatabaseConnection = DatabaseConnectionFragment;
export function isLocalConnection(connection: DatabaseConnection): boolean {
if (!connection.origin) {
return true;
}
return connection.origin.type === AUTH_PROVIDER_LOCAL_ID;
}
export function isCloudConnection(connection: DatabaseConnection): boolean {
if (!connection.origin) {
return false;
}
return connection.origin.type === 'cloud';
}
@@ -0,0 +1,18 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2021 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 type { CachedMapResource, ConnectionConfig, GetConnectionsQueryVariables, TestConnectionMutation } from '@cloudbeaver/core-sdk';
import type { DatabaseConnection } from './DatabaseConnection';
export interface IConnectionsResource
extends CachedMapResource<string, DatabaseConnection, GetConnectionsQueryVariables> {
update: (config: ConnectionConfig) => Promise<DatabaseConnection>;
create: (config: ConnectionConfig) => Promise<DatabaseConnection>;
test: (config: ConnectionConfig) => Promise<TestConnectionMutation['connection']>;
}
+3 -25
View File
@@ -1,43 +1,21 @@
export * from './Administration/Connections/ConnectionsAdministration';
export * from './Administration/Connections/ConnectionsAdministrationNavService';
export * from './Administration/Connections/ConnectionsAdministrationService';
export * from './Administration/Connections/CreateConnection/Manual/ConnectionManualService';
export * from './Administration/Connections/CreateConnection/Search/ConnectionSearchService';
export * from './Administration/Connections/CreateConnection/CreateConnectionBaseBootstrap';
export * from './Administration/Connections/CreateConnectionService';
export * from './Administration/ConnectionsResource';
export * from './ConnectionExecutionContext/ConnectionExecutionContext';
export * from './ConnectionExecutionContext/ConnectionExecutionContextResource';
export * from './ConnectionExecutionContext/ConnectionExecutionContextService';
export * from './ConnectionExecutionContext/IConnectionExecutionContext';
export * from './ConnectionExecutionContext/IConnectionExecutionContextInfo';
export * from './ConnectionForm/Options/ConnectionOptionsTabService';
export * from './ConnectionForm/DriverProperties/ConnectionDriverPropertiesTabService';
export * from './ConnectionForm/SSH/ConnectionSSHTabService';
export * from './ConnectionForm/OriginInfo/ConnectionOriginInfoTabService';
export * from './ConnectionForm/ConnectionAccess/ConnectionAccessTabService';
export * from './ConnectionForm/Contexts/connectionConfigContext';
export * from './ConnectionForm/ConnectionFormBaseActions';
export * from './ConnectionForm/connectionFormConfigureContext';
export * from './ConnectionForm/ConnectionForm';
export * from './ConnectionForm/ConnectionFormService';
export * from './ConnectionForm/ConnectionFormState';
export * from './ConnectionForm/Contexts/connectionFormStateContext';
export * from './ConnectionForm/IConnectionFormProps';
export * from './ConnectionForm/useConnectionFormState';
export * from './ConnectionAuthentication/IConnectionAuthenticationConfig';
export * from './ConnectionAuthentication/ConnectionAuthenticationForm';
export * from './extensions/IConnectionProvider';
export * from './extensions/IConnectionSetter';
export * from './ConnectionsManagerService';
export * from './ConnectionInfoResource';
export * from './ConnectionAuthService';
export * from './EConnectionFeature';
export * from './ContainerResource';
export * from './ConnectionsLocaleService';
export * from './DatabaseAuthModelsResource';
export * from './DatabaseConnection';
export * from './DBDriverResource';
export * from './IConnectionsResource';
export * from './isJDBCConnection';
export * from './NetworkHandlerResource';
export * from './useConnectionInfo';
export * from './useDBDriver';
@@ -6,7 +6,7 @@
* you may not use this file except in compliance with the License.
*/
import type { DatabaseConnection } from './Administration/ConnectionsResource';
import type { DatabaseConnection } from './DatabaseConnection';
import type { DBDriver } from './DBDriverResource';
export function isJDBCConnection(driver?: DBDriver, connection?: DatabaseConnection): boolean {
@@ -44,8 +44,8 @@ export abstract class CachedDataResource<
> {
protected loaded: boolean;
constructor(defaultValue: TData) {
super(defaultValue, []);
constructor(defaultValue: TData, defaultIncludes: ContextArg<TData, TContext>) {
super(defaultValue, defaultIncludes as any as string[]);
this.loaded = false;
@@ -0,0 +1,51 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2021 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 { EAdminPermission, AdministrationScreenService } from '@cloudbeaver/core-administration';
import { SettingsMenuService } from '@cloudbeaver/core-app';
import { Bootstrap, injectable } from '@cloudbeaver/core-di';
import { PermissionsService } from '@cloudbeaver/core-root';
import { ScreenService } from '@cloudbeaver/core-routing';
@injectable()
export class PluginBootstrap extends Bootstrap {
constructor(
private settingsMenuService: SettingsMenuService,
private permissionsService: PermissionsService,
private screenService: ScreenService,
private administrationScreenService: AdministrationScreenService,
) {
super();
}
register(): void {
this.settingsMenuService.addMenuItem(
SettingsMenuService.settingsMenuToken,
{
id: 'administrationMenuEnter',
order: 0,
isHidden: () => !this.permissionsService.has(EAdminPermission.admin)
|| this.screenService.isActive(AdministrationScreenService.screenName),
title: 'administration_menu_enter',
onClick: () => this.administrationScreenService.navigateToRoot(),
}
);
this.settingsMenuService.addMenuItem(
SettingsMenuService.settingsMenuToken,
{
id: 'administrationMenuBack',
order: 0,
isHidden: () => !this.screenService.isActive(AdministrationScreenService.screenName),
title: 'administration_menu_back',
onClick: () => this.screenService.navigateToRoot(),
}
);
}
load(): void {}
}
@@ -12,6 +12,7 @@ import { ConfigurationWizardPagesBootstrapService } from './ConfigurationWizard/
import { ServerConfigurationService } from './ConfigurationWizard/ServerConfiguration/ServerConfigurationService';
import { ServerConfigurationAdministrationNavService } from './ConfigurationWizard/ServerConfigurationAdministrationNavService';
import { LocaleService } from './LocaleService';
import { PluginBootstrap } from './PluginBootstrap';
export const manifest: PluginManifest = {
info: {
@@ -23,5 +24,6 @@ export const manifest: PluginManifest = {
ServerConfigurationAdministrationNavService,
ConfigurationWizardPagesBootstrapService,
LocaleService,
PluginBootstrap,
],
};
@@ -0,0 +1,17 @@
# dependencies
/node_modules
# testing
/coverage
# production
/lib
# misc
.DS_Store
.env*
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
@@ -0,0 +1,44 @@
{
"name": "@cloudbeaver/plugin-authentication-administration",
"sideEffects": false,
"version": "0.1.0",
"description": "",
"license": "Apache-2.0",
"main": "lib/index.js",
"module": "lib/index.js",
"types": "src/index.ts",
"scripts": {
"prebuild": "rimraf lib/*",
"build": "webpack --config ../../configs/webpack.plugin.config.js",
"postbuild": "tsc",
"lint": "eslint ./src/ --ext .ts,.tsx",
"lint-fix": "eslint ./src/ --ext .ts,.tsx --fix"
},
"peerDependencies": {
"@cloudbeaver/core-administration": "^0.1.0",
"@cloudbeaver/core-authentication": "^0.1.0",
"@cloudbeaver/core-app": "^0.1.0",
"@cloudbeaver/core-blocks": "^0.1.0",
"@cloudbeaver/core-di": "^0.1.0",
"@cloudbeaver/core-dialogs": "^0.1.0",
"@cloudbeaver/core-events": "^0.1.0",
"@cloudbeaver/core-extensions": "^0.1.0",
"@cloudbeaver/core-localization": "^0.1.0",
"@cloudbeaver/core-notifications": "^0.1.0",
"@cloudbeaver/core-plugin": "^0.1.0",
"@cloudbeaver/core-product": "^0.1.0",
"@cloudbeaver/core-root": "^0.1.0",
"@cloudbeaver/core-sdk": "^0.1.0",
"@cloudbeaver/core-settings": "^0.1.0",
"@cloudbeaver/core-theming": "^0.1.0",
"@cloudbeaver/core-utils": "^0.1.0",
"@cloudbeaver/plugin-administration": "^0.1.0",
"@cloudbeaver/plugin-authentication-administration": "^0.1.0",
"@cloudbeaver/plugin-connections-administration": "^0.1.0",
"react": "^16.x.x",
"rxjs": "^6.x.x",
"mobx": "^5.x.x",
"mobx-react-lite": "^3.x.x",
"reshadow": "^0.x.x"
}
}
@@ -16,10 +16,11 @@ import {
InfoItem, Loader, TabContainerPanelComponent,
TextPlaceholder, useMapResource, useTab,
} from '@cloudbeaver/core-blocks';
import { ConnectionsResource, DBDriverResource, isCloudConnection } from '@cloudbeaver/core-connections';
import { DBDriverResource, isCloudConnection } from '@cloudbeaver/core-connections';
import { TLocalizationToken, useTranslate } from '@cloudbeaver/core-localization';
import { CachedMapAllKey } from '@cloudbeaver/core-sdk';
import { useStyles } from '@cloudbeaver/core-theming';
import { ConnectionsResource } from '@cloudbeaver/plugin-connections-administration';
import type { IRoleFormProps } from '../IRoleFormProps';
import { ConnectionList } from './ConnectionList';

Some files were not shown because too many files have changed in this diff Show More