PanelHeader.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import React, { PureComponent } from 'react';
  2. import classNames from 'classnames';
  3. import { PanelHeaderMenu } from './PanelHeaderMenu';
  4. import { DashboardModel } from 'app/features/dashboard/dashboard_model';
  5. import { PanelModel } from 'app/features/dashboard/panel_model';
  6. import { ClickOutsideWrapper } from 'app/core/components/ClickOutsideWrapper/ClickOutsideWrapper';
  7. export interface Props {
  8. panel: PanelModel;
  9. dashboard: DashboardModel;
  10. timeInfo: string;
  11. }
  12. interface State {
  13. panelMenuOpen: boolean;
  14. }
  15. export class PanelHeader extends PureComponent<Props, State> {
  16. state = {
  17. panelMenuOpen: false,
  18. };
  19. onMenuToggle = event => {
  20. event.stopPropagation();
  21. this.setState(prevState => ({
  22. panelMenuOpen: !prevState.panelMenuOpen,
  23. }));
  24. };
  25. closeMenu = () => {
  26. this.setState({
  27. panelMenuOpen: false,
  28. });
  29. };
  30. render() {
  31. const isFullscreen = false;
  32. const isLoading = false;
  33. const panelHeaderClass = classNames({ 'panel-header': true, 'grid-drag-handle': !isFullscreen });
  34. const { panel, dashboard, timeInfo } = this.props;
  35. return (
  36. <div className={panelHeaderClass}>
  37. <span className="panel-info-corner">
  38. <i className="fa" />
  39. <span className="panel-info-corner-inner" />
  40. </span>
  41. {isLoading && (
  42. <span className="panel-loading">
  43. <i className="fa fa-spinner fa-spin" />
  44. </span>
  45. )}
  46. <div className="panel-title-container" onClick={this.onMenuToggle}>
  47. <div className="panel-title">
  48. <span className="icon-gf panel-alert-icon" />
  49. <span className="panel-title-text">
  50. {panel.title} <span className="fa fa-caret-down panel-menu-toggle" />
  51. </span>
  52. {this.state.panelMenuOpen && (
  53. <ClickOutsideWrapper onClick={this.closeMenu}>
  54. <PanelHeaderMenu panel={panel} dashboard={dashboard} />
  55. </ClickOutsideWrapper>
  56. )}
  57. {timeInfo && (
  58. <span className="panel-time-info">
  59. <i className="fa fa-clock-o" /> {timeInfo}
  60. </span>
  61. )}
  62. </div>
  63. </div>
  64. </div>
  65. );
  66. }
  67. }