diff --git a/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialog.tsx b/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialog.tsx index d8913f7996..d210552809 100644 --- a/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialog.tsx +++ b/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialog.tsx @@ -14,7 +14,7 @@ import { SubmittingForm, ErrorMessage, InputField, Checkbox } from '@dbeaver/core/blocks'; import { useController } from '@dbeaver/core/di'; -import { DialogComponent, CommonDialogWrapper } from '@dbeaver/core/dialogs'; +import { CommonDialogWrapper, DialogComponentProps } from '@dbeaver/core/dialogs'; import { useTranslate } from '@dbeaver/core/localization'; import { composes, useStyles } from '@dbeaver/core/theming'; @@ -57,103 +57,103 @@ const styles = composes( ` ); -export const CreateUserDialog: DialogComponent = observer( - function CreateUserDialog(props) { - const controller = useController(CreateUserDialogController, props.rejectDialog); - const translate = useTranslate(); - const handleLoginChange = useCallback( - (value: string) => controller.credentials.login = value, - [] - ); - const handlePasswordChange = useCallback( - (value: string) => controller.credentials.password = value, - [] - ); - const handlePasswordRepeatChange = useCallback( - (value: string) => controller.credentials.passwordRepeat = value, - [] - ); - const handleRoleChange = useCallback( - (roleId: string, value: boolean) => controller.credentials.roles.set(roleId, value), - [] - ); +export const CreateUserDialog = observer(function CreateUserDialog({ + rejectDialog, +}: DialogComponentProps) { + const controller = useController(CreateUserDialogController, rejectDialog); + const translate = useTranslate(); + const handleLoginChange = useCallback( + (value: string) => controller.credentials.login = value, + [] + ); + const handlePasswordChange = useCallback( + (value: string) => controller.credentials.password = value, + [] + ); + const handlePasswordRepeatChange = useCallback( + (value: string) => controller.credentials.passwordRepeat = value, + [] + ); + const handleRoleChange = useCallback( + (roleId: string, value: boolean) => controller.credentials.roles.set(roleId, value), + [] + ); - return styled(useStyles(styles))( - - )} - onReject={props.rejectDialog} - > - - - - + )} + onReject={rejectDialog} + > + + + + + {translate('authentication_user_name')} + + + + + {translate('authentication_user_password')} + + + + + {translate('authentication_user_password_repeat')} + + + {controller.roles.map((role, i) => ( + + handleRoleChange(role.roleId, checked)} + checked={controller.credentials.roles.get(role.roleId)} disabled={controller.isCreating} mod='surface' > - {translate('authentication_user_name')} - + {i === 0 && translate('authentication_user_role')} + - - - {translate('authentication_user_password')} - - - - - {translate('authentication_user_password_repeat')} - - - {controller.roles.map((role, i) => ( - - handleRoleChange(role.roleId, checked)} - checked={controller.credentials.roles.get(role.roleId)} - disabled={controller.isCreating} - mod='surface' - > - {i === 0 && translate('authentication_user_role')} - - - ))} - - - {controller.error.responseMessage && ( - - )} - - ); - } -); + ))} + + + {controller.error.responseMessage && ( + + )} + + ); +}); diff --git a/webapp/packages/authentication/src/Dialog/AuthDialog.tsx b/webapp/packages/authentication/src/Dialog/AuthDialog.tsx index 4de3edd2eb..17d6dcba5b 100644 --- a/webapp/packages/authentication/src/Dialog/AuthDialog.tsx +++ b/webapp/packages/authentication/src/Dialog/AuthDialog.tsx @@ -13,7 +13,7 @@ import { SubmittingForm, ErrorMessage, TabsState, TabList, Tab, TabTitle } from '@dbeaver/core/blocks'; import { useController } from '@dbeaver/core/di'; -import { DialogComponent, CommonDialogWrapper } from '@dbeaver/core/dialogs'; +import { CommonDialogWrapper, DialogComponentProps } from '@dbeaver/core/dialogs'; import { useTranslate } from '@dbeaver/core/localization'; import { composes, useStyles } from '@dbeaver/core/theming'; @@ -79,56 +79,57 @@ const styles = composes( ` ); -export const AuthDialog: DialogComponent = observer( - function AuthDialog(props) { - const controller = useController(AuthDialogController, props.rejectDialog); - const translate = useTranslate(); +export const AuthDialog = observer(function AuthDialog({ + options, + rejectDialog, +}: DialogComponentProps) { + const controller = useController(AuthDialogController, rejectDialog); + const translate = useTranslate(); - return styled(useStyles(styles))( - - - {controller.providers.map(provider => ( - controller.selectProvider(provider.id)} - > - {provider.label} - - ))} - - )} - footer={( - + + {controller.providers.map(provider => ( + controller.selectProvider(provider.id)} + > + {provider.label} + + ))} + + )} + footer={( + + )} + onReject={options?.persistent ? undefined : rejectDialog} + > + + {controller.provider && ( + )} - onReject={props.options?.persistent ? undefined : props.rejectDialog} - > - - {controller.provider && ( - - )} - {!controller.provider && <>Select available provider} - - {controller.error.responseMessage && ( - - )} - - - ); - } -); + {!controller.provider && <>Select available provider} + + {controller.error.responseMessage && ( + + )} + + + ); +}); diff --git a/webapp/packages/basic-connection-plugin/src/ConnectionDialog/ConnectionDialog.tsx b/webapp/packages/basic-connection-plugin/src/ConnectionDialog/ConnectionDialog.tsx index 6232e89678..8ebad2d230 100644 --- a/webapp/packages/basic-connection-plugin/src/ConnectionDialog/ConnectionDialog.tsx +++ b/webapp/packages/basic-connection-plugin/src/ConnectionDialog/ConnectionDialog.tsx @@ -11,7 +11,7 @@ import styled, { css } from 'reshadow'; import { ErrorMessage, SubmittingForm, Loader } from '@dbeaver/core/blocks'; import { useController } from '@dbeaver/core/di'; -import { CommonDialogWrapper, DialogComponent, DialogComponentProps } from '@dbeaver/core/dialogs'; +import { CommonDialogWrapper, DialogComponentProps } from '@dbeaver/core/dialogs'; import { useTranslate } from '@dbeaver/core/localization'; import { useStyles } from '@dbeaver/core/theming'; @@ -37,59 +37,59 @@ const styles = css` } `; -export const ConnectionDialog: DialogComponent = observer( - function ConnectionDialog(props: DialogComponentProps) { - const controller = useController(ConnectionController, props.rejectDialog); - const translate = useTranslate(); - let title = translate('basicConnection_connectionDialog_newConnection'); +export const ConnectionDialog = observer(function ConnectionDialog({ + rejectDialog, +}: DialogComponentProps) { + const controller = useController(ConnectionController, rejectDialog); + const translate = useTranslate(); + let title = translate('basicConnection_connectionDialog_newConnection'); - if (controller.step === ConnectionStep.Connection && controller.dbSource?.name) { - title = controller.dbSource.name; - } - - return styled(useStyles(styles))( - controller.onStep(ConnectionStep.DBSource)} - onConnect={controller.onConnect} - /> - )} - onReject={props.rejectDialog} - > - {controller.isLoading && } - {!controller.isLoading && controller.step === ConnectionStep.DBSource && ( - - )} - {controller.step === ConnectionStep.Connection && (controller.dbDriver?.anonymousAccess ? ( -
- {controller.isConnecting && translate('basicConnection_connectionDialog_connecting_message')} -
- ) : ( - - - - ))} - {controller.responseMessage && ( - - )} -
- ); + if (controller.step === ConnectionStep.Connection && controller.dbSource?.name) { + title = controller.dbSource.name; } -); + + return styled(useStyles(styles))( + controller.onStep(ConnectionStep.DBSource)} + onConnect={controller.onConnect} + /> + )} + onReject={rejectDialog} + > + {controller.isLoading && } + {!controller.isLoading && controller.step === ConnectionStep.DBSource && ( + + )} + {controller.step === ConnectionStep.Connection && (controller.dbDriver?.anonymousAccess ? ( +
+ {controller.isConnecting && translate('basicConnection_connectionDialog_connecting_message')} +
+ ) : ( + + + + ))} + {controller.responseMessage && ( + + )} +
+ ); +}); diff --git a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationNode/Placeholder/Placeholder.tsx b/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationNode/Placeholder/Placeholder.tsx deleted file mode 100644 index 347d289091..0000000000 --- a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationNode/Placeholder/Placeholder.tsx +++ /dev/null @@ -1,19 +0,0 @@ -/* - * cloudbeaver - Cloud Database Manager - * Copyright (C) 2020 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 styled from 'reshadow'; - -import { placeholderStyles } from './placeholderStyles'; - -export function Placeholder({ className }: { className?: string }) { - return styled(placeholderStyles)( - -
-
- ); -} diff --git a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationNode/Placeholder/placeholderStyles.ts b/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationNode/Placeholder/placeholderStyles.ts deleted file mode 100644 index 1d99f72603..0000000000 --- a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationNode/Placeholder/placeholderStyles.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * cloudbeaver - Cloud Database Manager - * Copyright (C) 2020 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 { css } from 'reshadow'; - -export const placeholderStyles = css` - box { - position: relative; - overflow: hidden; - padding: 0 6px; - max-width: 200px; - } - - div { - box-sizing: border-box; - overflow: hidden; - position: relative; - height: 18px; - background: #dedede; - border-radius: 3px; - margin: 2px 0px; - animation: wave 1.5s linear infinite; - } - - @keyframes wave { - 0% { - opacity: 0; - } - 50% { - opacity: 1; - } - 100% { - opacity: 0; - } - } -`; diff --git a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationNodeChildren/NavigationNodeChildren.tsx b/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationNodeChildren.tsx similarity index 88% rename from webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationNodeChildren/NavigationNodeChildren.tsx rename to webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationNodeChildren.tsx index e2744a7ea9..ade15af012 100644 --- a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationNodeChildren/NavigationNodeChildren.tsx +++ b/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationNodeChildren.tsx @@ -9,7 +9,7 @@ import { observer } from 'mobx-react'; import React, { PropsWithChildren } from 'react'; -import { useChildren } from '../../../shared/useChildren'; +import { useChildren } from '../../shared/useChildren'; type NavigationNodeChildrenProps = PropsWithChildren<{ parentId: string; @@ -29,7 +29,7 @@ export const NavigationNodeChildren = observer(function NavigationNodeChildren({ const NavigationNodeChild = component; return ( <> - {nodeChildren.children.map(id => ( + {nodeChildren.children!.map(id => ( ))} diff --git a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationTreeNode.tsx b/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationTreeNode.tsx index 87c02ca2c1..5f0e962a62 100644 --- a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationTreeNode.tsx +++ b/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/NavigationTreeNode.tsx @@ -9,7 +9,7 @@ import { observer } from 'mobx-react'; import { NavigationNode } from './NavigationNode/NavigationNode'; -import { NavigationNodeChildren } from './NavigationNodeChildren/NavigationNodeChildren'; +import { NavigationNodeChildren } from './NavigationNodeChildren'; import { TreeNodeMenu } from './TreeNodeMenu/TreeNodeMenu'; import { useNavigationTree } from './useNavigationTree'; diff --git a/webapp/packages/core/src/app/TopNavBar/ConnectionSchemaManager/ConnectionSelector/ConnectionSelectorController.ts b/webapp/packages/core/src/app/TopNavBar/ConnectionSchemaManager/ConnectionSelector/ConnectionSelectorController.ts index 5810624628..41109aaad4 100644 --- a/webapp/packages/core/src/app/TopNavBar/ConnectionSchemaManager/ConnectionSelector/ConnectionSelectorController.ts +++ b/webapp/packages/core/src/app/TopNavBar/ConnectionSchemaManager/ConnectionSelector/ConnectionSelectorController.ts @@ -13,7 +13,7 @@ import { ComputedMenuItemModel, ComputedMenuPanelModel, IMenuItem } from '@dbeav import { ConnectionsManagerService, Connection } from '../../../shared/ConnectionsManager/ConnectionsManagerService'; import { EObjectFeature } from '../../../shared/NodesManager/EObjectFeature'; -import { concatSchemaAndCatalog } from '../../../shared/NodesManager/NodesManagerService'; +import { NodeManagerUtils } from '../../../shared/NodesManager/NodeManagerUtils'; import { ConnectionSchemaManagerService } from '../ConnectionSchemaManagerService'; @injectable() @@ -54,7 +54,7 @@ export class ConnectionSelectorController { } private get currentObjectContainerTitle(): string | undefined { - return concatSchemaAndCatalog( + return NodeManagerUtils.concatSchemaAndCatalog( this.connectionSelectorService.currentObjectCatalogId, this.connectionSelectorService.currentObjectSchemaId ); @@ -116,7 +116,10 @@ export class ConnectionSelectorController { .filter(item => !!item.name) .map((item) => { if (item.features?.includes(EObjectFeature.catalog)) { - const title = concatSchemaAndCatalog(item.name, this.connectionSelectorService.currentObjectSchemaId); + const title = NodeManagerUtils.concatSchemaAndCatalog( + item.name, + this.connectionSelectorService.currentObjectSchemaId + ); const handler = item.features?.includes(EObjectFeature.catalog) ? () => this.connectionSelectorService.selectCatalog(item.name!) : () => this.connectionSelectorService.selectSchema(item.name!); @@ -129,7 +132,10 @@ export class ConnectionSelectorController { return menuItem; } - const title = concatSchemaAndCatalog(this.connectionSelectorService.currentObjectCatalogId, item.name); + const title = NodeManagerUtils.concatSchemaAndCatalog( + this.connectionSelectorService.currentObjectCatalogId, + item.name + ); const handler = item.features?.includes(EObjectFeature.catalog) ? () => this.connectionSelectorService.selectCatalog(item.name!) : () => this.connectionSelectorService.selectSchema(item.name!); diff --git a/webapp/packages/core/src/app/index.ts b/webapp/packages/core/src/app/index.ts index 2c2c7e761f..306e139230 100644 --- a/webapp/packages/core/src/app/index.ts +++ b/webapp/packages/core/src/app/index.ts @@ -15,6 +15,7 @@ export * from './shared/NodesManager/extensions/IObjectCatalogProvider'; export * from './shared/NodesManager/extensions/IObjectCatalogSetter'; export * from './shared/NodesManager/extensions/IObjectSchemaProvider'; export * from './shared/NodesManager/extensions/IObjectSchemaSetter'; +export * from './shared/NodesManager/NodeManagerUtils'; export * from './shared/Navigation/NavigationService'; export * from './shared/NavigationTabs/NavigationTabsService'; export * from './shared/NavigationTabs/TabNavigationContext'; diff --git a/webapp/packages/core/src/app/shared/NodesManager/NodeManagerUtils.ts b/webapp/packages/core/src/app/shared/NodesManager/NodeManagerUtils.ts index 5f142cca54..c5382d9187 100644 --- a/webapp/packages/core/src/app/shared/NodesManager/NodeManagerUtils.ts +++ b/webapp/packages/core/src/app/shared/NodesManager/NodeManagerUtils.ts @@ -25,5 +25,11 @@ export class NodeManagerUtils { return matches[1]; } + static isDatabaseObject(objectId: string) { + return /^database:\/\//.test(objectId); + } + static concatSchemaAndCatalog(catalogId?: string, schemaId?: string) { + return `${schemaId || ''}${schemaId && catalogId ? '@' : ''}${catalogId || ''}`; + } } diff --git a/webapp/packages/core/src/app/shared/NodesManager/NodesManagerService.ts b/webapp/packages/core/src/app/shared/NodesManager/NodesManagerService.ts index 8457b6c613..f0e56a9096 100644 --- a/webapp/packages/core/src/app/shared/NodesManager/NodesManagerService.ts +++ b/webapp/packages/core/src/app/shared/NodesManager/NodesManagerService.ts @@ -312,11 +312,3 @@ export class NodesManagerService { || info.features.includes(ENodeFeature.container); } } - -export function isDatabaseObject(objectId: string) { - return /^database:\/\//.test(objectId); -} - -export function concatSchemaAndCatalog(catalogId?: string, schemaId?: string) { - return `${schemaId || ''}${schemaId && catalogId ? '@' : ''}${catalogId || ''}`; -} diff --git a/webapp/packages/core/src/dialogs/SessionExpire/SessionExpiredDialog.tsx b/webapp/packages/core/src/dialogs/SessionExpire/SessionExpiredDialog.tsx index 27b34ff217..8e254abf74 100644 --- a/webapp/packages/core/src/dialogs/SessionExpire/SessionExpiredDialog.tsx +++ b/webapp/packages/core/src/dialogs/SessionExpire/SessionExpiredDialog.tsx @@ -15,7 +15,7 @@ import { useTranslate } from '@dbeaver/core/localization'; import { useStyles } from '@dbeaver/core/theming'; import { CommonDialogWrapper } from '../CommonDialog/CommonDialog/CommonDialogWrapper'; -import { DialogComponent } from '../CommonDialog/CommonDialogService'; +import { DialogComponentProps } from '../CommonDialog/CommonDialogService'; const styles = css` dialog-content { @@ -34,9 +34,9 @@ const styles = css` } `; -export const SessionExpiredDialog: DialogComponent = observer(function SessionExpiredDialog({ +export const SessionExpiredDialog = observer(function SessionExpiredDialog({ rejectDialog, -}) { +}: DialogComponentProps) { const translate = useTranslate(); const title = translate('app_root_session_expired_title'); const reload = useCallback(() => window.location.reload(), []); diff --git a/webapp/packages/core/src/manifest.ts b/webapp/packages/core/src/manifest.ts index 1f7a189c28..f84c873448 100644 --- a/webapp/packages/core/src/manifest.ts +++ b/webapp/packages/core/src/manifest.ts @@ -73,7 +73,7 @@ export const coreManifest: PluginManifest = { ServerService, ], - async initialize(services) { + async initialize() { // Note that the initialization of the core occurs in AppBootstrap // and it is called before the initialization phase of all manifests }, diff --git a/webapp/packages/core/src/utils/MetadataMap.ts b/webapp/packages/core/src/utils/MetadataMap.ts new file mode 100644 index 0000000000..4a2b30a9e4 --- /dev/null +++ b/webapp/packages/core/src/utils/MetadataMap.ts @@ -0,0 +1,32 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 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 { observable } from 'mobx'; + +export type DefaultValueGetter = (key: TKey, metadata: MetadataMap) => TValue + +export class MetadataMap { + private data: Map; + + constructor(private defaultValueGetter: DefaultValueGetter) { + this.data = observable(new Map()); + } + + get(key: TKey): TValue { + if (this.data.has(key)) { + return this.data.get(key)!; + } + const value = this.defaultValueGetter(key, this); + this.data.set(key, value); + return value; + } + + delete(key: TKey) { + this.data.delete(key); + } +} diff --git a/webapp/packages/core/src/utils/index.ts b/webapp/packages/core/src/utils/index.ts index edf629eaa4..d49cb01fe5 100644 --- a/webapp/packages/core/src/utils/index.ts +++ b/webapp/packages/core/src/utils/index.ts @@ -1,4 +1,5 @@ export * from './flat'; +export * from './MetadataMap'; export * from './OrderedMap'; export * from './parseJSONFlat'; export * from './uuid_'; diff --git a/webapp/packages/custom-connection-plugin/src/CustomConnection/ConnectionFormDialog/ConnectionFormDialog.tsx b/webapp/packages/custom-connection-plugin/src/CustomConnection/ConnectionFormDialog/ConnectionFormDialog.tsx index a071514208..ee2453a284 100644 --- a/webapp/packages/custom-connection-plugin/src/CustomConnection/ConnectionFormDialog/ConnectionFormDialog.tsx +++ b/webapp/packages/custom-connection-plugin/src/CustomConnection/ConnectionFormDialog/ConnectionFormDialog.tsx @@ -82,63 +82,61 @@ type ConnectionFormDialogProps = React.PropsWithChildren<{ onBack(): void; }> -export const ConnectionFormDialog = observer( - function ConnectionFormDialog({ - title, - driver, - onClose, - onBack, - }: ConnectionFormDialogProps) { - const translate = useTranslate(); - const controller = useController(ConnectionFormDialogController, driver, onClose); - const [loadProperties, setLoadProperties] = useState(false); +export const ConnectionFormDialog = observer(function ConnectionFormDialog({ + title, + driver, + onClose, + onBack, +}: ConnectionFormDialogProps) { + const translate = useTranslate(); + const controller = useController(ConnectionFormDialogController, driver, onClose); + const [loadProperties, setLoadProperties] = useState(false); - return styled(useStyles(styles))( - - - - {translate('customConnection_options')} - - setLoadProperties(true)} > - {translate('customConnection_properties')} - - - )} - footer={( - + + + {translate('customConnection_options')} + + setLoadProperties(true)} > + {translate('customConnection_properties')} + + + )} + footer={( + + )} + onReject={onClose} + > + + + + + + - )} - onReject={onClose} - > - - - - - - - - - {controller.error.responseMessage && ( - - )} - - - ); - } -); + + + {controller.error.responseMessage && ( + + )} + + + ); +}); diff --git a/webapp/packages/custom-connection-plugin/src/CustomConnection/CustomConnectionDialog.tsx b/webapp/packages/custom-connection-plugin/src/CustomConnection/CustomConnectionDialog.tsx index b0d07b4909..8974ee1237 100644 --- a/webapp/packages/custom-connection-plugin/src/CustomConnection/CustomConnectionDialog.tsx +++ b/webapp/packages/custom-connection-plugin/src/CustomConnection/CustomConnectionDialog.tsx @@ -9,41 +9,41 @@ import { observer } from 'mobx-react'; import { useController } from '@dbeaver/core/di'; -import { DialogComponent } from '@dbeaver/core/dialogs'; +import { DialogComponentProps } from '@dbeaver/core/dialogs'; import { useTranslate } from '@dbeaver/core/localization'; import { ConnectionFormDialog } from './ConnectionFormDialog/ConnectionFormDialog'; import { CustomConnectionController, ConnectionStep } from './CustomConnectionController'; import { DriverSelectorDialog } from './DriverSelectorDialog/DriverSelectorDialog'; -export const CustomConnectionDialog: DialogComponent = observer( - function CustomConnectionDialog(props) { - const controller = useController(CustomConnectionController); - let title = useTranslate('basicConnection_connectionDialog_newConnection'); +export const CustomConnectionDialog = observer(function CustomConnectionDialog({ + rejectDialog, +}: DialogComponentProps) { + const controller = useController(CustomConnectionController); + let title = useTranslate('basicConnection_connectionDialog_newConnection'); - if (controller.step === ConnectionStep.Connection && controller.driver?.name) { - title = controller.driver.name; - } - - if (controller.step === ConnectionStep.Connection && controller.driver) { - return ( - controller.onStep(ConnectionStep.Driver)} - onClose={props.rejectDialog} - /> - ); - } + if (controller.step === ConnectionStep.Connection && controller.driver?.name) { + title = controller.driver.name; + } + if (controller.step === ConnectionStep.Connection && controller.driver) { return ( - controller.onStep(ConnectionStep.Driver)} + onClose={rejectDialog} /> ); } -); + + return ( + + ); +}); diff --git a/webapp/packages/data-export-plugin/src/Dialog/DataExportDialog.tsx b/webapp/packages/data-export-plugin/src/Dialog/DataExportDialog.tsx index fa1acd83bd..0fd4bc3446 100644 --- a/webapp/packages/data-export-plugin/src/Dialog/DataExportDialog.tsx +++ b/webapp/packages/data-export-plugin/src/Dialog/DataExportDialog.tsx @@ -9,41 +9,42 @@ import { observer } from 'mobx-react'; import { useController } from '@dbeaver/core/di'; -import { DialogComponent } from '@dbeaver/core/dialogs'; +import { DialogComponentProps } from '@dbeaver/core/dialogs'; import { IExportContext } from '../IExportContext'; import { DataExportController, DataExportStep } from './DataExportController'; import { ProcessorConfigureDialog } from './ProcessorConfigureDialog'; import { ProcessorSelectDialog } from './ProcessorSelectDialog'; -export const DataExportDialog: DialogComponent = observer( - function DataExportDialog(props) { - const controller = useController(DataExportController, props.payload, props.rejectDialog); - - if (controller.step === DataExportStep.Configure && controller.processor) { - return ( - controller.setStep(DataExportStep.DataTransferProcessor)} - onClose={props.rejectDialog} - onExport={controller.prepareExport} - /> - ); - } +export const DataExportDialog = observer(function DataExportDialog({ + payload, + rejectDialog, +}: DialogComponentProps) { + const controller = useController(DataExportController, payload, rejectDialog); + if (controller.step === DataExportStep.Configure && controller.processor) { return ( - controller.setStep(DataExportStep.DataTransferProcessor)} + onClose={rejectDialog} + onExport={controller.prepareExport} /> ); } -); + + return ( + + ); +}); diff --git a/webapp/packages/data-viewer-plugin/src/DataViewerTableService.ts b/webapp/packages/data-viewer-plugin/src/DataViewerTableService.ts index 67808e1847..9b6ed74f76 100644 --- a/webapp/packages/data-viewer-plugin/src/DataViewerTableService.ts +++ b/webapp/packages/data-viewer-plugin/src/DataViewerTableService.ts @@ -7,13 +7,13 @@ */ import { injectable } from '@dbeaver/core/di'; -import { GraphQLService, SqlDataFilterConstraint } from '@dbeaver/core/sdk'; +import { GraphQLService } from '@dbeaver/core/sdk'; +import { RequestDataOptionsToConstrains } from './DataViewerUtils'; import { IExecutionContext } from './IExecutionContext'; import { RowDiff } from './TableViewer/TableDataModel/EditedRow'; import { IRequestDataResult, IRequestDataResultOptions, TableViewerModel } from './TableViewer/TableViewerModel'; import { TableViewerStorageService } from './TableViewer/TableViewerStorageService'; -import { RequestDataOptionsToConstrains } from './DataViewerUtils'; @injectable() diff --git a/webapp/packages/data-viewer-plugin/src/TableViewer/ErrorDialog.tsx b/webapp/packages/data-viewer-plugin/src/TableViewer/ErrorDialog.tsx index d4fed0c349..552c98c384 100644 --- a/webapp/packages/data-viewer-plugin/src/TableViewer/ErrorDialog.tsx +++ b/webapp/packages/data-viewer-plugin/src/TableViewer/ErrorDialog.tsx @@ -11,7 +11,7 @@ import { useCallback } from 'react'; import styled, { css } from 'reshadow'; import { Button, SanitizedHTML } from '@dbeaver/core/blocks'; -import { CommonDialogWrapper, DialogComponent } from '@dbeaver/core/dialogs'; +import { CommonDialogWrapper, DialogComponentProps } from '@dbeaver/core/dialogs'; import { useTranslate } from '@dbeaver/core/localization'; import { useStyles } from '@dbeaver/core/theming'; @@ -44,9 +44,9 @@ export type ErrorDialogPayload = { onShowDetails?: () => void; } -export const ErrorDialog: DialogComponent = observer(function ErrorDialog({ +export const ErrorDialog = observer(function ErrorDialog({ rejectDialog, resolveDialog, payload, -}) { +}: DialogComponentProps) { const handleRetry = useCallback(() => resolveDialog(true), [resolveDialog]); const translate = useTranslate(); diff --git a/webapp/packages/object-viewer-plugin/src/ObjectViewerTabService.ts b/webapp/packages/object-viewer-plugin/src/ObjectViewerTabService.ts index 5a724f009c..1ce1d99241 100644 --- a/webapp/packages/object-viewer-plugin/src/ObjectViewerTabService.ts +++ b/webapp/packages/object-viewer-plugin/src/ObjectViewerTabService.ts @@ -15,12 +15,12 @@ import { IContextProvider, ITab, TabHandler, - isDatabaseObject, NavigationType, NodeManagerUtils, connectionProvider, objectCatalogProvider, objectSchemaProvider, + NavNodeManagerService, } from '@dbeaver/core/app'; import { injectable } from '@dbeaver/core/di'; import { NotificationService } from '@dbeaver/core/eventsLog'; @@ -115,7 +115,7 @@ export class ObjectViewerTabService { const propertiesTabLoadingKey = `${tab.handlerState.objectId}_${folderId}`; try { - if (children.length === 0 || !isDatabaseObject(folderId)) { + if (children.length === 0 || !NodeManagerUtils.isDatabaseObject(folderId)) { return; }