diff --git a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/GmsGraphQLEngine.java b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/GmsGraphQLEngine.java index 7afe807ea618d..11fab81567a7a 100644 --- a/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/GmsGraphQLEngine.java +++ b/datahub-graphql-core/src/main/java/com/linkedin/datahub/graphql/GmsGraphQLEngine.java @@ -885,9 +885,14 @@ private void configureDatasetResolvers(final RuntimeWiring.Builder builder) { ) .type("DatasetStatsSummary", typeWiring -> typeWiring .dataFetcher("topUsersLast30Days", new LoadableTypeBatchResolver<>(corpUserType, - (env) -> ((DatasetStatsSummary) env.getSource()).getTopUsersLast30Days().stream() - .map(CorpUser::getUrn) - .collect(Collectors.toList()))) + (env) -> { + DatasetStatsSummary summary = ((DatasetStatsSummary) env.getSource()); + return summary.getTopUsersLast30Days() != null + ? summary.getTopUsersLast30Days().stream() + .map(CorpUser::getUrn) + .collect(Collectors.toList()) + : null; + })) ); } @@ -1039,9 +1044,14 @@ private void configureDashboardResolvers(final RuntimeWiring.Builder builder) { ); builder.type("DashboardStatsSummary", typeWiring -> typeWiring .dataFetcher("topUsersLast30Days", new LoadableTypeBatchResolver<>(corpUserType, - (env) -> ((DashboardStatsSummary) env.getSource()).getTopUsersLast30Days().stream() - .map(CorpUser::getUrn) - .collect(Collectors.toList()))) + (env) -> { + DashboardStatsSummary summary = ((DashboardStatsSummary) env.getSource()); + return summary.getTopUsersLast30Days() != null + ? summary.getTopUsersLast30Days().stream() + .map(CorpUser::getUrn) + .collect(Collectors.toList()) + : null; + })) ); } diff --git a/datahub-graphql-core/src/main/resources/entity.graphql b/datahub-graphql-core/src/main/resources/entity.graphql index dd300b0a015cf..cf21b1e4c6d42 100644 --- a/datahub-graphql-core/src/main/resources/entity.graphql +++ b/datahub-graphql-core/src/main/resources/entity.graphql @@ -5279,7 +5279,7 @@ type DatasetStatsSummary { """ The top users in the past 30 days """ - topUsersLast30Days: [CorpUser!]! + topUsersLast30Days: [CorpUser!] } """ @@ -5456,7 +5456,7 @@ type DashboardStatsSummary { """ The top users in the past 30 days """ - topUsersLast30Days: [CorpUser!]! + topUsersLast30Days: [CorpUser!] } diff --git a/datahub-web-react/src/app/entity/shared/components/styled/ExpandedActorGroup.tsx b/datahub-web-react/src/app/entity/shared/components/styled/ExpandedActorGroup.tsx index 47a66c9dc8a0c..4530e67d02118 100644 --- a/datahub-web-react/src/app/entity/shared/components/styled/ExpandedActorGroup.tsx +++ b/datahub-web-react/src/app/entity/shared/components/styled/ExpandedActorGroup.tsx @@ -1,18 +1,53 @@ +import { Popover, Typography } from 'antd'; import React from 'react'; +import styled from 'styled-components'; import { CorpGroup, CorpUser } from '../../../../../types.generated'; import { ExpandedActor } from './ExpandedActor'; +const PopoverActors = styled.div``; + +const ActorsContainer = styled.div` + display: flex; + justify-content: right; + flex-wrap: wrap; + align-items: center; +`; + +const RemainderText = styled(Typography.Text)` + display: flex; + justify-content: right; + margin-right: 8px; +`; + type Props = { actors: Array; + max: number; onClose?: (actor: CorpUser | CorpGroup) => void; }; -export const ExpandedActorGroup = ({ actors, onClose }: Props) => { +const DEFAULT_MAX = 10; + +export const ExpandedActorGroup = ({ actors, max = DEFAULT_MAX, onClose }: Props) => { + const finalActors = actors.length > max ? actors.slice(0, max) : actors; + const remainder = actors.length > max ? actors.length - max : undefined; + return ( - <> - {actors.map((actor) => ( - onClose?.(actor)} /> - ))} - + + {actors.map((actor) => ( + onClose?.(actor)} /> + ))} + + } + > + + {finalActors.map((actor) => ( + onClose?.(actor)} /> + ))} + + {remainder && + {remainder} more} + ); }; diff --git a/datahub-web-react/src/app/entity/shared/containers/profile/header/EntityHeader.tsx b/datahub-web-react/src/app/entity/shared/containers/profile/header/EntityHeader.tsx index 8f39925892f07..b6ce4727dfc33 100644 --- a/datahub-web-react/src/app/entity/shared/containers/profile/header/EntityHeader.tsx +++ b/datahub-web-react/src/app/entity/shared/containers/profile/header/EntityHeader.tsx @@ -113,7 +113,7 @@ export const EntityHeader = ({ refreshBrowser, headerDropdownItems, isNameEditab - {entityData?.deprecation && ( + {entityData?.deprecation?.deprecated && ( )} {entityData?.health?.map((health) => ( diff --git a/datahub-web-react/src/app/preview/DefaultPreviewCard.tsx b/datahub-web-react/src/app/preview/DefaultPreviewCard.tsx index fc6a4c745fb25..dfe672127f9dc 100644 --- a/datahub-web-react/src/app/preview/DefaultPreviewCard.tsx +++ b/datahub-web-react/src/app/preview/DefaultPreviewCard.tsx @@ -148,7 +148,7 @@ const UserListContainer = styled.div` const UserListDivider = styled(Divider)` padding: 4px; - height: 60px; + height: auto; `; const UserListTitle = styled(Typography.Text)` @@ -266,7 +266,7 @@ export default function DefaultPreviewCard({ {name || ' '} - {deprecation && } + {deprecation?.deprecated && } {externalUrl && ( @@ -324,22 +324,22 @@ export default function DefaultPreviewCard({ )} - {topUsers && topUsers.length > 0 && ( + {topUsers && topUsers?.length > 0 && ( <> Top Users
- +
- )} - {owners && owners.length > 0 && ( + {(topUsers?.length || 0) > 0 && (owners?.length || 0) > 0 && } + {owners && owners?.length > 0 && ( Owners
- owner.owner)} /> + owner.owner)} max={2} />
)}