PanelHeaderCorner.tsx 2.6 KB

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