diff --git a/datahub-web-react/src/app/entityV2/shared/EntityDropdown/EntityDropdown.tsx b/datahub-web-react/src/app/entityV2/shared/EntityDropdown/EntityDropdown.tsx index babcf65287..52de4d5a51 100644 --- a/datahub-web-react/src/app/entityV2/shared/EntityDropdown/EntityDropdown.tsx +++ b/datahub-web-react/src/app/entityV2/shared/EntityDropdown/EntityDropdown.tsx @@ -353,6 +353,7 @@ const EntityDropdown = (props: Props) => { undefined } name={entityData?.name} + qualifiedName={entityData?.properties?.qualifiedName} /> )}{' '} diff --git a/datahub-web-react/src/app/shared/share/v2/ShareButtonMenu.tsx b/datahub-web-react/src/app/shared/share/v2/ShareButtonMenu.tsx index ca755474c9..845338ef36 100644 --- a/datahub-web-react/src/app/shared/share/v2/ShareButtonMenu.tsx +++ b/datahub-web-react/src/app/shared/share/v2/ShareButtonMenu.tsx @@ -1,6 +1,7 @@ import React from 'react'; import CopyLinkMenuItem from '@app/shared/share/v2/items/CopyLinkMenuItem'; +import CopyNameMenuItem from '@app/shared/share/v2/items/CopyNameMenuItem'; import CopyUrnMenuItem from '@app/shared/share/v2/items/CopyUrnMenuItem'; import EmailMenuItem from '@app/shared/share/v2/items/EmailMenuItem'; import { useEntityRegistry } from '@app/useEntityRegistry'; @@ -12,9 +13,10 @@ interface ShareButtonMenuProps { entityType: EntityType; subType?: string | null; name?: string | null; + qualifiedName?: string | null; } -export default function ShareButtonMenu({ urn, entityType, subType, name }: ShareButtonMenuProps) { +export default function ShareButtonMenu({ urn, entityType, subType, name, qualifiedName }: ShareButtonMenuProps) { const entityRegistry = useEntityRegistry(); const displayName = name || urn; @@ -26,7 +28,16 @@ export default function ShareButtonMenu({ urn, entityType, subType, name }: Shar {navigator.clipboard && } - + {navigator.clipboard && ( + + )} + + ); } diff --git a/datahub-web-react/src/app/shared/share/v2/ShareMenuAction.tsx b/datahub-web-react/src/app/shared/share/v2/ShareMenuAction.tsx index 62434b75f4..2f3bfca5d2 100644 --- a/datahub-web-react/src/app/shared/share/v2/ShareMenuAction.tsx +++ b/datahub-web-react/src/app/shared/share/v2/ShareMenuAction.tsx @@ -18,7 +18,13 @@ export default function ShareMenuAction() { trigger={['hover']} overlay={ - + } > diff --git a/datahub-web-react/src/app/shared/share/v2/items/CopyNameMenuItem.tsx b/datahub-web-react/src/app/shared/share/v2/items/CopyNameMenuItem.tsx new file mode 100644 index 0000000000..eb82bd20eb --- /dev/null +++ b/datahub-web-react/src/app/shared/share/v2/items/CopyNameMenuItem.tsx @@ -0,0 +1,46 @@ +import { CheckOutlined, CopyOutlined } from '@ant-design/icons'; +import { Tooltip } from '@components'; +import React, { useState } from 'react'; +import styled from 'styled-components'; + +import { StyledMenuItem } from '@app/shared/share/v2/styledComponents'; + +interface CopyNameMenuItemProps { + key: string; + type: string; + name: string; + qualifiedName?: string; +} + +const TextSpan = styled.span` + padding-left: 12px; + margin-left: 0px !important; +`; + +export default function CopyNameMenuItem({ key, type, name, qualifiedName }: CopyNameMenuItemProps) { + /** + * Whether button has been clicked + */ + const [isClicked, setIsClicked] = useState(false); + + return ( + { + if (qualifiedName) { + navigator.clipboard.writeText(qualifiedName); + } else { + navigator.clipboard.writeText(name); + } + setIsClicked(true); + }} + > + + {isClicked ? : } + + Copy Name + + + + ); +} diff --git a/datahub-web-react/src/graphql/container.graphql b/datahub-web-react/src/graphql/container.graphql index 0ae5e6bcad..0ad3deb7a4 100644 --- a/datahub-web-react/src/graphql/container.graphql +++ b/datahub-web-react/src/graphql/container.graphql @@ -9,6 +9,7 @@ query getContainer($urn: String!) { } properties { name + qualifiedName description externalUrl customProperties { diff --git a/datahub-web-react/src/graphql/fragments.graphql b/datahub-web-react/src/graphql/fragments.graphql index 13d62a17c2..1c3fa81fc1 100644 --- a/datahub-web-react/src/graphql/fragments.graphql +++ b/datahub-web-react/src/graphql/fragments.graphql @@ -409,6 +409,7 @@ fragment nonRecursiveDatasetFields on Dataset { platformNativeType properties { name + qualifiedName description customProperties { key diff --git a/metadata-ingestion/examples/mce_files/bootstrap_mce.json b/metadata-ingestion/examples/mce_files/bootstrap_mce.json index 251325e5b0..d0e0075379 100644 --- a/metadata-ingestion/examples/mce_files/bootstrap_mce.json +++ b/metadata-ingestion/examples/mce_files/bootstrap_mce.json @@ -610,6 +610,7 @@ { "com.linkedin.pegasus2avro.dataset.DatasetProperties": { "description": "table where each row represents a single log event", + "qualifiedName": "a.b.c", "uri": null, "tags": [], "customProperties": {