grafana/public/app/features/dashboard/dashgrid/PanelLinks.tsx
kay delaney 40ec4ef5b8
PanelChrome: Implement hover header (#61774)
Closes #59078

Co-authored-by: polinaboneva <polina.boneva@grafana.com>
Co-authored-by: Ivan Ortega <ivanortegaalba@gmail.com>
Co-authored-by: Alexandra Vargas <alexa1866@gmail.com>
2023-02-02 17:53:18 +00:00

58 lines
1.5 KiB
TypeScript

import { css } from '@emotion/css';
import React from 'react';
import { DataLink, GrafanaTheme2, LinkModel } from '@grafana/data';
import { Dropdown, Icon, Menu, ToolbarButton, useStyles2, PanelChrome } from '@grafana/ui';
interface Props {
panelLinks: DataLink[];
onShowPanelLinks: () => LinkModel[];
}
export function PanelLinks({ panelLinks, onShowPanelLinks }: Props) {
const styles = useStyles2(getStyles);
const getLinksContent = (): JSX.Element => {
const interpolatedLinks = onShowPanelLinks();
return (
<Menu>
{interpolatedLinks?.map((link, idx) => {
return <Menu.Item key={idx} label={link.title} url={link.href} target={link.target} />;
})}
</Menu>
);
};
if (panelLinks.length === 1) {
const linkModel = onShowPanelLinks()[0];
return (
<PanelChrome.TitleItem
href={linkModel.href}
onClick={linkModel.onClick}
target={linkModel.target}
title={linkModel.title}
>
<Icon name="external-link-alt" size="md" />
</PanelChrome.TitleItem>
);
} else {
return (
<Dropdown overlay={getLinksContent}>
<ToolbarButton icon="external-link-alt" iconSize="md" aria-label="panel links" className={styles.menuTrigger} />
</Dropdown>
);
}
}
const getStyles = (theme: GrafanaTheme2) => {
return {
menuTrigger: css({
height: '100%',
background: 'inherit',
border: 'none',
borderRadius: `${theme.shape.borderRadius()}`,
cursor: 'context-menu',
}),
};
};