From bac9ee6d9ce2151fcd4a7b9d6d93d93f170e475b Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Wed, 15 Jul 2026 16:31:56 +0200 Subject: [PATCH 1/6] dbeaver/pro#9665 adds global network profiles --- .../package.json | 44 +++++++++++ .../public/icons/plugin_connections.svg | 16 ++++ .../public/icons/plugin_connections_m.svg | 16 ++++ .../public/icons/plugin_connections_sm.svg | 16 ++++ .../src/ADMINISTRATION_CONNECTIONS_ITEM.ts | 9 +++ .../src/ConnectionsAdministration.tsx | 75 +++++++++++++++++++ .../ConnectionsAdministrationNavService.ts | 25 +++++++ .../src/ConnectionsAdministrationService.ts | 59 +++++++++++++++ .../src/ConnectionsDrawerItem.tsx | 22 ++++++ .../src/LocaleService.ts | 29 +++++++ .../src/index.ts | 5 ++ .../src/locales/en.ts | 1 + .../src/locales/ru.ts | 1 + .../src/module.ts | 24 ++++++ .../ConnectionsAdministration.module.css | 14 ++++ .../ConnectionsAdministrationTab.module.css | 24 ++++++ ...nnectionsAdministrationTabPanel.module.css | 11 +++ ...nnectionsAdministrationTabTitle.module.css | 11 +++ .../tsconfig.json | 45 +++++++++++ .../src/SSH/SSHForm.tsx | 5 +- .../packages/plugin-set-common/package.json | 1 + .../packages/plugin-set-common/src/index.ts | 2 + .../packages/plugin-set-common/tsconfig.json | 3 + webapp/yarn.lock | 24 ++++++ 24 files changed, 480 insertions(+), 2 deletions(-) create mode 100644 webapp/packages/plugin-connection-administration/package.json create mode 100644 webapp/packages/plugin-connection-administration/public/icons/plugin_connections.svg create mode 100644 webapp/packages/plugin-connection-administration/public/icons/plugin_connections_m.svg create mode 100644 webapp/packages/plugin-connection-administration/public/icons/plugin_connections_sm.svg create mode 100644 webapp/packages/plugin-connection-administration/src/ADMINISTRATION_CONNECTIONS_ITEM.ts create mode 100644 webapp/packages/plugin-connection-administration/src/ConnectionsAdministration.tsx create mode 100644 webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationNavService.ts create mode 100644 webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationService.ts create mode 100644 webapp/packages/plugin-connection-administration/src/ConnectionsDrawerItem.tsx create mode 100644 webapp/packages/plugin-connection-administration/src/LocaleService.ts create mode 100644 webapp/packages/plugin-connection-administration/src/index.ts create mode 100644 webapp/packages/plugin-connection-administration/src/locales/en.ts create mode 100644 webapp/packages/plugin-connection-administration/src/locales/ru.ts create mode 100644 webapp/packages/plugin-connection-administration/src/module.ts create mode 100644 webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministration.module.css create mode 100644 webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTab.module.css create mode 100644 webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabPanel.module.css create mode 100644 webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabTitle.module.css create mode 100644 webapp/packages/plugin-connection-administration/tsconfig.json 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..6cbb6c664ad --- /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 { ConnectionsAdministrationService } from './ConnectionsAdministrationService.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 connectionsAdministrationService = useService(ConnectionsAdministrationService); + 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/ConnectionsAdministrationService.ts b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationService.ts new file mode 100644 index 00000000000..54199852a2d --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationService.ts @@ -0,0 +1,59 @@ +/* + * 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 AdministrationItemContentProps, + type AdministrationItemSubEvent, + type IAdministrationItem, +} from '@cloudbeaver/core-administration'; +import { importLazyComponent } from '@cloudbeaver/core-blocks'; +import { Bootstrap, 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; +} + +@injectable(() => [AdministrationItemService]) +export class ConnectionsAdministrationService extends Bootstrap { + readonly tabsContainer: TabsContainer; + + private item!: IAdministrationItem; + + constructor(private readonly administrationItemService: AdministrationItemService) { + super(); + this.tabsContainer = new TabsContainer('Connections administration tabs'); + } + + addTab({ onActivate, onDeActivate, ...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 }); + } + + this.item.defaultSub ??= tabInfo.key; + } + + override register(): void { + this.item = this.administrationItemService.create({ + name: ADMINISTRATION_CONNECTIONS_ITEM, + order: 7, + 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..f47b68e5d10 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/index.ts @@ -0,0 +1,5 @@ +import './module.js'; + +export * from './ADMINISTRATION_CONNECTIONS_ITEM.js'; +export * from './ConnectionsAdministrationNavService.js'; +export * from './ConnectionsAdministrationService.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..da68c953081 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/module.ts @@ -0,0 +1,24 @@ +/* + * 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, proxy } from '@cloudbeaver/core-di'; + +import { ConnectionsAdministrationService } from './ConnectionsAdministrationService.js'; +import { ConnectionsAdministrationNavService } from './ConnectionsAdministrationNavService.js'; +import { LocaleService } from './LocaleService.js'; + +export default ModuleRegistry.add({ + name: '@cloudbeaver/plugin-connection-administration', + + configure: serviceCollection => { + serviceCollection + .addSingleton(Bootstrap, LocaleService) + .addSingleton(Bootstrap, proxy(ConnectionsAdministrationService)) + .addSingleton(ConnectionsAdministrationService) + .addSingleton(ConnectionsAdministrationNavService); + }, +}); \ No newline at end of file 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..9e5dc1359fe --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministration.module.css @@ -0,0 +1,14 @@ +/* + * 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. + */ + +.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..cffeccdadc2 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTab.module.css @@ -0,0 +1,24 @@ +/* + * 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. + */ + +.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..f695aa6fe95 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabPanel.module.css @@ -0,0 +1,11 @@ +/* + * 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. + */ + +.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..5d6a73b3969 --- /dev/null +++ b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabTitle.module.css @@ -0,0 +1,11 @@ +/* + * 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. + */ + +.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 0e583545f97..99bd1711dac 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" @@ -4112,6 +4135,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:*" From 8568eebf481242f1ee94e7b72472d728da48f116 Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Thu, 16 Jul 2026 14:35:26 +0200 Subject: [PATCH 2/6] dbeaver/pro#9665 marks global profiles in selector --- webapp/packages/core-app/public/icons/preload/icons.svg | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/webapp/packages/core-app/public/icons/preload/icons.svg b/webapp/packages/core-app/public/icons/preload/icons.svg index 23efb21e38f..5f62a1e6a3e 100644 --- a/webapp/packages/core-app/public/icons/preload/icons.svg +++ b/webapp/packages/core-app/public/icons/preload/icons.svg @@ -581,4 +581,10 @@ + + + + G + + From 1efaf632cf39d4f6c3344041756c8d12ad4c8f89 Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Thu, 16 Jul 2026 14:56:23 +0200 Subject: [PATCH 3/6] dbeaver/pro#9665 cleanup --- .../src/shared/ConnectionsAdministration.module.css | 8 -------- .../src/shared/ConnectionsAdministrationTab.module.css | 8 -------- .../shared/ConnectionsAdministrationTabPanel.module.css | 8 -------- .../shared/ConnectionsAdministrationTabTitle.module.css | 8 -------- 4 files changed, 32 deletions(-) diff --git a/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministration.module.css b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministration.module.css index 9e5dc1359fe..eca294599e3 100644 --- a/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministration.module.css +++ b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministration.module.css @@ -1,11 +1,3 @@ -/* - * 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. - */ - .tabList { position: relative; flex-shrink: 0; diff --git a/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTab.module.css b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTab.module.css index cffeccdadc2..b75fcefafac 100644 --- a/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTab.module.css +++ b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTab.module.css @@ -1,11 +1,3 @@ -/* - * 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. - */ - .administrationTabs { & .tab { 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 index f695aa6fe95..fc8fc508d05 100644 --- a/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabPanel.module.css +++ b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabPanel.module.css @@ -1,11 +1,3 @@ -/* - * 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. - */ - .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 index 5d6a73b3969..fe72df1e427 100644 --- a/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabTitle.module.css +++ b/webapp/packages/plugin-connection-administration/src/shared/ConnectionsAdministrationTabTitle.module.css @@ -1,11 +1,3 @@ -/* - * 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. - */ - .tabTitle { font-weight: 700; } From e6c46f325dca1597e845e189c43fcda0968e53af Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Thu, 16 Jul 2026 17:10:05 +0200 Subject: [PATCH 4/6] dbeaver/pro#9665 fixes document-global G color so it adapts to the theme --- webapp/packages/core-app/public/icons/preload/icons.svg | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/webapp/packages/core-app/public/icons/preload/icons.svg b/webapp/packages/core-app/public/icons/preload/icons.svg index 5f62a1e6a3e..514a1c05272 100644 --- a/webapp/packages/core-app/public/icons/preload/icons.svg +++ b/webapp/packages/core-app/public/icons/preload/icons.svg @@ -583,8 +583,11 @@ - - G + + + G + + From 239846918e1f5f33b61915f9485810d655bf5e35 Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Tue, 21 Jul 2026 13:43:38 +0200 Subject: [PATCH 5/6] dbeaver/pro#9665 splits logic to tab service & bootstrap --- .../src/ConnectionsAdministration.tsx | 6 +++--- ...nnectionsAdministrationServiceBootstrap.ts | 21 +++++++++++++++++++ ...=> ConnectionsAdministrationTabService.ts} | 9 ++++---- .../src/index.ts | 10 ++++++++- .../src/module.ts | 11 +++++----- 5 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationServiceBootstrap.ts rename webapp/packages/plugin-connection-administration/src/{ConnectionsAdministrationService.ts => ConnectionsAdministrationTabService.ts} (88%) diff --git a/webapp/packages/plugin-connection-administration/src/ConnectionsAdministration.tsx b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministration.tsx index 6cbb6c664ad..65aaabe1aba 100644 --- a/webapp/packages/plugin-connection-administration/src/ConnectionsAdministration.tsx +++ b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministration.tsx @@ -18,7 +18,7 @@ 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 { ConnectionsAdministrationService } from './ConnectionsAdministrationService.js'; +import { ConnectionsAdministrationTabService } from './ConnectionsAdministrationTabService.js'; const tabPanelRegistry: StyleRegistry = [[TabPanelStyles, { mode: 'append', styles: [tabPanelStyle] }]]; @@ -35,7 +35,7 @@ export const ConnectionsAdministration: AdministrationItemContentComponent = obs }) { const translate = useTranslate(); const connectionsAdministrationNavService = useService(ConnectionsAdministrationNavService); - const connectionsAdministrationService = useService(ConnectionsAdministrationService); + const connectionsAdministrationTabService = useService(ConnectionsAdministrationTabService); const styles = useS(style, tabStyle); function openSub({ tabId }: ITabData) { @@ -49,7 +49,7 @@ export const ConnectionsAdministration: AdministrationItemContentComponent = obs return ( [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/ConnectionsAdministrationService.ts b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationTabService.ts similarity index 88% rename from webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationService.ts rename to webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationTabService.ts index 54199852a2d..52754730f6f 100644 --- a/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationService.ts +++ b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationTabService.ts @@ -13,7 +13,7 @@ import { type IAdministrationItem, } from '@cloudbeaver/core-administration'; import { importLazyComponent } from '@cloudbeaver/core-blocks'; -import { Bootstrap, injectable } from '@cloudbeaver/core-di'; +import { injectable } from '@cloudbeaver/core-di'; import { TabsContainer, type ITabInfoOptions } from '@cloudbeaver/core-ui'; import { ADMINISTRATION_CONNECTIONS_ITEM } from './ADMINISTRATION_CONNECTIONS_ITEM.js'; @@ -28,17 +28,16 @@ export interface IConnectionsTabOptions extends ITabInfoOptions [AdministrationItemService]) -export class ConnectionsAdministrationService extends Bootstrap { +export class ConnectionsAdministrationTabService { readonly tabsContainer: TabsContainer; private item!: IAdministrationItem; constructor(private readonly administrationItemService: AdministrationItemService) { - super(); this.tabsContainer = new TabsContainer('Connections administration tabs'); } - addTab({ onActivate, onDeActivate, ...tabInfo }: IConnectionsTabOptions): void { + addSubTab({ onActivate, onDeActivate, ...tabInfo }: IConnectionsTabOptions): void { this.tabsContainer.add(tabInfo); if (!this.item.sub.some(sub => sub.name === tabInfo.key)) { @@ -48,7 +47,7 @@ export class ConnectionsAdministrationService extends Bootstrap { this.item.defaultSub ??= tabInfo.key; } - override register(): void { + createRootTab(): void { this.item = this.administrationItemService.create({ name: ADMINISTRATION_CONNECTIONS_ITEM, order: 7, diff --git a/webapp/packages/plugin-connection-administration/src/index.ts b/webapp/packages/plugin-connection-administration/src/index.ts index f47b68e5d10..1ac8a05198d 100644 --- a/webapp/packages/plugin-connection-administration/src/index.ts +++ b/webapp/packages/plugin-connection-administration/src/index.ts @@ -1,5 +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 './ConnectionsAdministrationService.js'; +export * from './ConnectionsAdministrationTabService.js'; diff --git a/webapp/packages/plugin-connection-administration/src/module.ts b/webapp/packages/plugin-connection-administration/src/module.ts index da68c953081..27eb914a90c 100644 --- a/webapp/packages/plugin-connection-administration/src/module.ts +++ b/webapp/packages/plugin-connection-administration/src/module.ts @@ -5,11 +5,12 @@ * Licensed under the Apache License, Version 2.0. * you may not use this file except in compliance with the License. */ -import { Bootstrap, ModuleRegistry, proxy } from '@cloudbeaver/core-di'; +import { Bootstrap, ModuleRegistry } from '@cloudbeaver/core-di'; -import { ConnectionsAdministrationService } from './ConnectionsAdministrationService.js'; +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', @@ -17,8 +18,8 @@ export default ModuleRegistry.add({ configure: serviceCollection => { serviceCollection .addSingleton(Bootstrap, LocaleService) - .addSingleton(Bootstrap, proxy(ConnectionsAdministrationService)) - .addSingleton(ConnectionsAdministrationService) + .addSingleton(Bootstrap, ConnectionsAdministrationServiceBootstrap) + .addSingleton(ConnectionsAdministrationTabService) .addSingleton(ConnectionsAdministrationNavService); }, -}); \ No newline at end of file +}); From d9561e40a28ab0df4ba369020e0a1d91aab1e556 Mon Sep 17 00:00:00 2001 From: sergeyteleshev Date: Mon, 27 Jul 2026 18:03:19 +0200 Subject: [PATCH 6/6] dbeaver/pro#9665 hides connections tab if no sub-tabs was registered --- .../src/ConnectionsAdministrationTabService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationTabService.ts b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationTabService.ts index 52754730f6f..aeb0ed9e467 100644 --- a/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationTabService.ts +++ b/webapp/packages/plugin-connection-administration/src/ConnectionsAdministrationTabService.ts @@ -51,6 +51,7 @@ export class ConnectionsAdministrationTabService { this.item = this.administrationItemService.create({ name: ADMINISTRATION_CONNECTIONS_ITEM, order: 7, + isHidden: () => this.item.sub.length === 0, getContentComponent: () => ConnectionsAdministration, getDrawerComponent: () => ConnectionsDrawerItem, });