grafana/public/app/core/components/AppChrome/NavToolbar.tsx
Ashley Harrison 211c9991c5
Navigation: Add responsive behaviour to ToolbarButtonRow (#53739)
* hacky first attempt

* slightly cleaner...

* behaviour mostly working...

* remove unnecessary wrapper

* css tweaks

* much cleaner implementation with intersectionobserver

* set style props directly on children

* separate story, integrate when toggle is off

* improve story, integrate when toggle is on

* remove styles from DashNavTimeControls

* mock IntersectionObserver for all unit tests

* prettier

* don't use dropdown anymore

* add some basic documentation

* add right alignment to scenes toolbarbuttonrow

* just use the react children api to prevent duplicating children
2022-08-24 11:19:36 +01:00

75 lines
2.0 KiB
TypeScript

import { css } from '@emotion/css';
import React from 'react';
import { GrafanaTheme2, NavModelItem } from '@grafana/data';
import { Icon, IconButton, ToolbarButton, useStyles2 } from '@grafana/ui';
import { Breadcrumbs } from '../Breadcrumbs/Breadcrumbs';
import { buildBreadcrumbs } from '../Breadcrumbs/utils';
import { NavToolbarSeparator } from './NavToolbarSeparator';
import { TOP_BAR_LEVEL_HEIGHT } from './types';
export interface Props {
onToggleSearchBar(): void;
onToggleMegaMenu(): void;
searchBarHidden?: boolean;
sectionNav: NavModelItem;
pageNav?: NavModelItem;
actions: React.ReactNode;
}
export function NavToolbar({
actions,
searchBarHidden,
sectionNav,
pageNav,
onToggleMegaMenu,
onToggleSearchBar,
}: Props) {
const styles = useStyles2(getStyles);
const breadcrumbs = buildBreadcrumbs(sectionNav, pageNav);
return (
<div className={styles.pageToolbar}>
<div className={styles.menuButton}>
<IconButton name="bars" tooltip="Toggle menu" tooltipPlacement="bottom" size="xl" onClick={onToggleMegaMenu} />
</div>
<Breadcrumbs breadcrumbs={breadcrumbs} />
<div className={styles.actions}>
{actions}
{actions && <NavToolbarSeparator />}
<ToolbarButton onClick={onToggleSearchBar} narrow tooltip="Toggle top search bar">
<Icon name={searchBarHidden ? 'angle-down' : 'angle-up'} size="xl" />
</ToolbarButton>
</div>
</div>
);
}
const getStyles = (theme: GrafanaTheme2) => {
return {
pageToolbar: css({
height: TOP_BAR_LEVEL_HEIGHT,
display: 'flex',
padding: theme.spacing(0, 2),
alignItems: 'center',
justifyContent: 'space-between',
}),
menuButton: css({
display: 'flex',
alignItems: 'center',
}),
actions: css({
display: 'flex',
alignItems: 'center',
flexWrap: 'nowrap',
justifyContent: 'flex-end',
paddingLeft: theme.spacing(1),
flexGrow: 1,
gap: theme.spacing(0.5),
minWidth: 0,
}),
};
};