feat(techdocs-header): Show breadcrumbs on docs page (#2786)

This commit is contained in:
Mahmood Hosseini
2020-10-08 17:26:41 -04:00
committed by GitHub
parent 29a1405121
commit 4295a248e9
4 changed files with 62 additions and 9 deletions
@@ -58,4 +58,11 @@ describe('<Header/>', () => {
);
rendered.getByText('tool');
});
it('should have breadcrumb rendered', () => {
const rendered = render(
wrapInTestApp(<Header title="Title" type="tool" typeLink="/tool" />),
);
rendered.getAllByText('Title');
});
});
+49 -7
View File
@@ -16,9 +16,15 @@
import React, { ReactNode, CSSProperties, FC, useContext } from 'react';
import { Helmet } from 'react-helmet';
import { Typography, Tooltip, makeStyles } from '@material-ui/core';
import {
Link,
Typography,
Tooltip,
makeStyles,
Breadcrumbs,
} from '@material-ui/core';
import ChevronRightIcon from '@material-ui/icons/ChevronRight';
import { BackstageTheme } from '@backstage/theme';
import { PageThemeContext } from '../Page/Page';
const useStyles = makeStyles<BackstageTheme, { backgroundImage: string }>(
@@ -69,6 +75,21 @@ const useStyles = makeStyles<BackstageTheme, { backgroundImage: string }>(
marginBottom: theme.spacing(1),
color: theme.palette.bursts.fontColor,
},
breadcrumb: {
fontSize: 'calc(15px + 1 * ((100vw - 320px) / 680))',
color: theme.palette.bursts.fontColor,
},
breadcrumbType: {
fontSize: 'inherit',
opacity: 0.7,
marginRight: -theme.spacing(0.3),
marginBottom: theme.spacing(0.3),
},
breadcrumbTitle: {
fontSize: 'inherit',
marginLeft: -theme.spacing(0.3),
marginBottom: theme.spacing(0.3),
},
}),
);
@@ -87,7 +108,8 @@ type Props = {
type TypeFragmentProps = {
classes: HeaderStyles;
type?: Props['title'];
pageTitle: string | ReactNode;
type?: Props['type'];
typeLink?: Props['typeLink'];
};
@@ -102,17 +124,32 @@ type SubtitleFragmentProps = {
subtitle?: Props['subtitle'];
};
const TypeFragment: FC<TypeFragmentProps> = ({ type, typeLink, classes }) => {
const TypeFragment: FC<TypeFragmentProps> = ({
type,
typeLink,
classes,
pageTitle,
}) => {
if (!type) {
return null;
}
if (!typeLink) {
// TODO: Add breadcrumbs.
return <Typography className={classes.type}>{type}</Typography>;
}
return <Typography className={classes.type}>{type}</Typography>;
return (
<Breadcrumbs
aria-label="breadcrumb"
separator={<ChevronRightIcon fontSize="small" />}
className={classes.breadcrumb}
>
<Link href={typeLink} color="inherit">
<Typography className={classes.breadcrumbType}> {type}</Typography>
</Link>
<Typography className={classes.breadcrumbTitle}>{pageTitle}</Typography>
</Breadcrumbs>
);
};
const TitleFragment: FC<TitleFragmentProps> = ({
@@ -175,7 +212,12 @@ export const Header: FC<Props> = ({
<Helmet titleTemplate={titleTemplate} defaultTitle={defaultTitle} />
<header style={style} className={classes.header}>
<div className={classes.leftItemsBox}>
<TypeFragment classes={classes} type={type} typeLink={typeLink} />
<TypeFragment
classes={classes}
type={type}
typeLink={typeLink}
pageTitle={pageTitle}
/>
<TitleFragment
classes={classes}
pageTitle={pageTitle}
@@ -54,7 +54,7 @@ describe('<TechDocsPageHeader />', () => {
),
);
expect(rendered.container.innerHTML).toContain('header');
expect(rendered.getByText('test-site-name')).toBeDefined();
expect(rendered.getAllByText('test-site-name')).toHaveLength(2);
expect(rendered.getByText('test-site-desc')).toBeDefined();
});
});
@@ -48,12 +48,14 @@ export const TechDocsPageHeader = ({
spec: { owner, lifecycle },
} = entityMetadataValues || { spec: {} };
const componentLink = `/catalog/${kind}/${name}`;
const labels = (
<>
<HeaderLabel
label="Component"
value={
<Link style={{ color: '#fff' }} to={`/catalog/${kind}/${name}`}>
<Link style={{ color: '#fff' }} to={componentLink}>
{name}
</Link>
}
@@ -85,6 +87,8 @@ export const TechDocsPageHeader = ({
subtitle={
siteDescription && siteDescription !== 'None' ? siteDescription : ''
}
type={name}
typeLink={componentLink}
>
{labels}
</Header>