annotation_tooltip.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import _ from 'lodash';
  2. import $ from 'jquery';
  3. import coreModule from 'app/core/core_module';
  4. import alertDef from '../alerting/alert_def';
  5. /** @ngInject **/
  6. export function annotationTooltipDirective(
  7. $sanitize,
  8. dashboardSrv,
  9. contextSrv,
  10. $compile
  11. ) {
  12. function sanitizeString(str) {
  13. try {
  14. return $sanitize(str);
  15. } catch (err) {
  16. console.log(
  17. 'Could not sanitize annotation string, html escaping instead'
  18. );
  19. return _.escape(str);
  20. }
  21. }
  22. return {
  23. restrict: 'E',
  24. scope: {
  25. event: '=',
  26. onEdit: '&',
  27. },
  28. link: function(scope, element) {
  29. var event = scope.event;
  30. var title = event.title;
  31. var text = event.text;
  32. var dashboard = dashboardSrv.getCurrent();
  33. var tooltip = '<div class="graph-annotation">';
  34. var titleStateClass = '';
  35. if (event.alertId) {
  36. var stateModel = alertDef.getStateDisplayModel(event.newState);
  37. titleStateClass = stateModel.stateClass;
  38. title = `<i class="icon-gf ${stateModel.iconClass}"></i> ${
  39. stateModel.text
  40. }`;
  41. text = alertDef.getAlertAnnotationInfo(event);
  42. if (event.text) {
  43. text = text + '<br />' + event.text;
  44. }
  45. } else if (title) {
  46. text = title + '<br />' + (_.isString(text) ? text : '');
  47. title = '';
  48. }
  49. var header = `<div class="graph-annotation__header">`;
  50. if (event.login) {
  51. header += `<div class="graph-annotation__user" bs-tooltip="'Created by ${
  52. event.login
  53. }'"><img src="${event.avatarUrl}" /></div>`;
  54. }
  55. header += `
  56. <span class="graph-annotation__title ${titleStateClass}">${sanitizeString(
  57. title
  58. )}</span>
  59. <span class="graph-annotation__time">${dashboard.formatDate(
  60. event.min
  61. )}</span>
  62. `;
  63. // Show edit icon only for users with at least Editor role
  64. if (event.id && contextSrv.isEditor) {
  65. header += `
  66. <span class="pointer graph-annotation__edit-icon" ng-click="onEdit()">
  67. <i class="fa fa-pencil-square"></i>
  68. </span>
  69. `;
  70. }
  71. header += `</div>`;
  72. tooltip += header;
  73. tooltip += '<div class="graph-annotation__body">';
  74. if (text) {
  75. tooltip +=
  76. '<div>' + sanitizeString(text.replace(/\n/g, '<br>')) + '</div>';
  77. }
  78. var tags = event.tags;
  79. if (tags && tags.length) {
  80. scope.tags = tags;
  81. tooltip +=
  82. '<span class="label label-tag small" ng-repeat="tag in tags" tag-color-from-name="tag">{{tag}}</span><br/>';
  83. }
  84. tooltip += '</div>';
  85. tooltip += '</div>';
  86. var $tooltip = $(tooltip);
  87. $tooltip.appendTo(element);
  88. $compile(element.contents())(scope);
  89. },
  90. };
  91. }
  92. coreModule.directive('annotationTooltip', annotationTooltipDirective);