mirror of
https://github.com/grafana/grafana.git
synced 2025-02-15 01:53:33 -06:00
* WIP: initial commit * Fix: Fixed $timeout call when testing snapshots * Chore: reverts changes to metrics_panel_ctrl.ts * Chore: reverts changes to annotations_srv * Refactor: adds DashboardQueryRunner.run to initdashboard * Refactor: adds run to dashboard model start refresh * Refactor: move to own folder and split up into smaller files * Tests: adds tests for LegacyAnnotationQueryRunner * Tests: adds tests for AnnotationsQueryRunner * Tests: adds tests for SnapshotWorker * Refactor: renames from canRun|run to canWork|work * Tests: adds tests for AlertStatesWorker * Tests: adds tests for AnnotationsWorker * Refactor: renames operators * Refactor: renames operators * Tests: adds tests for DashboardQueryRunner * Refactor: adds mergePanelAndDashboardData function * Tests: fixes broken tests * Chore: Fixes errors after merge with master * Chore: Removes usage of AnnotationSrv from event_editor and initDashboard * WIP: getting annotations and alerts working in graph (snapshot not working) * Refactor: fixes snapshot data for React panels * Refactor: Fixes so snapshots work for Graph * Refactor: moves alert types to grafana-data * Refactor: changes to some for readability * Tests: skipping tests for now, needs rewrite * Refactor: refactors out common static functions to utils * Refactor: fixes resolving annotations from dataframes * Refactor: removes getRunners/Workers functions * Docs: fixes docs errors * Docs: trying to fix doc error * Refactor: changes after PR comments * Refactor: hides everything behind a factory instead * Refactor: adds cancellation between runs and explicitly
112 lines
2.7 KiB
TypeScript
112 lines
2.7 KiB
TypeScript
import { cloneDeep, isNumber } from 'lodash';
|
|
import { coreModule } from 'app/core/core';
|
|
import { AnnotationEvent, dateTime } from '@grafana/data';
|
|
import { MetricsPanelCtrl } from '../panel/metrics_panel_ctrl';
|
|
import { deleteAnnotation, saveAnnotation, updateAnnotation } from './api';
|
|
|
|
export class EventEditorCtrl {
|
|
// @ts-ignore initialized through Angular not constructor
|
|
panelCtrl: MetricsPanelCtrl;
|
|
// @ts-ignore initialized through Angular not constructor
|
|
event: AnnotationEvent;
|
|
timeRange?: { from: number; to: number };
|
|
form: any;
|
|
close: any;
|
|
timeFormated?: string;
|
|
|
|
/** @ngInject */
|
|
constructor() {}
|
|
|
|
$onInit() {
|
|
this.event.panelId = this.panelCtrl.panel.id;
|
|
this.event.dashboardId = this.panelCtrl.dashboard.id;
|
|
|
|
// Annotations query returns time as Unix timestamp in milliseconds
|
|
this.event.time = tryEpochToMoment(this.event.time);
|
|
if (this.event.isRegion) {
|
|
this.event.timeEnd = tryEpochToMoment(this.event.timeEnd);
|
|
}
|
|
|
|
this.timeFormated = this.panelCtrl.dashboard.formatDate(this.event.time!);
|
|
}
|
|
|
|
save() {
|
|
if (!this.form.$valid) {
|
|
return;
|
|
}
|
|
|
|
const saveModel = cloneDeep(this.event);
|
|
saveModel.time = saveModel.time!.valueOf();
|
|
saveModel.timeEnd = 0;
|
|
|
|
if (saveModel.isRegion) {
|
|
saveModel.timeEnd = this.event.timeEnd!.valueOf();
|
|
|
|
if (saveModel.timeEnd < saveModel.time) {
|
|
console.log('invalid time');
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (saveModel.id) {
|
|
updateAnnotation(saveModel)
|
|
.then(() => {
|
|
this.panelCtrl.refresh();
|
|
this.close();
|
|
})
|
|
.catch(() => {
|
|
this.panelCtrl.refresh();
|
|
this.close();
|
|
});
|
|
} else {
|
|
saveAnnotation(saveModel)
|
|
.then(() => {
|
|
this.panelCtrl.refresh();
|
|
this.close();
|
|
})
|
|
.catch(() => {
|
|
this.panelCtrl.refresh();
|
|
this.close();
|
|
});
|
|
}
|
|
}
|
|
|
|
delete() {
|
|
return deleteAnnotation(this.event)
|
|
.then(() => {
|
|
this.panelCtrl.refresh();
|
|
this.close();
|
|
})
|
|
.catch(() => {
|
|
this.panelCtrl.refresh();
|
|
this.close();
|
|
});
|
|
}
|
|
}
|
|
|
|
function tryEpochToMoment(timestamp: any) {
|
|
if (timestamp && isNumber(timestamp)) {
|
|
const epoch = Number(timestamp);
|
|
return dateTime(epoch);
|
|
} else {
|
|
return timestamp;
|
|
}
|
|
}
|
|
|
|
export function eventEditor() {
|
|
return {
|
|
restrict: 'E',
|
|
controller: EventEditorCtrl,
|
|
bindToController: true,
|
|
controllerAs: 'ctrl',
|
|
templateUrl: 'public/app/features/annotations/partials/event_editor.html',
|
|
scope: {
|
|
panelCtrl: '=',
|
|
event: '=',
|
|
close: '&',
|
|
},
|
|
};
|
|
}
|
|
|
|
coreModule.directive('eventEditor', eventEditor);
|