From 99a20c92c7e5480e5c5ee00156ba58abaf3e18be Mon Sep 17 00:00:00 2001 From: Wroud Date: Wed, 24 Mar 2021 11:39:00 +0300 Subject: [PATCH 1/3] refactor: CB-794 placeholder context --- .../src/Placeholder/Placeholder.tsx | 15 +- .../src/Placeholder/PlaceholderContainer.ts | 10 +- .../ConnectionsAdministrationService.ts | 6 +- .../ConnectionsTable/Connection.tsx | 5 +- .../ConnectionDetailsInfo/Origin.tsx | 19 ++- .../ConnectionDetailsInfo/SSH.tsx | 12 +- .../ConnectionDetailsInfo/Template.tsx | 12 +- .../src/ConnectionForm/ConnectionForm.tsx | 2 +- .../ServerConfigurationPage.tsx | 150 ++++++++---------- .../ServerConfigurationPageController.ts | 7 +- .../Users/UsersAdministrationService.ts | 6 +- .../Administration/Users/UsersTable/User.tsx | 2 +- .../UsersTable/UserDetailsInfo/Origin.tsx | 16 +- .../TableViewer/TableHeader/TableHeader.tsx | 2 +- .../TableHeader/TableHeaderService.ts | 6 +- .../TableHeader/TableWhereFilter.tsx | 35 ++-- 16 files changed, 140 insertions(+), 165 deletions(-) diff --git a/webapp/packages/core-blocks/src/Placeholder/Placeholder.tsx b/webapp/packages/core-blocks/src/Placeholder/Placeholder.tsx index c7b4543653..c1db2d9cef 100644 --- a/webapp/packages/core-blocks/src/Placeholder/Placeholder.tsx +++ b/webapp/packages/core-blocks/src/Placeholder/Placeholder.tsx @@ -10,18 +10,17 @@ import { observer } from 'mobx-react-lite'; import type { PlaceholderContainer } from './PlaceholderContainer'; -type Props = { +type Props> = T & { container: PlaceholderContainer; -} & (T extends undefined ? { - context?: undefined; -} : { - context: T; -}); +}; -export const Placeholder = observer(function Placeholder({ container, context }: Props) { +export const Placeholder = observer(function Placeholder>({ + container, + ...rest +}: Props) { return ( <> - {container.get().map(({ id, component: Component }) => )} + {container.get().map(({ id, component: Component }) => )} ); }); diff --git a/webapp/packages/core-blocks/src/Placeholder/PlaceholderContainer.ts b/webapp/packages/core-blocks/src/Placeholder/PlaceholderContainer.ts index 599b07c965..60b29e1471 100644 --- a/webapp/packages/core-blocks/src/Placeholder/PlaceholderContainer.ts +++ b/webapp/packages/core-blocks/src/Placeholder/PlaceholderContainer.ts @@ -10,19 +10,15 @@ import { observable } from 'mobx'; import { uuid } from '@cloudbeaver/core-utils'; -export interface PlaceholderProps { - context: T; -} +export type PlaceholderComponent = Record> = React.FunctionComponent; -export type PlaceholderComponent = React.FunctionComponent>; - -export interface PlaceholderElement { +export interface PlaceholderElement = Record> { id: string; component: PlaceholderComponent; order?: number; } -export class PlaceholderContainer { +export class PlaceholderContainer = Record> { private placeholders = observable>([], { deep: false }); get(): Array> { diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministrationService.ts b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministrationService.ts index 4cd9e1f1f8..4389dc6c90 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministrationService.ts +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsAdministrationService.ts @@ -22,9 +22,13 @@ import { SSH } from './ConnectionsTable/ConnectionDetailsInfo/SSH'; import { Template } from './ConnectionsTable/ConnectionDetailsInfo/Template'; import { CreateConnectionService } from './CreateConnectionService'; +export interface IConnectionDetailsPlaceholderProps { + connection: DatabaseConnection; +} + @injectable() export class ConnectionsAdministrationService extends Bootstrap { - readonly connectionDetailsPlaceholder = new PlaceholderContainer(); + readonly connectionDetailsPlaceholder = new PlaceholderContainer(); constructor( private administrationItemService: AdministrationItemService, diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/Connection.tsx b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/Connection.tsx index 54d6c4aaa5..089fb892c6 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/Connection.tsx +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/Connection.tsx @@ -61,7 +61,10 @@ export const Connection = observer(function Connection({ connection }: Props) { {connection.name} {connection.host}{connection.host && connection.port && `:${connection.port}`} - + ); diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionDetailsInfo/Origin.tsx b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionDetailsInfo/Origin.tsx index 863b9e1054..649b3dc74f 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionDetailsInfo/Origin.tsx +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionDetailsInfo/Origin.tsx @@ -9,19 +9,18 @@ import { observer } from 'mobx-react-lite'; import styled from 'reshadow'; -import { StaticImage } from '@cloudbeaver/core-blocks'; +import { AUTH_PROVIDER_LOCAL_ID } from '@cloudbeaver/core-authentication'; +import { PlaceholderComponent, StaticImage } from '@cloudbeaver/core-blocks'; -import type { DatabaseConnection } from '../../../ConnectionsResource'; +import type { IConnectionDetailsPlaceholderProps } from '../../ConnectionsAdministrationService'; import { CONNECTION_DETAILS_STYLES } from './ConnectionDetailsStyles'; -interface Props { - context: DatabaseConnection; -} - -export const Origin: React.FC = observer(function Origin({ context }) { - const isLocal = context.origin.type === 'local'; - const icon = context.origin.icon; - const title = context.origin.displayName; +export const Origin: PlaceholderComponent = observer(function Origin({ + connection, +}) { + const isLocal = connection.origin.type === AUTH_PROVIDER_LOCAL_ID; + const icon = connection.origin.icon; + const title = connection.origin.displayName; if (isLocal) { return null; diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionDetailsInfo/SSH.tsx b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionDetailsInfo/SSH.tsx index e3b1e322d9..702bcffcae 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionDetailsInfo/SSH.tsx +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionDetailsInfo/SSH.tsx @@ -9,21 +9,17 @@ import { observer } from 'mobx-react-lite'; import styled from 'reshadow'; -import { StaticImage, useMapResource } from '@cloudbeaver/core-blocks'; +import { PlaceholderComponent, StaticImage, useMapResource } from '@cloudbeaver/core-blocks'; import { useTranslate } from '@cloudbeaver/core-localization'; import { NetworkHandlerResource, SSH_TUNNEL_ID } from '../../../../NetworkHandlerResource'; -import type { DatabaseConnection } from '../../../ConnectionsResource'; +import type { IConnectionDetailsPlaceholderProps } from '../../ConnectionsAdministrationService'; import { CONNECTION_DETAILS_STYLES } from './ConnectionDetailsStyles'; -interface Props { - context: DatabaseConnection; -} - -export const SSH: React.FC = observer(function SSH({ context }) { +export const SSH: PlaceholderComponent = observer(function SSH({ connection }) { const translate = useTranslate(); const handler = useMapResource(NetworkHandlerResource, SSH_TUNNEL_ID); - const sshConfig = context.networkHandlersConfig.find(state => state.id === SSH_TUNNEL_ID); + const sshConfig = connection.networkHandlersConfig.find(state => state.id === SSH_TUNNEL_ID); if (!sshConfig || !sshConfig.enabled) { return null; diff --git a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionDetailsInfo/Template.tsx b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionDetailsInfo/Template.tsx index b3d56ae706..d5bb9a11a1 100644 --- a/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionDetailsInfo/Template.tsx +++ b/webapp/packages/core-connections/src/Administration/Connections/ConnectionsTable/ConnectionDetailsInfo/Template.tsx @@ -9,17 +9,13 @@ import { observer } from 'mobx-react-lite'; import styled from 'reshadow'; -import { StaticImage } from '@cloudbeaver/core-blocks'; +import { PlaceholderComponent, StaticImage } from '@cloudbeaver/core-blocks'; -import type { DatabaseConnection } from '../../../ConnectionsResource'; +import type { IConnectionDetailsPlaceholderProps } from '../../ConnectionsAdministrationService'; import { CONNECTION_DETAILS_STYLES } from './ConnectionDetailsStyles'; -interface Props { - context: DatabaseConnection; -} - -export const Template: React.FC = observer(function Template({ context }) { - if (!context.template) { +export const Template: PlaceholderComponent = observer(function Template({ connection }) { + if (!connection.template) { return null; } diff --git a/webapp/packages/core-connections/src/ConnectionForm/ConnectionForm.tsx b/webapp/packages/core-connections/src/ConnectionForm/ConnectionForm.tsx index bd9ad3173c..186852b28a 100644 --- a/webapp/packages/core-connections/src/ConnectionForm/ConnectionForm.tsx +++ b/webapp/packages/core-connections/src/ConnectionForm/ConnectionForm.tsx @@ -111,7 +111,7 @@ export const ConnectionForm = observer(function ConnectionForm({ - +