PanelHeader.tsx 2.4 KB

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