Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions webapp/packages/core-app/public/icons/preload/icons.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
44 changes: 44 additions & 0 deletions webapp/packages/plugin-connection-administration/package.json
Original file line number Diff line number Diff line change
@@ -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"
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -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';
Original file line number Diff line number Diff line change
@@ -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<AdministrationItemContentProps>) {
if (sub?.name === tabId) {
return;
}

connectionsAdministrationNavService.navToSub(tabId);
}

return (
<TabsState
selectedId={sub?.name}
container={connectionsAdministrationTabService.tabsContainer}
item={item}
configurationWizard={configurationWizard}
sub={sub}
param={param ?? null}
lazy
onChange={openSub}
>
<ToolsPanel bottomBorder>
<SContext registry={mainTabsRegistry}>
<TabList
className={s(styles, { tabList: true, administrationTabs: true })}
aria-label={translate('plugin_connection_administration_label')}
childrenFirst
underline
/>
</SContext>
</ToolsPanel>
<SContext registry={tabPanelRegistry}>
<TabPanelList />
</SContext>
</TabsState>
);
});
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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<void> {
this.connectionsAdministrationTabService.createRootTab();
}
}
Original file line number Diff line number Diff line change
@@ -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 { 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<AdministrationItemContentProps> {
onActivate?: AdministrationItemSubEvent;
onDeActivate?: AdministrationItemSubEvent;
}

@injectable(() => [AdministrationItemService])
export class ConnectionsAdministrationTabService {
readonly tabsContainer: TabsContainer<AdministrationItemContentProps>;

private item!: IAdministrationItem;

constructor(private readonly administrationItemService: AdministrationItemService) {
this.tabsContainer = new TabsContainer('Connections administration tabs');
}

addSubTab({ 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;
}

createRootTab(): void {
this.item = this.administrationItemService.create({
name: ADMINISTRATION_CONNECTIONS_ITEM,
order: 7,
isHidden: () => this.item.sub.length === 0,
getContentComponent: () => ConnectionsAdministration,
getDrawerComponent: () => ConnectionsDrawerItem,
});
}
}
Original file line number Diff line number Diff line change
@@ -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<AdministrationItemDrawerProps> = function ConnectionsDrawerItem({ item, onSelect, disabled }) {
return (
<Tab tabId={item.name} disabled={disabled} onOpen={() => onSelect(item.name)}>
<TabIcon icon="/icons/plugin_connections.svg" />
<TabTitle>
<Translate token="plugin_connection_administration_label" />
</TabTitle>
</Tab>
);
};
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
13 changes: 13 additions & 0 deletions webapp/packages/plugin-connection-administration/src/index.ts
Original file line number Diff line number Diff line change
@@ -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';
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default [['plugin_connection_administration_label', 'Connections']];
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default [['plugin_connection_administration_label', 'Соединения']];
Loading
Loading