diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/apilog/ApiCallInterceptor.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/apilog/ApiCallInterceptor.java index 40a74c7eeb..f323842090 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/apilog/ApiCallInterceptor.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/apilog/ApiCallInterceptor.java @@ -37,6 +37,7 @@ public interface ApiCallInterceptor { @NotNull HttpServletRequest request, @Nullable Map variables, @NotNull String apiCall, + @Nullable String userId, @NotNull LocalDateTime startTime, @Nullable String errorMessage, @NotNull String apiProtocol diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/graphql/GraphQLEndpoint.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/graphql/GraphQLEndpoint.java index 49f19c97bb..ca011b8bb7 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/graphql/GraphQLEndpoint.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/graphql/GraphQLEndpoint.java @@ -271,7 +271,7 @@ public class GraphQLEndpoint extends HttpServlet { errorMessage = executionException.getMessage(); } if (WebAppUtils.getWebApplication() instanceof ApiCallInterceptor apiCallInterceptor) { - apiCallInterceptor.onApiCallEvent(request, variables, operationName, startTime, errorMessage, API_PROTOCOL); + apiCallInterceptor.onApiCallEvent(request, variables, operationName, userId, startTime, errorMessage, API_PROTOCOL); } } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceServletBase.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceServletBase.java index 8fbd1b8888..a7709f7db2 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceServletBase.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceServletBase.java @@ -75,7 +75,7 @@ public abstract class WebServiceServletBase extends HttpServlet { } finally { if (WebAppUtils.getWebApplication() instanceof ApiCallInterceptor apiCallInterceptor) { apiCallInterceptor.onApiCallEvent( - request, getVariables(request), request.getRequestURI(), startTime, errorMessage, API_PROTOCOL + request, getVariables(request), request.getRequestURI(), null, startTime, errorMessage, API_PROTOCOL ); } } diff --git a/webapp/packages/core-app/src/AppScreen/Main.tsx b/webapp/packages/core-app/src/AppScreen/Main.tsx index 9b2a73fbb5..1d0c530c1f 100644 --- a/webapp/packages/core-app/src/AppScreen/Main.tsx +++ b/webapp/packages/core-app/src/AppScreen/Main.tsx @@ -7,7 +7,7 @@ */ import { observer } from 'mobx-react-lite'; -import { getComputed, Loader, Pane, ResizerControls, s, Split, useS, useSplitUserState } from '@cloudbeaver/core-blocks'; +import { getComputed, Loader, Pane, ResizerControls, s, Split, useExecutor, useS, useSplitUserState } from '@cloudbeaver/core-blocks'; import { useService } from '@cloudbeaver/core-di'; import { LeftBarPanelService, SideBarPanel, SideBarPanelService } from '@cloudbeaver/core-ui'; @@ -25,6 +25,17 @@ export const Main = observer(function Main() { const sideBarDisabled = getComputed(() => sideBarPanelService.tabsContainer.getDisplayed().length === 0); const leftBarDisabled = getComputed(() => leftBarPanelService.tabsContainer.getDisplayed().length === 0); + useExecutor({ + executor: sideBarPanelService.tabsContainer.onTabSelect, + handlers: [ + function showPanel() { + if (splitRightState.mode === 'minimize' && !sideBarDisabled) { + splitRightState.onModeChange?.('resize'); + } + }, + ], + }); + return (
diff --git a/webapp/packages/core-ui/src/SideBarPanel/SideBarPanel.tsx b/webapp/packages/core-ui/src/SideBarPanel/SideBarPanel.tsx index e85440821a..d44dc9fbf3 100644 --- a/webapp/packages/core-ui/src/SideBarPanel/SideBarPanel.tsx +++ b/webapp/packages/core-ui/src/SideBarPanel/SideBarPanel.tsx @@ -42,10 +42,9 @@ const sideBarPanelRegistry: StyleRegistry = [ export const SideBarPanel = observer(function SideBarPanel({ container }) { const style = useS(styles); - return ( - + container.select(tab.tabId, tab.props)}>
diff --git a/webapp/packages/core-ui/src/Tabs/TabsContainer/TabsContainer.ts b/webapp/packages/core-ui/src/Tabs/TabsContainer/TabsContainer.ts index ba2b03c6d8..d74ac35a1f 100644 --- a/webapp/packages/core-ui/src/Tabs/TabsContainer/TabsContainer.ts +++ b/webapp/packages/core-ui/src/Tabs/TabsContainer/TabsContainer.ts @@ -8,12 +8,14 @@ import { makeObservable, observable } from 'mobx'; import type { MetadataMap, MetadataValueGetter, schema } from '@cloudbeaver/core-utils'; +import { SyncExecutor } from '@cloudbeaver/core-executor'; import type { ITabInfo, ITabInfoOptions, ITabsContainer } from './ITabsContainer.js'; export class TabsContainer | unknown = unknown> implements ITabsContainer { readonly areaLabel: string; readonly tabInfoMap: Map>; + readonly onTabSelect: SyncExecutor; get tabInfoList(): Array> { return Array.from(this.tabInfoMap.values()).sort((a, b) => a.order - b.order); @@ -29,6 +31,7 @@ export class TabsContainer | this.tabInfoMap = new Map(); this.currentTabId = null; this.areaLabel = areaLabel; + this.onTabSelect = new SyncExecutor(); makeObservable, 'currentTabId'>(this, { tabInfoMap: observable.shallow, @@ -58,6 +61,7 @@ export class TabsContainer | }); this.currentTabId = tabId; + this.onTabSelect.execute(tabId); } getTabInfo(tabId: string): ITabInfo | undefined { diff --git a/webapp/packages/plugin-codemirror6/src/ReactCodemirror.tsx b/webapp/packages/plugin-codemirror6/src/ReactCodemirror.tsx index cd831342ba..e5cd6ffd51 100644 --- a/webapp/packages/plugin-codemirror6/src/ReactCodemirror.tsx +++ b/webapp/packages/plugin-codemirror6/src/ReactCodemirror.tsx @@ -42,6 +42,7 @@ export const ReactCodemirror = observer( ref, ) { value = value ?? getValue?.(); + const isInitialScriptOpening = useRef(true); const currentExtensions = useRef>(new Map()); const readOnlyFacet = useMemo(() => { if (readonly) { @@ -214,7 +215,7 @@ export const ReactCodemirror = observer( } } - if (hasInsertProperty(transaction.changes) && !transaction.selection) { + if (hasInsertProperty(transaction.changes) && !transaction.selection && !isInitialScriptOpening.current) { transaction.selection = { anchor: transaction.changes.insert?.length ?? 0, head: transaction.changes.insert?.length ?? 0, @@ -223,6 +224,7 @@ export const ReactCodemirror = observer( if (transaction.changes) { view.dispatch({ changes: transaction.changes }); + isInitialScriptOpening.current = false; } if (transaction.selection) {