From a3c4617960db96c4e57a33afb5eea062ee33ca33 Mon Sep 17 00:00:00 2001 From: Wroud Date: Tue, 19 Jul 2022 17:36:13 +0300 Subject: [PATCH] refactor: CB-2243 product config structure --- .../src/AdministrationSettingsService.ts | 4 +-- .../core-app/src/CoreSettingsService.ts | 5 ++- webapp/packages/core-app/src/index.ts | 1 + webapp/packages/core-app/src/manifest.ts | 4 +++ .../NodesManager/NavNodeContextMenuService.ts | 12 +++++-- .../shared/NodesManager/NavTreeResource.ts | 8 ++++- .../NodesManager/NavTreeSettingsService.ts | 28 +++++++++++++++ .../ToolsPanel/LogViewer/LogViewerService.ts | 29 +++++++++++---- .../LogViewer/LogViewerSettingsService.ts} | 13 ++++--- .../src/AuthSettingsService.ts | 4 +-- .../src/BrowserSettingsService.ts | 36 +++++++++++++++++++ .../core-browser/src/CookiesService.ts | 9 +++-- webapp/packages/core-browser/src/manifest.ts | 4 +-- .../core-events/src/EventsSettingsService.ts | 8 +++-- .../core-events/src/NotificationService.ts | 15 ++++++-- .../src/LocalizationService.ts | 9 ++++- .../core-plugin/src/PluginManagerService.ts | 12 +++++++ .../core-plugin/src/PluginSettings.ts | 4 +++ .../packages/core-theming/src/ThemeService.ts | 4 +++ .../core-theming/src/ThemeSettingsService.ts | 5 ++- .../src/DataExportMenuService.ts | 13 +++++-- .../src/DataExportSettingsService.ts | 5 ++- .../src/DataGridSettingsService.ts | 5 ++- .../src/SpreadsheetBootstrap.ts | 6 +++- .../src/DataViewerService.ts | 4 ++- .../src/DataViewerSettingsService.ts | 5 ++- .../ObjectPropertyTableFooterService.ts | 9 +++-- .../src/ResourceManagerSettingsService.ts | 5 ++- .../src/PluginBootstrap.ts | 4 ++- .../src/ResourceEditorSettingsService.ts | 2 +- .../src/SqlEditor/useTools.tsx | 5 ++- .../src/SqlEditorSettingsService.ts | 5 ++- 32 files changed, 232 insertions(+), 50 deletions(-) create mode 100644 webapp/packages/core-app/src/shared/NodesManager/NavTreeSettingsService.ts rename webapp/packages/{core-browser/src/CookiesSettingsService.ts => core-app/src/shared/ToolsPanel/LogViewer/LogViewerSettingsService.ts} (66%) create mode 100644 webapp/packages/core-browser/src/BrowserSettingsService.ts diff --git a/webapp/packages/core-administration/src/AdministrationSettingsService.ts b/webapp/packages/core-administration/src/AdministrationSettingsService.ts index e49eacefb6..b0cbbaa53d 100644 --- a/webapp/packages/core-administration/src/AdministrationSettingsService.ts +++ b/webapp/packages/core-administration/src/AdministrationSettingsService.ts @@ -19,8 +19,8 @@ export type AdministrationSettings = typeof defaultSettings; export class AdministrationSettingsService { readonly settings: PluginSettings; - constructor(private readonly pluginManagerService: PluginManagerService) { - this.settings = this.pluginManagerService.getPluginSettings('core.administration', defaultSettings); + constructor(private readonly pluginManagerService: PluginManagerService) { + this.settings = this.pluginManagerService.getCoreSettings('administration', defaultSettings); } isBase(feature: string): boolean { diff --git a/webapp/packages/core-app/src/CoreSettingsService.ts b/webapp/packages/core-app/src/CoreSettingsService.ts index 0980f9e816..e2319f9c76 100644 --- a/webapp/packages/core-app/src/CoreSettingsService.ts +++ b/webapp/packages/core-app/src/CoreSettingsService.ts @@ -22,11 +22,14 @@ const defaultSettings = { export type CoreSettings = typeof defaultSettings; +/** + * @deprecated use plugin-log-viewer, core-navigation-tree settings instead + */ @injectable() export class CoreSettingsService { readonly settings: PluginSettings; constructor(private readonly pluginManagerService: PluginManagerService) { - this.settings = this.pluginManagerService.getPluginSettings('core', defaultSettings); + this.settings = this.pluginManagerService.getDeprecatedPluginSettings('core', defaultSettings); } } diff --git a/webapp/packages/core-app/src/index.ts b/webapp/packages/core-app/src/index.ts index d28037669f..306cef123a 100644 --- a/webapp/packages/core-app/src/index.ts +++ b/webapp/packages/core-app/src/index.ts @@ -23,6 +23,7 @@ export * from './shared/NodesManager/NavNodeContextMenuService'; export * from './shared/NodesManager/NavNodeInfoResource'; export * from './shared/NodesManager/NavNodeManagerService'; export * from './shared/NodesManager/NavTreeResource'; +export * from './shared/NodesManager/NavTreeSettingsService'; export * from './shared/NodesManager/nodeDeleteContext'; export * from './shared/NodesManager/NavNodeExtensionsService'; export * from './shared/NodesManager/NodeLink'; diff --git a/webapp/packages/core-app/src/manifest.ts b/webapp/packages/core-app/src/manifest.ts index c01b89a3c4..932b111b71 100644 --- a/webapp/packages/core-app/src/manifest.ts +++ b/webapp/packages/core-app/src/manifest.ts @@ -24,12 +24,14 @@ import { NavNodeInfoResource } from './shared/NodesManager/NavNodeInfoResource'; import { NavNodeManagerService } from './shared/NodesManager/NavNodeManagerService'; import { NavNodeViewService } from './shared/NodesManager/NavNodeView/NavNodeViewService'; import { NavTreeResource } from './shared/NodesManager/NavTreeResource'; +import { NavTreeSettingsService } from './shared/NodesManager/NavTreeSettingsService'; import { SessionExpiredDialogService } from './shared/SessionExpireDialog/SessionExpiredDialogService'; import { SessionExpireWarningDialogService } from './shared/SessionExpireWarningDialog/SessionExpireWarningDialogService'; import { SqlGeneratorsBootstrap } from './shared/SqlGenerators/SqlGeneratorsBootstrap'; import { SqlGeneratorsResource } from './shared/SqlGenerators/SqlGeneratorsResource'; import { LogViewerBootstrap } from './shared/ToolsPanel/LogViewer/LogViewerBootstrap'; import { LogViewerService } from './shared/ToolsPanel/LogViewer/LogViewerService'; +import { LogViewerSettingsService } from './shared/ToolsPanel/LogViewer/LogViewerSettingsService'; import { ToolsPanelService } from './shared/ToolsPanel/ToolsPanelService'; import { AdministrationTopAppBarBootstrapService } from './TopNavBar/AdministrationTopAppBarBootstrapService'; import { ConnectionSchemaManagerBootstrap } from './TopNavBar/ConnectionSchemaManager/ConnectionSchemaManagerBootstrap'; @@ -63,6 +65,8 @@ export const coreAppManifest: PluginManifest = { TopNavService, AppScreenService, CoreSettingsService, + NavTreeSettingsService, + LogViewerSettingsService, AdministrationTopAppBarBootstrapService, AppLocaleService, SessionExpiredDialogService, diff --git a/webapp/packages/core-app/src/shared/NodesManager/NavNodeContextMenuService.ts b/webapp/packages/core-app/src/shared/NodesManager/NavNodeContextMenuService.ts index bdddb5d10e..06fda84858 100644 --- a/webapp/packages/core-app/src/shared/NodesManager/NavNodeContextMenuService.ts +++ b/webapp/packages/core-app/src/shared/NodesManager/NavNodeContextMenuService.ts @@ -25,6 +25,7 @@ import type { INodeActions } from './INodeActions'; import { getNodeDisplayName, NavNodeInfoResource } from './NavNodeInfoResource'; import { NavNodeManagerService } from './NavNodeManagerService'; import { NavTreeResource } from './NavTreeResource'; +import { NavTreeSettingsService } from './NavTreeSettingsService'; import { nodeDeleteContext } from './nodeDeleteContext'; export interface INodeMenuData { @@ -43,7 +44,8 @@ export class NavNodeContextMenuService extends Bootstrap { private readonly menuService: MenuService, private readonly coreSettingsService: CoreSettingsService, private readonly localizationService: LocalizationService, - private readonly navNodeInfoResource: NavNodeInfoResource + private readonly navNodeInfoResource: NavNodeInfoResource, + private readonly navTreeSettingsService: NavTreeSettingsService ) { super(); } @@ -87,7 +89,9 @@ export class NavNodeContextMenuService extends Bootstrap { } if (action === ACTION_RENAME) { - const globalPermission = this.coreSettingsService.settings.getValue('app.metadata.editing'); + const globalPermission = this.navTreeSettingsService.settings.isValueDefault('editing') + ? this.coreSettingsService.settings.getValue('app.metadata.editing') + : this.navTreeSettingsService.settings.getValue('editing'); if (!globalPermission) { return false; @@ -97,7 +101,9 @@ export class NavNodeContextMenuService extends Bootstrap { } if (action === ACTION_DELETE) { - const globalPermission = this.coreSettingsService.settings.getValue('app.metadata.deleting'); + const globalPermission = this.navTreeSettingsService.settings.isValueDefault('deleting') + ? this.coreSettingsService.settings.getValue('app.metadata.deleting') + : this.navTreeSettingsService.settings.getValue('deleting'); if (!globalPermission) { return false; diff --git a/webapp/packages/core-app/src/shared/NodesManager/NavTreeResource.ts b/webapp/packages/core-app/src/shared/NodesManager/NavTreeResource.ts index 33db2948fc..0b631d9709 100644 --- a/webapp/packages/core-app/src/shared/NodesManager/NavTreeResource.ts +++ b/webapp/packages/core-app/src/shared/NodesManager/NavTreeResource.ts @@ -30,6 +30,7 @@ import { MetadataMap } from '@cloudbeaver/core-utils'; import { CoreSettingsService } from '../../CoreSettingsService'; import type { NavNode } from './EntityTypes'; import { NavNodeInfoResource, ROOT_NODE_PATH } from './NavNodeInfoResource'; +import { NavTreeSettingsService } from './NavTreeSettingsService'; import { NodeManagerUtils } from './NodeManagerUtils'; // TODO: so much dirty @@ -62,13 +63,18 @@ export class NavTreeResource extends CachedMapResource { protected metadata: MetadataMap; get childrenLimit(): number { - return this.coreSettingsService.settings.getValue('app.navigationTree.childrenLimit'); + return ( + this.navTreeSettingsService.settings.isValueDefault('childrenLimit') + ? this.coreSettingsService.settings.getValue('app.navigationTree.childrenLimit') + : this.navTreeSettingsService.settings.getValue('childrenLimit') + ); } constructor( private readonly graphQLService: GraphQLService, private readonly navNodeInfoResource: NavNodeInfoResource, private readonly coreSettingsService: CoreSettingsService, + private readonly navTreeSettingsService: NavTreeSettingsService, private readonly sessionDataResource: SessionDataResource, private readonly connectionInfo: ConnectionInfoResource, private readonly userInfoResource: UserInfoResource, diff --git a/webapp/packages/core-app/src/shared/NodesManager/NavTreeSettingsService.ts b/webapp/packages/core-app/src/shared/NodesManager/NavTreeSettingsService.ts new file mode 100644 index 0000000000..98f29b7e79 --- /dev/null +++ b/webapp/packages/core-app/src/shared/NodesManager/NavTreeSettingsService.ts @@ -0,0 +1,28 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2022 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 { injectable } from '@cloudbeaver/core-di'; +import { PluginManagerService, PluginSettings } from '@cloudbeaver/core-plugin'; + +const defaultSettings = { + // temporary limit for all nodes children in app + childrenLimit: 500, + editing: true, + deleting: true, +}; + +export type NavTreeSettings = typeof defaultSettings; + +@injectable() +export class NavTreeSettingsService { + readonly settings: PluginSettings; + + constructor(private readonly pluginManagerService: PluginManagerService) { + this.settings = this.pluginManagerService.getCoreSettings('navigation-tree', defaultSettings); + } +} diff --git a/webapp/packages/core-app/src/shared/ToolsPanel/LogViewer/LogViewerService.ts b/webapp/packages/core-app/src/shared/ToolsPanel/LogViewer/LogViewerService.ts index 0ae1f1aff2..a5fb7f0c41 100644 --- a/webapp/packages/core-app/src/shared/ToolsPanel/LogViewer/LogViewerService.ts +++ b/webapp/packages/core-app/src/shared/ToolsPanel/LogViewer/LogViewerService.ts @@ -17,6 +17,7 @@ import { uuid } from '@cloudbeaver/core-utils'; import { CoreSettingsService } from '../../../CoreSettingsService'; import type { ILogEntry } from './ILogEntry'; +import { LogViewerSettingsService } from './LogViewerSettingsService'; const logViewerSettingsKey = 'log-viewer'; @@ -46,6 +47,7 @@ export class LogViewerService { private readonly notificationService: NotificationService, private readonly permissionsService: PermissionsService, private readonly permissionsResource: SessionPermissionsResource, + private readonly logViewerSettingsService: LogViewerSettingsService, private readonly sessionExpireService: SessionExpireService ) { @@ -80,8 +82,14 @@ export class LogViewerService { } this.failedRequestsCount = 0; this.settings.active = true; - const refreshInterval = this.coreSettingsService.settings.getValue('app.logViewer.refreshTimeout'); - this.maxFailedRequests = this.coreSettingsService.settings.getValue('app.logViewer.maxFailedRequests'); + + const refreshInterval = this.logViewerSettingsService.settings.isValueDefault('refreshTimeout') + ? this.coreSettingsService.settings.getValue('app.logViewer.refreshTimeout') + : this.logViewerSettingsService.settings.getValue('refreshTimeout'); + + this.maxFailedRequests = this.logViewerSettingsService.settings.isValueDefault('maxFailedRequests') + ? this.coreSettingsService.settings.getValue('app.logViewer.maxFailedRequests') + : this.logViewerSettingsService.settings.getValue('maxFailedRequests'); await this.updateLog(); this.runInterval(refreshInterval); @@ -100,7 +108,10 @@ export class LogViewerService { } async loadLog(): Promise { - const maxLogEntries = this.coreSettingsService.settings.getValue('app.logViewer.logBatchSize'); + const maxLogEntries = this.logViewerSettingsService.settings.isValueDefault('logBatchSize') + ? this.coreSettingsService.settings.getValue('app.logViewer.logBatchSize') + : this.logViewerSettingsService.settings.getValue('logBatchSize'); + const { log } = await this.graphQLService.sdk.readSessionLog({ maxEntries: maxLogEntries, clearEntries: true, @@ -114,7 +125,11 @@ export class LogViewerService { private addNewEntries(entries: ILogEntry[]) { this.log.unshift(...entries.reverse()); - const maxLogEntries = this.coreSettingsService.settings.getValue('app.logViewer.maxLogRecords'); + + const maxLogEntries = this.logViewerSettingsService.settings.isValueDefault('maxLogRecords') + ? this.coreSettingsService.settings.getValue('app.logViewer.maxLogRecords') + : this.logViewerSettingsService.settings.getValue('maxLogRecords'); + if (this.log.length > maxLogEntries) { this.log.splice(maxLogEntries, this.log.length - maxLogEntries); } @@ -134,9 +149,9 @@ export class LogViewerService { try { const newEntries = await this.loadLog(); this.addNewEntries(newEntries); - } catch (e: any) { - if (this.failedRequestsCount === 0 && !this.sessionExpireService.sessionExpired) { - this.notificationService.logException(e, 'Failed to load log'); + } catch (exception: any) { + if (this.failedRequestsCount === 0 && !this.sessionExpireService.expired) { + this.notificationService.logException(exception, 'Failed to load log'); } this.failedRequestsCount++; diff --git a/webapp/packages/core-browser/src/CookiesSettingsService.ts b/webapp/packages/core-app/src/shared/ToolsPanel/LogViewer/LogViewerSettingsService.ts similarity index 66% rename from webapp/packages/core-browser/src/CookiesSettingsService.ts rename to webapp/packages/core-app/src/shared/ToolsPanel/LogViewer/LogViewerSettingsService.ts index 4d83a6df2b..e65fdd5255 100644 --- a/webapp/packages/core-browser/src/CookiesSettingsService.ts +++ b/webapp/packages/core-app/src/shared/ToolsPanel/LogViewer/LogViewerSettingsService.ts @@ -10,16 +10,19 @@ import { injectable } from '@cloudbeaver/core-di'; import { PluginManagerService, PluginSettings } from '@cloudbeaver/core-plugin'; const defaultSettings = { - disabled: false, + refreshTimeout: 3000, + maxLogRecords: 1000, + logBatchSize: 2000, + maxFailedRequests: 3, }; -export type CookiesSettings = typeof defaultSettings; +export type LogViewerSettings = typeof defaultSettings; @injectable() -export class CookiesSettingsService { - readonly settings: PluginSettings; +export class LogViewerSettingsService { + readonly settings: PluginSettings; constructor(private readonly pluginManagerService: PluginManagerService) { - this.settings = this.pluginManagerService.getPluginSettings('core.cookies', defaultSettings); + this.settings = this.pluginManagerService.getPluginSettings('log-viewer', defaultSettings); } } diff --git a/webapp/packages/core-authentication/src/AuthSettingsService.ts b/webapp/packages/core-authentication/src/AuthSettingsService.ts index 0b4a8ab71a..61e65bd9e5 100644 --- a/webapp/packages/core-authentication/src/AuthSettingsService.ts +++ b/webapp/packages/core-authentication/src/AuthSettingsService.ts @@ -20,7 +20,7 @@ export type AuthSettings = typeof defaultSettings; export class AuthSettingsService { readonly settings: PluginSettings; - constructor(private readonly pluginManagerService: PluginManagerService) { - this.settings = this.pluginManagerService.getPluginSettings('core.authentication', defaultSettings); + constructor(private readonly pluginManagerService: PluginManagerService) { + this.settings = this.pluginManagerService.getCoreSettings('authentication', defaultSettings); } } diff --git a/webapp/packages/core-browser/src/BrowserSettingsService.ts b/webapp/packages/core-browser/src/BrowserSettingsService.ts new file mode 100644 index 0000000000..6b62c50c99 --- /dev/null +++ b/webapp/packages/core-browser/src/BrowserSettingsService.ts @@ -0,0 +1,36 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2020-2022 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 { injectable } from '@cloudbeaver/core-di'; +import { PluginManagerService, PluginSettings } from '@cloudbeaver/core-plugin'; + +const defaultSettings = { + 'cookies.disabled': false, +}; + +/** @deprecated don't use */ +const deprecatedDefaultSettings = { + disabled: false, +}; + +export type CookiesSettings = typeof defaultSettings; + +/** @deprecated don't use */ +export type DeprecatedCookiesSettings = typeof deprecatedDefaultSettings; + +@injectable() +export class BrowserSettingsService { + readonly settings: PluginSettings; + /** @deprecated Use settings instead, will be removed in 23.0.0 */ + readonly deprecatedSettings: PluginSettings; + + constructor(private readonly pluginManagerService: PluginManagerService) { + this.settings = this.pluginManagerService.getPluginSettings('browser', defaultSettings); + this.deprecatedSettings = this.pluginManagerService.getCoreSettings('cookies', deprecatedDefaultSettings); + } +} diff --git a/webapp/packages/core-browser/src/CookiesService.ts b/webapp/packages/core-browser/src/CookiesService.ts index de4e0af625..3546a97cae 100644 --- a/webapp/packages/core-browser/src/CookiesService.ts +++ b/webapp/packages/core-browser/src/CookiesService.ts @@ -8,13 +8,16 @@ import { injectable } from '@cloudbeaver/core-di'; -import { CookiesSettingsService } from './CookiesSettingsService'; +import { BrowserSettingsService } from './BrowserSettingsService'; @injectable() export class CookiesService { get cookiesEnabled() { - return !this.cookiesSettingsService.settings.getValue('disabled'); + if (this.browserSettingsService.settings.isValueDefault('cookies.disabled')) { + return !this.browserSettingsService.deprecatedSettings.getValue('disabled'); + } + return !this.browserSettingsService.settings.getValue('cookies.disabled'); } - constructor(private readonly cookiesSettingsService: CookiesSettingsService) {} + constructor(private readonly browserSettingsService: BrowserSettingsService) {} } \ No newline at end of file diff --git a/webapp/packages/core-browser/src/manifest.ts b/webapp/packages/core-browser/src/manifest.ts index 66530bcff5..f9da3ec660 100644 --- a/webapp/packages/core-browser/src/manifest.ts +++ b/webapp/packages/core-browser/src/manifest.ts @@ -8,8 +8,8 @@ import type { PluginManifest } from '@cloudbeaver/core-di'; +import { BrowserSettingsService } from './BrowserSettingsService'; import { CookiesService } from './CookiesService'; -import { CookiesSettingsService } from './CookiesSettingsService'; export const coreBrowserManifest: PluginManifest = { @@ -18,7 +18,7 @@ export const coreBrowserManifest: PluginManifest = { }, providers: [ - CookiesSettingsService, + BrowserSettingsService, CookiesService, ], }; diff --git a/webapp/packages/core-events/src/EventsSettingsService.ts b/webapp/packages/core-events/src/EventsSettingsService.ts index cbac46f7a4..9c874d26c4 100644 --- a/webapp/packages/core-events/src/EventsSettingsService.ts +++ b/webapp/packages/core-events/src/EventsSettingsService.ts @@ -12,7 +12,6 @@ import { PluginManagerService, PluginSettings } from '@cloudbeaver/core-plugin'; const defaultSettings = { notificationsPool: 5, maxPersistentAllow: 5, - }; export type EventsSettings = typeof defaultSettings; @@ -20,8 +19,11 @@ export type EventsSettings = typeof defaultSettings; @injectable() export class EventsSettingsService { readonly settings: PluginSettings; + /** @deprecated Use settings instead, will be removed in 23.0.0 */ + readonly deprecatedSettings: PluginSettings; - constructor(private readonly pluginManagerService: PluginManagerService) { - this.settings = this.pluginManagerService.getPluginSettings('core_events', defaultSettings); + constructor(private readonly pluginManagerService: PluginManagerService) { + this.settings = this.pluginManagerService.getPluginSettings('notifications', defaultSettings); + this.deprecatedSettings = this.pluginManagerService.getDeprecatedPluginSettings('core_events', defaultSettings); } } diff --git a/webapp/packages/core-events/src/NotificationService.ts b/webapp/packages/core-events/src/NotificationService.ts index 940fa362ac..0809b752aa 100644 --- a/webapp/packages/core-events/src/NotificationService.ts +++ b/webapp/packages/core-events/src/NotificationService.ts @@ -51,8 +51,13 @@ export class NotificationService { ): INotification { if (options.persistent) { const persistentNotifications = this.notificationList.values.filter(value => value.persistent); - if (persistentNotifications.length >= this.settings.settings.getValue('maxPersistentAllow')) { - throw new Error(`You cannot create more than ${this.settings.settings.getValue('maxPersistentAllow')} persistent notification`); + + const maxPersistentAllow = this.settings.settings.isValueDefault('maxPersistentAllow') + ? this.settings.deprecatedSettings.getValue('maxPersistentAllow') + : this.settings.settings.getValue('maxPersistentAllow'); + + if (persistentNotifications.length >= maxPersistentAllow) { + throw new Error(`You cannot create more than ${maxPersistentAllow} persistent notification`); } } @@ -90,7 +95,11 @@ export class NotificationService { const filteredNotificationList = this.notificationList.values.filter(notification => !notification.persistent); - if (filteredNotificationList.length > this.settings.settings.getValue('notificationsPool')) { + const notificationsPool = this.settings.settings.isValueDefault('notificationsPool') + ? this.settings.deprecatedSettings.getValue('notificationsPool') + : this.settings.settings.getValue('notificationsPool'); + + if (filteredNotificationList.length > notificationsPool) { let i = 0; while (this.notificationList.get(this.notificationList.keys[i])?.persistent) { i++; diff --git a/webapp/packages/core-localization/src/LocalizationService.ts b/webapp/packages/core-localization/src/LocalizationService.ts index c325144abb..0a1e7db6a3 100644 --- a/webapp/packages/core-localization/src/LocalizationService.ts +++ b/webapp/packages/core-localization/src/LocalizationService.ts @@ -43,6 +43,10 @@ export class LocalizationService extends Bootstrap { } get defaultLanguage(): string { + if (this.pluginSettings.getValue('defaultLanguage')) { + return this.deprecatedPluginSettings.getValue('defaultLanguage'); + } + return this.pluginSettings.getValue('defaultLanguage'); } @@ -50,6 +54,8 @@ export class LocalizationService extends Bootstrap { language: DEFAULT_LOCALE_NAME, }; readonly pluginSettings: PluginSettings; + /** @deprecated Use settings instead, will be removed in 23.0.0 */ + readonly deprecatedPluginSettings: PluginSettings; readonly onChange: ISyncExecutor; // observable.shallow - don't treat locales as observables @@ -67,7 +73,8 @@ export class LocalizationService extends Bootstrap { super(); this.onChange = new SyncExecutor(); - this.pluginSettings = this.pluginManagerService.getPluginSettings('core.user', defaultThemeSettings); + this.pluginSettings = this.pluginManagerService.getCoreSettings('localization', defaultThemeSettings); + this.deprecatedPluginSettings = this.pluginManagerService.getCoreSettings('user', defaultThemeSettings); sessionResource.onDataUpdate.addHandler(this.syncLanguage.bind(this)); makeObservable(this, { diff --git a/webapp/packages/core-plugin/src/PluginManagerService.ts b/webapp/packages/core-plugin/src/PluginManagerService.ts index 4568ca2de9..627a5111b0 100644 --- a/webapp/packages/core-plugin/src/PluginManagerService.ts +++ b/webapp/packages/core-plugin/src/PluginManagerService.ts @@ -15,7 +15,19 @@ import { PluginSettings } from './PluginSettings'; export class PluginManagerService { constructor(private readonly productManagerService: ProductManagerService) { } + getCoreSettings(scope: string, defaults: T) { + return new PluginSettings(this.productManagerService.settings, 'core.' + scope, defaults); + } + getPluginSettings(scope: string, defaults: T) { + return new PluginSettings(this.productManagerService.settings, 'plugin.' + scope, defaults); + } + + /** + * Please use getPluginSettings instead + * @deprecated Please use getPluginSettings instead, will be removed in 23.0.0 + */ + getDeprecatedPluginSettings(scope: string, defaults: T) { return new PluginSettings(this.productManagerService.settings, scope, defaults); } } diff --git a/webapp/packages/core-plugin/src/PluginSettings.ts b/webapp/packages/core-plugin/src/PluginSettings.ts index 9afb7e8853..3c29c3c650 100644 --- a/webapp/packages/core-plugin/src/PluginSettings.ts +++ b/webapp/packages/core-plugin/src/PluginSettings.ts @@ -20,6 +20,10 @@ export class PluginSettings implements ISettingsSource { return true; } + isValueDefault(key: TKey): boolean { + return !this.source.has(this.scopedKey(key)); + } + getValue(key: TKey): T[TKey] { if (this.source.has(this.scopedKey(key))) { return this.source.getValue(this.scopedKey(key)); diff --git a/webapp/packages/core-theming/src/ThemeService.ts b/webapp/packages/core-theming/src/ThemeService.ts index 50a4f6e06b..6b1c5592c0 100644 --- a/webapp/packages/core-theming/src/ThemeService.ts +++ b/webapp/packages/core-theming/src/ThemeService.ts @@ -46,6 +46,10 @@ export class ThemeService extends Bootstrap { } get defaultThemeId(): string { + if (this.themeSettingsService.settings.isValueDefault('defaultTheme')) { + return this.themeSettingsService.deprecatedSettings.getValue('defaultTheme'); + } + return this.themeSettingsService.settings.getValue('defaultTheme'); } diff --git a/webapp/packages/core-theming/src/ThemeSettingsService.ts b/webapp/packages/core-theming/src/ThemeSettingsService.ts index b509e9e760..9348de1e69 100644 --- a/webapp/packages/core-theming/src/ThemeSettingsService.ts +++ b/webapp/packages/core-theming/src/ThemeSettingsService.ts @@ -22,8 +22,11 @@ export const defaultThemeSettings: IDefaultSettings = { @injectable() export class ThemeSettingsService { readonly settings: PluginSettings; + /** @deprecated Use settings instead, will be removed in 23.0.0 */ + readonly deprecatedSettings: PluginSettings; constructor(private readonly pluginManagerService: PluginManagerService) { - this.settings = this.pluginManagerService.getPluginSettings('core.user', defaultThemeSettings); + this.settings = this.pluginManagerService.getPluginSettings('theming', defaultThemeSettings); + this.deprecatedSettings = this.pluginManagerService.getCoreSettings('user', defaultThemeSettings); } } diff --git a/webapp/packages/plugin-data-export/src/DataExportMenuService.ts b/webapp/packages/plugin-data-export/src/DataExportMenuService.ts index fb064587cd..ddf286744f 100644 --- a/webapp/packages/plugin-data-export/src/DataExportMenuService.ts +++ b/webapp/packages/plugin-data-export/src/DataExportMenuService.ts @@ -10,10 +10,10 @@ import { EObjectFeature, DATA_CONTEXT_NAV_NODE } from '@cloudbeaver/core-app'; import { injectable } from '@cloudbeaver/core-di'; import { IMenuContext, CommonDialogService } from '@cloudbeaver/core-dialogs'; import { ActionService, ACTION_EXPORT, DATA_CONTEXT_MENU_NESTED, MenuService } from '@cloudbeaver/core-view'; +import { DATA_CONTEXT_CONNECTION } from '@cloudbeaver/plugin-connections'; import { TableFooterMenuService, ITableFooterMenuContext, IDatabaseDataSource, IDataContainerOptions } from '@cloudbeaver/plugin-data-viewer'; import type { IDataQueryOptions } from '@cloudbeaver/plugin-sql-editor'; -import { DATA_CONTEXT_CONNECTION } from '../../plugin-connections/src'; import { DataExportSettingsService } from './DataExportSettingsService'; import { DataExportDialog } from './Dialog/DataExportDialog'; @@ -37,7 +37,7 @@ export class DataExportMenuService { isPresent(context) { return context.contextType === TableFooterMenuService.nodeContextType; }, - isHidden: () => this.dataExportSettingsService.settings.getValue('disabled'), + isHidden: () => this.isDisabled(), isDisabled(context) { return context.data.model.isLoading() || context.data.model.isDisabled(context.data.resultIndex) @@ -55,7 +55,7 @@ export class DataExportMenuService { } return ( - !this.dataExportSettingsService.settings.getValue('disabled') + !this.isDisabled() && context.has(DATA_CONTEXT_CONNECTION) && !context.has(DATA_CONTEXT_MENU_NESTED) ); @@ -110,4 +110,11 @@ export class DataExportMenuService { }, }); } + + private isDisabled() { + if (this.dataExportSettingsService.settings.isValueDefault('disabled')) { + return this.dataExportSettingsService.deprecatedSettings.getValue('disabled'); + } + return this.dataExportSettingsService.settings.getValue('disabled'); + } } diff --git a/webapp/packages/plugin-data-export/src/DataExportSettingsService.ts b/webapp/packages/plugin-data-export/src/DataExportSettingsService.ts index 470889cca5..e240d2e33e 100644 --- a/webapp/packages/plugin-data-export/src/DataExportSettingsService.ts +++ b/webapp/packages/plugin-data-export/src/DataExportSettingsService.ts @@ -18,8 +18,11 @@ export type DataExportSettings = typeof defaultSettings; @injectable() export class DataExportSettingsService { readonly settings: PluginSettings; + /** @deprecated Use settings instead, will be removed in 23.0.0 */ + readonly deprecatedSettings: PluginSettings; constructor(private readonly pluginManagerService: PluginManagerService) { - this.settings = this.pluginManagerService.getPluginSettings('plugin_data_export', defaultSettings); + this.settings = this.pluginManagerService.getPluginSettings('data-export', defaultSettings); + this.deprecatedSettings = this.pluginManagerService.getDeprecatedPluginSettings('plugin_data_export', defaultSettings); } } diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/DataGridSettingsService.ts b/webapp/packages/plugin-data-spreadsheet-new/src/DataGridSettingsService.ts index 134fc988f1..0fa6f375b4 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGridSettingsService.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGridSettingsService.ts @@ -18,8 +18,11 @@ export type DataGridSettings = typeof defaultSettings; @injectable() export class DataGridSettingsService { readonly settings: PluginSettings; + /** @deprecated Use settings instead, will be removed in 23.0.0 */ + readonly deprecatedSettings: PluginSettings; constructor(private readonly pluginManagerService: PluginManagerService) { - this.settings = this.pluginManagerService.getPluginSettings('plugin_data_spreadsheet_new', defaultSettings); + this.settings = this.pluginManagerService.getPluginSettings('data-spreadsheet', defaultSettings); + this.deprecatedSettings = this.pluginManagerService.getDeprecatedPluginSettings('plugin_data_spreadsheet_new', defaultSettings); } } diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/SpreadsheetBootstrap.ts b/webapp/packages/plugin-data-spreadsheet-new/src/SpreadsheetBootstrap.ts index 8a43cf048b..7c71c94570 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/SpreadsheetBootstrap.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/SpreadsheetBootstrap.ts @@ -40,7 +40,11 @@ export class SpreadsheetBootstrap extends Bootstrap { id: 'spreadsheet_grid', dataFormat: ResultDataFormat.Resultset, getPresentationComponent: () => SpreadsheetGrid, - hidden: () => this.dataGridSettingsService.settings.getValue('hidden'), + hidden: () => ( + this.dataGridSettingsService.settings.isValueDefault('hidden') + ? this.dataGridSettingsService.deprecatedSettings.getValue('hidden') + : this.dataGridSettingsService.settings.getValue('hidden') + ), title: 'Table', icon: 'table-icon-sm', }); diff --git a/webapp/packages/plugin-data-viewer/src/DataViewerService.ts b/webapp/packages/plugin-data-viewer/src/DataViewerService.ts index 4e024af55d..72f8f8dcd2 100644 --- a/webapp/packages/plugin-data-viewer/src/DataViewerService.ts +++ b/webapp/packages/plugin-data-viewer/src/DataViewerService.ts @@ -18,7 +18,9 @@ export class DataViewerService { ) { } isDataEditable(connection: Connection) { - const disabled = this.dataViewerSettingsService.settings.getValue('disableEdit'); + const disabled = this.dataViewerSettingsService.settings.isValueDefault('disableEdit') + ? this.dataViewerSettingsService.deprecatedSettings.getValue('disableEdit') + : this.dataViewerSettingsService.settings.getValue('disableEdit'); return !disabled && !connection.readOnly; } } \ No newline at end of file diff --git a/webapp/packages/plugin-data-viewer/src/DataViewerSettingsService.ts b/webapp/packages/plugin-data-viewer/src/DataViewerSettingsService.ts index 4e000998b7..1bba55ad64 100644 --- a/webapp/packages/plugin-data-viewer/src/DataViewerSettingsService.ts +++ b/webapp/packages/plugin-data-viewer/src/DataViewerSettingsService.ts @@ -18,8 +18,11 @@ export type DataViewerSettings = typeof defaultSettings; @injectable() export class DataViewerSettingsService { readonly settings: PluginSettings; + /** @deprecated Use settings instead, will be removed in 23.0.0 */ + readonly deprecatedSettings: PluginSettings; constructor(private readonly pluginManagerService: PluginManagerService) { - this.settings = this.pluginManagerService.getPluginSettings('core.app.dataViewer', defaultSettings); + this.settings = this.pluginManagerService.getPluginSettings('data-viewer', defaultSettings); + this.deprecatedSettings = this.pluginManagerService.getDeprecatedPluginSettings('core.app.dataViewer', defaultSettings); } } \ No newline at end of file diff --git a/webapp/packages/plugin-object-viewer/src/ObjectPropertiesPage/ObjectPropertyTable/ObjectPropertyTableFooterService.ts b/webapp/packages/plugin-object-viewer/src/ObjectPropertiesPage/ObjectPropertyTable/ObjectPropertyTableFooterService.ts index 51ed2649b0..c64934056b 100644 --- a/webapp/packages/plugin-object-viewer/src/ObjectPropertiesPage/ObjectPropertyTable/ObjectPropertyTableFooterService.ts +++ b/webapp/packages/plugin-object-viewer/src/ObjectPropertiesPage/ObjectPropertyTable/ObjectPropertyTableFooterService.ts @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. */ -import { CoreSettingsService, ENodeFeature, getNodeDisplayName, NavNode, NavNodeInfoResource, NavTreeResource } from '@cloudbeaver/core-app'; +import { CoreSettingsService, ENodeFeature, getNodeDisplayName, NavNode, NavNodeInfoResource, NavTreeResource, NavTreeSettingsService } from '@cloudbeaver/core-app'; import type { TableState } from '@cloudbeaver/core-blocks'; import { injectable } from '@cloudbeaver/core-di'; import { @@ -32,7 +32,8 @@ export class ObjectPropertyTableFooterService { private readonly navNodeInfoResource: NavNodeInfoResource, private readonly notificationService: NotificationService, private readonly commonDialogService: CommonDialogService, - private readonly coreSettingsService: CoreSettingsService + private readonly coreSettingsService: CoreSettingsService, + private readonly navTreeSettingsService: NavTreeSettingsService ) { this.contextMenuService.addPanel(this.objectPropertyTableFooterToken); @@ -45,7 +46,9 @@ export class ObjectPropertyTableFooterService { isPresent(context) { return context.contextType === ObjectPropertyTableFooterService.objectPropertyContextType; }, - isHidden: () => !this.coreSettingsService.settings.getValue('app.metadata.deleting'), + isHidden: () => !(this.navTreeSettingsService.settings.isValueDefault('deleting') + ? this.coreSettingsService.settings.getValue('app.metadata.deleting') + : this.navTreeSettingsService.settings.getValue('deleting')), isDisabled: context => { if (context.data.tableState.selectedList.length === 0) { return true; diff --git a/webapp/packages/plugin-resource-manager/src/ResourceManagerSettingsService.ts b/webapp/packages/plugin-resource-manager/src/ResourceManagerSettingsService.ts index 0f39d71240..f3aa4525ca 100644 --- a/webapp/packages/plugin-resource-manager/src/ResourceManagerSettingsService.ts +++ b/webapp/packages/plugin-resource-manager/src/ResourceManagerSettingsService.ts @@ -16,8 +16,11 @@ const defaultSettings = { @injectable() export class ResourceManagerSettingsService { readonly settings: PluginSettings; + /** @deprecated Use settings instead, will be removed in 23.0.0 */ + readonly deprecatedSettings: PluginSettings; constructor(private readonly pluginManagerService: PluginManagerService) { - this.settings = this.pluginManagerService.getPluginSettings('plugin_resource_manager', defaultSettings); + this.settings = this.pluginManagerService.getPluginSettings('resource-manager', defaultSettings); + this.deprecatedSettings = this.pluginManagerService.getDeprecatedPluginSettings('plugin_resource_manager', defaultSettings); } } diff --git a/webapp/packages/plugin-sql-editor-navigation-tab-resource/src/PluginBootstrap.ts b/webapp/packages/plugin-sql-editor-navigation-tab-resource/src/PluginBootstrap.ts index 36f4b3c499..1ddd521021 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab-resource/src/PluginBootstrap.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab-resource/src/PluginBootstrap.ts @@ -195,7 +195,9 @@ export class PluginBootstrap extends Bootstrap { return; } - const maxSize = this.sqlEditorSettingsService.settings.getValue('maxFileSize'); + const maxSize = this.sqlEditorSettingsService.settings.isValueDefault('maxFileSize') + ? this.sqlEditorSettingsService.deprecatedSettings.getValue('maxFileSize') + : this.sqlEditorSettingsService.settings.getValue('maxFileSize'); const size = Math.round(resource.length / 1000); // kilobyte if (size > maxSize) { diff --git a/webapp/packages/plugin-sql-editor-navigation-tab-resource/src/ResourceEditorSettingsService.ts b/webapp/packages/plugin-sql-editor-navigation-tab-resource/src/ResourceEditorSettingsService.ts index 6945cf35f7..6bb07c971d 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab-resource/src/ResourceEditorSettingsService.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab-resource/src/ResourceEditorSettingsService.ts @@ -19,6 +19,6 @@ export class ResourceEditorSettingsService { readonly settings: PluginSettings; constructor(private readonly pluginManagerService: PluginManagerService) { - this.settings = this.pluginManagerService.getPluginSettings('plugin.resource_editor', defaultSettings); + this.settings = this.pluginManagerService.getPluginSettings('sql-editor-navigation-tab-resource', defaultSettings); } } diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditor/useTools.tsx b/webapp/packages/plugin-sql-editor/src/SqlEditor/useTools.tsx index b9c4404fcb..fefd49c495 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlEditor/useTools.tsx +++ b/webapp/packages/plugin-sql-editor/src/SqlEditor/useTools.tsx @@ -71,7 +71,10 @@ export function useTools(state: ISqlEditorTabState): Readonly { }, checkFileValidity(file: File) { - const maxSize = this.sqlEditorSettingsService.settings.getValue('maxFileSize'); + const maxSize = this.sqlEditorSettingsService.settings.isValueDefault('maxFileSize') + ? this.sqlEditorSettingsService.deprecatedSettings.getValue('maxFileSize') + : this.sqlEditorSettingsService.settings.getValue('maxFileSize'); + const size = Math.round(file.size / 1000); // kilobyte const aboveMaxSize = size > maxSize; diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditorSettingsService.ts b/webapp/packages/plugin-sql-editor/src/SqlEditorSettingsService.ts index 7cdf0ec006..4c4a47548f 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlEditorSettingsService.ts +++ b/webapp/packages/plugin-sql-editor/src/SqlEditorSettingsService.ts @@ -16,8 +16,11 @@ const defaultSettings = { @injectable() export class SqlEditorSettingsService { readonly settings: PluginSettings; + /** @deprecated Use settings instead, will be removed in 23.0.0 */ + readonly deprecatedSettings: PluginSettings; constructor(private readonly pluginManagerService: PluginManagerService) { - this.settings = this.pluginManagerService.getPluginSettings('core.app.sqlEditor', defaultSettings); + this.settings = this.pluginManagerService.getPluginSettings('sql-editor', defaultSettings); + this.deprecatedSettings = this.pluginManagerService.getDeprecatedPluginSettings('core.app.sqlEditor', defaultSettings); } }