PanelHeaderCorner.tsx 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import React, { PureComponent } from 'react';
  2. import { PanelModel } from 'app/features/dashboard/panel_model';
  3. import Tooltip from 'app/core/components/Tooltip/Tooltip';
  4. import templateSrv from 'app/features/templating/template_srv';
  5. import { LinkSrv } from 'app/features/dashboard/panellinks/link_srv';
  6. import { getTimeSrv, TimeSrv } from 'app/features/dashboard/time_srv';
  7. import Remarkable from 'remarkable';
  8. enum InfoModes {
  9. Error = 'Error',
  10. Info = 'Info',
  11. Links = 'Links',
  12. }
  13. interface Props {
  14. panel: PanelModel;
  15. }
  16. export class PanelHeaderCorner extends PureComponent<Props> {
  17. timeSrv: TimeSrv = getTimeSrv();
  18. getInfoMode = () => {
  19. const { panel } = this.props;
  20. if (!!panel.description) {
  21. return InfoModes.Info;
  22. }
  23. if (panel.links && panel.links.length) {
  24. return InfoModes.Links;
  25. }
  26. return undefined;
  27. };
  28. getInfoContent = (): JSX.Element => {
  29. const { panel } = this.props;
  30. const markdown = panel.description;
  31. const linkSrv = new LinkSrv(templateSrv, this.timeSrv);
  32. const interpolatedMarkdown = templateSrv.replace(markdown, panel.scopedVars);
  33. const remarkableInterpolatedMarkdown = new Remarkable().render(interpolatedMarkdown);
  34. const html = (
  35. <div className="markdown-html">
  36. <div dangerouslySetInnerHTML={{ __html: remarkableInterpolatedMarkdown }} />
  37. {panel.links &&
  38. panel.links.length > 0 && (
  39. <ul>
  40. {panel.links.map((link, idx) => {
  41. const info = linkSrv.getPanelLinkAnchorInfo(link, panel.scopedVars);
  42. return (
  43. <li key={idx}>
  44. <a className="panel-menu-link" href={info.href} target={info.target}>
  45. {info.title}
  46. </a>
  47. </li>
  48. );
  49. })}
  50. </ul>
  51. )}
  52. </div>
  53. );
  54. return html;
  55. };
  56. render() {
  57. const infoMode: InfoModes | undefined = this.getInfoMode();
  58. if (!infoMode) {
  59. return null;
  60. }
  61. return (
  62. <>
  63. {infoMode === InfoModes.Info || infoMode === InfoModes.Links ? (
  64. <Tooltip
  65. content={this.getInfoContent}
  66. className="absolute"
  67. refClassName={`panel-info-corner panel-info-corner--${infoMode.toLowerCase()}`}
  68. >
  69. <i className="fa" />
  70. <span className="panel-info-corner-inner" />
  71. </Tooltip>
  72. ) : null}
  73. </>
  74. );
  75. }
  76. }
  77. export default PanelHeaderCorner;