mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-08-24 17:08:28 +00:00
Redesign : certificates and source URL (#20368)
* Redesigned certificate || source url * updated extrainfolabel * updated extrainfolabel * fixed metricHeaderInfo|| gave consistent spacing * fixed test cases * fixed metric text overflow * fixed tests * fixed comments * fixed sonar cases
This commit is contained in:
parent
30239bdf05
commit
52e07cf2c3
@ -48,7 +48,7 @@ export const updateUnitOfMeasurement = async (
|
|||||||
page: Page,
|
page: Page,
|
||||||
unitOfMeasurement: string
|
unitOfMeasurement: string
|
||||||
) => {
|
) => {
|
||||||
await page.click(`[data-testid="edit-unit-of-measurement-button"]`);
|
await page.click(`[data-testid="edit-measurement-unit-button"]`);
|
||||||
const patchPromise = page.waitForResponse(
|
const patchPromise = page.waitForResponse(
|
||||||
(response) => response.request().method() === 'PATCH'
|
(response) => response.request().method() === 'PATCH'
|
||||||
);
|
);
|
||||||
@ -60,21 +60,21 @@ export const updateUnitOfMeasurement = async (
|
|||||||
|
|
||||||
// verify the unit of measurement is updated
|
// verify the unit of measurement is updated
|
||||||
await expect(
|
await expect(
|
||||||
page.getByText(`Unit of Measurement${unitOfMeasurement.toUpperCase()}`)
|
page.getByText(`Measurement Unit${unitOfMeasurement.toUpperCase()}`)
|
||||||
).toBeVisible();
|
).toBeVisible();
|
||||||
};
|
};
|
||||||
|
|
||||||
export const removeUnitOfMeasurement = async (page: Page) => {
|
export const removeUnitOfMeasurement = async (page: Page) => {
|
||||||
await page.click(`[data-testid="edit-unit-of-measurement-button"]`);
|
await page.click(`[data-testid="edit-measurement-unit-button"]`);
|
||||||
const patchPromise = page.waitForResponse(
|
const patchPromise = page.waitForResponse(
|
||||||
(response) => response.request().method() === 'PATCH'
|
(response) => response.request().method() === 'PATCH'
|
||||||
);
|
);
|
||||||
await page.getByTestId('remove-unit-of-measurement-button').click();
|
await page.getByTestId('remove-measurement-unit-button').click();
|
||||||
|
|
||||||
await patchPromise;
|
await patchPromise;
|
||||||
|
|
||||||
// verify the unit of measurement is updated
|
// verify the unit of measurement is updated
|
||||||
await expect(page.getByText('Unit of Measurement--')).toBeVisible();
|
await expect(page.getByText('Measurement Unit--')).toBeVisible();
|
||||||
};
|
};
|
||||||
|
|
||||||
export const updateGranularity = async (page: Page, granularity: string) => {
|
export const updateGranularity = async (page: Page, granularity: string) => {
|
||||||
@ -267,7 +267,7 @@ export const addMetric = async (page: Page) => {
|
|||||||
|
|
||||||
await expect(
|
await expect(
|
||||||
page.getByText(
|
page.getByText(
|
||||||
`Unit of Measurement${metricData.unitOfMeasurement.toUpperCase()}`
|
`Measurement Unit${metricData.unitOfMeasurement.toUpperCase()}`
|
||||||
)
|
)
|
||||||
).toBeVisible();
|
).toBeVisible();
|
||||||
|
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
<svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_8108_4894)">
|
||||||
|
<path d="M6.66656 8.66673C6.95286 9.04948 7.31813 9.36618 7.73759 9.59535C8.15705 9.82452 8.62089 9.9608 9.09766 9.99495C9.57442 10.0291 10.0529 9.9603 10.5008 9.79325C10.9486 9.62619 11.3553 9.36477 11.6932 9.02673L13.6932 7.02673C14.3004 6.39805 14.6364 5.55604 14.6288 4.68205C14.6212 3.80807 14.2706 2.97202 13.6526 2.354C13.0346 1.73597 12.1985 1.38541 11.3246 1.37781C10.4506 1.37022 9.60856 1.7062 8.97989 2.31339L7.83322 3.45339M9.33322 7.33339C9.04692 6.95064 8.68165 6.63394 8.26219 6.40477C7.84273 6.17559 7.37888 6.03931 6.90212 6.00517C6.42536 5.97102 5.94683 6.03981 5.49899 6.20687C5.05115 6.37393 4.64448 6.63534 4.30656 6.97339L2.30656 8.97339C1.69936 9.60207 1.36338 10.4441 1.37098 11.3181C1.37857 12.1921 1.72913 13.0281 2.34716 13.6461C2.96519 14.2641 3.80123 14.6147 4.67522 14.6223C5.54921 14.6299 6.39121 14.2939 7.01989 13.6867L8.15989 12.5467" stroke="#1570EF" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_8108_4894">
|
||||||
|
<rect width="16" height="16" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
@ -25,6 +25,7 @@ import { ReactComponent as IconExternalLink } from '../../../assets/svg/external
|
|||||||
import { ReactComponent as RedAlertIcon } from '../../../assets/svg/ic-alert-red.svg';
|
import { ReactComponent as RedAlertIcon } from '../../../assets/svg/ic-alert-red.svg';
|
||||||
import { ReactComponent as TaskOpenIcon } from '../../../assets/svg/ic-open-task.svg';
|
import { ReactComponent as TaskOpenIcon } from '../../../assets/svg/ic-open-task.svg';
|
||||||
import { ReactComponent as VersionIcon } from '../../../assets/svg/ic-version.svg';
|
import { ReactComponent as VersionIcon } from '../../../assets/svg/ic-version.svg';
|
||||||
|
import { ReactComponent as LinkIcon } from '../../../assets/svg/link-icon-with-bg.svg';
|
||||||
import { ActivityFeedTabs } from '../../../components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.interface';
|
import { ActivityFeedTabs } from '../../../components/ActivityFeed/ActivityFeedTab/ActivityFeedTab.interface';
|
||||||
import { DomainLabel } from '../../../components/common/DomainLabel/DomainLabel.component';
|
import { DomainLabel } from '../../../components/common/DomainLabel/DomainLabel.component';
|
||||||
import { OwnerLabel } from '../../../components/common/OwnerLabel/OwnerLabel.component';
|
import { OwnerLabel } from '../../../components/common/OwnerLabel/OwnerLabel.component';
|
||||||
@ -67,6 +68,7 @@ import serviceUtilClassBase from '../../../utils/ServiceUtilClassBase';
|
|||||||
import tableClassBase from '../../../utils/TableClassBase';
|
import tableClassBase from '../../../utils/TableClassBase';
|
||||||
import { getTierTags } from '../../../utils/TableUtils';
|
import { getTierTags } from '../../../utils/TableUtils';
|
||||||
import { showErrorToast } from '../../../utils/ToastUtils';
|
import { showErrorToast } from '../../../utils/ToastUtils';
|
||||||
|
import CertificationTag from '../../common/CertificationTag/CertificationTag';
|
||||||
import AnnouncementCard from '../../common/EntityPageInfos/AnnouncementCard/AnnouncementCard';
|
import AnnouncementCard from '../../common/EntityPageInfos/AnnouncementCard/AnnouncementCard';
|
||||||
import AnnouncementDrawer from '../../common/EntityPageInfos/AnnouncementDrawer/AnnouncementDrawer';
|
import AnnouncementDrawer from '../../common/EntityPageInfos/AnnouncementDrawer/AnnouncementDrawer';
|
||||||
import ManageButton from '../../common/EntityPageInfos/ManageButton/ManageButton';
|
import ManageButton from '../../common/EntityPageInfos/ManageButton/ManageButton';
|
||||||
@ -94,7 +96,7 @@ export const ExtraInfoLabel = ({
|
|||||||
inlineLayout = false,
|
inlineLayout = false,
|
||||||
}: {
|
}: {
|
||||||
label: string;
|
label: string;
|
||||||
value: string | number;
|
value: string | number | React.ReactNode;
|
||||||
dataTestId?: string;
|
dataTestId?: string;
|
||||||
showAsATag?: boolean;
|
showAsATag?: boolean;
|
||||||
inlineLayout?: boolean;
|
inlineLayout?: boolean;
|
||||||
@ -116,19 +118,19 @@ export const ExtraInfoLabel = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="d-flex align-start ">
|
<div className="d-flex align-start extra-info-container">
|
||||||
<Typography.Text
|
<Typography.Text
|
||||||
className="whitespace-nowrap text-sm d-flex flex-col gap-2"
|
className="whitespace-nowrap text-sm d-flex flex-col gap-2"
|
||||||
data-testid={dataTestId}>
|
data-testid={dataTestId}>
|
||||||
{!isEmpty(label) && (
|
{!isEmpty(label) && (
|
||||||
<span className="extra-info-label-heading">{label}</span>
|
<span className="extra-info-label-heading">{label}</span>
|
||||||
)}
|
)}
|
||||||
<span
|
<div
|
||||||
className={classNames('font-medium extra-info-value', {
|
className={classNames('font-medium extra-info-value', {
|
||||||
showAsATag: showAsATag,
|
showAsATag: showAsATag,
|
||||||
})}>
|
})}>
|
||||||
{value}
|
{value}
|
||||||
</span>
|
</div>
|
||||||
</Typography.Text>
|
</Typography.Text>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@ -489,7 +491,6 @@ export const DataAssetsHeader = ({
|
|||||||
<Col flex="auto">
|
<Col flex="auto">
|
||||||
<EntityHeaderTitle
|
<EntityHeaderTitle
|
||||||
badge={alertBadge}
|
badge={alertBadge}
|
||||||
certification={(dataAsset as Table)?.certification}
|
|
||||||
deleted={dataAsset?.deleted}
|
deleted={dataAsset?.deleted}
|
||||||
displayName={dataAsset.displayName}
|
displayName={dataAsset.displayName}
|
||||||
entityType={entityType}
|
entityType={entityType}
|
||||||
@ -538,6 +539,22 @@ export const DataAssetsHeader = ({
|
|||||||
</Button>
|
</Button>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|
||||||
|
{(dataAsset as Table).sourceUrl && (
|
||||||
|
<Tooltip title={t('label.source-url')}>
|
||||||
|
<Button
|
||||||
|
className="source-url-button font-semibold"
|
||||||
|
data-testid="source-url-button"
|
||||||
|
icon={
|
||||||
|
<Icon className="flex-center" component={LinkIcon} />
|
||||||
|
}>
|
||||||
|
<Typography.Link
|
||||||
|
href={(dataAsset as Table).sourceUrl}
|
||||||
|
target="_blank">
|
||||||
|
{t('label.source-url')}
|
||||||
|
</Typography.Link>
|
||||||
|
</Button>
|
||||||
|
</Tooltip>
|
||||||
|
)}
|
||||||
<ManageButton
|
<ManageButton
|
||||||
isAsyncDelete
|
isAsyncDelete
|
||||||
afterDeleteAction={afterDeleteAction}
|
afterDeleteAction={afterDeleteAction}
|
||||||
@ -600,10 +617,10 @@ export const DataAssetsHeader = ({
|
|||||||
{tierSuggestionRender ?? (
|
{tierSuggestionRender ?? (
|
||||||
<TierCard currentTier={tier?.tagFQN} updateTier={onTierUpdate}>
|
<TierCard currentTier={tier?.tagFQN} updateTier={onTierUpdate}>
|
||||||
<Space
|
<Space
|
||||||
className="d-flex align-start"
|
className="d-flex tier-container align-start"
|
||||||
data-testid="header-tier-container">
|
data-testid="header-tier-container">
|
||||||
{tier ? (
|
{tier ? (
|
||||||
<div className="d-flex items-center flex-col gap-2">
|
<div className="d-flex flex-col gap-2">
|
||||||
<div className="d-flex items-center gap-1">
|
<div className="d-flex items-center gap-1">
|
||||||
<span className="entity-no-tier ">
|
<span className="entity-no-tier ">
|
||||||
{t('label.tier')}
|
{t('label.tier')}
|
||||||
@ -696,6 +713,24 @@ export const DataAssetsHeader = ({
|
|||||||
onUpdateMetricDetails={onMetricUpdate}
|
onUpdateMetricDetails={onMetricUpdate}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{(dataAsset as Table)?.certification && (
|
||||||
|
<>
|
||||||
|
<Divider
|
||||||
|
className="self-center vertical-divider"
|
||||||
|
type="vertical"
|
||||||
|
/>
|
||||||
|
<ExtraInfoLabel
|
||||||
|
label={t('label.certification')}
|
||||||
|
value={
|
||||||
|
<CertificationTag
|
||||||
|
showName
|
||||||
|
certification={(dataAsset as Table).certification!}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
{extraInfo}
|
{extraInfo}
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-2">
|
<div className="mt-2">
|
||||||
|
@ -25,6 +25,8 @@ import { DEFAULT_ENTITY_PERMISSION } from '../../../utils/PermissionsUtils';
|
|||||||
import { DataAssetsHeader, ExtraInfoLink } from './DataAssetsHeader.component';
|
import { DataAssetsHeader, ExtraInfoLink } from './DataAssetsHeader.component';
|
||||||
import { DataAssetsHeaderProps } from './DataAssetsHeader.interface';
|
import { DataAssetsHeaderProps } from './DataAssetsHeader.interface';
|
||||||
|
|
||||||
|
import { LabelType, State, TagSource } from '../../../generated/tests/testCase';
|
||||||
|
import { AssetCertification } from '../../../generated/type/assetCertification';
|
||||||
const mockProps: DataAssetsHeaderProps = {
|
const mockProps: DataAssetsHeaderProps = {
|
||||||
dataAsset: {
|
dataAsset: {
|
||||||
id: 'assets-id',
|
id: 'assets-id',
|
||||||
@ -223,4 +225,71 @@ describe('DataAssetsHeader component', () => {
|
|||||||
|
|
||||||
mockIsAlertSupported = false;
|
mockIsAlertSupported = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should render source URL button when sourceUrl is present', () => {
|
||||||
|
const mockSourceUrl = 'http://test-source.com';
|
||||||
|
|
||||||
|
render(
|
||||||
|
<DataAssetsHeader
|
||||||
|
{...mockProps}
|
||||||
|
dataAsset={{
|
||||||
|
...mockProps.dataAsset,
|
||||||
|
sourceUrl: mockSourceUrl,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
const sourceUrlButton = screen.getByTestId('source-url-button');
|
||||||
|
|
||||||
|
const sourceUrlLink = screen.getByRole('link');
|
||||||
|
|
||||||
|
expect(sourceUrlButton).toBeInTheDocument();
|
||||||
|
expect(sourceUrlLink).toHaveAttribute('href', mockSourceUrl);
|
||||||
|
expect(sourceUrlLink).toHaveAttribute('target', '_blank');
|
||||||
|
expect(screen.getByText('label.source-url')).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not render source URL button when sourceUrl is not present', () => {
|
||||||
|
render(<DataAssetsHeader {...mockProps} />);
|
||||||
|
|
||||||
|
expect(screen.queryByTestId('source-url-button')).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render certification when certification is present', () => {
|
||||||
|
const mockCertification: AssetCertification = {
|
||||||
|
tagLabel: {
|
||||||
|
tagFQN: 'Certification.Bronze',
|
||||||
|
name: 'Bronze',
|
||||||
|
displayName: 'Bronze_Medal',
|
||||||
|
description: 'Bronze certified Data Asset test',
|
||||||
|
style: {
|
||||||
|
color: '#C08329',
|
||||||
|
iconURL: 'BronzeCertification.svg',
|
||||||
|
},
|
||||||
|
source: TagSource.Classification,
|
||||||
|
labelType: LabelType.Manual,
|
||||||
|
state: State.Confirmed,
|
||||||
|
},
|
||||||
|
appliedDate: 1732814645688,
|
||||||
|
expiryDate: 1735406645688,
|
||||||
|
};
|
||||||
|
render(
|
||||||
|
<DataAssetsHeader
|
||||||
|
{...mockProps}
|
||||||
|
dataAsset={{
|
||||||
|
...mockProps.dataAsset,
|
||||||
|
certification: mockCertification,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(screen.getByText('label.certification')).toBeInTheDocument();
|
||||||
|
|
||||||
|
const certificatComponent = screen.getByTestId(
|
||||||
|
`certification-${mockCertification.tagLabel.tagFQN}`
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(certificatComponent).toBeInTheDocument();
|
||||||
|
expect(certificatComponent).toHaveTextContent('Bronze_Medal');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
border: 0.5px solid @grey-300;
|
border: 0.5px solid @grey-300;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
gap: 50px;
|
gap: 28px;
|
||||||
background-color: @background-color;
|
background-color: @background-color;
|
||||||
}
|
}
|
||||||
.ant-space-item {
|
.ant-space-item {
|
||||||
@ -83,6 +83,7 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
width: 148px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ant-btn-group {
|
.ant-btn-group {
|
||||||
@ -101,6 +102,23 @@
|
|||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.ant-btn.source-url-button {
|
||||||
|
background-color: @blue-11;
|
||||||
|
.ant-typography {
|
||||||
|
color: @blue-9;
|
||||||
|
}
|
||||||
|
span.anticon {
|
||||||
|
border-radius: 50%;
|
||||||
|
background-color: @blue-20;
|
||||||
|
padding: 4px;
|
||||||
|
height: 32px;
|
||||||
|
width: 32px;
|
||||||
|
border: 4px solid @blue-14;
|
||||||
|
}
|
||||||
|
svg {
|
||||||
|
fill: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.ant-btn-group {
|
.ant-btn-group {
|
||||||
.ant-btn {
|
.ant-btn {
|
||||||
@ -111,4 +129,8 @@
|
|||||||
.ant-divider.ant-divider-vertical.vertical-divider {
|
.ant-divider.ant-divider-vertical.vertical-divider {
|
||||||
height: 50px;
|
height: 50px;
|
||||||
}
|
}
|
||||||
|
.tier-container,
|
||||||
|
.extra-info-container {
|
||||||
|
width: 148px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,7 @@ const RetentionPeriod = ({
|
|||||||
return (
|
return (
|
||||||
<div className="d-flex items-start gap-1">
|
<div className="d-flex items-start gap-1">
|
||||||
<Space
|
<Space
|
||||||
className="d-flex align-start"
|
className="d-flex retention-period-container align-start"
|
||||||
data-testid="retention-period-container">
|
data-testid="retention-period-container">
|
||||||
<div className="d-flex ">
|
<div className="d-flex ">
|
||||||
<Typography.Text className="text-sm d-flex flex-col gap-2">
|
<Typography.Text className="text-sm d-flex flex-col gap-2">
|
||||||
|
@ -20,3 +20,7 @@ span.extra-info-label-heading {
|
|||||||
color: @primary-heading-color;
|
color: @primary-heading-color;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.retention-period-container {
|
||||||
|
width: 148px;
|
||||||
|
}
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import Icon, { ExclamationCircleFilled } from '@ant-design/icons';
|
import Icon, { ExclamationCircleFilled } from '@ant-design/icons';
|
||||||
import { Badge, Button, Col, Divider, Row, Tooltip, Typography } from 'antd';
|
import { Badge, Button, Col, Row, Tooltip, Typography } from 'antd';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { capitalize, isEmpty } from 'lodash';
|
import { capitalize, isEmpty } from 'lodash';
|
||||||
import React, { useMemo, useState } from 'react';
|
import React, { useMemo, useState } from 'react';
|
||||||
@ -25,7 +25,6 @@ import { useClipboard } from '../../../hooks/useClipBoard';
|
|||||||
import useCustomLocation from '../../../hooks/useCustomLocation/useCustomLocation';
|
import useCustomLocation from '../../../hooks/useCustomLocation/useCustomLocation';
|
||||||
import { getEntityName } from '../../../utils/EntityUtils';
|
import { getEntityName } from '../../../utils/EntityUtils';
|
||||||
import { stringToHTML } from '../../../utils/StringsUtils';
|
import { stringToHTML } from '../../../utils/StringsUtils';
|
||||||
import CertificationTag from '../../common/CertificationTag/CertificationTag';
|
|
||||||
import './entity-header-title.less';
|
import './entity-header-title.less';
|
||||||
import { EntityHeaderTitleProps } from './EntityHeaderTitle.interface';
|
import { EntityHeaderTitleProps } from './EntityHeaderTitle.interface';
|
||||||
|
|
||||||
@ -42,7 +41,6 @@ const EntityHeaderTitle = ({
|
|||||||
className,
|
className,
|
||||||
showName = true,
|
showName = true,
|
||||||
showOnlyDisplayName = false,
|
showOnlyDisplayName = false,
|
||||||
certification,
|
|
||||||
excludeEntityService,
|
excludeEntityService,
|
||||||
isFollowing,
|
isFollowing,
|
||||||
isFollowingLoading,
|
isFollowingLoading,
|
||||||
@ -164,14 +162,7 @@ const EntityHeaderTitle = ({
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</Col>
|
</Col>
|
||||||
{certification && (
|
|
||||||
<Col className="text-xs">
|
|
||||||
<div className="d-flex items-center">
|
|
||||||
<Divider className="m-x-xs h-6 m-r-sm" type="vertical" />
|
|
||||||
<CertificationTag certification={certification} />
|
|
||||||
</div>
|
|
||||||
</Col>
|
|
||||||
)}
|
|
||||||
{isDisabled && (
|
{isDisabled && (
|
||||||
<Badge
|
<Badge
|
||||||
className="m-l-xs badge-grey"
|
className="m-l-xs badge-grey"
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { EntityType } from '../../../enums/entity.enum';
|
import { EntityType } from '../../../enums/entity.enum';
|
||||||
import { AssetCertification } from '../../../generated/entity/data/table';
|
|
||||||
|
|
||||||
export interface EntityHeaderTitleProps {
|
export interface EntityHeaderTitleProps {
|
||||||
className?: string;
|
className?: string;
|
||||||
@ -28,7 +27,6 @@ export interface EntityHeaderTitleProps {
|
|||||||
badge?: React.ReactNode;
|
badge?: React.ReactNode;
|
||||||
isDisabled?: boolean;
|
isDisabled?: boolean;
|
||||||
showName?: boolean;
|
showName?: boolean;
|
||||||
certification?: AssetCertification;
|
|
||||||
excludeEntityService?: boolean;
|
excludeEntityService?: boolean;
|
||||||
isFollowing?: boolean;
|
isFollowing?: boolean;
|
||||||
isFollowingLoading?: boolean;
|
isFollowingLoading?: boolean;
|
||||||
|
@ -17,10 +17,12 @@
|
|||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
display: block;
|
display: block;
|
||||||
color: @grey-900;
|
color: @grey-900;
|
||||||
|
max-width: 500px;
|
||||||
}
|
}
|
||||||
.ant-typography-ellipsis.entity-header-display-name {
|
.ant-typography-ellipsis.entity-header-display-name {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
color: @grey-700;
|
color: @grey-700;
|
||||||
|
max-width: 500px;
|
||||||
}
|
}
|
||||||
.ant-col.entity-header-content {
|
.ant-col.entity-header-content {
|
||||||
max-width: calc(100% - 100px);
|
max-width: calc(100% - 100px);
|
||||||
|
@ -38,7 +38,6 @@ import {
|
|||||||
UnitOfMeasurement,
|
UnitOfMeasurement,
|
||||||
} from '../../../generated/entity/data/metric';
|
} from '../../../generated/entity/data/metric';
|
||||||
import { getSortedOptions } from '../../../utils/MetricEntityUtils/MetricUtils';
|
import { getSortedOptions } from '../../../utils/MetricEntityUtils/MetricUtils';
|
||||||
import { ExtraInfoLabel } from '../../DataAssets/DataAssetsHeader/DataAssetsHeader.component';
|
|
||||||
import './metric-header-info.less';
|
import './metric-header-info.less';
|
||||||
|
|
||||||
interface MetricInfoItemOption {
|
interface MetricInfoItemOption {
|
||||||
@ -150,37 +149,46 @@ const MetricInfoItem: FC<MetricInfoItemProps> = ({
|
|||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Space className="d-flex align-start" data-testid={modiFiedLabel}>
|
<Space
|
||||||
<ExtraInfoLabel
|
className="d-flex metric-header-info-container align-start"
|
||||||
dataTestId={modiFiedLabel}
|
data-testid={modiFiedLabel}>
|
||||||
label={label}
|
<div className="d-flex extra-info-container align-start ">
|
||||||
value={value ?? NO_DATA_PLACEHOLDER}
|
<Typography.Text
|
||||||
/>
|
className="whitespace-nowrap text-sm d-flex flex-col gap-2"
|
||||||
{hasPermission && !metricDetails.deleted && (
|
data-testid={modiFiedLabel}>
|
||||||
<Popover
|
<div className="d-flex items-center gap-1">
|
||||||
destroyTooltipOnHide
|
<span className="extra-info-label-heading">{label}</span>
|
||||||
content={list}
|
{hasPermission && !metricDetails.deleted && (
|
||||||
open={popupVisible}
|
<Popover
|
||||||
overlayClassName="metric-header-info-popover"
|
destroyTooltipOnHide
|
||||||
placement="bottomRight"
|
content={list}
|
||||||
showArrow={false}
|
open={popupVisible}
|
||||||
trigger="click"
|
overlayClassName="metric-header-info-popover"
|
||||||
onOpenChange={setPopupVisible}>
|
placement="bottomRight"
|
||||||
<Tooltip
|
showArrow={false}
|
||||||
title={t('label.edit-entity', {
|
trigger="click"
|
||||||
entity: label,
|
onOpenChange={setPopupVisible}>
|
||||||
})}>
|
<Tooltip
|
||||||
<Button
|
title={t('label.edit-entity', {
|
||||||
className="flex-center p-0"
|
entity: label,
|
||||||
data-testid={`edit-${modiFiedLabel}-button`}
|
})}>
|
||||||
icon={<EditIcon color={DE_ACTIVE_COLOR} width="14px" />}
|
<Button
|
||||||
loading={isUpdating}
|
className="flex-center edit-metrics p-0"
|
||||||
size="small"
|
data-testid={`edit-${modiFiedLabel}-button`}
|
||||||
type="text"
|
icon={<EditIcon color={DE_ACTIVE_COLOR} width="12px" />}
|
||||||
/>
|
loading={isUpdating}
|
||||||
</Tooltip>
|
size="small"
|
||||||
</Popover>
|
type="text"
|
||||||
)}
|
/>
|
||||||
|
</Tooltip>
|
||||||
|
</Popover>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<div className={classNames('font-medium extra-info-value')}>
|
||||||
|
{value ?? NO_DATA_PLACEHOLDER}
|
||||||
|
</div>
|
||||||
|
</Typography.Text>
|
||||||
|
</div>
|
||||||
</Space>
|
</Space>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
@import (reference) '../../../styles/variables.less';
|
||||||
.metric-header-info-popover {
|
.metric-header-info-popover {
|
||||||
min-width: 250px;
|
min-width: 250px;
|
||||||
.ant-popover-inner-content {
|
.ant-popover-inner-content {
|
||||||
@ -19,3 +20,15 @@
|
|||||||
background-color: #f2f6fc;
|
background-color: #f2f6fc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.ant-btn.ant-btn-text.edit-metrics {
|
||||||
|
border: 1px solid @border-light;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
border-radius: 4px;
|
||||||
|
svg {
|
||||||
|
color: @grey-600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.metric-header-info-container {
|
||||||
|
width: 148px;
|
||||||
|
}
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import { Tag, Tooltip } from 'antd';
|
import { Tag, Tooltip } from 'antd';
|
||||||
|
import classNames from 'classnames';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { AssetCertification } from '../../../generated/entity/data/table';
|
import { AssetCertification } from '../../../generated/entity/data/table';
|
||||||
import { getEntityName } from '../../../utils/EntityUtils';
|
import { getEntityName } from '../../../utils/EntityUtils';
|
||||||
@ -19,8 +20,10 @@ import './certification-tag.less';
|
|||||||
|
|
||||||
const CertificationTag = ({
|
const CertificationTag = ({
|
||||||
certification,
|
certification,
|
||||||
|
showName = false,
|
||||||
}: {
|
}: {
|
||||||
certification: AssetCertification;
|
certification: AssetCertification;
|
||||||
|
showName?: boolean;
|
||||||
}) => {
|
}) => {
|
||||||
if (certification.tagLabel.style?.iconURL) {
|
if (certification.tagLabel.style?.iconURL) {
|
||||||
const name = getEntityName(certification.tagLabel);
|
const name = getEntityName(certification.tagLabel);
|
||||||
@ -31,12 +34,26 @@ const CertificationTag = ({
|
|||||||
className="cursor-pointer"
|
className="cursor-pointer"
|
||||||
title={getTagTooltip(name, certification.tagLabel.description)}
|
title={getTagTooltip(name, certification.tagLabel.description)}
|
||||||
trigger="hover">
|
trigger="hover">
|
||||||
<div data-testid={`certification-${certification.tagLabel.tagFQN}`}>
|
<div
|
||||||
|
className={classNames({
|
||||||
|
'certification-tag-with-name d-flex items-center gap-1': showName,
|
||||||
|
})}
|
||||||
|
data-testid={`certification-${certification.tagLabel.tagFQN}`}
|
||||||
|
style={
|
||||||
|
showName
|
||||||
|
? { backgroundColor: certification.tagLabel.style?.color + '33' } // to decrease opacity of the background color by 80%
|
||||||
|
: {}
|
||||||
|
}>
|
||||||
<img
|
<img
|
||||||
alt={`certification: ${name}`}
|
alt={`certification: ${name}`}
|
||||||
className="certification-img"
|
className="certification-img"
|
||||||
src={tagSrc}
|
src={tagSrc}
|
||||||
/>
|
/>
|
||||||
|
{showName && (
|
||||||
|
<span className="certification-name text-sm font-medium">
|
||||||
|
{name}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
);
|
);
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
@import (reference) '../../../styles/variables.less';
|
||||||
.certification-tag {
|
.certification-tag {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -28,3 +29,16 @@
|
|||||||
width: 28px;
|
width: 28px;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.certification-tag-with-name {
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 2px 8px 2px 10px;
|
||||||
|
|
||||||
|
.certification-img {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
color: @yellow-11;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -202,7 +202,7 @@ export const DomainLabel = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="d-flex flex-col gap-2 justify-center">
|
<div className="d-flex flex-col gap-2 justify-start">
|
||||||
{headerLayout && (
|
{headerLayout && (
|
||||||
<div
|
<div
|
||||||
className="d-flex text-sm gap-1 font-medium items-center "
|
className="d-flex text-sm gap-1 font-medium items-center "
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
.domain-link-text {
|
.domain-link-text {
|
||||||
color: @grey-700;
|
color: @grey-700;
|
||||||
}
|
}
|
||||||
.domain-link-container {
|
.data-assets-header-container {
|
||||||
width: 150px;
|
.domain-link-container {
|
||||||
|
width: 148px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,11 @@ export const NoOwnerFound: React.FC<NoOwnerFoundProps> = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="d-flex justify-center flex-col gap-2"
|
className={classNames(
|
||||||
|
'd-flex justify-start flex-col gap-2',
|
||||||
|
{ 'owner-label-container': !isCompactView },
|
||||||
|
className
|
||||||
|
)}
|
||||||
data-testid="owner-label">
|
data-testid="owner-label">
|
||||||
<div className="d-flex items-center gap-1">
|
<div className="d-flex items-center gap-1">
|
||||||
{isCompactView && (
|
{isCompactView && (
|
||||||
|
@ -35,7 +35,7 @@ export const OwnerLabel = ({
|
|||||||
team: false,
|
team: false,
|
||||||
},
|
},
|
||||||
tooltipText,
|
tooltipText,
|
||||||
isCompactView = true,
|
isCompactView = true, // renders owner profile followed by its name
|
||||||
}: OwnerLabelProps) => {
|
}: OwnerLabelProps) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [showAllOwners, setShowAllOwners] = useState(false);
|
const [showAllOwners, setShowAllOwners] = useState(false);
|
||||||
@ -69,7 +69,9 @@ export const OwnerLabel = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="d-flex owner-label-heading gap-2 items-center"
|
className={classNames('d-flex owner-label-heading gap-2 items-center', {
|
||||||
|
'owner-label-container': !isCompactView,
|
||||||
|
})}
|
||||||
data-testid="owner-label">
|
data-testid="owner-label">
|
||||||
<div
|
<div
|
||||||
className={classNames(
|
className={classNames(
|
||||||
|
@ -125,3 +125,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.owner-label-container {
|
||||||
|
width: 148px;
|
||||||
|
}
|
||||||
|
@ -1434,7 +1434,7 @@
|
|||||||
"uninstall-lowercase": "uninstall",
|
"uninstall-lowercase": "uninstall",
|
||||||
"uninstalled-lowercase": "uninstalled",
|
"uninstalled-lowercase": "uninstalled",
|
||||||
"unique": "Unique",
|
"unique": "Unique",
|
||||||
"unit-of-measurement": "Unit of Measurement",
|
"unit-of-measurement": "Measurement Unit",
|
||||||
"unpause": "UnPause",
|
"unpause": "UnPause",
|
||||||
"unprocessed": "Unprocessed",
|
"unprocessed": "Unprocessed",
|
||||||
"up-vote": "Up Vote",
|
"up-vote": "Up Vote",
|
||||||
|
@ -1434,7 +1434,7 @@
|
|||||||
"uninstall-lowercase": "desinstalar",
|
"uninstall-lowercase": "desinstalar",
|
||||||
"uninstalled-lowercase": "uninstalled",
|
"uninstalled-lowercase": "uninstalled",
|
||||||
"unique": "Único",
|
"unique": "Único",
|
||||||
"unit-of-measurement": "Unit of Measurement",
|
"unit-of-measurement": "medida Unidad",
|
||||||
"unpause": "Reanudar",
|
"unpause": "Reanudar",
|
||||||
"unprocessed": "Unprocessed",
|
"unprocessed": "Unprocessed",
|
||||||
"up-vote": "Voto Positivo",
|
"up-vote": "Voto Positivo",
|
||||||
|
@ -1434,7 +1434,7 @@
|
|||||||
"uninstall-lowercase": "désinstaller",
|
"uninstall-lowercase": "désinstaller",
|
||||||
"uninstalled-lowercase": "désinstallé",
|
"uninstalled-lowercase": "désinstallé",
|
||||||
"unique": "Unique",
|
"unique": "Unique",
|
||||||
"unit-of-measurement": "Unit of Measurement",
|
"unit-of-measurement": "Unité de mesure",
|
||||||
"unpause": "Réactiver",
|
"unpause": "Réactiver",
|
||||||
"unprocessed": "Unprocessed",
|
"unprocessed": "Unprocessed",
|
||||||
"up-vote": "Voter",
|
"up-vote": "Voter",
|
||||||
|
@ -1434,7 +1434,7 @@
|
|||||||
"uninstall-lowercase": "הסרה",
|
"uninstall-lowercase": "הסרה",
|
||||||
"uninstalled-lowercase": "uninstalled",
|
"uninstalled-lowercase": "uninstalled",
|
||||||
"unique": "ייחודי",
|
"unique": "ייחודי",
|
||||||
"unit-of-measurement": "Unit of Measurement",
|
"unit-of-measurement": "יחידת מדידה",
|
||||||
"unpause": "בטל השהייה",
|
"unpause": "בטל השהייה",
|
||||||
"unprocessed": "Unprocessed",
|
"unprocessed": "Unprocessed",
|
||||||
"up-vote": "Up Vote",
|
"up-vote": "Up Vote",
|
||||||
|
@ -1434,7 +1434,7 @@
|
|||||||
"uninstall-lowercase": "uninstall",
|
"uninstall-lowercase": "uninstall",
|
||||||
"uninstalled-lowercase": "uninstalled",
|
"uninstalled-lowercase": "uninstalled",
|
||||||
"unique": "ユニーク",
|
"unique": "ユニーク",
|
||||||
"unit-of-measurement": "Unit of Measurement",
|
"unit-of-measurement": "単位",
|
||||||
"unpause": "再開",
|
"unpause": "再開",
|
||||||
"unprocessed": "Unprocessed",
|
"unprocessed": "Unprocessed",
|
||||||
"up-vote": "Up Vote",
|
"up-vote": "Up Vote",
|
||||||
|
@ -1434,7 +1434,7 @@
|
|||||||
"uninstall-lowercase": "deïnstalleren",
|
"uninstall-lowercase": "deïnstalleren",
|
||||||
"uninstalled-lowercase": "uninstalled",
|
"uninstalled-lowercase": "uninstalled",
|
||||||
"unique": "Uniek",
|
"unique": "Uniek",
|
||||||
"unit-of-measurement": "Unit of Measurement",
|
"unit-of-measurement": "Meeteenheid",
|
||||||
"unpause": "Hervatten",
|
"unpause": "Hervatten",
|
||||||
"unprocessed": "Unprocessed",
|
"unprocessed": "Unprocessed",
|
||||||
"up-vote": "Up Vote",
|
"up-vote": "Up Vote",
|
||||||
|
@ -1434,7 +1434,7 @@
|
|||||||
"uninstall-lowercase": "desinstalar",
|
"uninstall-lowercase": "desinstalar",
|
||||||
"uninstalled-lowercase": "uninstalled",
|
"uninstalled-lowercase": "uninstalled",
|
||||||
"unique": "Único",
|
"unique": "Único",
|
||||||
"unit-of-measurement": "Unit of Measurement",
|
"unit-of-measurement": "Medida Unidade ",
|
||||||
"unpause": "Continuar",
|
"unpause": "Continuar",
|
||||||
"unprocessed": "Unprocessed",
|
"unprocessed": "Unprocessed",
|
||||||
"up-vote": "Up Vote",
|
"up-vote": "Up Vote",
|
||||||
|
@ -1434,7 +1434,7 @@
|
|||||||
"uninstall-lowercase": "uninstall",
|
"uninstall-lowercase": "uninstall",
|
||||||
"uninstalled-lowercase": "uninstalled",
|
"uninstalled-lowercase": "uninstalled",
|
||||||
"unique": "Уникальные значения",
|
"unique": "Уникальные значения",
|
||||||
"unit-of-measurement": "Unit of Measurement",
|
"unit-of-measurement": "Единица измерения",
|
||||||
"unpause": "Снять паузу",
|
"unpause": "Снять паузу",
|
||||||
"unprocessed": "Unprocessed",
|
"unprocessed": "Unprocessed",
|
||||||
"up-vote": "Up Vote",
|
"up-vote": "Up Vote",
|
||||||
|
@ -1434,7 +1434,7 @@
|
|||||||
"uninstall-lowercase": "卸载",
|
"uninstall-lowercase": "卸载",
|
||||||
"uninstalled-lowercase": "已卸载",
|
"uninstalled-lowercase": "已卸载",
|
||||||
"unique": "唯一",
|
"unique": "唯一",
|
||||||
"unit-of-measurement": "Unit of Measurement",
|
"unit-of-measurement": "计量单位",
|
||||||
"unpause": "取消暂停",
|
"unpause": "取消暂停",
|
||||||
"unprocessed": "Unprocessed",
|
"unprocessed": "Unprocessed",
|
||||||
"up-vote": "Up Vote",
|
"up-vote": "Up Vote",
|
||||||
|
@ -87,6 +87,7 @@
|
|||||||
@blue-17: #eff8ff;
|
@blue-17: #eff8ff;
|
||||||
@blue-18: #0968da;
|
@blue-18: #0968da;
|
||||||
@blue-19: #e3e3e3;
|
@blue-19: #e3e3e3;
|
||||||
|
@blue-20: #d1e9ff;
|
||||||
|
|
||||||
@partial-success-1: #06a4a4;
|
@partial-success-1: #06a4a4;
|
||||||
@partial-success-2: #bdeeee;
|
@partial-success-2: #bdeeee;
|
||||||
|
@ -276,22 +276,10 @@ describe('Tests for DataAssetsHeaderUtils', () => {
|
|||||||
expect(assetData.breadcrumbs).toEqual([{ name: 'entityName', url: 'url' }]);
|
expect(assetData.breadcrumbs).toEqual([{ name: 'entityName', url: 'url' }]);
|
||||||
|
|
||||||
// contains extra data for source url
|
// contains extra data for source url
|
||||||
expect(JSON.stringify(assetData.extraInfo)).toContain(
|
|
||||||
'http://localhost:8080/tree?dag_id=snowflake_etl'
|
|
||||||
);
|
|
||||||
|
|
||||||
// If Data does not present
|
// If Data does not present
|
||||||
const assetWithNoExtraData = getDataAssetsHeaderInfo(
|
|
||||||
EntityType.PIPELINE,
|
|
||||||
{ ...mockPipelineData, sourceUrl: '' },
|
|
||||||
'snowflake_etl',
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
|
|
||||||
// contains extra data for source url
|
// contains extra data for source url
|
||||||
expect(JSON.stringify(assetWithNoExtraData.extraInfo)).not.toContain(
|
|
||||||
'http://localhost:8080/tree?dag_id=snowflake_etl'
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Test for MlModel entity
|
// Test for MlModel entity
|
||||||
@ -494,10 +482,6 @@ describe('Tests for DataAssetsHeaderUtils', () => {
|
|||||||
expect(JSON.stringify(assetData.extraInfo)).toContain('label.language');
|
expect(JSON.stringify(assetData.extraInfo)).toContain('label.language');
|
||||||
expect(JSON.stringify(assetData.extraInfo)).toContain('SQL');
|
expect(JSON.stringify(assetData.extraInfo)).toContain('SQL');
|
||||||
|
|
||||||
expect(JSON.stringify(assetData.extraInfo)).toContain(
|
|
||||||
'http://localhost:8585/api/v1/databaseSchemas/48261b8c-4c99-4c5d-9ec7-cb758cc9f9c1'
|
|
||||||
);
|
|
||||||
|
|
||||||
// If Data does not present
|
// If Data does not present
|
||||||
|
|
||||||
const assetWithNoExtraData = getDataAssetsHeaderInfo(
|
const assetWithNoExtraData = getDataAssetsHeaderInfo(
|
||||||
|
@ -59,7 +59,6 @@ import {
|
|||||||
getBreadcrumbForEntitiesWithServiceOnly,
|
getBreadcrumbForEntitiesWithServiceOnly,
|
||||||
getBreadcrumbForTable,
|
getBreadcrumbForTable,
|
||||||
getEntityBreadcrumbs,
|
getEntityBreadcrumbs,
|
||||||
getEntityName,
|
|
||||||
} from './EntityUtils';
|
} from './EntityUtils';
|
||||||
import { getEntityDetailsPath } from './RouterUtils';
|
import { getEntityDetailsPath } from './RouterUtils';
|
||||||
import { bytesToSize } from './StringsUtils';
|
import { bytesToSize } from './StringsUtils';
|
||||||
@ -667,22 +666,6 @@ export const getDataAssetsHeaderInfo = (
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('sourceUrl' in dataAsset && dataAsset.sourceUrl) {
|
|
||||||
returnData.extraInfo = (
|
|
||||||
<>
|
|
||||||
{returnData.extraInfo}
|
|
||||||
<Divider className="self-center vertical-divider" type="vertical" />
|
|
||||||
<ExtraInfoLink
|
|
||||||
ellipsis
|
|
||||||
newTab
|
|
||||||
href={dataAsset.sourceUrl}
|
|
||||||
label={t('label.source-url')}
|
|
||||||
value={getEntityName(dataAsset)}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnData;
|
return returnData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user