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": {