event_editor.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. ///<reference path="../../headers/common.d.ts" />
  2. import _ from 'lodash';
  3. import moment from 'moment';
  4. import {coreModule} from 'app/core/core';
  5. import {MetricsPanelCtrl} from 'app/plugins/sdk';
  6. export class AnnotationEvent {
  7. dashboardId: number;
  8. panelId: number;
  9. time: any;
  10. timeEnd: any;
  11. isRegion: boolean;
  12. title: string;
  13. text: string;
  14. }
  15. export class EventEditorCtrl {
  16. panelCtrl: MetricsPanelCtrl;
  17. event: AnnotationEvent;
  18. timeRange: {from: number, to: number};
  19. form: any;
  20. close: any;
  21. /** @ngInject **/
  22. constructor(private annotationsSrv) {
  23. this.event.panelId = this.panelCtrl.panel.id;
  24. this.event.dashboardId = this.panelCtrl.dashboard.id;
  25. }
  26. save() {
  27. if (!this.form.$valid) {
  28. return;
  29. }
  30. let saveModel = _.cloneDeep(this.event);
  31. saveModel.time = saveModel.time.valueOf();
  32. saveModel.timeEnd = 0;
  33. if (saveModel.isRegion) {
  34. saveModel.timeEnd = saveModel.timeEnd.valueOf();
  35. if (saveModel.timeEnd < saveModel.time) {
  36. console.log('invalid time');
  37. return;
  38. }
  39. }
  40. this.annotationsSrv.saveAnnotationEvent(saveModel).then(() => {
  41. this.panelCtrl.refresh();
  42. this.close();
  43. });
  44. }
  45. timeChanged() {
  46. this.panelCtrl.render();
  47. }
  48. }
  49. export function eventEditor() {
  50. return {
  51. restrict: 'E',
  52. controller: EventEditorCtrl,
  53. bindToController: true,
  54. controllerAs: 'ctrl',
  55. templateUrl: 'public/app/features/annotations/partials/event_editor.html',
  56. scope: {
  57. "panelCtrl": "=",
  58. "event": "=",
  59. "close": "&",
  60. }
  61. };
  62. }
  63. coreModule.directive('eventEditor', eventEditor);
  64. export class EventManager {
  65. event: AnnotationEvent;
  66. constructor(private panelCtrl: MetricsPanelCtrl,
  67. private elem,
  68. private popoverSrv) {
  69. }
  70. editorClosed() {
  71. console.log('editorClosed');
  72. this.event = null;
  73. this.panelCtrl.render();
  74. }
  75. updateTime(range) {
  76. let newEvent = true;
  77. if (this.event) {
  78. newEvent = false;
  79. } else {
  80. // init new event
  81. this.event = new AnnotationEvent();
  82. this.event.dashboardId = this.panelCtrl.dashboard.id;
  83. this.event.panelId = this.panelCtrl.panel.id;
  84. }
  85. // update time
  86. this.event.time = moment(range.from);
  87. this.event.isRegion = false;
  88. if (range.to) {
  89. this.event.timeEnd = moment(range.to);
  90. this.event.isRegion = true;
  91. }
  92. // newEvent means the editor is not visible
  93. if (!newEvent) {
  94. this.panelCtrl.render();
  95. return;
  96. }
  97. this.popoverSrv.show({
  98. element: this.elem[0],
  99. classNames: 'drop-popover drop-popover--form',
  100. position: 'bottom center',
  101. openOn: null,
  102. template: '<event-editor panel-ctrl="panelCtrl" event="event" close="dismiss()"></event-editor>',
  103. onClose: this.editorClosed.bind(this),
  104. model: {
  105. event: this.event,
  106. panelCtrl: this.panelCtrl,
  107. },
  108. });
  109. this.panelCtrl.render();
  110. }
  111. }