import React, { Component } from 'react'; import classNames from 'classnames'; import { isEqual } from 'lodash'; import { ScopedVars } from '@grafana/ui'; import PanelHeaderCorner from './PanelHeaderCorner'; import { PanelHeaderMenu } from './PanelHeaderMenu'; import templateSrv from 'app/features/templating/template_srv'; import { DashboardModel } from 'app/features/dashboard/state/DashboardModel'; import { PanelModel } from 'app/features/dashboard/state/PanelModel'; import { ClickOutsideWrapper } from '@grafana/ui'; export interface Props { panel: PanelModel; dashboard: DashboardModel; timeInfo: string; title?: string; description?: string; scopedVars?: ScopedVars; links?: []; error?: string; isFullscreen: boolean; } interface ClickCoordinates { x: number; y: number; } interface State { panelMenuOpen: boolean; } export class PanelHeader extends Component { clickCoordinates: ClickCoordinates = { x: 0, y: 0 }; state = { panelMenuOpen: false, clickCoordinates: { x: 0, y: 0 }, }; eventToClickCoordinates = (event: React.MouseEvent) => { return { x: event.clientX, y: event.clientY, }; }; onMouseDown = (event: React.MouseEvent) => { this.clickCoordinates = this.eventToClickCoordinates(event); }; isClick = (clickCoordinates: ClickCoordinates) => { return isEqual(clickCoordinates, this.clickCoordinates); }; onMenuToggle = (event: React.MouseEvent) => { if (this.isClick(this.eventToClickCoordinates(event))) { event.stopPropagation(); this.setState(prevState => ({ panelMenuOpen: !prevState.panelMenuOpen, })); } }; closeMenu = () => { this.setState({ panelMenuOpen: false, }); }; render() { const { panel, dashboard, timeInfo, scopedVars, error, isFullscreen } = this.props; const title = templateSrv.replaceWithText(panel.title, scopedVars); const panelHeaderClass = classNames({ 'panel-header': true, 'grid-drag-handle': !isFullscreen, }); return ( <>
{title} {this.state.panelMenuOpen && ( )} {timeInfo && ( {timeInfo} )}
); } }