From 7ecd9bf20a413a7ba92a57fa36795681b252783f Mon Sep 17 00:00:00 2001 From: Wroud Date: Fri, 19 Mar 2021 12:56:54 +0300 Subject: [PATCH] fix: CB-761 autosearch in easy-config connections --- .../src/Tabs/TabsContainer/ITabsContainer.ts | 3 +- .../src/Tabs/TabsContainer/TabsContainer.ts | 32 +++++++++++++++++-- .../core-blocks/src/Tabs/TabsState.tsx | 15 +++++---- .../ConnectionsAdministrationService.ts | 1 + .../Search/ConnectionSearchService.tsx | 2 +- .../Connections/CreateConnectionService.ts | 13 +++++--- 6 files changed, 52 insertions(+), 14 deletions(-) diff --git a/webapp/packages/core-blocks/src/Tabs/TabsContainer/ITabsContainer.ts b/webapp/packages/core-blocks/src/Tabs/TabsContainer/ITabsContainer.ts index 3d76ec62c8..8770b51d49 100644 --- a/webapp/packages/core-blocks/src/Tabs/TabsContainer/ITabsContainer.ts +++ b/webapp/packages/core-blocks/src/Tabs/TabsContainer/ITabsContainer.ts @@ -45,7 +45,8 @@ export interface ITabInfo< } export interface ITabsContainer, TOptions extends Record = never> { - tabInfoList: Array>; + readonly tabInfoList: Array>; + readonly selectedId: string | null; getTabInfo: (tabId: string) => ITabInfo | undefined; getDisplayed: (props?: TProps) => Array>; } diff --git a/webapp/packages/core-blocks/src/Tabs/TabsContainer/TabsContainer.ts b/webapp/packages/core-blocks/src/Tabs/TabsContainer/TabsContainer.ts index 8ce985b5cc..a9677b9609 100644 --- a/webapp/packages/core-blocks/src/Tabs/TabsContainer/TabsContainer.ts +++ b/webapp/packages/core-blocks/src/Tabs/TabsContainer/TabsContainer.ts @@ -10,7 +10,7 @@ import { observable, makeObservable } from 'mobx'; import type { ITabInfo, ITabInfoOptions, ITabsContainer } from './ITabsContainer'; -export class TabsContainer, TOptions extends Record = never> +export class TabsContainer = never> implements ITabsContainer { readonly tabInfoMap: Map>; @@ -19,12 +19,40 @@ implements ITabsContainer { .sort((a, b) => a.order - b.order); } + get selectedId(): string | null { + return this.currentTabId; + } + + private currentTabId: string | null; + constructor() { - makeObservable(this, { + makeObservable, 'currentTabId'>(this, { tabInfoMap: observable.shallow, + currentTabId: observable, }); this.tabInfoMap = new Map(); + this.currentTabId = null; + } + + select(tabId: string | null, props: TProps): void { + if (tabId === null) { + this.currentTabId = tabId; + return; + } + + const info = this.getTabInfo(tabId); + + if (!info) { + return; + } + + info.onOpen?.({ + tabId, + props, + }); + + this.currentTabId = tabId; } getTabInfo(tabId: string): ITabInfo | undefined { diff --git a/webapp/packages/core-blocks/src/Tabs/TabsState.tsx b/webapp/packages/core-blocks/src/Tabs/TabsState.tsx index f179df85e7..f041c79115 100644 --- a/webapp/packages/core-blocks/src/Tabs/TabsState.tsx +++ b/webapp/packages/core-blocks/src/Tabs/TabsState.tsx @@ -17,7 +17,9 @@ import { useObjectRef } from '../useObjectRef'; import type { ITabData, ITabsContainer } from './TabsContainer/ITabsContainer'; import { TabsContext, ITabsContext } from './TabsContext'; -type Props> = T & React.PropsWithChildren<{ +type ExtractContainerProps = T extends void ? Record : T; + +type Props> = ExtractContainerProps & React.PropsWithChildren<{ selectedId?: string; orientation?: 'horizontal' | 'vertical'; currentTabId?: string | null; @@ -42,12 +44,13 @@ export const TabsState = observer(function TabsState>({ onClose, ...rest }: Props): React.ReactElement | null { + const props = rest as any as T; if ( !selectedId && currentTabId === undefined && container ) { - const displayed = container.getDisplayed(rest as T); + const displayed = container.getDisplayed(props); if (displayed.length > 0) { selectedId = displayed[0].key; @@ -68,14 +71,14 @@ export const TabsState = observer(function TabsState>({ const dynamic = useObjectRef({ open: onOpen, close: onClose, - props: rest as T, + props, container, state, selectedId: selectedId || currentTabId, }, { open: onOpen, close: onClose, - props: rest as T, + props, container, state, }); @@ -114,7 +117,7 @@ export const TabsState = observer(function TabsState>({ openExecutor.execute({ tabId: state.selectedId!, - props: rest as T, + props, }); }, [state.selectedId]); @@ -133,7 +136,7 @@ export const TabsState = observer(function TabsState>({ const value = useMemo>(() => ({ state, tabsState, - props: rest as T, + props, container, openExecutor, closeExecutor, diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministrationService.ts b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministrationService.ts index 3a7ac1a532..4cd9e1f1f8 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministrationService.ts +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministrationService.ts @@ -75,6 +75,7 @@ export class ConnectionsAdministrationService extends Bootstrap { if (!param) { this.createConnectionService.setCreateMethod(); } + this.createConnectionService.setCreateMethod(param); } private async deactivateCreateMethod(param: string | null, configuration: boolean, outside: boolean) { diff --git a/webapp/packages/core-connections/src/Administration/Connections/CreateConnection/Search/ConnectionSearchService.tsx b/webapp/packages/core-connections/src/Administration/Connections/CreateConnection/Search/ConnectionSearchService.tsx index 0f892efda8..f8def379ea 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/CreateConnection/Search/ConnectionSearchService.tsx +++ b/webapp/packages/core-connections/src/Administration/Connections/CreateConnection/Search/ConnectionSearchService.tsx @@ -52,7 +52,7 @@ export class ConnectionSearchService { } async load(): Promise { - if (this.administrationScreenService.isConfigurationMode) { + if (this.administrationScreenService.isConfigurationMode && this.databases.length === 0) { await this.search(); } } diff --git a/webapp/packages/core-connections/src/Administration/Connections/CreateConnectionService.ts b/webapp/packages/core-connections/src/Administration/Connections/CreateConnectionService.ts index 1dd8dbde91..8a5cf1770a 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/CreateConnectionService.ts +++ b/webapp/packages/core-connections/src/Administration/Connections/CreateConnectionService.ts @@ -28,7 +28,7 @@ export class CreateConnectionService { disabled = false; data: IConnectionFormDataOptions | null; - readonly tabsContainer: TabsContainer; + readonly tabsContainer: TabsContainer; constructor( private readonly connectionsAdministrationNavService: ConnectionsAdministrationNavService, @@ -66,7 +66,7 @@ export class CreateConnectionService { return this.tabsContainer.tabInfoList[0].key; } - setCreateMethod(method?: string): void { + setCreateMethod(method?: string | null): void { if (!method) { const id = this.getDefault(); @@ -75,7 +75,7 @@ export class CreateConnectionService { } method = id; } - this.connectionsAdministrationNavService.navToCreate(method); + this.activateMethod(method); } cancelCreate(): void { @@ -89,7 +89,7 @@ export class CreateConnectionService { return; } - this.connectionsAdministrationNavService.navToCreate(defaultId); + this.activateMethod(defaultId); } setConnectionTemplate(config: ConnectionConfig, availableDrivers: string[]): void { @@ -109,4 +109,9 @@ export class CreateConnectionService { method.options?.close?.(); } } + + private activateMethod(method: string) { + this.tabsContainer.select(method); + this.connectionsAdministrationNavService.navToCreate(method); + } }