PanelHeaderCorner.tsx 2.8 KB

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