diff --git a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataContracts.spec.ts b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataContracts.spec.ts index a9d5a73d5fc..3b74dfeb9cd 100644 --- a/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataContracts.spec.ts +++ b/openmetadata-ui/src/main/resources/ui/playwright/e2e/Pages/DataContracts.spec.ts @@ -143,11 +143,6 @@ test.describe('Data Contracts', () => { DATA_CONTRACT_SEMANTICS1.description ); - await expect(page.locator('#semantics_0_enabled')).toHaveAttribute( - 'aria-checked', - 'true' - ); - const ruleLocator = page.locator('.group').nth(0); await selectOption( page, diff --git a/openmetadata-ui/src/main/resources/ui/src/assets/svg/DataContractValidationApplication.svg b/openmetadata-ui/src/main/resources/ui/src/assets/svg/DataContractValidationApplication.svg index 6a4be044f9a..50d22928b85 100644 --- a/openmetadata-ui/src/main/resources/ui/src/assets/svg/DataContractValidationApplication.svg +++ b/openmetadata-ui/src/main/resources/ui/src/assets/svg/DataContractValidationApplication.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/openmetadata-ui/src/main/resources/ui/src/assets/svg/ic-contract-aborted.svg b/openmetadata-ui/src/main/resources/ui/src/assets/svg/ic-contract-aborted.svg new file mode 100644 index 00000000000..8b375da95fd --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/src/assets/svg/ic-contract-aborted.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/openmetadata-ui/src/main/resources/ui/src/assets/svg/ic-contract-failed.svg b/openmetadata-ui/src/main/resources/ui/src/assets/svg/ic-contract-failed.svg new file mode 100644 index 00000000000..ff7f275cda4 --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/src/assets/svg/ic-contract-failed.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/openmetadata-ui/src/main/resources/ui/src/assets/svg/ic-contract-running.svg b/openmetadata-ui/src/main/resources/ui/src/assets/svg/ic-contract-running.svg new file mode 100644 index 00000000000..4d57b535799 --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/src/assets/svg/ic-contract-running.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataAssets/DataAssetsHeader/DataAssetsHeader.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataAssets/DataAssetsHeader/DataAssetsHeader.component.tsx index da707f31c11..5c42e713dea 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataAssets/DataAssetsHeader/DataAssetsHeader.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataAssets/DataAssetsHeader/DataAssetsHeader.component.tsx @@ -15,7 +15,7 @@ import { Button, Col, Divider, Row, Space, Tooltip, Typography } from 'antd'; import ButtonGroup from 'antd/lib/button/button-group'; import { AxiosError } from 'axios'; import classNames from 'classnames'; -import { get, isEmpty, isUndefined } from 'lodash'; +import { get, isEmpty, isUndefined, toLower } from 'lodash'; import { ServiceTypes } from 'Models'; import QueryString from 'qs'; import { useCallback, useEffect, useMemo, useState } from 'react'; @@ -60,10 +60,10 @@ import { getEntityExtraInfoLength, isDataAssetsWithServiceField, } from '../../../utils/DataAssetsHeader.utils'; +import { getDataContractStatusIcon } from '../../../utils/DataContract/DataContractUtils'; import EntityLink from '../../../utils/EntityLink'; import entityUtilClassBase from '../../../utils/EntityUtilClassBase'; import { - getDataContractStatusIcon, getEntityFeedLink, getEntityName, getEntityVoteStatus, @@ -425,15 +425,26 @@ export const DataAssetsHeader = ({ ]); const dataContractLatestResultButton = useMemo(() => { - if (dataContract?.latestResult?.status === ContractExecutionStatus.Failed) { + if ( + dataContract?.latestResult?.status && + [ + ContractExecutionStatus.Aborted, + ContractExecutionStatus.Failed, + ContractExecutionStatus.Running, + ].includes(dataContract?.latestResult?.status) + ) { + const icon = getDataContractStatusIcon( + dataContract?.latestResult?.status + ); + return ( diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataAssets/DataAssetsHeader/data-asset-header.less b/openmetadata-ui/src/main/resources/ui/src/components/DataAssets/DataAssetsHeader/data-asset-header.less index 4092d720fca..254c6a0d09c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataAssets/DataAssetsHeader/data-asset-header.less +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataAssets/DataAssetsHeader/data-asset-header.less @@ -138,21 +138,33 @@ box-shadow: 0px 2px 2px -1px @grey-35, 0px 4px 6px -2px @grey-35, 0px 12px 16px -4px @grey-35; - &.Failed { + svg { + font-size: 26px; + fill: transparent; + } + + &.failed { color: @red-14; border: 1px solid @red-19; background-color: @red-9; + } - svg { - font-size: 26px; - fill: transparent; - } + &.aborted { + color: @orange-7; + border: 1px solid @orange-200; + background-color: @orange-50; &:hover { border: 1px solid @red-19; background-color: @red-2; } } + + &.running { + color: @primary-7; + border: 1px solid @blue-39; + background-color: @blue-33; + } } } } diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractQualityFormTab/ContractQualityFormTab.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractQualityFormTab/ContractQualityFormTab.tsx index 086d0e2ae3c..2010c85f14e 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractQualityFormTab/ContractQualityFormTab.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractQualityFormTab/ContractQualityFormTab.tsx @@ -11,8 +11,8 @@ * limitations under the License. */ -import Icon from '@ant-design/icons'; -import { Button, Card, Typography } from 'antd'; +import Icon, { DownOutlined } from '@ant-design/icons'; +import { Button, Card, Dropdown, Typography } from 'antd'; import { ColumnsType } from 'antd/lib/table'; import { AxiosError } from 'axios'; import { toLower } from 'lodash'; @@ -22,6 +22,7 @@ import { ReactComponent as LeftOutlined } from '../../../assets/svg/left-arrow.s import { ReactComponent as PlusIcon } from '../../../assets/svg/x-colored.svg'; import { DEFAULT_SORT_ORDER } from '../../../constants/profiler.constant'; import { EntityType, TabSpecificField } from '../../../enums/entity.enum'; +import { TestCaseType } from '../../../enums/TestSuite.enum'; import { DataContract } from '../../../generated/entity/data/dataContract'; import { Table as TableType } from '../../../generated/entity/data/table'; import { TestCase, TestCaseResult } from '../../../generated/tests/testCase'; @@ -31,13 +32,11 @@ import { usePaging } from '../../../hooks/paging/usePaging'; import { getListTestCaseBySearch, ListTestCaseParamsBySearch, - TestCaseType, } from '../../../rest/testAPI'; -import { TEST_LEVEL_OPTIONS } from '../../../utils/DataQuality/DataQualityUtils'; +import { ContractTestTypeLabelMap } from '../../../utils/DataContract/DataContractUtils'; import { generateEntityLink } from '../../../utils/TableUtils'; import { showErrorToast } from '../../../utils/ToastUtils'; import { PagingHandlerParams } from '../../common/NextPrevious/NextPrevious.interface'; -import SelectionCardGroup from '../../common/SelectionCardGroup/SelectionCardGroup'; import StatusBadge from '../../common/StatusBadge/StatusBadge.component'; import { StatusType } from '../../common/StatusBadge/StatusBadge.interface'; import Table from '../../common/Table/Table'; @@ -52,7 +51,7 @@ export const ContractQualityFormTab: React.FC<{ onPrev: () => void; prevLabel?: string; }> = ({ selectedQuality, onChange, onPrev, prevLabel }) => { - const [testType, setTestType] = useState(TestCaseType.table); + const [testType, setTestType] = useState(TestCaseType.all); const [allTestCases, setAllTestCases] = useState([]); const { data: table } = useGenericContext(); const [isTestsLoading, setIsTestsLoading] = useState(false); @@ -191,6 +190,16 @@ export const ContractQualityFormTab: React.FC<{ fetchAllTests(); }, [testType]); + const filterMenu = useMemo(() => { + return { + items: Object.entries(ContractTestTypeLabelMap).map(([key]) => ({ + key, + label: ContractTestTypeLabelMap[key as TestCaseType], + onClick: () => setTestType(key as TestCaseType), + })), + }; + }, []); + return (
@@ -215,15 +224,17 @@ export const ContractQualityFormTab: React.FC<{
- setTestType(value as TestCaseType)} - /> + + + } loading={isTestsLoading} pagination={false} rowKey="id" @@ -234,6 +245,16 @@ export const ContractQualityFormTab: React.FC<{ handleSelection(selectedRowKeys as string[]); }, }} + searchProps={{ + placeholder: t('label.search-by-name'), + onSearch: (value) => { + fetchAllTests({ + offset: 0, + limit: pageSize, + q: value, + }); + }, + }} /> diff --git a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSemanticFormTab/ContractSemanticFormTab.tsx b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSemanticFormTab/ContractSemanticFormTab.tsx index e23da32fd30..fab55c1c87b 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSemanticFormTab/ContractSemanticFormTab.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/DataContract/ContractSemanticFormTab/ContractSemanticFormTab.tsx @@ -239,22 +239,6 @@ export const ContractSemanticFormTab: React.FC<{