PanelHeader.tsx 2.6 KB

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