diff --git a/datahub-web-react/.eslintignore b/datahub-web-react/.eslintignore
new file mode 100644
index 0000000000..d55ffbac20
--- /dev/null
+++ b/datahub-web-react/.eslintignore
@@ -0,0 +1 @@
+**/*.graphql
diff --git a/datahub-web-react/src/components/entity/dataset/profile/DatasetHeader.tsx b/datahub-web-react/src/components/entity/dataset/profile/DatasetHeader.tsx
new file mode 100644
index 0000000000..84fab2ecef
--- /dev/null
+++ b/datahub-web-react/src/components/entity/dataset/profile/DatasetHeader.tsx
@@ -0,0 +1,65 @@
+import { Avatar, Badge, Popover, Space, Tooltip, Typography } from 'antd';
+import React from 'react';
+import { Link } from 'react-router-dom';
+import { Dataset, EntityType } from '../../../../types.generated';
+import { useEntityRegistry } from '../../../useEntityRegistry';
+import defaultAvatar from '../../../../images/default_avatar.png';
+
+export type Props = {
+ dataset: Dataset;
+};
+
+export default function DatasetHeader({ dataset: { description, ownership, deprecation } }: Props) {
+ const entityRegistry = useEntityRegistry();
+
+ return (
+ <>
+ {description}
+
+
+ {ownership &&
+ ownership.owners &&
+ ownership.owners.map((owner: any) => (
+
+
+
+
+
+ ))}
+
+
+ {deprecation?.deprecated && (
+
+ By: {deprecation?.actor}
+ {deprecation.decommissionTime && (
+
+ On: {new Date(deprecation?.decommissionTime).toUTCString()}
+
+ )}
+ {deprecation?.note && (
+ {deprecation.note}
+ )}
+ >
+ }
+ title="Deprecated"
+ >
+
+
+ )}
+
+
+ >
+ );
+}
diff --git a/datahub-web-react/src/components/entity/dataset/profile/Profile.tsx b/datahub-web-react/src/components/entity/dataset/profile/Profile.tsx
index 3a49dadad4..283a738849 100644
--- a/datahub-web-react/src/components/entity/dataset/profile/Profile.tsx
+++ b/datahub-web-react/src/components/entity/dataset/profile/Profile.tsx
@@ -1,17 +1,14 @@
import React from 'react';
-import { Avatar, Tooltip, Typography } from 'antd';
-import { Link } from 'react-router-dom';
import { useGetDatasetQuery, useUpdateDatasetMutation } from '../../../../graphql/dataset.generated';
-import defaultAvatar from '../../../../images/default_avatar.png';
import { Ownership as OwnershipView } from './Ownership';
import SchemaView from './schema/Schema';
import { EntityProfile } from '../../../shared/EntityProfile';
-import { Dataset, EntityType } from '../../../../types.generated';
-import { useEntityRegistry } from '../../../useEntityRegistry';
+import { Dataset } from '../../../../types.generated';
import LineageView from './Lineage';
import PropertiesView from './Properties';
import DocumentsView from './Documentation';
import { sampleDownstreamEntities, sampleUpstreamEntities } from './stories/lineageEntities';
+import DatasetHeader from './DatasetHeader';
export enum TabType {
Ownership = 'Ownership',
@@ -28,37 +25,10 @@ const EMPTY_ARR: never[] = [];
* Responsible for display the Dataset Page
*/
export const Profile = ({ urn }: { urn: string }): JSX.Element => {
- const entityRegistry = useEntityRegistry();
-
const { loading, error, data } = useGetDatasetQuery({ variables: { urn } });
-
const [updateDataset] = useUpdateDatasetMutation();
- const getBody = (description: string, ownership: any) => (
- <>
- {description}
-
- {ownership &&
- ownership.owners &&
- ownership.owners.map((owner: any) => (
-
-
-
-
-
- ))}
-
- >
- );
+ const getHeader = (dataset: Dataset) => ;
const getTabs = ({ ownership, properties, institutionalMemory, schema }: Dataset) => {
return [
@@ -118,8 +88,8 @@ export const Profile = ({ urn }: { urn: string }): JSX.Element => {
)}
{error &&
Failed to load dataset with urn {urn}
}
diff --git a/datahub-web-react/src/components/entity/dataset/profile/stories/DatasetHeader.stories.tsx b/datahub-web-react/src/components/entity/dataset/profile/stories/DatasetHeader.stories.tsx
new file mode 100644
index 0000000000..7a126924f9
--- /dev/null
+++ b/datahub-web-react/src/components/entity/dataset/profile/stories/DatasetHeader.stories.tsx
@@ -0,0 +1,37 @@
+import React from 'react';
+import { Story, Meta } from '@storybook/react';
+
+import TestPageContainer from '../../../../../utils/test-utils/TestPageContainer';
+import DatasetHeader, { Props } from '../DatasetHeader';
+import { sampleDataset, sampleDeprecatedDataset } from './sampleDataset';
+
+export default {
+ title: 'Dataset Profile / DatasetHeader',
+ component: DatasetHeader,
+} as Meta;
+
+const Template: Story = (args) => ;
+
+export const DescriptionAndOwner = Template.bind({});
+DescriptionAndOwner.args = { dataset: sampleDataset };
+DescriptionAndOwner.decorators = [
+ (InnerStory) => (
+ <>
+
+
+
+ >
+ ),
+];
+
+export const Deprecated = Template.bind({});
+Deprecated.args = { dataset: sampleDeprecatedDataset };
+Deprecated.decorators = [
+ (InnerStory) => (
+ <>
+
+
+
+ >
+ ),
+];
diff --git a/datahub-web-react/src/components/entity/dataset/profile/stories/sampleDataset.ts b/datahub-web-react/src/components/entity/dataset/profile/stories/sampleDataset.ts
new file mode 100644
index 0000000000..cdedbb1081
--- /dev/null
+++ b/datahub-web-react/src/components/entity/dataset/profile/stories/sampleDataset.ts
@@ -0,0 +1,53 @@
+import { Dataset, EntityType, FabricType, OwnershipType } from '../../../../../types.generated';
+
+export const sampleDataset: Dataset = {
+ __typename: 'Dataset',
+ urn: 'test:urn',
+ platform: {
+ type: EntityType.DataPlatform,
+ urn: 'test:hive:urn',
+ name: 'hive',
+ },
+ name: 'hive dataset',
+ origin: FabricType.Prod,
+ description: 'Some description',
+ type: EntityType.Dataset,
+ created: { time: 1 },
+ lastModified: { time: 1 },
+ tags: [],
+ ownership: {
+ owners: [
+ { owner: { urn: 'user:urn', type: EntityType.CorpUser, username: 'UserA' }, type: OwnershipType.Dataowner },
+ ],
+ lastModified: { time: 1 },
+ },
+};
+
+export const sampleDeprecatedDataset: Dataset = {
+ __typename: 'Dataset',
+ urn: 'test:urn',
+ platform: {
+ type: EntityType.DataPlatform,
+ urn: 'test:hive:urn',
+ name: 'hive',
+ },
+ name: 'hive dataset',
+ origin: FabricType.Prod,
+ description: 'Some deprecated description',
+ type: EntityType.Dataset,
+ created: { time: 1 },
+ lastModified: { time: 1 },
+ tags: [],
+ ownership: {
+ owners: [
+ { owner: { urn: 'user:urn', type: EntityType.CorpUser, username: 'UserA' }, type: OwnershipType.Dataowner },
+ ],
+ lastModified: { time: 1 },
+ },
+ deprecation: {
+ actor: 'UserB',
+ deprecated: true,
+ note: "Don't touch this dataset with a 10 foot pole",
+ decommissionTime: 1612565520292,
+ },
+};
diff --git a/datahub-web-react/src/components/shared/EntityProfile.tsx b/datahub-web-react/src/components/shared/EntityProfile.tsx
index 58cc2a2379..172b16681e 100644
--- a/datahub-web-react/src/components/shared/EntityProfile.tsx
+++ b/datahub-web-react/src/components/shared/EntityProfile.tsx
@@ -5,7 +5,7 @@ import { RoutedTabs } from './RoutedTabs';
export interface EntityProfileProps {
title: string;
tags?: Array;
- body: React.ReactNode;
+ header: React.ReactNode;
tabs?: Array<{
name: string;
path: string;
@@ -21,8 +21,8 @@ const defaultProps = {
/**
* A default container view for presenting Entity details.
*/
-export const EntityProfile = ({ title: _title, tags: _tags, body: _body, tabs: _tabs }: EntityProfileProps) => {
- const defaultTabPath = _tabs && _tabs?.length > 0 ? _tabs[0].path : '';
+export const EntityProfile = ({ title, tags, header, tabs }: EntityProfileProps) => {
+ const defaultTabPath = tabs && tabs?.length > 0 ? tabs[0].path : '';
/* eslint-disable spaced-comment */
return (
@@ -30,18 +30,18 @@ export const EntityProfile = ({ title: _title, tags: _tags, body: _body, tabs: _
-
{_title}
+
{title}
- {_tags && _tags.map((t) => {t})}
+ {tags && tags.map((t) => {t})}
- {_body}
+ {header}
-
+
diff --git a/datahub-web-react/src/graphql/dataset.graphql b/datahub-web-react/src/graphql/dataset.graphql
index fb96ac3a40..e39e357250 100644
--- a/datahub-web-react/src/graphql/dataset.graphql
+++ b/datahub-web-react/src/graphql/dataset.graphql
@@ -78,6 +78,12 @@ query getDataset($urn: String!) {
}
primaryKeys
}
+ deprecation {
+ actor
+ deprecated
+ note
+ decommissionTime
+ }
}
}
@@ -146,5 +152,11 @@ mutation updateDataset($input: DatasetUpdateInput!) {
}
primaryKeys
}
+ deprecation {
+ actor
+ deprecated
+ note
+ decommissionTime
+ }
}
}
diff --git a/datahub-web-react/src/utils/test-utils/TestPageContainer.tsx b/datahub-web-react/src/utils/test-utils/TestPageContainer.tsx
index ccba22c168..babaa417e1 100644
--- a/datahub-web-react/src/utils/test-utils/TestPageContainer.tsx
+++ b/datahub-web-react/src/utils/test-utils/TestPageContainer.tsx
@@ -22,7 +22,7 @@ export default ({ children }: Props) => {
return (
- {children};
+ {children}
);
};