PanelHeaderCorner.tsx 2.9 KB

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