diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityExportModalProvider/EntityExportModalProvider.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityExportModalProvider/EntityExportModalProvider.component.tsx index a4b0ae70c71..f5a76e83d45 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityExportModalProvider/EntityExportModalProvider.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityExportModalProvider/EntityExportModalProvider.component.tsx @@ -12,12 +12,13 @@ */ import { Form, Input, Modal } from 'antd'; import { AxiosError } from 'axios'; +import classNames from 'classnames'; import { isString } from 'lodash'; import React, { ReactNode, useEffect, useMemo, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { getCurrentISODate } from '../../../utils/date-time/DateTimeUtils'; import { showErrorToast } from '../../../utils/ToastUtils'; -import Banner, { BannerProps } from '../../common/Banner/Banner'; +import Banner from '../../common/Banner/Banner'; import { CSVExportJob, CSVExportWebsocketResponse, @@ -149,16 +150,6 @@ export const EntityExportModalProvider = ({ [] ); - const bannerConfig = useMemo(() => { - const isCompleted = csvExportJob?.status === 'COMPLETED'; - - return { - type: isCompleted ? 'success' : 'error', - message: isCompleted ? csvExportJob?.message : csvExportJob?.error, - hasJobId: !!csvExportJob?.jobId, - }; - }, [csvExportJob]); - return ( <> @@ -169,13 +160,13 @@ export const EntityExportModalProvider = ({ open cancelText={t('label.cancel')} closable={false} - confirmLoading={downloading} data-testid="export-entity-modal" maskClosable={false} okButtonProps={{ form: 'export-form', htmlType: 'submit', id: 'submit-button', + disabled: downloading, }} okText={t('label.export')} title={exportData.title ?? t('label.export')} @@ -186,6 +177,7 @@ export const EntityExportModalProvider = ({ layout="vertical" onFinish={handleExport}> - {bannerConfig.hasJobId && bannerConfig.message && ( + {csvExportJob?.jobId && ( )} diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityExportModalProvider/EntityExportModalProvider.test.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityExportModalProvider/EntityExportModalProvider.test.tsx index 8833e33be32..9a533a76004 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityExportModalProvider/EntityExportModalProvider.test.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Entity/EntityExportModalProvider/EntityExportModalProvider.test.tsx @@ -18,17 +18,14 @@ import { } from './EntityExportModalProvider.component'; import { ExportData } from './EntityExportModalProvider.interface'; -const dummyTeamsCSV = `name*,displayName,description,teamType*,parents*,Owner,isJoinable,defaultRoles,policies -access table only,access table only,,Group,Organization,,true,Only table, -Engineering,,,BusinessUnit,Organization,,true,, -Finance,,,BusinessUnit,Organization,,true,, -Legal,,,BusinessUnit,Organization,,true,, -Applications,,,Group,Engineering,,true,, -`; +const mockExportJob = { + jobId: '123456', + message: 'Export initiated successfyully', +}; const mockShowModal: ExportData = { name: 'test', - onExport: jest.fn().mockImplementation(() => Promise.resolve(dummyTeamsCSV)), + onExport: jest.fn().mockImplementation(() => Promise.resolve(mockExportJob)), }; const ConsumerComponent = () => { @@ -140,6 +137,7 @@ describe('EntityExportModalProvider component', () => { }); expect(mockShowModal.onExport).toHaveBeenCalledWith(mockShowModal.name); - expect(screen.queryByTestId('export-entity-modal')).not.toBeInTheDocument(); + + expect(await screen.findByText(mockExportJob.message)).toBeInTheDocument(); }); }); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/Banner/Banner.tsx b/openmetadata-ui/src/main/resources/ui/src/components/common/Banner/Banner.tsx index 36727e5334d..8959bf18d1d 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/Banner/Banner.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/Banner/Banner.tsx @@ -1,6 +1,8 @@ import React, { FC } from 'react'; import './banner.less'; +import { LoadingOutlined } from '@ant-design/icons'; +import { Spin } from 'antd'; import classNames from 'classnames'; import { ReactComponent as ErrorIcon } from '../../../assets/svg/banner/ic-banner-error.svg'; import { ReactComponent as SuccessIcon } from '../../../assets/svg/banner/ic-banner-success.svg'; @@ -8,12 +10,23 @@ import { ReactComponent as SuccessIcon } from '../../../assets/svg/banner/ic-ban export interface BannerProps extends React.HTMLAttributes { type: 'success' | 'error'; message: string; + isLoading?: boolean; } -const Banner: FC = ({ type, message, className }) => { +const Banner: FC = ({ type, message, className, isLoading }) => { + const icon = type === 'success' ? : ; + return (
- {type === 'success' ? : } + {isLoading ? ( + } + size="small" + /> + ) : ( + icon + )} {message}
); diff --git a/openmetadata-ui/src/main/resources/ui/src/components/common/Banner/banner.less b/openmetadata-ui/src/main/resources/ui/src/components/common/Banner/banner.less index 78246e4e25e..89bfd7d4be5 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/common/Banner/banner.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/common/Banner/banner.less @@ -20,4 +20,8 @@ background-color: @error-bg-color; color: @error-color; } + + .loading-spinner-success { + color: @success-color; + } }