diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/SummaryPannel/PieChartSummaryPanel.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/SummaryPannel/PieChartSummaryPanel.component.tsx new file mode 100644 index 00000000000..f92f8053e15 --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/SummaryPannel/PieChartSummaryPanel.component.tsx @@ -0,0 +1,208 @@ +import { Card, Col, Row } from 'antd'; +import React, { useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Cell, Pie, PieChart } from 'recharts'; +import { SummaryPanelProps } from './SummaryPanel.interface'; + +const renderCenterText = (value: number) => ( + + {value.toLocaleString()} + +); + +const PieChartSummaryPanel = ({ + testSummary, + isLoading = false, + showAdditionalSummary = false, +}: SummaryPanelProps) => { + const { t } = useTranslation(); + console.log('testSummary', testSummary); + + // { + // "success": 4, + // "failed": 3, + // "aborted": 1, + // "total": 8, + // "unhealthy": 1, + // "healthy": 1, + // "totalDQEntities": 2, + // "totalEntityCount": 36 + // } + + const success = useMemo( + () => [ + { + name: 'success', + value: testSummary?.success, + color: '#22C55E', + }, + { + name: 'total', + value: testSummary?.total, + color: '#E5E7EB', + }, + ], + [testSummary] + ); + + return ( + +
+
+ {t('test-cases-status', 'Test Cases Status')} +
+
+ {t( + 'test-cases-status-desc', + 'Understand the metadata available in your service and keep track of the main KPIs coverage' + )} +
+
+ + {/* Total Tests */} + + +
+ {t('total-tests', 'Total Tests')} +
+
+ + + {success?.map((entry) => ( + + ))} + + {/* {renderCenterText(testSummary?.totalTests || 0)} */} + +
+
+ {testSummary?.totalTests?.map((item: any) => ( +
+ + + {t(item.name)} + + + {item.value} + +
+ ))} +
+
+ + {/* Healthy Data Assets */} + + +
+ {t('healthy-data-asset-plural')} +
+
+ + + {testSummary?.healthyDataAssets?.map( + (entry: any, idx: number) => ( + + ) + )} + + {renderCenterText(1000)} + +
+
+ + {/* Data Assets Coverage */} + + +
+ {t('data-asset-plural-coverage')} +
+
+ + + {testSummary?.dataAssetsCoverage?.map( + (entry: any, idx: number) => ( + + ) + )} + + {renderCenterText(1000)} + +
+
+ +
+
+ ); +}; + +export default PieChartSummaryPanel; diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/TestCases/TestCases.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/TestCases/TestCases.component.tsx index 7e519e4dbec..13278eee274 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/TestCases/TestCases.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataQuality/TestCases/TestCases.component.tsx @@ -13,6 +13,7 @@ import { RightOutlined } from '@ant-design/icons'; import { Button, + Card, Col, Dropdown, Form, @@ -81,6 +82,7 @@ import { PagingHandlerParams } from '../../common/NextPrevious/NextPrevious.inte import Searchbar from '../../common/SearchBarComponent/SearchBar.component'; import DataQualityTab from '../../Database/Profiler/DataQualityTab/DataQualityTab'; import { TestCaseSearchParams } from '../DataQuality.interface'; +import PieChartSummaryPanel from '../SummaryPannel/PieChartSummaryPanel.component'; import { SummaryPanel } from '../SummaryPannel/SummaryPanel.component'; export const TestCases = () => { @@ -482,196 +484,204 @@ export const TestCases = () => { } return ( - - - - form={form} - layout="horizontal" - onValuesChange={handleFilterChange}> - - - handleSearchParam('searchValue', value)} - /> - - - - - - - {selectedFilter.includes(TEST_CASE_FILTERS.table) && ( - - + + + + - )} - {selectedFilter.includes(TEST_CASE_FILTERS.type) && ( - - - - )} - {selectedFilter.includes(TEST_CASE_FILTERS.lastRun) && ( - - - - )} - {selectedFilter.includes(TEST_CASE_FILTERS.tags) && ( - - - - )} - {selectedFilter.includes(TEST_CASE_FILTERS.service) && ( - - - - )} - - - - - - - - - - + {selectedFilter.includes(TEST_CASE_FILTERS.table) && ( + + + + )} + {selectedFilter.includes(TEST_CASE_FILTERS.type) && ( + + + + )} + {selectedFilter.includes(TEST_CASE_FILTERS.lastRun) && ( + + + + )} + {selectedFilter.includes(TEST_CASE_FILTERS.tags) && ( + + + + )} + {selectedFilter.includes(TEST_CASE_FILTERS.service) && ( + + + + )} + + + + + + + + + + + + + + ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/DataQuality/DataQualityPage.tsx b/openmetadata-ui/src/main/resources/ui/src/pages/DataQuality/DataQualityPage.tsx index 936ee8859e9..af2973fef84 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/DataQuality/DataQualityPage.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/pages/DataQuality/DataQualityPage.tsx @@ -11,13 +11,15 @@ * limitations under the License. */ -import { Card, Col, Row, Tabs, Typography } from 'antd'; +import { Button, Card, Col, Row, Tabs, Typography } from 'antd'; import { isEmpty } from 'lodash'; import React, { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; -import { useHistory, useParams } from 'react-router-dom'; +import { Link, useHistory, useParams } from 'react-router-dom'; import ManageButton from '../../components/common/EntityPageInfos/ManageButton/ManageButton'; import TabsLabel from '../../components/common/TabsLabel/TabsLabel.component'; +import { ROUTES } from '../../constants/constants'; +import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider'; import { EntityType } from '../../enums/entity.enum'; import { withPageLayout } from '../../hoc/withPageLayout'; import i18n from '../../utils/i18next/LocalUtil'; @@ -32,6 +34,8 @@ const DataQualityPage = () => { useParams<{ tab: DataQualityPageTabs }>(); const history = useHistory(); const { t } = useTranslation(); + const { permissions } = usePermissionProvider(); + const { testSuite: testSuitePermission } = permissions; const menuItems = useMemo(() => { const data = DataQualityClassBase.getDataQualityTab(); @@ -58,45 +62,67 @@ const DataQualityPage = () => { }; return ( -
- - - - - - {t('label.data-quality')} - - - {t('message.page-sub-header-for-data-quality')} - - - {isEmpty(extraDropdownContent) ? null : ( - - + + + + + + + + {t('label.data-quality')} + + + {t('message.page-sub-header-for-data-quality')} + - )} - - - - - - -
+ + {activeTab === DataQualityPageTabs.TEST_SUITES && + testSuitePermission?.Create && ( + + + + )} + {activeTab === DataQualityPageTabs.TEST_CASES && + testSuitePermission?.Create && ( + + )} + {isEmpty(extraDropdownContent) ? null : ( + + )} + + + + + + + + + ); }; diff --git a/openmetadata-ui/src/main/resources/ui/src/pages/DataQuality/data-quality-page.less b/openmetadata-ui/src/main/resources/ui/src/pages/DataQuality/data-quality-page.less index e1ce348a048..9d4ba7dd795 100644 --- a/openmetadata-ui/src/main/resources/ui/src/pages/DataQuality/data-quality-page.less +++ b/openmetadata-ui/src/main/resources/ui/src/pages/DataQuality/data-quality-page.less @@ -13,9 +13,8 @@ @import (reference) '../../styles/variables.less'; -.data-quality-page-left-panel-menu { - &.ant-menu-root.ant-menu-inline { - padding-top: @size-md; - border-radius: @border-radius-sm; +.data-quality-page-tabs { + .ant-tabs-tabpane { + margin-top: @size-md; } }