PanelHeader.tsx 2.5 KB

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