diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java index 0c71a6e502..f00dd02e59 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java @@ -882,6 +882,7 @@ public class WebSession extends AbstractSessionPersistent implements SMSession, public synchronized void resetAuthToken() { this.sessionPermissions = null; this.smAuthToken = null; + this.user = null; } public synchronized void updateSMAuthInfo(SMAuthInfo smAuthInfo) throws DBCException { diff --git a/webapp/packages/core-app/src/NavigationTree/ElementsTree/ElementsTreeTools/ElementsTreeTools.tsx b/webapp/packages/core-app/src/NavigationTree/ElementsTree/ElementsTreeTools/ElementsTreeTools.tsx index 20eb30e697..7fe4d7d43b 100644 --- a/webapp/packages/core-app/src/NavigationTree/ElementsTree/ElementsTreeTools/ElementsTreeTools.tsx +++ b/webapp/packages/core-app/src/NavigationTree/ElementsTree/ElementsTreeTools/ElementsTreeTools.tsx @@ -119,7 +119,7 @@ export const ElementsTreeTools = observer(function ElementsTreeTools({ {tree.settings?.configurable && ( setOpen(!opened)} diff --git a/webapp/packages/core-app/src/NavigationTree/ElementsTree/ElementsTreeTools/NavigationTreeSettings/NavigationTreeSettings.tsx b/webapp/packages/core-app/src/NavigationTree/ElementsTree/ElementsTreeTools/NavigationTreeSettings/NavigationTreeSettings.tsx index 0c7cf6ee3a..71d85f3861 100644 --- a/webapp/packages/core-app/src/NavigationTree/ElementsTree/ElementsTreeTools/NavigationTreeSettings/NavigationTreeSettings.tsx +++ b/webapp/packages/core-app/src/NavigationTree/ElementsTree/ElementsTreeTools/NavigationTreeSettings/NavigationTreeSettings.tsx @@ -49,7 +49,7 @@ export const NavigationTreeSettings = observer(function NavigationTreeSet return styled(styles)( - {translate('app_navigationTree_settings_title')} + {translate('ui_settings')} ( key: string, defaultValue: () => T, - onUpdate: (data: T) => void, + onUpdate?: (data: T) => void, validate?: (data: T) => boolean ): T { const userDataService = useService(UserDataService); @@ -25,7 +25,7 @@ export function useUserData( useEffect(() => { if (previous !== data) { - onUpdate(data); + onUpdate?.(data); } }); diff --git a/webapp/packages/core-connections/src/locales/en.ts b/webapp/packages/core-connections/src/locales/en.ts index c74eb3197b..58b7f4c675 100644 --- a/webapp/packages/core-connections/src/locales/en.ts +++ b/webapp/packages/core-connections/src/locales/en.ts @@ -26,7 +26,6 @@ export default [ ['connections_connection_credentials_provisioning', 'Authentication credentials'], ['connections_connection_credentials_provisioning_description', 'You need to fill in or confirm the credentials to test this connection'], ['connections_connection_edit_authentication', 'Authentication'], - ['connections_connection_edit_settings', 'Settings'], ['connections_connection_edit_access', 'Access'], ['connections_connection_edit_access_load_failed', 'Fail to get connection access'], ['connections_connection_edit_access_role', 'Role'], diff --git a/webapp/packages/core-connections/src/locales/it.ts b/webapp/packages/core-connections/src/locales/it.ts index 4065e6d1c4..ec3c2e23b8 100644 --- a/webapp/packages/core-connections/src/locales/it.ts +++ b/webapp/packages/core-connections/src/locales/it.ts @@ -25,7 +25,6 @@ export default [ ['connections_connection_credentials_provisioning', 'Credenziali di autenticazione'], ['connections_connection_credentials_provisioning_description', 'Devi compilare o confermare le credenziali per provare questa connessione'], ['connections_connection_edit_authentication', 'Autenticazione'], - ['connections_connection_edit_settings', 'Impostazioni'], ['connections_connection_edit_access', 'Accesso'], ['connections_connection_edit_access_load_failed', 'Errore al recupero dell\'accesso alla connessione'], ['connections_connection_edit_access_role', 'Ruolo'], diff --git a/webapp/packages/core-connections/src/locales/ru.ts b/webapp/packages/core-connections/src/locales/ru.ts index 4a329a9b20..8548f0ee89 100644 --- a/webapp/packages/core-connections/src/locales/ru.ts +++ b/webapp/packages/core-connections/src/locales/ru.ts @@ -23,7 +23,6 @@ export default [ ['connections_connection_credentials_provisioning', 'Аутентификационные данные'], ['connections_connection_credentials_provisioning_description', 'Чтобы проверить подключение, необходимо заполнить или подтвердить данные доступа'], ['connections_connection_edit_authentication', 'Авторизация'], - ['connections_connection_edit_settings', 'Настройки'], ['connections_connection_edit_access', 'Доступ'], ['connections_connection_edit_access_load_failed', 'Не удалось загрузить информацию доступа'], ['connections_connection_edit_access_role', 'Роль'], diff --git a/webapp/packages/core-connections/src/locales/zh.ts b/webapp/packages/core-connections/src/locales/zh.ts index 1af15d8d28..c312099609 100644 --- a/webapp/packages/core-connections/src/locales/zh.ts +++ b/webapp/packages/core-connections/src/locales/zh.ts @@ -26,7 +26,6 @@ export default [ ['connections_connection_credentials_provisioning', '认证凭据'], ['connections_connection_credentials_provisioning_description', '您却要填写或确认凭据以测试此连接。'], ['connections_connection_edit_authentication', '认证'], - ['connections_connection_edit_settings', '设置'], ['connections_connection_edit_access', '权限'], ['connections_connection_edit_access_load_failed', '无法获取连接访问权限'], ['connections_connection_edit_access_role', '角色'], diff --git a/webapp/packages/core-localization/src/locales/it.ts b/webapp/packages/core-localization/src/locales/it.ts index 10eb0a3818..f265c8ba92 100644 --- a/webapp/packages/core-localization/src/locales/it.ts +++ b/webapp/packages/core-localization/src/locales/it.ts @@ -41,7 +41,7 @@ export const defaultITLocale = [ ['ui_no_items_placeholder', 'Non ci sono ancora elementi.'], ['ui_search_no_result_placeholder', 'Nessun risultato trovato.'], ['ui_save_reminder', 'Ci sono modifiche non salvate.'], - ['ui_settings', 'Settings'], + ['ui_settings', 'Impostazioni'], ['ui_expand', 'Expand'], ['ui_close_all', 'Close all'], ['ui_close_others', 'Close others'], diff --git a/webapp/packages/core-localization/src/locales/zh.ts b/webapp/packages/core-localization/src/locales/zh.ts index f25d1fc3d3..b53c5954a7 100644 --- a/webapp/packages/core-localization/src/locales/zh.ts +++ b/webapp/packages/core-localization/src/locales/zh.ts @@ -62,7 +62,7 @@ export const defaultZHLocale = [ ['ui_changes_will_be_lost', '您的更改将丢失'], ['ui_continue', '继续'], ['ui_authentication', '认证'], - ['ui_settings', 'Settings'], + ['ui_settings', '设置'], ['ui_expand', 'Expand'], ['ui_close_all', 'Close all'], ['ui_close_others', 'Close others'], diff --git a/webapp/packages/core-view/src/Action/Actions/ACTION_SETTINGS.ts b/webapp/packages/core-view/src/Action/Actions/ACTION_SETTINGS.ts new file mode 100644 index 0000000000..8e2a5e2706 --- /dev/null +++ b/webapp/packages/core-view/src/Action/Actions/ACTION_SETTINGS.ts @@ -0,0 +1,15 @@ +/* + * 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 { createAction } from '../createAction'; + +export const ACTION_SETTINGS = createAction('settings', { + label: 'ui_settings', + tooltip: 'ui_settings', + icon: '/icons/settings_cog_m.svg', +}); diff --git a/webapp/packages/core-view/src/index.ts b/webapp/packages/core-view/src/index.ts index 2c84991d5e..ef31a7757b 100644 --- a/webapp/packages/core-view/src/index.ts +++ b/webapp/packages/core-view/src/index.ts @@ -8,6 +8,7 @@ export * from './Action/Actions/ACTION_OPEN'; export * from './Action/Actions/ACTION_REFRESH'; export * from './Action/Actions/ACTION_RENAME'; export * from './Action/Actions/ACTION_SAVE'; +export * from './Action/Actions/ACTION_SETTINGS'; export * from './Action/Actions/ACTION_ZOOM_IN'; export * from './Action/Actions/ACTION_ZOOM_OUT'; export * from './Action/KeyBinding/Bindings/KEY_BINDING_OPEN_IN_TAB'; diff --git a/webapp/packages/plugin-connections/src/ConnectionForm/Options/Options.tsx b/webapp/packages/plugin-connections/src/ConnectionForm/Options/Options.tsx index 92e662a2bd..95030aac5f 100644 --- a/webapp/packages/plugin-connections/src/ConnectionForm/Options/Options.tsx +++ b/webapp/packages/plugin-connections/src/ConnectionForm/Options/Options.tsx @@ -287,7 +287,7 @@ export const Options: TabContainerPanelComponent = observe )} {driverMap.isLoaded() && driver?.providerProperties && driver.providerProperties.length > 0 && ( - {translate('connections_connection_edit_settings')} + {translate('ui_settings')} {booleanProviderProperties && booleanProviderProperties.length > 0 && ( = { @@ -100,6 +102,33 @@ export class SQLParser { this.lines = []; this.customScriptDelimiters = []; this.customQuotes = [["'", "'"]]; + + makeObservable(this, { + scriptDelimiters: computed, + quoteStrings: computed, + singleLineComments: computed, + multiLineComments: computed, + actualScript: computed, + dialect: observable.ref, + _scripts: observable.shallow, + script: observable.ref, + parsedScript: observable.ref, + lines: observable.shallow, + customScriptDelimiters: observable.ref, + customQuotes: observable.ref, + getScriptSegment: action, + getSegment: action, + getQueryAtPos: action, + getLineAtPos: action, + getScriptLineAtPos: action, + setScript: action, + setDialect: action, + setCustomDelimiters: action, + parse: action, + setQueries: action, + isEndsWithDelimiter: action, + update: action, + }); } getScriptSegment(): ISQLScriptSegment { diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditor/DATA_CONTEXT_SQL_EDITOR_DATA.ts b/webapp/packages/plugin-sql-editor/src/SqlEditor/DATA_CONTEXT_SQL_EDITOR_DATA.ts new file mode 100644 index 0000000000..5521150295 --- /dev/null +++ b/webapp/packages/plugin-sql-editor/src/SqlEditor/DATA_CONTEXT_SQL_EDITOR_DATA.ts @@ -0,0 +1,14 @@ +/* + * 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 { createDataContext } from '@cloudbeaver/core-view'; + +import type { ISQLEditorData } from './ISQLEditorData'; + + +export const DATA_CONTEXT_SQL_EDITOR_DATA = createDataContext('sql-editor-data'); diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditor/ISQLEditorData.ts b/webapp/packages/plugin-sql-editor/src/SqlEditor/ISQLEditorData.ts new file mode 100644 index 0000000000..1f967b34d2 --- /dev/null +++ b/webapp/packages/plugin-sql-editor/src/SqlEditor/ISQLEditorData.ts @@ -0,0 +1,58 @@ +/* + * CloudBeaver - Cloud Database Manager + * Copyright (C) 2019-2022 DBeaver Corp + * + * All Rights Reserved + * + * NOTICE: All information contained herein is, and remains + * the property of DBeaver Corp and its suppliers, if any. + * The intellectual and technical concepts contained + * herein are proprietary to DBeaver Corp and its suppliers + * and may be covered by U.S. and Foreign Patents, + * patents in process, and are protected by trade secret or copyright law. + * Dissemination of this information or reproduction of this material + * is strictly forbidden unless prior written permission is obtained + * from DBeaver Corp. + */ + +import type { ISyncExecutor } from '@cloudbeaver/core-executor'; +import type { SqlDialectInfo } from '@cloudbeaver/core-sdk'; + +import type { SQLProposal } from '../SqlEditorService'; +import type { SQLParser, ISQLScriptSegment } from '../SQLParser'; + +export interface ISegmentExecutionData { + segment: ISQLScriptSegment; + type: 'start' | 'end' | 'error'; +} + +export interface ISQLEditorData { + readonly parser: SQLParser; + readonly dialect: SqlDialectInfo | undefined; + readonly activeSegment: ISQLScriptSegment | undefined; + readonly cursorSegment: ISQLScriptSegment | undefined; + readonly readonly: boolean; + readonly isLineScriptEmpty: boolean; + readonly isScriptEmpty: boolean; + readonly isDisabled: boolean; + readonly value: string; + readonly onExecute: ISyncExecutor; + readonly onSegmentExecute: ISyncExecutor; + readonly onUpdate: ISyncExecutor; + updateParserScriptsThrottle(): Promise; + setQuery(query: string): void; + init(): void; + destruct(): void; + setCursor(begin: number, end?: number): void; + formatScript(): Promise; + executeQuery (): Promise; + executeQueryNewTab(): Promise; + showExecutionPlan(): Promise; + executeScript(): Promise; + getHintProposals(position: number, simple: boolean): Promise; + executeQueryAction( + segment: ISQLScriptSegment | undefined, + action: (query: ISQLScriptSegment) => Promise, + passEmpty?: boolean + ): Promise; +} \ No newline at end of file diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditor/SQLCodeEditorPanel/useSQLCodeEditorPanel.ts b/webapp/packages/plugin-sql-editor/src/SqlEditor/SQLCodeEditorPanel/useSQLCodeEditorPanel.ts index 61e18f4683..5d89a7eba2 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlEditor/SQLCodeEditorPanel/useSQLCodeEditorPanel.ts +++ b/webapp/packages/plugin-sql-editor/src/SqlEditor/SQLCodeEditorPanel/useSQLCodeEditorPanel.ts @@ -20,8 +20,8 @@ import type { IControlledCodeMirror } from 'react-codemirror2'; import { useExecutor, useObservableRef } from '@cloudbeaver/core-blocks'; import type { SqlCompletionProposal } from '@cloudbeaver/core-sdk'; +import type { ISQLEditorData } from '../ISQLEditorData'; import type { SQLCodeEditorController } from '../SQLCodeEditor/SQLCodeEditorController'; -import type { ISQLEditorData } from '../useSqlEditor'; interface ISQLCodeEditorPanelData { proposalsWordFrom: Position | null; diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditor/useSqlEditor.ts b/webapp/packages/plugin-sql-editor/src/SqlEditor/useSqlEditor.ts index 9c39336aba..ab8a603104 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlEditor/useSqlEditor.ts +++ b/webapp/packages/plugin-sql-editor/src/SqlEditor/useSqlEditor.ts @@ -13,59 +13,24 @@ import { useObservableRef } from '@cloudbeaver/core-blocks'; import { ConnectionExecutionContextService } from '@cloudbeaver/core-connections'; import { useService } from '@cloudbeaver/core-di'; import { CommonDialogService, ConfirmationDialog, DialogueStateResult } from '@cloudbeaver/core-dialogs'; -import { ISyncExecutor, SyncExecutor } from '@cloudbeaver/core-executor'; +import { SyncExecutor } from '@cloudbeaver/core-executor'; import type { SqlDialectInfo } from '@cloudbeaver/core-sdk'; import { throttleAsync } from '@cloudbeaver/core-utils'; import type { ISqlEditorTabState } from '../ISqlEditorTabState'; import { SqlDialectInfoService } from '../SqlDialectInfoService'; -import { SqlEditorService, SQLProposal } from '../SqlEditorService'; +import { SqlEditorService } from '../SqlEditorService'; import { ISQLScriptSegment, SQLParser } from '../SQLParser'; import { SqlExecutionPlanService } from '../SqlResultTabs/ExecutionPlan/SqlExecutionPlanService'; import { SqlQueryService } from '../SqlResultTabs/SqlQueryService'; import { SqlResultTabsService } from '../SqlResultTabs/SqlResultTabsService'; +import type { ISQLEditorData } from './ISQLEditorData'; interface ICursor { begin: number; end: number; } -interface ISegmentExecutionData { - segment: ISQLScriptSegment; - type: 'start' | 'end' | 'error'; -} - -export interface ISQLEditorData { - readonly parser: SQLParser; - readonly dialect: SqlDialectInfo | undefined; - readonly activeSegment: ISQLScriptSegment | undefined; - readonly cursorSegment: ISQLScriptSegment | undefined; - readonly readonly: boolean; - readonly isLineScriptEmpty: boolean; - readonly isScriptEmpty: boolean; - readonly isDisabled: boolean; - readonly value: string; - readonly onExecute: ISyncExecutor; - readonly onSegmentExecute: ISyncExecutor; - readonly onUpdate: ISyncExecutor; - updateParserScriptsThrottle(): Promise; - setQuery(query: string): void; - init(): void; - destruct(): void; - setCursor(begin: number, end?: number): void; - formatScript(): Promise; - executeQuery (): Promise; - executeQueryNewTab(): Promise; - showExecutionPlan(): Promise; - executeScript(): Promise; - getHintProposals(position: number, simple: boolean): Promise; - executeQueryAction( - segment: ISQLScriptSegment | undefined, - action: (query: ISQLScriptSegment) => Promise, - passEmpty?: boolean - ): Promise; -} - interface ISQLEditorDataPrivate extends ISQLEditorData { readonly sqlDialectInfoService: SqlDialectInfoService; readonly connectionExecutionContextService: ConnectionExecutionContextService; diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditorModeService.ts b/webapp/packages/plugin-sql-editor/src/SqlEditorModeService.ts index 595ef5e16a..da31b3d2a4 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlEditorModeService.ts +++ b/webapp/packages/plugin-sql-editor/src/SqlEditorModeService.ts @@ -10,7 +10,7 @@ import { injectable } from '@cloudbeaver/core-di'; import { TabsContainer } from '@cloudbeaver/core-ui'; import type { ISqlEditorTabState } from '@cloudbeaver/plugin-sql-editor'; -import type { ISQLEditorData } from './SqlEditor/useSqlEditor'; +import type { ISQLEditorData } from './SqlEditor/ISQLEditorData'; export interface ISqlEditorModeProps { state: ISqlEditorTabState; diff --git a/webapp/packages/plugin-sql-editor/src/index.ts b/webapp/packages/plugin-sql-editor/src/index.ts index fa404dcfc2..ac3f784077 100644 --- a/webapp/packages/plugin-sql-editor/src/index.ts +++ b/webapp/packages/plugin-sql-editor/src/index.ts @@ -1,5 +1,7 @@ import { sqlEditorPluginManifest } from './manifest'; export * from './SqlEditor/SQLCodeEditor/SQLCodeEditorLoader'; +export * from './SqlEditor/ISQLEditorData'; +export * from './SqlEditor/DATA_CONTEXT_SQL_EDITOR_DATA'; export * from './SqlResultTabs/DATA_CONTEXT_SQL_EDITOR_RESULT_ID'; export * from './SqlResultTabs/SqlResultTabsService'; export * from './DATA_CONTEXT_SQL_EDITOR_STATE';