mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
refactor component to be more dumb, use LinkButton for icons and fix alignment (#53383)
This commit is contained in:
parent
25c7dc9151
commit
8185b6fdf7
@ -2,11 +2,10 @@ import { css } from '@emotion/css';
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
import { GrafanaTheme2, NavModelItem } from '@grafana/data';
|
import { GrafanaTheme2, NavModelItem } from '@grafana/data';
|
||||||
import { useStyles2, Icon, IconName } from '@grafana/ui';
|
import { useStyles2, Icon, IconName, LinkButton } from '@grafana/ui';
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
sectionNav: NavModelItem;
|
breadcrumbs: Breadcrumb[];
|
||||||
pageNav?: NavModelItem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Breadcrumb {
|
export interface Breadcrumb {
|
||||||
@ -15,8 +14,34 @@ export interface Breadcrumb {
|
|||||||
href?: string;
|
href?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Breadcrumbs({ sectionNav, pageNav }: Props) {
|
export function Breadcrumbs({ breadcrumbs }: Props) {
|
||||||
const styles = useStyles2(getStyles);
|
const styles = useStyles2(getStyles);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ul className={styles.breadcrumbs}>
|
||||||
|
{breadcrumbs.map((breadcrumb, index) => (
|
||||||
|
<li className={styles.breadcrumb} key={index}>
|
||||||
|
{breadcrumb.href && breadcrumb.text && (
|
||||||
|
<a className={styles.breadcrumbLink} href={breadcrumb.href}>
|
||||||
|
{breadcrumb.text}
|
||||||
|
</a>
|
||||||
|
)}
|
||||||
|
{breadcrumb.href && breadcrumb.icon && (
|
||||||
|
<LinkButton size="md" variant="secondary" fill="text" icon={breadcrumb.icon} href={breadcrumb.href} />
|
||||||
|
)}
|
||||||
|
{!breadcrumb.href && <span className={styles.breadcrumbLink}>{breadcrumb.text}</span>}
|
||||||
|
{index + 1 < breadcrumbs.length && (
|
||||||
|
<div className={styles.separator}>
|
||||||
|
<Icon name="angle-right" />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function buildBreadcrumbs(sectionNav: NavModelItem, pageNav?: NavModelItem) {
|
||||||
const crumbs: Breadcrumb[] = [{ icon: 'home-alt', href: '/' }];
|
const crumbs: Breadcrumb[] = [{ icon: 'home-alt', href: '/' }];
|
||||||
|
|
||||||
function addCrumbs(node: NavModelItem) {
|
function addCrumbs(node: NavModelItem) {
|
||||||
@ -33,26 +58,7 @@ export function Breadcrumbs({ sectionNav, pageNav }: Props) {
|
|||||||
addCrumbs(pageNav);
|
addCrumbs(pageNav);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return crumbs;
|
||||||
<ul className={styles.breadcrumbs}>
|
|
||||||
{crumbs.map((breadcrumb, index) => (
|
|
||||||
<li className={styles.breadcrumb} key={index}>
|
|
||||||
{breadcrumb.href && (
|
|
||||||
<a className={styles.breadcrumbLink} href={breadcrumb.href}>
|
|
||||||
{breadcrumb.text}
|
|
||||||
{breadcrumb.icon && <Icon name={breadcrumb.icon} />}
|
|
||||||
</a>
|
|
||||||
)}
|
|
||||||
{!breadcrumb.href && <span className={styles.breadcrumbLink}>{breadcrumb.text}</span>}
|
|
||||||
{index + 1 < crumbs.length && (
|
|
||||||
<div className={styles.separator}>
|
|
||||||
<Icon name="angle-right" />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const getStyles = (theme: GrafanaTheme2) => {
|
const getStyles = (theme: GrafanaTheme2) => {
|
||||||
@ -69,10 +75,12 @@ const getStyles = (theme: GrafanaTheme2) => {
|
|||||||
}),
|
}),
|
||||||
separator: css({
|
separator: css({
|
||||||
color: theme.colors.text.secondary,
|
color: theme.colors.text.secondary,
|
||||||
padding: theme.spacing(0, 0.5),
|
|
||||||
}),
|
}),
|
||||||
breadcrumbLink: css({
|
breadcrumbLink: css({
|
||||||
|
alignItems: 'center',
|
||||||
color: theme.colors.text.primary,
|
color: theme.colors.text.primary,
|
||||||
|
display: 'flex',
|
||||||
|
padding: theme.spacing(0, 0.5),
|
||||||
whiteSpace: 'nowrap',
|
whiteSpace: 'nowrap',
|
||||||
'&:hover': {
|
'&:hover': {
|
||||||
textDecoration: 'underline',
|
textDecoration: 'underline',
|
||||||
|
@ -4,7 +4,7 @@ import React from 'react';
|
|||||||
import { GrafanaTheme2, NavModelItem } from '@grafana/data';
|
import { GrafanaTheme2, NavModelItem } from '@grafana/data';
|
||||||
import { Icon, IconButton, ToolbarButton, useStyles2 } from '@grafana/ui';
|
import { Icon, IconButton, ToolbarButton, useStyles2 } from '@grafana/ui';
|
||||||
|
|
||||||
import { Breadcrumbs } from './Breadcrumbs';
|
import { Breadcrumbs, buildBreadcrumbs } from './Breadcrumbs';
|
||||||
import { NavToolbarSeparator } from './NavToolbarSeparator';
|
import { NavToolbarSeparator } from './NavToolbarSeparator';
|
||||||
import { TOP_BAR_LEVEL_HEIGHT } from './types';
|
import { TOP_BAR_LEVEL_HEIGHT } from './types';
|
||||||
|
|
||||||
@ -26,13 +26,14 @@ export function NavToolbar({
|
|||||||
onToggleSearchBar,
|
onToggleSearchBar,
|
||||||
}: Props) {
|
}: Props) {
|
||||||
const styles = useStyles2(getStyles);
|
const styles = useStyles2(getStyles);
|
||||||
|
const breadcrumbs = buildBreadcrumbs(sectionNav, pageNav);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.pageToolbar}>
|
<div className={styles.pageToolbar}>
|
||||||
<div className={styles.menuButton}>
|
<div className={styles.menuButton}>
|
||||||
<IconButton name="bars" tooltip="Toggle menu" tooltipPlacement="bottom" size="xl" onClick={onToggleMegaMenu} />
|
<IconButton name="bars" tooltip="Toggle menu" tooltipPlacement="bottom" size="xl" onClick={onToggleMegaMenu} />
|
||||||
</div>
|
</div>
|
||||||
<Breadcrumbs sectionNav={sectionNav} pageNav={pageNav} />
|
<Breadcrumbs breadcrumbs={breadcrumbs} />
|
||||||
<div className={styles.actions}>
|
<div className={styles.actions}>
|
||||||
{actions}
|
{actions}
|
||||||
{actions && <NavToolbarSeparator />}
|
{actions && <NavToolbarSeparator />}
|
||||||
@ -56,7 +57,6 @@ const getStyles = (theme: GrafanaTheme2) => {
|
|||||||
menuButton: css({
|
menuButton: css({
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
paddingRight: theme.spacing(1),
|
|
||||||
}),
|
}),
|
||||||
actions: css({
|
actions: css({
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
|
Loading…
Reference in New Issue
Block a user