diff --git a/webapp/packages/core-app/public/icons/preload/icons.svg b/webapp/packages/core-app/public/icons/preload/icons.svg index 23efb21e38f..514a1c05272 100644 --- a/webapp/packages/core-app/public/icons/preload/icons.svg +++ b/webapp/packages/core-app/public/icons/preload/icons.svg @@ -581,4 +581,13 @@ + + + + + G + + + + diff --git a/webapp/packages/plugin-connection-administration/package.json b/webapp/packages/plugin-connection-administration/package.json new file mode 100644 index 00000000000..eca24223d47 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/package.json @@ -0,0 +1,44 @@ +{ + "name": "@cloudbeaver/plugin-connection-administration", + "type": "module", + "sideEffects": [ + "./lib/module.js", + "./lib/index.js", + "src/**/*.css", + "public/**/*" + ], + "version": "0.1.0", + "description": "", + "license": "Apache-2.0", + "exports": { + ".": "./lib/index.js", + "./module": "./lib/module.js" + }, + "scripts": { + "build": "tsc -b", + "clean": "rimraf --glob lib", + "lint": "eslint ./src/ --ext .ts,.tsx", + "test": "dbeaver-test", + "validate-dependencies": "core-cli-validate-dependencies" + }, + "dependencies": { + "@cloudbeaver/core-administration": "workspace:*", + "@cloudbeaver/core-blocks": "workspace:*", + "@cloudbeaver/core-di": "workspace:*", + "@cloudbeaver/core-localization": "workspace:*", + "@cloudbeaver/core-ui": "workspace:*", + "mobx-react-lite": "^4", + "react": "^19", + "react-dom": "^19", + "tslib": "^2" + }, + "devDependencies": { + "@cloudbeaver/core-cli": "workspace:*", + "@cloudbeaver/tsconfig": "workspace:*", + "@dbeaver/cli": "workspace:*", + "@types/react": "^19", + "rimraf": "^6", + "typescript": "^5", + "typescript-plugin-css-modules": "^5" + } +} diff --git a/webapp/packages/plugin-connection-administration/public/icons/plugin_connections.svg b/webapp/packages/plugin-connection-administration/public/icons/plugin_connections.svg new file mode 100644 index 00000000000..f7607fa8b8b --- /dev/null +++ b/webapp/packages/plugin-connection-administration/public/icons/plugin_connections.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/webapp/packages/plugin-connection-administration/public/icons/plugin_connections_m.svg b/webapp/packages/plugin-connection-administration/public/icons/plugin_connections_m.svg new file mode 100644 index 00000000000..f03beeceaaf --- /dev/null +++ b/webapp/packages/plugin-connection-administration/public/icons/plugin_connections_m.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/webapp/packages/plugin-connection-administration/public/icons/plugin_connections_sm.svg b/webapp/packages/plugin-connection-administration/public/icons/plugin_connections_sm.svg new file mode 100644 index 00000000000..a09f46045e2 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/public/icons/plugin_connections_sm.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/webapp/packages/plugin-connection-administration/src/ADMINISTRATION_CONNECTIONS_ITEM.ts b/webapp/packages/plugin-connection-administration/src/ADMINISTRATION_CONNECTIONS_ITEM.ts new file mode 100644 index 00000000000..d5e4186cfa7 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/ADMINISTRATION_CONNECTIONS_ITEM.ts @@ -0,0 +1,9 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2026 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +export const ADMINISTRATION_CONNECTIONS_ITEM = 'connections'; diff --git a/webapp/packages/plugin-connection-administration/src/ConnectionsAdministration.tsx b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministration.tsx new file mode 100644 index 00000000000..65aaabe1aba --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministration.tsx @@ -0,0 +1,75 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2026 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react-lite'; + +import type { AdministrationItemContentComponent, AdministrationItemContentProps } from '@cloudbeaver/core-administration'; +import { s, SContext, type StyleRegistry, ToolsPanel, useS, useTranslate } from '@cloudbeaver/core-blocks'; +import { useService } from '@cloudbeaver/core-di'; +import { type ITabData, TabList, TabPanelList, TabPanelStyles, TabsState, TabStyles, TabTitleStyles } from '@cloudbeaver/core-ui'; + +import style from './shared/ConnectionsAdministration.module.css'; +import tabStyle from './shared/ConnectionsAdministrationTab.module.css'; +import tabPanelStyle from './shared/ConnectionsAdministrationTabPanel.module.css'; +import TabTitleModuleStyles from './shared/ConnectionsAdministrationTabTitle.module.css'; +import { ConnectionsAdministrationNavService } from './ConnectionsAdministrationNavService.js'; +import { ConnectionsAdministrationTabService } from './ConnectionsAdministrationTabService.js'; + +const tabPanelRegistry: StyleRegistry = [[TabPanelStyles, { mode: 'append', styles: [tabPanelStyle] }]]; + +const mainTabsRegistry: StyleRegistry = [ + [TabStyles, { mode: 'append', styles: [tabStyle] }], + [TabTitleStyles, { mode: 'append', styles: [TabTitleModuleStyles] }], +]; + +export const ConnectionsAdministration: AdministrationItemContentComponent = observer(function ConnectionsAdministration({ + item, + configurationWizard, + sub, + param, +}) { + const translate = useTranslate(); + const connectionsAdministrationNavService = useService(ConnectionsAdministrationNavService); + const connectionsAdministrationTabService = useService(ConnectionsAdministrationTabService); + const styles = useS(style, tabStyle); + + function openSub({ tabId }: ITabData) { + if (sub?.name === tabId) { + return; + } + + connectionsAdministrationNavService.navToSub(tabId); + } + + return ( + + + + + + + + + + + ); +}); diff --git a/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationNavService.ts b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationNavService.ts new file mode 100644 index 00000000000..c09152593a4 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationNavService.ts @@ -0,0 +1,25 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2026 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { AdministrationScreenService } from '@cloudbeaver/core-administration'; +import { injectable } from '@cloudbeaver/core-di'; + +import { ADMINISTRATION_CONNECTIONS_ITEM } from './ADMINISTRATION_CONNECTIONS_ITEM.js'; + +@injectable(() => [AdministrationScreenService]) +export class ConnectionsAdministrationNavService { + constructor(private readonly administrationScreenService: AdministrationScreenService) {} + + navToRoot(): void { + this.administrationScreenService.navigateToItem(ADMINISTRATION_CONNECTIONS_ITEM); + } + + navToSub(sub: string, param?: string): void { + this.administrationScreenService.navigateToItemSub(ADMINISTRATION_CONNECTIONS_ITEM, sub, param); + } +} diff --git a/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationServiceBootstrap.ts b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationServiceBootstrap.ts new file mode 100644 index 00000000000..f03f2e7d04e --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationServiceBootstrap.ts @@ -0,0 +1,21 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2026 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { Bootstrap, injectable } from '@cloudbeaver/core-di'; +import { ConnectionsAdministrationTabService } from './ConnectionsAdministrationTabService.js'; + +@injectable(() => [ConnectionsAdministrationTabService]) +export class ConnectionsAdministrationServiceBootstrap extends Bootstrap { + constructor(private readonly connectionsAdministrationTabService: ConnectionsAdministrationTabService) { + super(); + } + + override register(): void | Promise { + this.connectionsAdministrationTabService.createRootTab(); + } +} diff --git a/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationTabService.ts b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationTabService.ts new file mode 100644 index 00000000000..29a002312b0 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationTabService.ts @@ -0,0 +1,62 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2026 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { + AdministrationItemService, + type AdministrationItemSubCanActivateEvent, + type AdministrationItemSubEvent, + type AdministrationItemContentProps, + type IAdministrationItem, +} from '@cloudbeaver/core-administration'; +import { importLazyComponent } from '@cloudbeaver/core-blocks'; +import { injectable } from '@cloudbeaver/core-di'; +import { TabsContainer, type ITabInfoOptions } from '@cloudbeaver/core-ui'; + +import { ADMINISTRATION_CONNECTIONS_ITEM } from './ADMINISTRATION_CONNECTIONS_ITEM.js'; + +const ConnectionsAdministration = importLazyComponent(() => import('./ConnectionsAdministration.js').then(m => m.ConnectionsAdministration)); + +const ConnectionsDrawerItem = importLazyComponent(() => import('./ConnectionsDrawerItem.js').then(m => m.ConnectionsDrawerItem)); + +export interface IConnectionsTabOptions extends ITabInfoOptions { + onActivate?: AdministrationItemSubEvent; + onDeActivate?: AdministrationItemSubEvent; + canActivate?: AdministrationItemSubCanActivateEvent; + canDeActivate?: AdministrationItemSubCanActivateEvent; +} + +@injectable(() => [AdministrationItemService]) +export class ConnectionsAdministrationTabService { + readonly tabsContainer: TabsContainer; + + private item!: IAdministrationItem; + + constructor(private readonly administrationItemService: AdministrationItemService) { + this.tabsContainer = new TabsContainer('Connections administration tabs'); + } + + addSubTab({ onActivate, onDeActivate, canActivate, canDeActivate, ...tabInfo }: IConnectionsTabOptions): void { + this.tabsContainer.add(tabInfo); + + if (!this.item.sub.some(sub => sub.name === tabInfo.key)) { + this.item.sub.push({ name: tabInfo.key, onActivate, onDeActivate, canActivate, canDeActivate }); + } + + this.item.defaultSub ??= tabInfo.key; + } + + createRootTab(): void { + this.item = this.administrationItemService.create({ + name: ADMINISTRATION_CONNECTIONS_ITEM, + order: 7, + isHidden: () => this.item.sub.length === 0, + getContentComponent: () => ConnectionsAdministration, + getDrawerComponent: () => ConnectionsDrawerItem, + }); + } +} diff --git a/webapp/packages/plugin-connection-administration/src/ConnectionsDrawerItem.tsx b/webapp/packages/plugin-connection-administration/src/ConnectionsDrawerItem.tsx new file mode 100644 index 00000000000..a70c9b1108d --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/ConnectionsDrawerItem.tsx @@ -0,0 +1,22 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2026 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import type { AdministrationItemDrawerProps } from '@cloudbeaver/core-administration'; +import { Translate } from '@cloudbeaver/core-blocks'; +import { Tab, TabIcon, TabTitle } from '@cloudbeaver/core-ui'; + +export const ConnectionsDrawerItem: React.FC = function ConnectionsDrawerItem({ item, onSelect, disabled }) { + return ( + onSelect(item.name)}> + + + + + + ); +}; diff --git a/webapp/packages/plugin-connection-administration/src/LocaleService.ts b/webapp/packages/plugin-connection-administration/src/LocaleService.ts new file mode 100644 index 00000000000..fae7357b770 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/LocaleService.ts @@ -0,0 +1,29 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2026 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ +import { Bootstrap, injectable } from '@cloudbeaver/core-di'; +import { LocalizationService } from '@cloudbeaver/core-localization'; + +@injectable(() => [LocalizationService]) +export class LocaleService extends Bootstrap { + constructor(private readonly localizationService: LocalizationService) { + super(); + } + + override register(): void { + this.localizationService.addProvider(this.provider.bind(this)); + } + + private async provider(locale: string) { + switch (locale) { + case 'ru': + return (await import('./locales/ru.js')).default; + default: + return (await import('./locales/en.js')).default; + } + } +} diff --git a/webapp/packages/plugin-connection-administration/src/index.ts b/webapp/packages/plugin-connection-administration/src/index.ts new file mode 100644 index 00000000000..1ac8a05198d --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/index.ts @@ -0,0 +1,13 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2026 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import './module.js'; + +export * from './ADMINISTRATION_CONNECTIONS_ITEM.js'; +export * from './ConnectionsAdministrationNavService.js'; +export * from './ConnectionsAdministrationTabService.js'; diff --git a/webapp/packages/plugin-connection-administration/src/locales/en.ts b/webapp/packages/plugin-connection-administration/src/locales/en.ts new file mode 100644 index 00000000000..f9ec4ecc7ea --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/locales/en.ts @@ -0,0 +1 @@ +export default [['plugin_connection_administration_label', 'Connections']]; diff --git a/webapp/packages/plugin-connection-administration/src/locales/ru.ts b/webapp/packages/plugin-connection-administration/src/locales/ru.ts new file mode 100644 index 00000000000..93fb568760b --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/locales/ru.ts @@ -0,0 +1 @@ +export default [['plugin_connection_administration_label', 'Соединения']]; diff --git a/webapp/packages/plugin-connection-administration/src/module.ts b/webapp/packages/plugin-connection-administration/src/module.ts new file mode 100644 index 00000000000..27eb914a90c --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/module.ts @@ -0,0 +1,25 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2026 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ +import { Bootstrap, ModuleRegistry } from '@cloudbeaver/core-di'; + +import { ConnectionsAdministrationTabService } from './ConnectionsAdministrationTabService.js'; +import { ConnectionsAdministrationNavService } from './ConnectionsAdministrationNavService.js'; +import { LocaleService } from './LocaleService.js'; +import { ConnectionsAdministrationServiceBootstrap } from './ConnectionsAdministrationServiceBootstrap.js'; + +export default ModuleRegistry.add({ + name: '@cloudbeaver/plugin-connection-administration', + + configure: serviceCollection => { + serviceCollection + .addSingleton(Bootstrap, LocaleService) + .addSingleton(Bootstrap, ConnectionsAdministrationServiceBootstrap) + .addSingleton(ConnectionsAdministrationTabService) + .addSingleton(ConnectionsAdministrationNavService); + }, +}); diff --git a/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministration.module.css b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministration.module.css new file mode 100644 index 00000000000..eca294599e3 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministration.module.css @@ -0,0 +1,6 @@ +.tabList { + position: relative; + flex-shrink: 0; + align-items: center; + padding: 0 24px; +} diff --git a/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTab.module.css b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTab.module.css new file mode 100644 index 00000000000..b75fcefafac --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTab.module.css @@ -0,0 +1,16 @@ +.administrationTabs { + & .tab { + height: 100%; + font-size: 14px; + font-weight: 700; + padding: 0 4px; + } + + & .tabInner { + height: 100%; + } + + & .tabOuter { + height: 100%; + } +} diff --git a/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabPanel.module.css b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabPanel.module.css new file mode 100644 index 00000000000..fc8fc508d05 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabPanel.module.css @@ -0,0 +1,3 @@ +.tabPanel { + overflow: auto; +} diff --git a/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabTitle.module.css b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabTitle.module.css new file mode 100644 index 00000000000..fe72df1e427 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabTitle.module.css @@ -0,0 +1,3 @@ +.tabTitle { + font-weight: 700; +} diff --git a/webapp/packages/plugin-connection-administration/tsconfig.json b/webapp/packages/plugin-connection-administration/tsconfig.json new file mode 100644 index 00000000000..26d1429ff61 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/tsconfig.json @@ -0,0 +1,45 @@ +{ + "extends": "@cloudbeaver/tsconfig/tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "lib", + "tsBuildInfoFile": "lib/tsconfig.tsbuildinfo", + "composite": true + }, + "references": [ + { + "path": "../../common-typescript/@dbeaver/cli" + }, + { + "path": "../core-administration" + }, + { + "path": "../core-blocks" + }, + { + "path": "../core-cli" + }, + { + "path": "../core-di" + }, + { + "path": "../core-di/tsconfig.json" + }, + { + "path": "../core-localization" + }, + { + "path": "../core-ui" + } + ], + "include": [ + "__custom_mocks__/**/*", + "src/**/*", + "src/**/*.json", + "src/**/*.css" + ], + "exclude": [ + "**/node_modules", + "lib/**/*" + ] +} diff --git a/webapp/packages/plugin-network-handlers/src/SSH/SSHForm.tsx b/webapp/packages/plugin-network-handlers/src/SSH/SSHForm.tsx index 08a9b16929e..f6f7a0c2ef8 100644 --- a/webapp/packages/plugin-network-handlers/src/SSH/SSHForm.tsx +++ b/webapp/packages/plugin-network-handlers/src/SSH/SSHForm.tsx @@ -43,7 +43,8 @@ export interface ISSHFormProps { disabled?: boolean; readonly?: boolean; sharedCredentials?: boolean; - projectId: string; + /** Omit for handlers not bound to any particular project, e.g. global network profiles */ + projectId?: string; connectionId?: string; } @@ -86,7 +87,7 @@ export const SSHForm = observer(function SSHForm({ const connectTimeoutLabel = translate('plugin_network_handlers_ssh_tunnel_advanced_settings_connect_timeout'); const { credentialsSavingEnabled } = useAdministrationSettings(); const projectInfoResource = useService(ProjectInfoResource); - const isSharedProject = projectInfoResource.isProjectShared(projectId); + const isSharedProject = projectInfoResource.isProjectShared(projectId ?? null); const showSaveCredentials = credentialsSavingEnabled && !sharedCredentials; const handleAuthTypeChange = useCallback(() => { diff --git a/webapp/packages/plugin-set-common/package.json b/webapp/packages/plugin-set-common/package.json index 90b8f90e6e6..5654e37cb14 100644 --- a/webapp/packages/plugin-set-common/package.json +++ b/webapp/packages/plugin-set-common/package.json @@ -63,6 +63,7 @@ "@cloudbeaver/plugin-authentication-administration": "workspace:*", "@cloudbeaver/plugin-browser": "workspace:*", "@cloudbeaver/plugin-codemirror6": "workspace:*", + "@cloudbeaver/plugin-connection-administration": "workspace:*", "@cloudbeaver/plugin-connection-custom": "workspace:*", "@cloudbeaver/plugin-connection-network-handlers": "workspace:*", "@cloudbeaver/plugin-connection-preferences": "workspace:*", diff --git a/webapp/packages/plugin-set-common/src/index.ts b/webapp/packages/plugin-set-common/src/index.ts index 29b8092569e..7ab5529fa54 100644 --- a/webapp/packages/plugin-set-common/src/index.ts +++ b/webapp/packages/plugin-set-common/src/index.ts @@ -49,6 +49,7 @@ import pluginAppLogoAdministration from '@cloudbeaver/plugin-app-logo-administra import pluginAuthentication from '@cloudbeaver/plugin-authentication/module'; import pluginAuthenticationAdministration from '@cloudbeaver/plugin-authentication-administration/module'; import pluginBrowser from '@cloudbeaver/plugin-browser/module'; +import pluginConnectionAdministration from '@cloudbeaver/plugin-connection-administration/module'; import pluginConnectionCustom from '@cloudbeaver/plugin-connection-custom/module'; import pluginConnectionSearch from '@cloudbeaver/plugin-connection-search/module'; import pluginConnections from '@cloudbeaver/plugin-connections/module'; @@ -166,6 +167,7 @@ export const commonSet = [ pluginAuthenticationAdministration, pluginTheme, pluginLocalization, + pluginConnectionAdministration, pluginConnectionCustom, pluginConnectionSearch, pluginDataExport, diff --git a/webapp/packages/plugin-set-common/tsconfig.json b/webapp/packages/plugin-set-common/tsconfig.json index 8dc109d16dc..dcdb3ea3549 100644 --- a/webapp/packages/plugin-set-common/tsconfig.json +++ b/webapp/packages/plugin-set-common/tsconfig.json @@ -136,6 +136,9 @@ { "path": "../plugin-codemirror6" }, + { + "path": "../plugin-connection-administration" + }, { "path": "../plugin-connection-custom" }, diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 616f190dd12..4265eebbf60 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -2657,6 +2657,29 @@ __metadata: languageName: unknown linkType: soft +"@cloudbeaver/plugin-connection-administration@workspace:*, @cloudbeaver/plugin-connection-administration@workspace:packages/plugin-connection-administration": + version: 0.0.0-use.local + resolution: "@cloudbeaver/plugin-connection-administration@workspace:packages/plugin-connection-administration" + dependencies: + "@cloudbeaver/core-administration": "workspace:*" + "@cloudbeaver/core-blocks": "workspace:*" + "@cloudbeaver/core-cli": "workspace:*" + "@cloudbeaver/core-di": "workspace:*" + "@cloudbeaver/core-localization": "workspace:*" + "@cloudbeaver/core-ui": "workspace:*" + "@cloudbeaver/tsconfig": "workspace:*" + "@dbeaver/cli": "workspace:*" + "@types/react": "npm:^19" + mobx-react-lite: "npm:^4" + react: "npm:^19" + react-dom: "npm:^19" + rimraf: "npm:^6" + tslib: "npm:^2" + typescript: "npm:^5" + typescript-plugin-css-modules: "npm:^5" + languageName: unknown + linkType: soft + "@cloudbeaver/plugin-connection-custom@workspace:*, @cloudbeaver/plugin-connection-custom@workspace:packages/plugin-connection-custom": version: 0.0.0-use.local resolution: "@cloudbeaver/plugin-connection-custom@workspace:packages/plugin-connection-custom" @@ -4113,6 +4136,7 @@ __metadata: "@cloudbeaver/plugin-authentication-administration": "workspace:*" "@cloudbeaver/plugin-browser": "workspace:*" "@cloudbeaver/plugin-codemirror6": "workspace:*" + "@cloudbeaver/plugin-connection-administration": "workspace:*" "@cloudbeaver/plugin-connection-custom": "workspace:*" "@cloudbeaver/plugin-connection-network-handlers": "workspace:*" "@cloudbeaver/plugin-connection-preferences": "workspace:*"