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

This commit is contained in:
serge-rider
2024-09-26 12:42:46 +02:00
132 changed files with 1034 additions and 312 deletions
+1 -1
View File
@@ -18,7 +18,7 @@
{
"type": "java",
"name": "CloudBeaver CE Server",
"cwd": "${workspaceFolder}/workspace-dev-ce",
"cwd": "${workspaceFolder}/../opt/cbce",
"request": "launch",
"mainClass": "org.jkiss.dbeaver.launcher.DBeaverLauncher",
"args": [
@@ -21,9 +21,7 @@
plugin.sql-editor.maxFileSize: 10240,
plugin.log-viewer.disabled: false,
plugin.log-viewer.logBatchSize: 1000,
plugin.log-viewer.maxFailedRequests: 3,
plugin.log-viewer.maxLogRecords: 2000,
plugin.log-viewer.refreshTimeout: 3000,
sql.proposals.insert.table.alias: PLAIN
},
@@ -19,9 +19,7 @@
plugin.sql-editor.maxFileSize: 10240,
plugin.log-viewer.disabled: false,
plugin.log-viewer.logBatchSize: 1000,
plugin.log-viewer.maxFailedRequests: 3,
plugin.log-viewer.maxLogRecords: 2000,
plugin.log-viewer.refreshTimeout: 3000,
sql.proposals.insert.table.alias: PLAIN
},
+11 -1
View File
@@ -50,7 +50,17 @@ export const Body = observer(function Body() {
return (
<DNDProvider>
<Loader className={s(styles, { loader: true })} suspense>
<div ref={ref} className={s(styles, { bodyContent: true }, `theme-${themeService.currentTheme.id}`)}>
<div
ref={ref}
className={s(
styles,
{ bodyContent: true },
`theme-${themeService.currentTheme.id}`,
'theme-typography--body2',
'theme-background-surface',
'theme-text-on-surface',
)}
>
<Loader className={s(styles, { loader: true })} suspense>
{Screen && <Screen {...screenService.routerService.params} />}
</Loader>
@@ -42,7 +42,7 @@
"@cloudbeaver/core-settings": "^0",
"@cloudbeaver/tests-runner": "^0",
"@jest/globals": "^29",
"@testing-library/jest-dom": "^6",
"@types/jest": "^29",
"msw": "^2",
"typescript": "^5"
}
@@ -34,7 +34,10 @@ export class AuthSettingsService {
private registerSettings() {
this.settingsManagerService.registerSettings(this.settings, () => [
// {
// key: 'disableAnonymousAccess',
// key: 'core.authentication.disableAnonymousAccess',
// access: {
// scope: ['server'],
// },
// type: ESettingsValueType.Checkbox,
// name: 'settings_authentication_disable_anonymous_access_name',
// description: 'settings_authentication_disable_anonymous_access_description',
+1 -1
View File
@@ -49,8 +49,8 @@
"@cloudbeaver/core-utils": "^0",
"@cloudbeaver/tests-runner": "^0",
"@jest/globals": "^29",
"@testing-library/jest-dom": "^6",
"@testing-library/react": "^16",
"@types/jest": "^29",
"@types/react": "^18",
"mobx": "^6",
"react": "^18",
@@ -6,9 +6,9 @@
* you may not use this file except in compliance with the License.
*/
import { useService } from '@cloudbeaver/core-di';
import { LocalizationService, type TLocalizationToken } from '@cloudbeaver/core-localization';
import { LocalizationService, type TranslateFn } from '@cloudbeaver/core-localization';
export function useTranslate(): <T extends TLocalizationToken | undefined>(token: T, fallback?: T, args?: Record<string | number, any>) => T {
export function useTranslate(): TranslateFn {
const localizationService = useService(LocalizationService);
return localizationService.translate;
@@ -34,7 +34,7 @@
"@cloudbeaver/core-settings": "^0",
"@cloudbeaver/tests-runner": "^0",
"@jest/globals": "^29",
"@testing-library/jest-dom": "^6",
"@types/jest": "^29",
"typescript": "^5"
}
}
@@ -13,7 +13,7 @@ module.exports = {
testEnvironment: require.resolve('../tests/test.environment.js'),
rootDir: path.resolve('./'),
moduleFileExtensions: ['js', 'jsx', 'json'],
testMatch: ['<rootDir>/(packages/*/|)dist/?(*.)+(spec|test).js?(x)'],
testMatch: ['<rootDir>/packages/*/dist/?(*.)+(spec|test).js?(x)', '<rootDir>/dist/?(*.)+(spec|test).js?(x)'],
transformIgnorePatterns: [
'\\.pnp\\.[^\\/]+$',
'node_modules/(?!@ngrx|(?!deck.gl)|ng-dynamic)',
@@ -32,13 +32,17 @@ export class ConnectionsSettingsService extends Dependency {
}
private registerSettings() {
this.settingsManagerService.registerSettings(this.settings, () => [
// {
// group: CONNECTIONS_SETTINGS_GROUP,
// key: 'disabled',
// name: 'Disable',
// type: ESettingsValueType.Checkbox,
// },
]);
// this.settingsManagerService.registerSettings(this.settings, () => [
// {
// group: CONNECTIONS_SETTINGS_GROUP,
// key: 'core.connections.disabled',
// access: {
// scope: ['server'],
// },
// name: 'core_connections_settings_disable',
// description: 'core_connections_settings_disable_description',
// type: ESettingsValueType.Checkbox,
// },
// ]);
}
}
@@ -55,4 +55,7 @@ export default [
['connections_network_handler_ssh_tunnel_advanced_settings', 'Erweiterte Einstellungen'],
['connections_not_found', 'Es wurden keine Datenbankverbindungen gefunden'],
['connections_connection_autocommit', 'Auto commit'],
['core_connections_settings_disable', 'Disable'],
['core_connections_settings_disable_description', 'Disable the ability to create new connections'],
];
@@ -99,4 +99,7 @@ export default [
'cloud_connections_access_placeholder',
'Cloud connections are visible to all users. Access management can be configured in "AWS Management Console".',
],
['core_connections_settings_disable', 'Disable'],
['core_connections_settings_disable_description', 'Disable the ability to create new connections'],
];
@@ -108,4 +108,7 @@ export default [
'cloud_connections_access_placeholder',
'Les connexions cloud sont visibles par tous les utilisateurs. La gestion des accès peut être configurée dans la "AWS Management Console".',
],
['core_connections_settings_disable', 'Disable'],
['core_connections_settings_disable_description', 'Disable the ability to create new connections'],
];
@@ -97,4 +97,7 @@ export default [
'cloud_connections_access_placeholder',
'Connessioni Cloud sono visibili a tutti gli utenti. Il gestore degli accessi può essere configurato in "AWS Management Console".',
],
['core_connections_settings_disable', 'Disable'],
['core_connections_settings_disable_description', 'Disable the ability to create new connections'],
];
@@ -100,4 +100,7 @@ export default [
['connections_not_found', 'Подключения к базам данных не найдены'],
['cloud_connections_access_placeholder', 'Облачные подключения видны всем пользователям. Вы можете настроить доступ в "Консоль Управления AWS".'],
['core_connections_settings_disable', 'Отключить'],
['core_connections_settings_disable_description', 'Отключить возможность создания новых подключений'],
];
@@ -92,4 +92,7 @@ export default [
['connections_not_found', '未找到数据库连接'],
['cloud_connections_access_placeholder', '云连接对所有用户可见。可以在“AWS管理控制台”中配置访问管理。'],
['core_connections_settings_disable', 'Disable'],
['core_connections_settings_disable_description', 'Disable the ability to create new connections'],
];
+1
View File
@@ -27,6 +27,7 @@
"peerDependencies": {},
"devDependencies": {
"@jest/globals": "^29",
"@types/jest": "^29",
"@types/react": "^18",
"typescript": "^5"
}
+2 -1
View File
@@ -21,6 +21,7 @@
"dependencies": {
"@cloudbeaver/core-di": "^0",
"@cloudbeaver/core-executor": "^0",
"@cloudbeaver/core-localization": "^0",
"@cloudbeaver/core-sdk": "^0",
"@cloudbeaver/core-settings": "^0",
"@cloudbeaver/core-utils": "^0",
@@ -35,7 +36,7 @@
"@cloudbeaver/core-settings": "^0",
"@cloudbeaver/tests-runner": "^0",
"@jest/globals": "^29",
"@testing-library/jest-dom": "^6",
"@types/jest": "^29",
"typescript": "^5"
}
}
@@ -56,14 +56,21 @@ export class EventsSettingsService extends Dependency {
this.settingsManagerService.registerSettings(this.settings, () => [
// {
// group: NOTIFICATIONS_SETTINGS_GROUP,
// key: 'maxPersistentAllow',
// key: 'plugin.notifications.maxPersistentAllow',
// access: {
// scope: ['client'],
// },
// name: 'Max persistent notifications count',
// type: ESettingsValueType.Input,
// },
// {
// group: NOTIFICATIONS_SETTINGS_GROUP,
// key: 'notificationsPool',
// name: 'Max notifications count',
// key: 'plugin.notifications.notificationsPool',
// access: {
// scope: ['client'],
// },
// name: 'core_events_notifications_settings_pool_size',
// description: 'core_events_notifications_settings_pool_size_description',
// type: ESettingsValueType.Input,
// },
]);
@@ -0,0 +1,35 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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()
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;
case 'it':
return (await import('./locales/it.js')).default;
case 'zh':
return (await import('./locales/zh.js')).default;
case 'fr':
return (await import('./locales/fr.js')).default;
default:
return (await import('./locales/en.js')).default;
}
}
}
@@ -5,6 +5,6 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
import { ROOT_SETTINGS_GROUP } from '@cloudbeaver/core-settings';
import { INTERFACE_SETTINGS_GROUP } from '@cloudbeaver/core-settings';
export const NOTIFICATIONS_SETTINGS_GROUP = ROOT_SETTINGS_GROUP.createSubGroup('core_events_notifications_settings_group');
export const NOTIFICATIONS_SETTINGS_GROUP = INTERFACE_SETTINGS_GROUP.createSubGroup('core_events_notifications_settings_group');
@@ -0,0 +1,12 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['core_events_notifications_settings_group', 'Notifications'],
['core_events_notifications_settings_pool_size', 'Max notifications count'],
['core_events_notifications_settings_pool_size_description', 'Exceeding this amount, the oldest notifications will be deleted'],
];
@@ -0,0 +1,12 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['core_events_notifications_settings_group', 'Notifications'],
['core_events_notifications_settings_pool_size', 'Max notifications count'],
['core_events_notifications_settings_pool_size_description', 'Exceeding this amount, the oldest notifications will be deleted'],
];
@@ -0,0 +1,12 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['core_events_notifications_settings_group', 'Notifications'],
['core_events_notifications_settings_pool_size', 'Max notifications count'],
['core_events_notifications_settings_pool_size_description', 'Exceeding this amount, the oldest notifications will be deleted'],
];
@@ -0,0 +1,12 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['core_events_notifications_settings_group', 'Уведомления'],
['core_events_notifications_settings_pool_size', 'Максимальное количество уведомлений'],
['core_events_notifications_settings_pool_size_description', 'Превышение этого количества приведет к удалению самых старых уведомлений'],
];
@@ -0,0 +1,12 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['core_events_notifications_settings_group', 'Notifications'],
['core_events_notifications_settings_pool_size', 'Max notifications count'],
['core_events_notifications_settings_pool_size_description', 'Exceeding this amount, the oldest notifications will be deleted'],
];
@@ -16,5 +16,6 @@ export const coreEventsManifest: PluginManifest = {
() => import('./NotificationService.js').then(m => m.NotificationService),
() => import('./ExceptionsCatcherService.js').then(m => m.ExceptionsCatcherService),
() => import('./EventsSettingsService.js').then(m => m.EventsSettingsService),
() => import('./LocaleService.js').then(m => m.LocaleService),
],
};
@@ -18,6 +18,9 @@
{
"path": "../core-localization/tsconfig.json"
},
{
"path": "../core-localization/tsconfig.json"
},
{
"path": "../core-root/tsconfig.json"
},
@@ -0,0 +1,10 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 { TLocalizationToken } from './TLocalizationToken.js';
export type TranslateFn = <T extends TLocalizationToken | undefined>(token: T, fallback?: T, args?: Record<string | number, any>) => T;
@@ -10,3 +10,4 @@ export * from './LocalizationService.js';
export * from './Locale.js';
export * from './TLocalizationToken.js';
export * from './DEFAULT_LOCALE.js';
export * from './TranslateFn.js';
@@ -51,7 +51,7 @@
"@cloudbeaver/core-view": "^0",
"@cloudbeaver/tests-runner": "^0",
"@jest/globals": "^29",
"@testing-library/jest-dom": "^6",
"@types/jest": "^29",
"typescript": "^5"
}
}
@@ -60,28 +60,37 @@ export class NavTreeSettingsService extends Dependency {
}
private registerSettings() {
this.settingsManagerService.registerSettings(this.settings, () => [
// {
// key: 'childrenLimit',
// access: {
// accessor: ['server'],
// },
// group: NAVIGATION_TREE_SETTINGS_GROUP,
// name: 'Children limit',
// type: ESettingsValueType.Input,
// },
// {
// group: NAVIGATION_TREE_SETTINGS_GROUP,
// key: 'editing',
// name: 'Editing',
// type: ESettingsValueType.Checkbox,
// },
// {
// group: NAVIGATION_TREE_SETTINGS_GROUP,
// key: 'deleting',
// name: 'Deleting',
// type: ESettingsValueType.Checkbox,
// },
]);
// this.settingsManagerService.registerSettings(this.settings, () => [
// {
// key: 'core.navigation-tree.childrenLimit',
// access: {
// scope: ['server'],
// },
// group: NAVIGATION_TREE_SETTINGS_GROUP,
// name: 'core_navigation_tree_settings_children_limit',
// description: 'core_navigation_tree_settings_children_limit_description',
// type: ESettingsValueType.Input,
// },
// {
// group: NAVIGATION_TREE_SETTINGS_GROUP,
// key: 'core.navigation-tree.editing',
// access: {
// scope: ['server'],
// },
// name: 'core_navigation_tree_settings_editing',
// description: 'core_navigation_tree_settings_editing_description',
// type: ESettingsValueType.Checkbox,
// },
// {
// group: NAVIGATION_TREE_SETTINGS_GROUP,
// key: 'core.navigation-tree.deleting',
// access: {
// scope: ['server'],
// },
// name: 'core_navigation_tree_settings_deleting',
// description: 'core_navigation_tree_settings_deleting_description',
// type: ESettingsValueType.Checkbox,
// },
// ]);
}
}
@@ -1 +1,16 @@
export default [['core_navigation_tree_navigation_tree_settings_group', 'Navigation Tree']];
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['core_navigation_tree_navigation_tree_settings_group', 'Navigation Tree'],
['core_navigation_tree_settings_children_limit', 'Amount of nodes to load'],
['core_navigation_tree_settings_children_limit_description', 'Amount of nodes to load in a single request'],
['core_navigation_tree_settings_editing', 'Editing'],
['core_navigation_tree_settings_editing_description', 'Allow editing nodes such as renaming'],
['core_navigation_tree_settings_deleting', 'Deleting'],
['core_navigation_tree_settings_deleting_description', 'Allow deleting nodes'],
];
@@ -5,4 +5,12 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
export default [['core_navigation_tree_navigation_tree_settings_group', 'Arborescence de navigation']];
export default [
['core_navigation_tree_navigation_tree_settings_group', 'Arborescence de navigation'],
['core_navigation_tree_settings_children_limit', 'Amount of nodes to load'],
['core_navigation_tree_settings_children_limit_description', 'Amount of nodes to load in a single request'],
['core_navigation_tree_settings_editing', 'Editing'],
['core_navigation_tree_settings_editing_description', 'Allow editing nodes such as renaming'],
['core_navigation_tree_settings_deleting', 'Deleting'],
['core_navigation_tree_settings_deleting_description', 'Allow deleting nodes'],
];
@@ -1 +1,16 @@
export default [['core_navigation_tree_navigation_tree_settings_group', 'Navigation Tree']];
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['core_navigation_tree_navigation_tree_settings_group', 'Navigation Tree'],
['core_navigation_tree_settings_children_limit', 'Amount of nodes to load'],
['core_navigation_tree_settings_children_limit_description', 'Amount of nodes to load in a single request'],
['core_navigation_tree_settings_editing', 'Editing'],
['core_navigation_tree_settings_editing_description', 'Allow editing nodes such as renaming'],
['core_navigation_tree_settings_deleting', 'Deleting'],
['core_navigation_tree_settings_deleting_description', 'Allow deleting nodes'],
];
@@ -1 +1,16 @@
export default [['core_navigation_tree_navigation_tree_settings_group', 'Дерево навигации']];
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['core_navigation_tree_navigation_tree_settings_group', 'Дерево навигации'],
['core_navigation_tree_settings_children_limit', 'Количество загружаемых дочерних элементов'],
['core_navigation_tree_settings_children_limit_description', 'Количество загружаемых дочерних элементов за один запрос'],
['core_navigation_tree_settings_editing', 'Редактирование'],
['core_navigation_tree_settings_editing_description', 'Разрешить редактирование узлов, такое как переименование'],
['core_navigation_tree_settings_deleting', 'Удаление'],
['core_navigation_tree_settings_deleting_description', 'Разрешить удаление узлов'],
];
@@ -5,4 +5,12 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
export default [['core_navigation_tree_navigation_tree_settings_group', '导航树']];
export default [
['core_navigation_tree_navigation_tree_settings_group', '导航树'],
['core_navigation_tree_settings_children_limit', 'Amount of nodes to load'],
['core_navigation_tree_settings_children_limit_description', 'Amount of nodes to load in a single request'],
['core_navigation_tree_settings_editing', 'Editing'],
['core_navigation_tree_settings_editing_description', 'Allow editing nodes such as renaming'],
['core_navigation_tree_settings_deleting', 'Deleting'],
['core_navigation_tree_settings_deleting_description', 'Allow deleting nodes'],
];
@@ -26,6 +26,7 @@
},
"devDependencies": {
"@jest/globals": "^29",
"@types/jest": "^29",
"mobx": "^6",
"typescript": "^5"
},
+2
View File
@@ -35,6 +35,8 @@
"@cloudbeaver/core-sdk": "^0",
"@cloudbeaver/core-website": "^0",
"@cloudbeaver/tests-runner": "^0",
"@jest/globals": "^29",
"@types/jest": "^29",
"msw": "^2",
"typescript": "^5"
}
@@ -8,7 +8,6 @@
import { injectable } from '@cloudbeaver/core-di';
import { CachedDataResource } from '@cloudbeaver/core-resource';
import { GraphQLService, type ServerConfigFragment, type ServerConfigInput } from '@cloudbeaver/core-sdk';
import { isArraysEqual } from '@cloudbeaver/core-utils';
import { DataSynchronizationQueue } from './DataSynchronization/DataSynchronizationQueue.js';
import { DataSynchronizationService } from './DataSynchronization/DataSynchronizationService.js';
@@ -34,7 +34,7 @@
"@cloudbeaver/core-settings": "^0",
"@cloudbeaver/tests-runner": "^0",
"@jest/globals": "^29",
"@testing-library/jest-dom": "^6",
"@types/jest": "^29",
"typescript": "^5"
}
}
+1 -1
View File
@@ -30,7 +30,7 @@
"@cloudbeaver/core-executor": "^0",
"@cloudbeaver/tests-runner": "^0",
"@jest/globals": "^29",
"@testing-library/jest-dom": "^6",
"@types/jest": "^29",
"typescript": "^5"
}
}
+1 -1
View File
@@ -47,7 +47,7 @@
"@material/switch": "^4",
"@material/theme": "^4",
"@material/typography": "^4",
"@testing-library/jest-dom": "^6",
"@types/jest": "^29",
"typescript": "^5",
"typescript-plugin-css-modules": "^5"
}
+1
View File
@@ -35,6 +35,7 @@
"peerDependencies": {},
"devDependencies": {
"@jest/globals": "^29",
"@types/jest": "^29",
"@types/md5": "^2",
"@types/underscore": "^1",
"@types/uuid": "^10",
@@ -5,8 +5,9 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
import { CONNECTIONS_SETTINGS_GROUP } from '@cloudbeaver/core-connections';
import { Dependency, injectable } from '@cloudbeaver/core-di';
import { SettingsManagerService, SettingsProvider, SettingsProviderService } from '@cloudbeaver/core-settings';
import { ESettingsValueType, SettingsManagerService, SettingsProvider, SettingsProviderService } from '@cloudbeaver/core-settings';
import { schema, schemaExtra } from '@cloudbeaver/core-utils';
const settings = schema.object({
@@ -32,12 +33,16 @@ export class ConnectionSearchSettingsService extends Dependency {
private registerSettings() {
this.settingsManagerService.registerSettings(this.settings, () => [
// {
// group: CONNECTIONS_SETTINGS_GROUP,
// key: 'disabled',
// type: ESettingsValueType.Checkbox,
// name: 'Disable connection search',
// },
{
group: CONNECTIONS_SETTINGS_GROUP,
key: 'plugin.connection-search.disabled',
access: {
scope: ['server'],
},
type: ESettingsValueType.Checkbox,
name: 'plugin_connection_search_settings_disable',
description: 'plugin_connection_search_settings_disable_description',
},
]);
}
}
@@ -1 +1,12 @@
export default [['plugin_connection_search_action_search_label', 'Find Local Database']];
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['plugin_connection_search_action_search_label', 'Find Local Database'],
['plugin_connection_search_settings_disable', 'Disable "{alias:plugin_connection_search_action_search_label}"'],
['plugin_connection_search_settings_disable_description', 'Disable the ability to search connections on a specific address'],
];
@@ -5,4 +5,8 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
export default [['plugin_connection_search_action_search_label', 'Trouver une base de données locale']];
export default [
['plugin_connection_search_action_search_label', 'Trouver une base de données locale'],
['plugin_connection_search_settings_disable', 'Disable "{alias:plugin_connection_search_action_search_label}"'],
['plugin_connection_search_settings_disable_description', 'Disable the ability to search connections on a specific address'],
];
@@ -1 +1,12 @@
export default [['plugin_connection_search_action_search_label', 'Find Local Database']];
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['plugin_connection_search_action_search_label', 'Find Local Database'],
['plugin_connection_search_settings_disable', 'Disable "{alias:plugin_connection_search_action_search_label}"'],
['plugin_connection_search_settings_disable_description', 'Disable the ability to search connections on a specific address'],
];
@@ -1 +1,12 @@
export default [['plugin_connection_search_action_search_label', 'Найти локальную базу данных']];
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['plugin_connection_search_action_search_label', 'Найти локальную базу данных'],
['plugin_connection_search_settings_disable', 'Отключить "{alias:plugin_connection_search_action_search_label}"'],
['plugin_connection_search_settings_disable_description', 'Отключить возможность поиска подключений по заданному адресу'],
];
@@ -5,4 +5,8 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
export default [['plugin_connection_search_action_search_label', '查找本地数据库']];
export default [
['plugin_connection_search_action_search_label', '查找本地数据库'],
['plugin_connection_search_settings_disable', 'Disable "{alias:plugin_connection_search_action_search_label}"'],
['plugin_connection_search_settings_disable_description', 'Disable the ability to search connections on a specific address'],
];
@@ -33,14 +33,18 @@ export class PluginConnectionsSettingsService extends Dependency {
}
private registerSettings() {
this.settingsManagerService.registerSettings(this.settings, () => [
// {
// key: 'hideConnectionViewForUsers',
// type: ESettingsValueType.Checkbox,
// name: 'settings_connections_hide_connections_view_name',
// description: 'settings_connections_hide_connections_view_description',
// group: CONNECTIONS_SETTINGS_GROUP,
// },
]);
// todo: probably not working as a separate setting
// this.settingsManagerService.registerSettings(this.settings, () => [
// {
// key: 'plugin.connections.hideConnectionViewForUsers',
// type: ESettingsValueType.Checkbox,
// access: {
// scope: ['server'],
// },
// name: 'settings_connections_hide_connections_view_name',
// description: 'settings_connections_hide_connections_view_description',
// group: CONNECTIONS_SETTINGS_GROUP,
// },
// ]);
}
}
@@ -23,8 +23,8 @@ export default [
['plugin_connections_menu_connections_label', 'Connection'],
['plugin_connections_action_disconnect_all_label', 'Disconnect All'],
['settings_connections', 'Connections'],
['settings_connections_hide_connections_view_name', 'Show connections to admins only'],
['settings_connections_hide_connections_view_description', 'Show connections to admins only'],
['settings_connections_hide_connections_view_name', 'Hide connections'],
['settings_connections_hide_connections_view_description', 'Connections will be hidden for all users except administrators'],
['connections_public_connection_ssl_enable', 'Enable SSL'],
@@ -7,28 +7,40 @@
*/
export default [
['connections_public_connection_edit_menu_item_title', 'Modifier la connexion'],
['connections_public_connection_edit_cancel_title', 'Confirmation d\'annulation'],
['connections_public_connection_edit_cancel_message', 'Vous allez annuler les modifications de la connexion. Les modifications non enregistrées seront perdues. Êtes-vous sûr ?'],
['connections_public_connection_edit_cancel_title', "Confirmation d'annulation"],
[
'connections_public_connection_edit_cancel_message',
'Vous allez annuler les modifications de la connexion. Les modifications non enregistrées seront perdues. Êtes-vous sûr ?',
],
['connections_public_connection_edit_reconnect_title', 'Connexion mise à jour'],
['connections_public_connection_edit_reconnect_message', 'La connexion a été mise à jour. Voulez-vous vous reconnecter ?'],
['connections_public_connection_edit_reconnect_failed', 'Échec de la reconnexion'],
['connections_public_connection_folder_move_failed', 'Échec du déplacement vers le dossier'],
['connections_public_connection_folder_move_duplication', 'Le dossier cible ou les dossiers sélectionnés contiennent un dossier portant le même nom ({arg:name})'],
['connections_public_connection_cloud_auth_required', 'Vous devez vous connecter avec les identifiants "{arg:providerLabel}" pour travailler avec cette connexion.'],
['plugin_connections_connection_form_project_invalid', 'Vous n\'avez pas accès à la création de connexions dans le projet sélectionné'],
['plugin_connections_connection_form_host_configuration_invalid', 'La configuration de l\'hôte n\'est pas supportée'],
[
'connections_public_connection_folder_move_duplication',
'Le dossier cible ou les dossiers sélectionnés contiennent un dossier portant le même nom ({arg:name})',
],
[
'connections_public_connection_cloud_auth_required',
'Vous devez vous connecter avec les identifiants "{arg:providerLabel}" pour travailler avec cette connexion.',
],
['plugin_connections_connection_form_project_invalid', "Vous n'avez pas accès à la création de connexions dans le projet sélectionné"],
['plugin_connections_connection_form_host_configuration_invalid', "La configuration de l'hôte n'est pas supportée"],
['plugin_connections_connection_form_name_invalid', 'Le champ "Nom de la connexion" ne peut pas être vide'],
['plugin_connections_connection_form_host_invalid', 'Le champ "Hôte" ne peut pas être vide'],
['connections_public_connection_folder_delete_confirmation', 'Vous allez supprimer "{arg:name}". Les connexions ne seront pas supprimées. Êtes-vous sûr ?'],
[
'connections_public_connection_folder_delete_confirmation',
'Vous allez supprimer "{arg:name}". Les connexions ne seront pas supprimées. Êtes-vous sûr ?',
],
['plugin_connections_menu_connections_label', 'Connexion'],
['plugin_connections_action_disconnect_all_label', 'Déconnecter tout'],
['settings_connections', 'Connexions'],
['settings_connections_hide_connections_view_name', 'Afficher les connexions uniquement aux administrateurs'],
['settings_connections_hide_connections_view_description', 'Afficher les connexions uniquement aux administrateurs'],
['settings_connections_hide_connections_view_name', 'Hide connections'],
['settings_connections_hide_connections_view_description', 'Connections will be hidden for all users except administrators'],
['connections_public_connection_ssl_enable', 'Activer SSL'],
['plugin_connections_connection_form_shared_credentials_manage_info', 'Vous pouvez gérer les identifiants dans l\'onglet '],
['plugin_connections_connection_form_shared_credentials_manage_info', "Vous pouvez gérer les identifiants dans l'onglet "],
['plugin_connections_connection_form_shared_credentials_manage_info_tab_link', 'Onglet Identifiants'],
['plugin_connections_connection_auth_secret_description', 'Veuillez sélectionner les identifiants fournis par une de vos équipes'],
];
@@ -1,3 +1,10 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['connections_public_connection_edit_menu_item_title', 'Modifica Connessione'],
['connections_public_connection_edit_cancel_title', "Conferma l'annullamento"],
@@ -18,8 +25,8 @@ export default [
['plugin_connections_menu_connections_label', 'Connessione'],
['plugin_connections_action_disconnect_all_label', 'Scollegati da tutto'],
['settings_connections', 'Connections'],
['settings_connections_hide_connections_view_name', 'Show connections to admins only'],
['settings_connections_hide_connections_view_description', 'Show connections to admins only'],
['settings_connections_hide_connections_view_name', 'Hide connections'],
['settings_connections_hide_connections_view_description', 'Connections will be hidden for all users except administrators'],
['connections_public_connection_ssl_enable', 'Enable SSL'],
@@ -23,8 +23,8 @@ export default [
['plugin_connections_menu_connections_label', 'Подключение'],
['plugin_connections_action_disconnect_all_label', 'Отключить все'],
['settings_connections', 'Подключения'],
['settings_connections_hide_connections_view_name', 'Показывать подключения только администраторам'],
['settings_connections_hide_connections_view_description', 'Показывать подключения только администраторам'],
['settings_connections_hide_connections_view_name', 'Скрыть подключения'],
['settings_connections_hide_connections_view_description', 'Подключения будут скрыты для всех пользователей, кроме администраторов'],
['connections_public_connection_ssl_enable', 'Включить SSL'],
@@ -22,15 +22,12 @@ export default [
['plugin_connections_menu_connections_label', '连接'],
['plugin_connections_action_disconnect_all_label', '断开所有连接'],
['settings_connections', '连接'],
['settings_connections_hide_connections_view_name', '仅对管理员显示连接'],
['settings_connections_hide_connections_view_description', '仅对管理员显示连接'],
['settings_connections_hide_connections_view_name', 'Hide connections'],
['settings_connections_hide_connections_view_description', 'Connections will be hidden for all users except administrators'],
['connections_public_connection_ssl_enable', '启用 SSL'],
['plugin_connections_connection_form_shared_credentials_manage_info', '您可在此管理凭证 '],
['plugin_connections_connection_form_shared_credentials_manage_info_tab_link', '凭证页签'],
[
'plugin_connections_connection_auth_secret_description',
'有多个凭证可用于身份验证.\n请选择您要使用的凭证。',
],
['plugin_connections_connection_auth_secret_description', '有多个凭证可用于身份验证.\n请选择您要使用的凭证。'],
];
@@ -68,7 +68,7 @@
"@cloudbeaver/plugin-object-viewer": "^0",
"@cloudbeaver/tests-runner": "^0",
"@jest/globals": "^29",
"@testing-library/jest-dom": "^6",
"@types/jest": "^29",
"@types/react": "^18",
"typescript": "^5",
"typescript-plugin-css-modules": "^5"
@@ -70,7 +70,7 @@
"@cloudbeaver/plugin-object-viewer": "^0",
"@cloudbeaver/tests-runner": "^0",
"@jest/globals": "^29",
"@testing-library/jest-dom": "^6",
"@types/jest": "^29",
"@types/react": "^18",
"typescript": "^5",
"typescript-plugin-css-modules": "^5"
@@ -13,8 +13,9 @@ import { StorageService } from '@cloudbeaver/core-storage';
interface IDevToolsSettings {
enabled: boolean;
distributed: boolean;
configuration: boolean;
override: boolean;
distributed: boolean | null;
configuration: boolean | null;
}
const DEVTOOLS = 'devtools';
@@ -25,12 +26,23 @@ export class DevToolsService {
return this.settings.enabled;
}
get isOverride(): boolean {
return this.settings.override;
}
get isDistributed(): boolean {
return this.settings.distributed;
if (!this.isOverride) {
return this.serverConfigResource.data?.distributed ?? false;
}
return this.settings.distributed ?? this.serverConfigResource.data?.distributed ?? false;
}
get isConfiguration(): boolean {
return this.settings.configuration;
if (!this.isOverride) {
return this.serverConfigResource.data?.configurationMode ?? false;
}
return this.settings.configuration ?? this.serverConfigResource.data?.configurationMode ?? false;
}
private readonly settings: IDevToolsSettings;
@@ -53,6 +65,11 @@ export class DevToolsService {
this.syncSettingsOverride();
}
setOverride(override: boolean) {
this.settings.override = override;
this.syncSettingsOverride();
}
setDistributedMode(distributed: boolean) {
this.settings.distributed = distributed;
this.syncSettingsOverride();
@@ -64,10 +81,14 @@ export class DevToolsService {
}
private syncSettingsOverride() {
if (this.isEnabled) {
if (this.isOverride && this.isEnabled) {
if (this.serverConfigResource.data) {
this.serverConfigResource.data.distributed = this.isDistributed;
this.serverConfigResource.data.configurationMode = this.isConfiguration;
if (this.settings.distributed !== null) {
this.serverConfigResource.data.distributed = this.isDistributed;
}
if (this.settings.configuration !== null) {
this.serverConfigResource.data.configurationMode = this.isConfiguration;
}
}
}
}
@@ -76,7 +97,8 @@ export class DevToolsService {
function getDefaultDevToolsSettings(): IDevToolsSettings {
return {
enabled: process.env['NODE_ENV'] === 'development',
distributed: false,
configuration: false,
override: false,
distributed: null,
configuration: null,
};
}
@@ -15,6 +15,7 @@ import { MENU_USER_PROFILE } from '@cloudbeaver/plugin-user-profile';
import { ACTION_DEVTOOLS } from './actions/ACTION_DEVTOOLS.js';
import { ACTION_DEVTOOLS_MODE_CONFIGURATION } from './actions/ACTION_DEVTOOLS_MODE_CONFIGURATION.js';
import { ACTION_DEVTOOLS_MODE_DISTRIBUTED } from './actions/ACTION_DEVTOOLS_MODE_DISTRIBUTED.js';
import { ACTION_DEVTOOLS_OVERRIDE } from './actions/ACTION_DEVTOOLS_OVERRIDE.js';
import { DATA_CONTEXT_MENU_SEARCH } from './ContextMenu/DATA_CONTEXT_MENU_SEARCH.js';
import { SearchResourceMenuItem } from './ContextMenu/SearchResourceMenuItem.js';
import { DevToolsService } from './DevToolsService.js';
@@ -89,7 +90,14 @@ export class PluginBootstrap extends Bootstrap {
];
}
return [new SearchResourceMenuItem(), ACTION_DEVTOOLS_MODE_DISTRIBUTED, ACTION_DEVTOOLS_MODE_CONFIGURATION, MENU_PLUGINS, ...items];
return [
new SearchResourceMenuItem(),
ACTION_DEVTOOLS_OVERRIDE,
ACTION_DEVTOOLS_MODE_DISTRIBUTED,
ACTION_DEVTOOLS_MODE_CONFIGURATION,
MENU_PLUGINS,
...items,
];
},
});
@@ -97,6 +105,7 @@ export class PluginBootstrap extends Bootstrap {
id: 'devtools-mode-configuration',
actions: [ACTION_DEVTOOLS_MODE_CONFIGURATION],
isChecked: () => this.devToolsService.isConfiguration,
isDisabled: () => !this.devToolsService.isOverride,
handler: () => {
this.devToolsService.setConfigurationMode(!this.devToolsService.isConfiguration);
},
@@ -106,11 +115,21 @@ export class PluginBootstrap extends Bootstrap {
id: 'devtools-mode-distributed',
actions: [ACTION_DEVTOOLS_MODE_DISTRIBUTED],
isChecked: () => this.devToolsService.isDistributed,
isDisabled: () => !this.devToolsService.isOverride,
handler: () => {
this.devToolsService.setDistributedMode(!this.devToolsService.isDistributed);
},
});
this.actionService.addHandler({
id: 'devtools-override',
actions: [ACTION_DEVTOOLS_OVERRIDE],
isChecked: () => this.devToolsService.isOverride,
handler: () => {
this.devToolsService.setOverride(!this.devToolsService.isOverride);
},
});
this.menuService.addCreator({
menus: [MENU_PLUGINS],
getItems: (context, items) => [
@@ -0,0 +1,14 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 { createAction } from '@cloudbeaver/core-view';
export const ACTION_DEVTOOLS_OVERRIDE = createAction('devtools-override', {
type: 'checkbox',
label: 'Override',
tooltip: 'Override server settings',
});
@@ -50,7 +50,7 @@
"@cloudbeaver/plugin-tools-panel": "^0",
"@cloudbeaver/tests-runner": "^0",
"@jest/globals": "^29",
"@testing-library/jest-dom": "^6",
"@types/jest": "^29",
"@types/react": "^18",
"typescript": "^5",
"typescript-plugin-css-modules": "^5"
@@ -5,6 +5,6 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
import { ROOT_SETTINGS_GROUP } from '@cloudbeaver/core-settings';
import { TOOLS_PANEL_SETTINGS_GROUP } from '@cloudbeaver/plugin-tools-panel';
export const LOG_VIEWER_SETTINGS_GROUP = ROOT_SETTINGS_GROUP.createSubGroup('plugin_log_viewer_log_viewer_settings_group');
export const LOG_VIEWER_SETTINGS_GROUP = TOOLS_PANEL_SETTINGS_GROUP.createSubGroup('plugin_log_viewer_log_viewer_settings_group');
@@ -53,19 +53,15 @@ const app = createApp(
);
const deprecatedSettings = {
'core.app.logViewer.refreshTimeout': 1,
'core.app.logViewer.maxLogRecords': 2,
'core.app.logViewer.logBatchSize': 3,
'core.app.logViewer.maxFailedRequests': 4,
'core.app.logViewer.disabled': true,
};
const newSettings = {
...deprecatedSettings,
'plugin.log-viewer.refreshTimeout': 5,
'plugin.log-viewer.maxLogRecords': 6,
'plugin.log-viewer.logBatchSize': 7,
'plugin.log-viewer.maxFailedRequests': 8,
'plugin.log-viewer.disabled': false,
};
@@ -77,10 +73,8 @@ test('New settings override deprecated settings', async () => {
await config.refresh();
expect(settings.refreshTimeout).toBe(5);
expect(settings.maxLogRecords).toBe(6);
expect(settings.logBatchSize).toBe(7);
expect(settings.maxFailedRequests).toBe(8);
expect(settings.disabled).toBe(false);
expectNoDeprecatedSettingMessage();
});
@@ -93,10 +87,8 @@ test('Deprecated settings are used if new settings are not defined', async () =>
await config.refresh();
expect(settings.refreshTimeout).toBe(1);
expect(settings.maxLogRecords).toBe(2);
expect(settings.logBatchSize).toBe(3);
expect(settings.maxFailedRequests).toBe(4);
expect(settings.disabled).toBe(true);
expectDeprecatedSettingMessage();
});
@@ -8,6 +8,7 @@
import { Dependency, injectable } from '@cloudbeaver/core-di';
import {
createSettingsAliasResolver,
ESettingsValueType,
ROOT_SETTINGS_LAYER,
SettingsManagerService,
SettingsProvider,
@@ -15,12 +16,11 @@ import {
SettingsResolverService,
} from '@cloudbeaver/core-settings';
import { schema, schemaExtra } from '@cloudbeaver/core-utils';
import { TOOLS_PANEL_SETTINGS_GROUP } from '@cloudbeaver/plugin-tools-panel';
const defaultSettings = schema.object({
'plugin.log-viewer.refreshTimeout': schema.coerce.number().default(3000),
'plugin.log-viewer.maxLogRecords': schema.coerce.number().default(1000),
'plugin.log-viewer.logBatchSize': schema.coerce.number().default(2000),
'plugin.log-viewer.maxFailedRequests': schema.coerce.number().default(3),
'plugin.log-viewer.disabled': schemaExtra.stringedBoolean().default(false),
});
@@ -32,10 +32,6 @@ export class LogViewerSettingsService extends Dependency {
return this.settings.getValue('plugin.log-viewer.disabled');
}
get refreshTimeout(): number {
return this.settings.getValue('plugin.log-viewer.refreshTimeout');
}
get maxLogRecords(): number {
return this.settings.getValue('plugin.log-viewer.maxLogRecords');
}
@@ -44,10 +40,6 @@ export class LogViewerSettingsService extends Dependency {
return this.settings.getValue('plugin.log-viewer.logBatchSize');
}
get maxFailedRequests(): number {
return this.settings.getValue('plugin.log-viewer.maxFailedRequests');
}
readonly settings: SettingsProvider<typeof defaultSettings>;
constructor(
@@ -63,9 +55,7 @@ export class LogViewerSettingsService extends Dependency {
createSettingsAliasResolver(this.settingsResolverService, this.settings, {
'plugin.log-viewer.disabled': 'core.app.logViewer.disabled',
'plugin.log-viewer.logBatchSize': 'core.app.logViewer.logBatchSize',
'plugin.log-viewer.maxFailedRequests': 'core.app.logViewer.maxFailedRequests',
'plugin.log-viewer.maxLogRecords': 'core.app.logViewer.maxLogRecords',
'plugin.log-viewer.refreshTimeout': 'core.app.logViewer.refreshTimeout',
}),
);
@@ -76,42 +66,34 @@ export class LogViewerSettingsService extends Dependency {
this.settingsManagerService.registerSettings(this.settings, () => [
// {
// group: LOG_VIEWER_SETTINGS_GROUP,
// key: 'refreshTimeout',
// type: ESettingsValueType.Input,
// name: 'Refresh timeout',
// description: 'Refresh timeout in milliseconds',
// },
// {
// group: LOG_VIEWER_SETTINGS_GROUP,
// key: 'maxLogRecords',
// type: ESettingsValueType.Input,
// name: 'Max log records',
// description: 'Max log records',
// },
// {
// group: LOG_VIEWER_SETTINGS_GROUP,
// key: 'logBatchSize',
// type: ESettingsValueType.Input,
// name: 'Log batch size',
// description: 'Log batch size',
// },
// {
// group: LOG_VIEWER_SETTINGS_GROUP,
// key: 'maxFailedRequests',
// type: ESettingsValueType.Input,
// name: 'Max failed requests',
// description: 'Max failed requests',
// },
// {
// key: 'plugin.log-viewer.disabled',
// key: 'plugin.log-viewer.maxLogRecords',
// access: {
// scope: ['server', 'client'],
// scope: ['client'],
// },
// group: LOG_VIEWER_SETTINGS_GROUP,
// type: ESettingsValueType.Checkbox,
// name: 'Disable log viewer',
// description: 'Disable log viewer',
// type: ESettingsValueType.Input,
// name: 'plugin_log_viewer_settings_max_log_records',
// description: 'plugin_log_viewer_settings_max_log_records_description',
// },
// {
// group: LOG_VIEWER_SETTINGS_GROUP,
// key: 'plugin.log-viewer.logBatchSize',
// access: {
// scope: ['client'],
// },
// type: ESettingsValueType.Input,
// name: 'plugin_log_viewer_settings_log_batch_size',
// description: 'plugin_log_viewer_settings_log_batch_size_description',
// },
{
key: 'plugin.log-viewer.disabled',
access: {
scope: ['server'],
},
group: TOOLS_PANEL_SETTINGS_GROUP,
type: ESettingsValueType.Checkbox,
name: 'plugin_log_viewer_settings_disable',
description: 'plugin_log_viewer_settings_disable_description',
},
]);
}
}
@@ -53,10 +53,11 @@ export class SessionLogsResource extends CachedDataResource<ILogEntry[]> {
}
protected async loader(): Promise<ILogEntry[]> {
const maxLogEntries = this.logViewerSettingsService.logBatchSize;
const maxLogRecords = this.logViewerSettingsService.maxLogRecords;
const batchSize = this.logViewerSettingsService.logBatchSize;
const { log } = await this.graphQLService.sdk.readSessionLog({
maxEntries: maxLogEntries,
maxEntries: batchSize,
clearEntries: true,
});
@@ -68,8 +69,8 @@ export class SessionLogsResource extends CachedDataResource<ILogEntry[]> {
runInAction(() => {
this.data.unshift(...logs.reverse());
if (this.data.length > maxLogEntries) {
this.data.splice(maxLogEntries, this.data.length - maxLogEntries);
if (this.data.length > maxLogRecords) {
this.data.splice(maxLogRecords, this.data.length - maxLogRecords);
}
});
@@ -1,3 +1,11 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['plugin_log_viewer_log_viewer_settings_group', 'Log viewer'],
['plugin_log_viewer_action_enable_label', 'Log viewer'],
@@ -7,4 +15,10 @@ export default [
['plugin_log_viewer_entry_timestamp', 'Time'],
['plugin_log_viewer_entry_message', 'Message'],
['plugin_log_viewer_entry_details', 'Details'],
['plugin_log_viewer_settings_disable', 'Disable log viewer'],
['plugin_log_viewer_settings_disable_description', 'Disable the ability to view logs for all users'],
['plugin_log_viewer_settings_max_log_records', 'Max log records'],
['plugin_log_viewer_settings_max_log_records_description', 'Max log records to store in the log viewer, older records will be deleted'],
['plugin_log_viewer_settings_log_batch_size', 'Amount of log records to load'],
['plugin_log_viewer_settings_log_batch_size_description', 'Amount of log records to load in a single request'],
];
@@ -14,4 +14,10 @@ export default [
['plugin_log_viewer_entry_timestamp', 'Heure'],
['plugin_log_viewer_entry_message', 'Message'],
['plugin_log_viewer_entry_details', 'Détails'],
['plugin_log_viewer_settings_disable', 'Disable log viewer'],
['plugin_log_viewer_settings_disable_description', 'Disable the ability to view logs for all users'],
['plugin_log_viewer_settings_max_log_records', 'Max log records'],
['plugin_log_viewer_settings_max_log_records_description', 'Max log records to store in the log viewer, older records will be deleted'],
['plugin_log_viewer_settings_log_batch_size', 'Amount of log records to load'],
['plugin_log_viewer_settings_log_batch_size_description', 'Amount of log records to load in a single request'],
];
@@ -1,3 +1,10 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['plugin_log_viewer_log_viewer_settings_group', 'Log viewer'],
['plugin_log_viewer_action_enable_label', 'Visualizzatore del log'],
@@ -7,4 +14,10 @@ export default [
['plugin_log_viewer_entry_timestamp', 'Time'],
['plugin_log_viewer_entry_message', 'Messaggio'],
['plugin_log_viewer_entry_details', 'Dettagli'],
['plugin_log_viewer_settings_disable', 'Disable log viewer'],
['plugin_log_viewer_settings_disable_description', 'Disable the ability to view logs for all users'],
['plugin_log_viewer_settings_max_log_records', 'Max log records'],
['plugin_log_viewer_settings_max_log_records_description', 'Max log records to store in the log viewer, older records will be deleted'],
['plugin_log_viewer_settings_log_batch_size', 'Amount of log records to load'],
['plugin_log_viewer_settings_log_batch_size_description', 'Amount of log records to load in a single request'],
];
@@ -1,5 +1,12 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['plugin_log_viewer_log_viewer_settings_group', 'Log viewer'],
['plugin_log_viewer_log_viewer_settings_group', 'Просмотр логов'],
['plugin_log_viewer_action_enable_label', 'Просмотр логов'],
['plugin_log_viewer_placeholder', 'Просмотр логов неактивен'],
['plugin_log_viewer_clear_log', 'Очистить лог'],
@@ -7,4 +14,10 @@ export default [
['plugin_log_viewer_entry_timestamp', 'Время'],
['plugin_log_viewer_entry_message', 'Сообщение'],
['plugin_log_viewer_entry_details', 'Детали'],
['plugin_log_viewer_settings_disable', 'Отключить просмотр логов'],
['plugin_log_viewer_settings_disable_description', 'Отключить возможность просмотра логов для всех пользователей'],
['plugin_log_viewer_settings_max_log_records', 'Максимальное количество записей'],
['plugin_log_viewer_settings_max_log_records_description', 'Максимальное количество записей для хранения, старые записи будут удалены'],
['plugin_log_viewer_settings_log_batch_size', 'Количество записей для загрузки'],
['plugin_log_viewer_settings_log_batch_size_description', 'Количество записей для загрузки за один запрос'],
];
@@ -14,4 +14,10 @@ export default [
['plugin_log_viewer_entry_timestamp', '时间戳'],
['plugin_log_viewer_entry_message', '消息'],
['plugin_log_viewer_entry_details', '详情'],
['plugin_log_viewer_settings_disable', 'Disable log viewer'],
['plugin_log_viewer_settings_disable_description', 'Disable the ability to view logs for all users'],
['plugin_log_viewer_settings_max_log_records', 'Max log records'],
['plugin_log_viewer_settings_max_log_records_description', 'Max log records to store in the log viewer, older records will be deleted'],
['plugin_log_viewer_settings_log_batch_size', 'Amount of log records to load'],
['plugin_log_viewer_settings_log_batch_size_description', 'Amount of log records to load in a single request'],
];
@@ -66,7 +66,7 @@
"@cloudbeaver/plugin-navigation-tabs": "^0",
"@cloudbeaver/tests-runner": "^0",
"@jest/globals": "^29",
"@testing-library/jest-dom": "^6",
"@types/jest": "^29",
"@types/react": "^18",
"typescript": "^5",
"typescript-plugin-css-modules": "^5"
@@ -5,12 +5,14 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
import { importLazyComponent } from '@cloudbeaver/core-blocks';
import { Bootstrap, injectable } from '@cloudbeaver/core-di';
import { LeftBarPanelService } from '@cloudbeaver/core-ui';
import { NavigationTreeSettingsService } from '../NavigationTreeSettingsService.js';
import { ElementsTreeToolsMenuService } from './ElementsTree/ElementsTreeTools/ElementsTreeToolsMenuService.js';
import { NavigationTreePanel } from './NavigationTreePanel.js';
const NavigationTreePanel = importLazyComponent(() => import('./NavigationTreePanel.js').then(m => m.NavigationTreePanel));
@injectable()
export class NavigationTreeBootstrap extends Bootstrap {
@@ -22,7 +24,7 @@ export class NavigationTreeBootstrap extends Bootstrap {
super();
}
override register(): void | Promise<void> {
override register(): void {
this.elementsTreeToolsMenuService.register();
this.leftBarPanelService.tabsContainer.add({
key: 'navigation-tree-tab',
@@ -32,6 +34,4 @@ export class NavigationTreeBootstrap extends Bootstrap {
panel: () => NavigationTreePanel,
});
}
override async load(): Promise<void> {}
}
@@ -8,7 +8,8 @@
import { computed, makeObservable } from 'mobx';
import { Dependency, injectable } from '@cloudbeaver/core-di';
import { SettingsManagerService, SettingsProvider, SettingsProviderService } from '@cloudbeaver/core-settings';
import { NAVIGATION_TREE_SETTINGS_GROUP } from '@cloudbeaver/core-navigation-tree';
import { ESettingsValueType, SettingsManagerService, SettingsProvider, SettingsProviderService } from '@cloudbeaver/core-settings';
import { schema, schemaExtra } from '@cloudbeaver/core-utils';
const defaultSettings = schema.object({
@@ -43,9 +44,13 @@ export class NavigationTreeSettingsService extends Dependency {
this.settingsManagerService.registerSettings(this.settings, () => [
// {
// group: NAVIGATION_TREE_SETTINGS_GROUP,
// key: 'disabled',
// key: 'plugin.navigation-tree.disabled',
// access: {
// scope: ['server'],
// },
// type: ESettingsValueType.Checkbox,
// name: 'Disable navigation tree',
// name: 'plugin_navigation_tree_settings_disable',
// description: 'plugin_navigation_tree_settings_disable_description',
// },
]);
}
@@ -5,5 +5,6 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
import type { ITreeData } from '../ITreeData.js';
export type TreeDataTransformer<T> = (nodeId: string, data: T) => T;
export type TreeDataTransformer<T> = (treeData: ITreeData, nodeId: string, data: T) => T;
@@ -5,15 +5,16 @@
* Licensed under the Apache License, Version 2.0.
* you may not use this file except in compliance with the License.
*/
import type { ITreeData } from '../ITreeData.js';
import type { TreeDataTransformer } from './TreeDataTransformer.js';
export function applyTransforms<T>(id: string, data: T, transformers?: TreeDataTransformer<T>[]) {
export function applyTransforms<T>(treeData: ITreeData, id: string, data: T, transformers?: TreeDataTransformer<T>[]) {
if (!transformers) {
return data;
}
for (const transformer of transformers) {
data = transformer(id, data);
data = transformer(treeData, id, data);
}
return data;
@@ -10,7 +10,7 @@ import type { INodeState } from '../INodeState.js';
import type { TreeDataTransformer } from './TreeDataTransformer.js';
export function rootNodeStateTransformer(root: string): TreeDataTransformer<INodeState> {
return function rootNodeStateTransformer(nodeId, data) {
return function rootNodeStateTransformer(treeData, nodeId, data) {
if (nodeId === root) {
return {
...data,
@@ -23,7 +23,7 @@ export function rootNodeStateTransformer(root: string): TreeDataTransformer<INod
}
export function rootNodeTransformer(root: string): TreeDataTransformer<INode> {
return function rootNodeTransformer(nodeId, data) {
return function rootNodeTransformer(treeData, nodeId, data) {
if (nodeId === root) {
return {
...data,
@@ -0,0 +1,22 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 { INode } from './INode.js';
import type { INodeState } from './INodeState.js';
export interface ITreeData {
rootId: string;
getNode(id: string): INode;
getChildren: (node: string) => string[];
getState(id: string): Readonly<INodeState>;
updateAllState(state: Partial<INodeState>): void;
updateState(id: string, state: Partial<INodeState>): void;
load(nodeId: string, manual: boolean): Promise<void>;
update(): Promise<void>;
}
@@ -13,10 +13,12 @@ import { getComputed, TreeNodeNested } from '@cloudbeaver/core-blocks';
import { NodeSizeCacheContext } from './contexts/NodeSizeCacheContext.js';
import { TreeDataContext } from './contexts/TreeDataContext.js';
import { TreeVirtualizationContext } from './contexts/TreeVirtualizationContext.js';
import type { NodeEmptyPlaceholderComponent } from './NodeEmptyPlaceholderComponent.js';
import { NodeRenderer } from './NodeRenderer.js';
interface Props {
nodeId: string;
emptyPlaceholder?: NodeEmptyPlaceholderComponent;
offsetHeight: number;
root?: boolean;
}
@@ -31,7 +33,7 @@ function getPositionWithOverscan(position: number, forward: boolean) {
return position - (position % OVERSCAN);
}
const NodeChildrenObserved = observer<Props>(function NodeChildren({ nodeId, offsetHeight, root }) {
const NodeChildrenObserved = observer<Props>(function NodeChildren({ nodeId, emptyPlaceholder, offsetHeight, root }) {
const data = useContext(TreeDataContext)!;
const optimization = useContext(TreeVirtualizationContext)!;
const sizeCache = useContext(NodeSizeCacheContext)!;
@@ -70,6 +72,11 @@ const NodeChildrenObserved = observer<Props>(function NodeChildren({ nodeId, off
elements.push(<div key={lastId} style={{ height: postFillHeight }} />);
}
if (elements.length === 0 && emptyPlaceholder) {
const EmptyPlaceholder = emptyPlaceholder;
elements.push(<EmptyPlaceholder key="empty" root={root} />);
}
return elements;
}
@@ -0,0 +1,11 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 type NodeEmptyPlaceholderComponent = React.FC<{
root?: boolean;
}>;
@@ -15,16 +15,18 @@ import { TreeDataContext } from './contexts/TreeDataContext.js';
import { TreeDnDContext } from './contexts/TreeDnDContext.js';
import { TreeVirtualizationContext } from './contexts/TreeVirtualizationContext.js';
import type { INodeRenderer } from './INodeRenderer.js';
import type { ITreeData } from './ITreeData.js';
import { NodeChildren } from './NodeChildren.js';
import type { NodeEmptyPlaceholderComponent } from './NodeEmptyPlaceholderComponent.js';
import { useNodeSizeCache } from './useNodeSizeCache.js';
import { useTree } from './useTree.js';
import type { ITreeData } from './useTreeData.js';
import { useTreeDnD } from './useTreeDnD.js';
import { useTreeVirtualization } from './useTreeVirtualization.js';
export interface NavigationTreeNewProps {
data: ITreeData;
nodeRenderers?: INodeRenderer[];
emptyPlaceholder?: NodeEmptyPlaceholderComponent;
onNodeClick?(id: string): void | Promise<void>;
onNodeDoubleClick?(id: string): void | Promise<void>;
getNodeDnDContext?(id: string, context: IDataContext): void;
@@ -34,6 +36,7 @@ export interface NavigationTreeNewProps {
export const Tree = observer<NavigationTreeNewProps>(function Tree({
data,
nodeRenderers,
emptyPlaceholder,
onNodeClick,
onNodeDoubleClick,
getNodeDnDContext,
@@ -59,7 +62,7 @@ export const Tree = observer<NavigationTreeNewProps>(function Tree({
<TreeVirtualizationContext.Provider value={mountOptimization}>
<TreeContext.Provider value={tree}>
<TreeDnDContext.Provider value={treeDnD}>
<NodeChildren nodeId={data.rootId} offsetHeight={0} root />
<NodeChildren nodeId={data.rootId} offsetHeight={0} emptyPlaceholder={emptyPlaceholder} root />
</TreeDnDContext.Provider>
</TreeContext.Provider>
</TreeVirtualizationContext.Provider>
@@ -7,6 +7,6 @@
*/
import { createContext } from 'react';
import type { ITreeData } from '../useTreeData.js';
import type { ITreeData } from '../ITreeData.js';
export const TreeDataContext = createContext<ITreeData | undefined>(undefined);
@@ -11,8 +11,8 @@ import { useState } from 'react';
import { useObjectRef } from '@cloudbeaver/core-blocks';
import { MetadataMap } from '@cloudbeaver/core-utils';
import type { ITreeData } from './ITreeData.js';
import type { ITree } from './useTree.js';
import type { ITreeData } from './useTreeData.js';
export interface INodeSizeCache {
getSize(id: string): number;
@@ -10,7 +10,7 @@ import { observable } from 'mobx';
import { useObservableRef } from '@cloudbeaver/core-blocks';
import type { INodeRenderer, NodeComponent } from './INodeRenderer.js';
import type { ITreeData } from './useTreeData.js';
import type { ITreeData } from './ITreeData.js';
interface IOptions {
data: ITreeData;
@@ -16,6 +16,7 @@ import { rootNodeStateTransformer, rootNodeTransformer } from './DataTransformer
import type { TreeDataTransformer } from './DataTransformers/TreeDataTransformer.js';
import type { INode } from './INode.js';
import type { INodeState } from './INodeState.js';
import type { ITreeData } from './ITreeData.js';
import type { TreeState } from './TreeState.js';
import { useTreeState } from './useTreeState.js';
@@ -31,19 +32,6 @@ interface IOptions {
stateTransformers?: TreeDataTransformer<INodeState>[];
}
export interface ITreeData {
rootId: string;
getNode(id: string): INode;
getChildren: (node: string) => string[];
getState(id: string): Readonly<INodeState>;
updateAllState(state: Partial<INodeState>): void;
updateState(id: string, state: Partial<INodeState>): void;
load(nodeId: string, manual: boolean): Promise<void>;
update(): Promise<void>;
}
export function useTreeData(options: IOptions): ITreeData {
options = useObservableRef(
{
@@ -67,19 +55,23 @@ export function useTreeData(options: IOptions): ITreeData {
const [nodeCache] = useState(
() =>
new MetadataMap<string, IComputedValue<INode>>(id =>
computed(() => applyTransforms(id, options.getNode(id), [rootNodeTransformer(options.rootId), ...(options.nodeTransformers || [])])),
computed(() =>
applyTransforms(treeData, id, options.getNode(id), [rootNodeTransformer(options.rootId), ...(options.nodeTransformers || [])]),
),
),
);
const [childrenCache] = useState(
() =>
new MetadataMap<string, IComputedValue<string[]>>(id =>
computed(() => applyTransforms(id, options.getChildren(id), options.childrenTransformers)),
computed(() => applyTransforms(treeData, id, options.getChildren(id), options.childrenTransformers)),
),
);
const [stateCache] = useState(
() =>
new MetadataMap<string, IComputedValue<INodeState>>(id =>
computed(() => applyTransforms(id, state.getState(id), [rootNodeStateTransformer(options.rootId), ...(options.stateTransformers || [])])),
computed(() =>
applyTransforms(treeData, id, state.getState(id), [rootNodeStateTransformer(options.rootId), ...(options.stateTransformers || [])]),
),
),
);
@@ -0,0 +1,58 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 { observable } from 'mobx';
import { useObjectRef, useObservableRef } from '@cloudbeaver/core-blocks';
import type { TreeDataTransformer } from './DataTransformers/TreeDataTransformer.js';
import type { ITreeData } from './ITreeData.js';
export interface ITreeFilterOptions {
isNodeMatched?: (nodeId: string, filter: string, isMatched: boolean) => boolean;
}
export interface ITreeFilter {
filter: string;
isNodeMatched(treeData: ITreeData, nodeId: string): boolean;
transformer: TreeDataTransformer<string[]>;
setFilter(filter: string): void;
}
export function useTreeFilter(options: ITreeFilterOptions = {}): Readonly<ITreeFilter> {
options = useObjectRef(options);
return useObservableRef<ITreeFilter>(
() => ({
filter: '',
isNodeMatched(treeData: ITreeData, nodeId: string): boolean {
const filter = this.filter.trim();
if (!filter) {
return true;
}
let isNodeMatched = treeData.getNode(nodeId).name.toLowerCase().includes(filter);
if (options?.isNodeMatched) {
isNodeMatched = options.isNodeMatched(nodeId, filter, isNodeMatched);
}
return isNodeMatched || treeData.getChildren(nodeId).length > 0;
},
transformer(treeData: ITreeData, nodeId: string, children: string[]): string[] {
return children.filter(child => this.isNodeMatched(treeData, child));
},
setFilter(filter: string): void {
this.filter = filter;
},
}),
{
filter: observable.ref,
},
false,
['setFilter', 'isNodeMatched', 'transformer'],
);
}
@@ -50,7 +50,10 @@ export * from './TreeNew/contexts/TreeContext.js';
export * from './TreeNew/contexts/TreeDataContext.js';
export * from './TreeNew/NodeControlLazy.js';
export * from './TreeNew/useTreeData.js';
export * from './TreeNew/ITreeData.js';
export * from './TreeNew/useTreeFilter.js';
export * from './TreeNew/INode.js';
export * from './TreeNew/NodeEmptyPlaceholderComponent.js';
export * from './NavigationTree/getNavigationTreeUserSettingsId.js';
export * from './NodesManager/NavNodeView/IFolderTransform.js';
@@ -1,3 +1,10 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['plugin_navigation_tree_explorer_tab_title', 'Explorer'],
['app_navigationTree_openNodeTab', 'Open'],
@@ -36,4 +43,6 @@ export default [
['app_navigationTree_drop_here', 'Drop here...'],
['plugin_navigation_tree_settings_projects_description', 'Displays elements under project groups'],
['plugin_navigation_tree_settings_projects_title', 'Group by Project'],
['plugin_navigation_tree_settings_disable', 'Disable'],
['plugin_navigation_tree_settings_disable_description', 'Disable navigation tree for all users'],
];
@@ -42,4 +42,6 @@ export default [
['app_navigationTree_drop_here', 'Déposer ici...'],
['plugin_navigation_tree_settings_projects_description', 'Affiche les éléments sous les groupes de projets'],
['plugin_navigation_tree_settings_projects_title', 'Grouper par projet'],
['plugin_navigation_tree_settings_disable', 'Disable'],
['plugin_navigation_tree_settings_disable_description', 'Disable navigation tree for all users'],
];
@@ -1,3 +1,10 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['plugin_navigation_tree_explorer_tab_title', 'Explorer'],
['app_navigationTree_openNodeTab', 'Apri'],
@@ -33,4 +40,6 @@ export default [
['app_navigationTree_drop_here', 'Drop here...'],
['plugin_navigation_tree_settings_projects_description', 'Displays elements under project groups'],
['plugin_navigation_tree_settings_projects_title', 'Group by Project'],
['plugin_navigation_tree_settings_disable', 'Disable'],
['plugin_navigation_tree_settings_disable_description', 'Disable navigation tree for all users'],
];
@@ -1,3 +1,10 @@
/*
* CloudBeaver - Cloud Database Manager
* Copyright (C) 2020-2024 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 default [
['plugin_navigation_tree_explorer_tab_title', 'Проводник'],
['app_navigationTree_openNodeTab', 'Открыть'],
@@ -39,4 +46,6 @@ export default [
['app_navigationTree_drop_here', 'Drop here...'],
['plugin_navigation_tree_settings_projects_description', 'Группировать элементы по проектам'],
['plugin_navigation_tree_settings_projects_title', 'Группировать по проектам'],
['plugin_navigation_tree_settings_disable', 'Отключить'],
['plugin_navigation_tree_settings_disable_description', 'Отключить дерево навигации для всех пользователей'],
];
@@ -42,4 +42,6 @@ export default [
['app_navigationTree_drop_here', '拖动至此...'],
['plugin_navigation_tree_settings_projects_description', '在项目分组下显示'],
['plugin_navigation_tree_settings_projects_title', '项目分组'],
['plugin_navigation_tree_settings_disable', 'Disable'],
['plugin_navigation_tree_settings_disable_description', 'Disable navigation tree for all users'],
];
@@ -23,10 +23,10 @@
"@cloudbeaver/core-di": "^0",
"@cloudbeaver/core-localization": "^0",
"@cloudbeaver/core-resource": "^0",
"@cloudbeaver/core-root": "^0",
"@cloudbeaver/core-ui": "^0",
"@cloudbeaver/core-version": "^0",
"@cloudbeaver/core-version-update": "^0",
"mobx": "^6",
"mobx-react-lite": "^4",
"react": "^18"
},
@@ -21,6 +21,9 @@
{
"path": "../core-resource/tsconfig.json"
},
{
"path": "../core-root/tsconfig.json"
},
{
"path": "../core-ui/tsconfig.json"
},
@@ -6,7 +6,8 @@
* you may not use this file except in compliance with the License.
*/
import { Dependency, injectable } from '@cloudbeaver/core-di';
import { SettingsManagerService, SettingsProvider, SettingsProviderService } from '@cloudbeaver/core-settings';
import { RESOURCE_MANAGER_SETTINGS_GROUP } from '@cloudbeaver/core-resource-manager';
import { ESettingsValueType, SettingsManagerService, SettingsProvider, SettingsProviderService } from '@cloudbeaver/core-settings';
import { schema, schemaExtra } from '@cloudbeaver/core-utils';
const settingsSchema = schema.object({
@@ -37,9 +38,13 @@ export class ResourceManagerScriptsSettingsService extends Dependency {
this.settingsManagerService.registerSettings(this.settings, () => [
// {
// group: RESOURCE_MANAGER_SETTINGS_GROUP,
// key: 'disabled',
// key: 'plugin.resource-manager-scripts.disabled',
// access: {
// scope: ['server'],
// },
// type: ESettingsValueType.Checkbox,
// name: 'Disable resource manager scripts',
// name: 'plugin_resource_manager_scripts_disable',
// description: 'plugin_resource_manager_scripts_disable_description',
// },
]);
}
@@ -18,4 +18,6 @@ export default [
'plugin_resource_manager_scripts_save_script_project_restriction_descripion',
"The script's project can't be different from the connection's project",
],
['plugin_resource_manager_scripts_disable', 'Disable scripts'],
['plugin_resource_manager_scripts_disable_description', 'Disable scripts explorer for all users'],
];
@@ -18,4 +18,6 @@ export default [
'plugin_resource_manager_scripts_save_script_project_restriction_description',
'Le projet du script ne peut pas être différent de celui de la connexion',
],
['plugin_resource_manager_scripts_disable', 'Disable scripts'],
['plugin_resource_manager_scripts_disable_description', 'Disable scripts explorer for all users'],
];
@@ -18,4 +18,6 @@ export default [
'plugin_resource_manager_scripts_save_script_project_restriction_descripion',
"The script's project can't be different from the connection's project",
],
['plugin_resource_manager_scripts_disable', 'Disable scripts'],
['plugin_resource_manager_scripts_disable_description', 'Disable scripts explorer for all users'],
];
@@ -15,4 +15,6 @@ export default [
'Имя скрипта не может содержать следующие символы / : " \\ \' <> | ? * и не может начинаться с точки',
],
['plugin_resource_manager_scripts_save_script_project_restriction_descripion', 'Проект скрипта не может отличаться от проекта подключения'],
['plugin_resource_manager_scripts_disable', 'Отключить скрипты'],
['plugin_resource_manager_scripts_disable_description', 'Отключить проводник скриптов для всех пользователей'],
];

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