2021-02-08 23:05:34 -06:00
|
|
|
import React, { FC } from 'react';
|
2021-04-01 07:15:23 -05:00
|
|
|
import { cx } from '@emotion/css';
|
2021-02-08 23:05:34 -06:00
|
|
|
import { DataLink, PanelData } from '@grafana/data';
|
|
|
|
import { Icon } from '@grafana/ui';
|
2020-04-27 02:09:05 -05:00
|
|
|
import { selectors } from '@grafana/e2e-selectors';
|
2018-10-25 05:47:09 -05:00
|
|
|
|
2018-11-15 09:52:39 -06:00
|
|
|
import PanelHeaderCorner from './PanelHeaderCorner';
|
2019-01-31 01:56:17 -06:00
|
|
|
import { DashboardModel } from 'app/features/dashboard/state/DashboardModel';
|
|
|
|
import { PanelModel } from 'app/features/dashboard/state/PanelModel';
|
2019-08-28 01:50:43 -05:00
|
|
|
import { getPanelLinksSupplier } from 'app/features/panel/panellinks/linkSuppliers';
|
2021-02-08 23:05:34 -06:00
|
|
|
import { PanelHeaderNotices } from './PanelHeaderNotices';
|
|
|
|
import { PanelHeaderMenuTrigger } from './PanelHeaderMenuTrigger';
|
|
|
|
import { PanelHeaderLoadingIndicator } from './PanelHeaderLoadingIndicator';
|
|
|
|
import { PanelHeaderMenuWrapper } from './PanelHeaderMenuWrapper';
|
2018-11-07 06:55:02 -06:00
|
|
|
|
|
|
|
export interface Props {
|
|
|
|
panel: PanelModel;
|
|
|
|
dashboard: DashboardModel;
|
2018-12-05 07:57:57 -06:00
|
|
|
title?: string;
|
|
|
|
description?: string;
|
2019-06-25 04:38:51 -05:00
|
|
|
links?: DataLink[];
|
2019-02-12 10:01:07 -06:00
|
|
|
error?: string;
|
2020-04-12 15:20:02 -05:00
|
|
|
alertState?: string;
|
2020-04-10 09:37:26 -05:00
|
|
|
isViewing: boolean;
|
|
|
|
isEditing: boolean;
|
2020-03-18 07:00:14 -05:00
|
|
|
data: PanelData;
|
2018-10-25 05:47:09 -05:00
|
|
|
}
|
2020-11-05 10:03:34 -06:00
|
|
|
|
2021-02-08 23:05:34 -06:00
|
|
|
export const PanelHeader: FC<Props> = ({ panel, error, isViewing, isEditing, data, alertState, dashboard }) => {
|
|
|
|
const onCancelQuery = () => panel.getQueryRunner().cancelQuery();
|
2021-03-15 02:44:13 -05:00
|
|
|
const title = panel.getDisplayTitle();
|
2021-02-08 23:05:34 -06:00
|
|
|
const className = cx('panel-header', !(isViewing || isEditing) ? 'grid-drag-handle' : '');
|
|
|
|
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<PanelHeaderLoadingIndicator state={data.state} onClick={onCancelQuery} />
|
|
|
|
<div className={className}>
|
|
|
|
<PanelHeaderCorner
|
|
|
|
panel={panel}
|
|
|
|
title={panel.title}
|
|
|
|
description={panel.description}
|
|
|
|
scopedVars={panel.scopedVars}
|
|
|
|
links={getPanelLinksSupplier(panel)}
|
|
|
|
error={error}
|
|
|
|
/>
|
|
|
|
<PanelHeaderMenuTrigger aria-label={selectors.components.Panels.Panel.title(title)}>
|
|
|
|
{({ closeMenu, panelMenuOpen }) => {
|
|
|
|
return (
|
|
|
|
<div className="panel-title">
|
|
|
|
<PanelHeaderNotices frames={data.series} panelId={panel.id} />
|
2021-05-04 03:00:44 -05:00
|
|
|
{panel.libraryPanel && <Icon name="library-panel" style={{ marginRight: '4px' }} />}
|
2021-02-08 23:05:34 -06:00
|
|
|
{alertState ? (
|
|
|
|
<Icon
|
|
|
|
name={alertState === 'alerting' ? 'heart-break' : 'heart'}
|
|
|
|
className="icon-gf panel-alert-icon"
|
|
|
|
style={{ marginRight: '4px' }}
|
|
|
|
size="sm"
|
|
|
|
/>
|
|
|
|
) : null}
|
|
|
|
<span className="panel-title-text">{title}</span>
|
|
|
|
<Icon name="angle-down" className="panel-menu-toggle" />
|
|
|
|
<PanelHeaderMenuWrapper panel={panel} dashboard={dashboard} show={panelMenuOpen} onClose={closeMenu} />
|
|
|
|
{data.request && data.request.timeInfo && (
|
|
|
|
<span className="panel-time-info">
|
|
|
|
<Icon name="clock-nine" size="sm" /> {data.request.timeInfo}
|
|
|
|
</span>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}}
|
|
|
|
</PanelHeaderMenuTrigger>
|
|
|
|
</div>
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
};
|