John Joyce 4da49fb1b4
refactor(ui): Make Navigating DataHub UI easier, fix duplicate tracking, duplicate networks calls, + misc optimizations (#7592)
Co-authored-by: david-leifker <114954101+david-leifker@users.noreply.github.com>
2023-03-21 18:36:21 -07:00

152 lines
5.6 KiB
TypeScript

import React from 'react';
import styled from 'styled-components/macro';
import { useEntityData, useRefetch } from '../../../EntityContext';
import { EntityHealthStatus } from './EntityHealthStatus';
import EntityDropdown, { EntityMenuItems } from '../../../EntityDropdown/EntityDropdown';
import PlatformContent from './PlatformContent';
import { getPlatformName } from '../../../utils';
import { EntityType, PlatformPrivileges } from '../../../../../../types.generated';
import EntityCount from './EntityCount';
import EntityName from './EntityName';
import { DeprecationPill } from '../../../components/styled/DeprecationPill';
import CompactContext from '../../../../../shared/CompactContext';
import { EntitySubHeaderSection, GenericEntityProperties } from '../../../types';
import EntityActions, { EntityActionItem } from '../../../entity/EntityActions';
import ExternalUrlButton from '../../../ExternalUrlButton';
import ShareButton from '../../../../../shared/share/ShareButton';
import { capitalizeFirstLetterOnly } from '../../../../../shared/textUtil';
import { useUserContext } from '../../../../../context/useUserContext';
const TitleWrapper = styled.div`
display: flex;
justify-content: left;
align-items: center;
.ant-typography-edit-content {
padding-top: 7px;
margin-left: 15px;
}
`;
const HeaderContainer = styled.div`
display: flex;
flex-direction: row;
align-items: space-between;
margin-bottom: 4px;
`;
const MainHeaderContent = styled.div`
flex: 1;
width: 70%;
.entityCount {
margin: 5px 0 -4px 0;
}
`;
const SideHeaderContent = styled.div`
display: flex;
flex-direction: column;
`;
const TopButtonsWrapper = styled.div`
display: flex;
justify-content: flex-end;
margin-bottom: 8px;
`;
export function getCanEditName(
entityType: EntityType,
entityData: GenericEntityProperties | null,
privileges?: PlatformPrivileges,
) {
switch (entityType) {
case EntityType.GlossaryTerm:
case EntityType.GlossaryNode:
return privileges?.manageGlossaries || !!entityData?.privileges?.canManageEntity;
case EntityType.Domain:
return privileges?.manageDomains;
default:
return false;
}
}
type Props = {
headerDropdownItems?: Set<EntityMenuItems>;
headerActionItems?: Set<EntityActionItem>;
isNameEditable?: boolean;
subHeader?: EntitySubHeaderSection;
};
export const EntityHeader = ({ headerDropdownItems, headerActionItems, isNameEditable, subHeader }: Props) => {
const { urn, entityType, entityData } = useEntityData();
const refetch = useRefetch();
const me = useUserContext();
const platformName = getPlatformName(entityData);
const externalUrl = entityData?.externalUrl || undefined;
const entityCount = entityData?.entityCount;
const isCompact = React.useContext(CompactContext);
const entityName = entityData?.name;
const subType = capitalizeFirstLetterOnly(entityData?.subTypes?.typeNames?.[0]) || undefined;
const canEditName =
isNameEditable && getCanEditName(entityType, entityData, me?.platformPrivileges as PlatformPrivileges);
return (
<>
<HeaderContainer data-testid="entity-header-test-id">
<MainHeaderContent>
<PlatformContent />
<TitleWrapper>
<EntityName isNameEditable={canEditName} />
{entityData?.deprecation?.deprecated && (
<DeprecationPill
urn={urn}
deprecation={entityData?.deprecation}
showUndeprecate
preview={isCompact}
refetch={refetch}
/>
)}
{entityData?.health?.map((health) => (
<EntityHealthStatus
type={health.type}
status={health.status}
message={health.message || undefined}
/>
))}
</TitleWrapper>
<EntityCount entityCount={entityCount} />
</MainHeaderContent>
<SideHeaderContent>
<TopButtonsWrapper>
{externalUrl && (
<ExternalUrlButton
externalUrl={externalUrl}
entityUrn={urn}
platformName={platformName}
entityType={entityType}
/>
)}
{headerActionItems && (
<EntityActions urn={urn} actionItems={headerActionItems} refetchForEntity={refetch} />
)}
<ShareButton entityType={entityType} subType={subType} urn={urn} name={entityName} />
{headerDropdownItems && (
<EntityDropdown
urn={urn}
entityType={entityType}
entityData={entityData}
menuItems={headerDropdownItems}
refetchForEntity={refetch}
/>
)}
</TopButtonsWrapper>
</SideHeaderContent>
</HeaderContainer>
{subHeader && <subHeader.component />}
</>
);
};