annotation_tooltip.ts 2.7 KB

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