PanelHeaderCorner.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. // TODO
  21. // if (error) {
  22. // return InfoModes.Error;
  23. // }
  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 = () => {
  33. const { panel } = this.props;
  34. const markdown = panel.description;
  35. const linkSrv = new LinkSrv(templateSrv, this.timeSrv);
  36. const sanitize = str => str; // TODO
  37. const interpolatedMarkdown = templateSrv.replace(markdown, panel.scopedVars);
  38. const remarkableInterpolatedMarkdown = new Remarkable().render(interpolatedMarkdown);
  39. const html = (
  40. <div className="markdown-html">
  41. <div dangerouslySetInnerHTML={{ __html: remarkableInterpolatedMarkdown }} />
  42. {panel.links &&
  43. panel.links.length > 0 && (
  44. <ul>
  45. {panel.links.map((link, idx) => {
  46. const info = linkSrv.getPanelLinkAnchorInfo(link, panel.scopedVars);
  47. return (
  48. <li key={idx}>
  49. <a className="panel-menu-link" href={info.href} target={info.target}>
  50. {info.title}
  51. </a>
  52. </li>
  53. );
  54. })}
  55. </ul>
  56. )}
  57. </div>
  58. );
  59. return sanitize(html);
  60. };
  61. render() {
  62. const infoMode: InfoModes | undefined = this.getInfoMode();
  63. if (!infoMode) {
  64. return null;
  65. }
  66. const infoContent = this.getInfoContent();
  67. return (
  68. <>
  69. {infoMode === InfoModes.Info || infoMode === InfoModes.Links ? (
  70. <Tooltip
  71. content={infoContent}
  72. className="absolute"
  73. refClassName={`panel-info-corner panel-info-corner--${infoMode.toLowerCase()}`}
  74. >
  75. <i className="fa" />
  76. <span className="panel-info-corner-inner" />
  77. </Tooltip>
  78. ) : null}
  79. </>
  80. );
  81. }
  82. }
  83. export default PanelHeaderCorner;