From 5272139b2d4c119a0adad00a034e5b32e8846e2e Mon Sep 17 00:00:00 2001 From: Shailesh Parmar Date: Thu, 19 Jun 2025 11:09:35 +0530 Subject: [PATCH] added pie chart component in test case page. --- .../PieChartSummaryPanel.component.tsx | 288 ++++++++++-------- .../TestCases/TestCases.component.tsx | 5 +- .../TestSuiteList/TestSuites.component.tsx | 8 +- .../src/pages/DataQuality/DataQualityPage.tsx | 21 +- 4 files changed, 180 insertions(+), 142 deletions(-) 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 index f92f8053e15..4bf05875579 100644 --- 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 @@ -1,7 +1,9 @@ -import { Card, Col, Row } from 'antd'; +import { Card, Col, Row, Typography } from 'antd'; import React, { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { Cell, Pie, PieChart } from 'recharts'; +import { PRIMARY_COLOR, WHITE_SMOKE } from '../../../constants/Color.constants'; +import PageHeader from '../../PageHeader/PageHeader.component'; import { SummaryPanelProps } from './SummaryPanel.interface'; const renderCenterText = (value: number) => ( @@ -20,98 +22,150 @@ const renderCenterText = (value: number) => ( 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( - () => [ + const healthyDataAssets = useMemo(() => { + return [ { - name: 'success', - value: testSummary?.success, - color: '#22C55E', + name: 'healthy', + value: testSummary?.healthy, + color: '#12B76A', }, { name: 'total', - value: testSummary?.total, - color: '#E5E7EB', + value: + (testSummary?.totalDQEntities ?? 0) - (testSummary?.healthy ?? 0), + color: WHITE_SMOKE, }, - ], - [testSummary] - ); + ]; + }, [testSummary?.healthy, testSummary?.totalDQEntities]); + + const dataAssetsCoverage = useMemo(() => { + return [ + { + name: 'dataAssetsCoverage', + value: testSummary?.totalDQEntities, + color: PRIMARY_COLOR, + }, + { + name: 'total', + value: + (testSummary?.totalEntityCount ?? 0) - + (testSummary?.totalDQEntities ?? 0), + color: WHITE_SMOKE, + }, + ]; + }, [testSummary?.totalEntityCount, testSummary?.totalDQEntities]); + + const testCaseSummary = useMemo(() => { + return [ + { + name: 'success', + data: [ + { + name: 'success', + value: testSummary?.success, + color: '#12B76A', + }, + { + name: 'total', + value: (testSummary?.total ?? 0) - (testSummary?.success ?? 0), + color: WHITE_SMOKE, + }, + ], + innerRadius: 90, + outerRadius: 100, + }, + { + name: 'failed', + data: [ + { + name: 'failed', + value: testSummary?.failed, + color: '#EF4444', + }, + { + name: 'total', + value: (testSummary?.total ?? 0) - (testSummary?.failed ?? 0), + color: WHITE_SMOKE, + }, + ], + innerRadius: 70, + outerRadius: 80, + }, + { + name: 'aborted', + data: [ + { + name: 'aborted', + value: testSummary?.aborted, + color: '#F59E0B', + }, + { + name: 'total', + value: (testSummary?.total ?? 0) - (testSummary?.aborted ?? 0), + color: WHITE_SMOKE, + }, + ], + innerRadius: 50, + outerRadius: 60, + }, + ]; + }, [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')} -
-
+ + + {t('label.total-entity', { + entity: t('label.test-case-plural'), + })} + +
- - {success?.map((entry) => ( - - ))} - - {/* {renderCenterText(testSummary?.totalTests || 0)} */} + {testCaseSummary.map((item) => { + return ( + + {item.data?.map((entry) => ( + + ))} + + ); + })} + {renderCenterText(testSummary?.total || 0)}
-
- {testSummary?.totalTests?.map((item: any) => ( -
+
+ {testCaseSummary?.map((item) => ( +
@@ -119,7 +173,7 @@ const PieChartSummaryPanel = ({ {t(item.name)} - {item.value} + {item.data[0].value}
))} @@ -128,74 +182,58 @@ const PieChartSummaryPanel = ({ {/* Healthy Data Assets */} - -
- {t('healthy-data-asset-plural')} -
-
- + + + {t('label.healthy-data-asset-plural')} + +
+ - {testSummary?.healthyDataAssets?.map( - (entry: any, idx: number) => ( - - ) - )} + endAngle={-270} + innerRadius={90} + outerRadius={100} + startAngle={90}> + {healthyDataAssets?.map((entry, idx) => ( + + ))} - {renderCenterText(1000)} + {renderCenterText(testSummary?.healthy || 0)}
{/* Data Assets Coverage */} - -
- {t('data-asset-plural-coverage')} -
-
- + + + {t('label.data-asset-plural-coverage')} + +
+ - {testSummary?.dataAssetsCoverage?.map( - (entry: any, idx: number) => ( - - ) - )} + endAngle={-270} + innerRadius={90} + outerRadius={100} + startAngle={90}> + {dataAssetsCoverage?.map((entry, idx) => ( + + ))} - {renderCenterText(1000)} + {renderCenterText(testSummary?.totalDQEntities || 0)}
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 13278eee274..056848ddf33 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 @@ -83,7 +83,6 @@ 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 = () => { const [form] = useForm(); @@ -650,13 +649,13 @@ export const TestCases = () => { - + {/* - + */} { const { t } = useTranslation(); @@ -352,10 +352,14 @@ export const TestSuites = () => { - */} + 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 af2973fef84..5fbaaa5338d 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,14 @@ * limitations under the License. */ -import { Button, Card, Col, Row, Tabs, Typography } from 'antd'; +import { Button, Card, Col, Row, Tabs } from 'antd'; import { isEmpty } from 'lodash'; import React, { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; 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 PageHeader from '../../components/PageHeader/PageHeader.component'; import { ROUTES } from '../../constants/constants'; import { usePermissionProvider } from '../../context/PermissionProvider/PermissionProvider'; import { EntityType } from '../../enums/entity.enum'; @@ -68,18 +69,14 @@ const DataQualityPage = () => { - - {t('label.data-quality')} - - - {t('message.page-sub-header-for-data-quality')} - + + {activeTab === DataQualityPageTabs.TEST_SUITES && testSuitePermission?.Create && (