import { css } from '@emotion/css'; import * as React from 'react'; import { NavModelItem, GrafanaTheme2 } from '@grafana/data'; import { useStyles2 } from '@grafana/ui'; import { PageInfo } from '../PageInfo/PageInfo'; import { EditableTitle } from './EditableTitle'; import { PageInfoItem } from './types'; export interface Props { navItem: NavModelItem; renderTitle?: (title: string) => React.ReactNode; actions?: React.ReactNode; info?: PageInfoItem[]; subTitle?: React.ReactNode; onEditTitle?: (newValue: string) => Promise; } export function PageHeader({ navItem, renderTitle, actions, info, subTitle, onEditTitle }: Props) { const styles = useStyles2(getStyles); const sub = subTitle ?? navItem.subTitle; const titleElement = onEditTitle ? ( ) : (
{navItem.img && {`logo} {renderTitle ? renderTitle(navItem.text) :

{navItem.text}

}
); return (
{titleElement} {info && }
{actions}
{sub &&
{sub}
}
); } const getStyles = (theme: GrafanaTheme2) => { return { topRow: css({ alignItems: 'flex-start', display: 'flex', flexDirection: 'row', flexWrap: 'wrap', gap: theme.spacing(1, 3), }), title: css({ display: 'flex', flexDirection: 'row', maxWidth: '100%', flex: 1, h1: { marginBottom: 0, }, }), actions: css({ display: 'flex', flexDirection: 'row', gap: theme.spacing(1), }), titleInfoContainer: css({ display: 'flex', label: 'title-info-container', flex: 1, flexWrap: 'wrap', gap: theme.spacing(1, 4), justifyContent: 'space-between', maxWidth: '100%', minWidth: '200px', }), pageHeader: css({ label: 'page-header', display: 'flex', flexDirection: 'column', gap: theme.spacing(1), marginBottom: theme.spacing(2), }), subTitle: css({ position: 'relative', color: theme.colors.text.secondary, }), img: css({ width: '32px', height: '32px', marginRight: theme.spacing(2), }), }; };