diff --git a/pkg/api/annotations.go b/pkg/api/annotations.go index af72b9d3876..a7783e4be88 100644 --- a/pkg/api/annotations.go +++ b/pkg/api/annotations.go @@ -39,6 +39,8 @@ func GetAnnotations(c *middleware.Context) Response { Text: item.Text, Metric: item.Metric, Title: item.Title, + PanelId: item.PanelId, + RegionId: item.RegionId, }) } @@ -55,14 +57,31 @@ func PostAnnotation(c *middleware.Context, cmd dtos.PostAnnotationsCmd) Response Epoch: cmd.Time / 1000, Title: cmd.Title, Text: cmd.Text, + CategoryId: cmd.CategoryId, + NewState: cmd.FillColor, + Type: annotations.EventType, } - err := repo.Save(&item) - - if err != nil { + if err := repo.Save(&item); err != nil { return ApiError(500, "Failed to save annotation", err) } + // handle regions + if cmd.IsRegion { + item.RegionId = item.Id + + if err := repo.Update(&item); err != nil { + return ApiError(500, "Failed set regionId on annotation", err) + } + + item.Id = 0 + item.Epoch = cmd.EndTime + + if err := repo.Save(&item); err != nil { + return ApiError(500, "Failed save annotation for region end time", err) + } + } + return ApiSuccess("Annotation added") } diff --git a/pkg/api/api.go b/pkg/api/api.go index 0b9a8acf851..6dcc900c16f 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -277,8 +277,10 @@ func (hs *HttpServer) registerRoutes() { }, reqEditorRole) r.Get("/annotations", wrap(GetAnnotations)) - r.Post("/annotations", bind(dtos.PostAnnotationsCmd{}), wrap(PostAnnotation)) - r.Post("/annotations/mass-delete", reqOrgAdmin, bind(dtos.DeleteAnnotationsCmd{}), wrap(DeleteAnnotations)) + + r.Group("/annotations", func() { + r.Post("/", bind(dtos.PostAnnotationsCmd{}), wrap(PostAnnotation)) + }, reqEditorRole) // error test r.Get("/metrics/error", wrap(GenerateError)) diff --git a/pkg/api/dtos/annotations.go b/pkg/api/dtos/annotations.go index cd8c0c1d523..bd9dd06c457 100644 --- a/pkg/api/dtos/annotations.go +++ b/pkg/api/dtos/annotations.go @@ -12,6 +12,7 @@ type Annotation struct { Title string `json:"title"` Text string `json:"text"` Metric string `json:"metric"` + RegionId int64 `json:"regionId"` Data *simplejson.Json `json:"data"` } @@ -19,9 +20,14 @@ type Annotation struct { type PostAnnotationsCmd struct { DashboardId int64 `json:"dashboardId"` PanelId int64 `json:"panelId"` + CategoryId int64 `json:"categoryId"` Time int64 `json:"time"` Title string `json:"title"` Text string `json:"text"` + + FillColor string `json:"fillColor"` + IsRegion bool `json:"isRegion"` + EndTime int64 `json:"endTime"` } type DeleteAnnotationsCmd struct { diff --git a/pkg/services/annotations/annotations.go b/pkg/services/annotations/annotations.go index a308f546c8a..be9d3f2d4d0 100644 --- a/pkg/services/annotations/annotations.go +++ b/pkg/services/annotations/annotations.go @@ -4,6 +4,7 @@ import "github.com/grafana/grafana/pkg/components/simplejson" type Repository interface { Save(item *Item) error + Update(item *Item) error Find(query *ItemQuery) ([]*Item, error) Delete(params *DeleteParams) error } @@ -49,6 +50,7 @@ type ItemType string const ( AlertType ItemType = "alert" + EventType ItemType = "event" ) type Item struct { @@ -57,6 +59,7 @@ type Item struct { DashboardId int64 `json:"dashboardId"` PanelId int64 `json:"panelId"` CategoryId int64 `json:"categoryId"` + RegionId int64 `json:"regionId"` Type ItemType `json:"type"` Title string `json:"title"` Text string `json:"text"` diff --git a/pkg/services/sqlstore/annotation.go b/pkg/services/sqlstore/annotation.go index e219f48d2fe..62a10ee2106 100644 --- a/pkg/services/sqlstore/annotation.go +++ b/pkg/services/sqlstore/annotation.go @@ -23,6 +23,17 @@ func (r *SqlAnnotationRepo) Save(item *annotations.Item) error { }) } +func (r *SqlAnnotationRepo) Update(item *annotations.Item) error { + return inTransaction(func(sess *xorm.Session) error { + + if _, err := sess.Table("annotation").Id(item.Id).Update(item); err != nil { + return err + } + + return nil + }) +} + func (r *SqlAnnotationRepo) Find(query *annotations.ItemQuery) ([]*annotations.Item, error) { var sql bytes.Buffer params := make([]interface{}, 0) diff --git a/pkg/services/sqlstore/migrations/annotation_mig.go b/pkg/services/sqlstore/migrations/annotation_mig.go index 4a7206f9d64..aeb2afed4fb 100644 --- a/pkg/services/sqlstore/migrations/annotation_mig.go +++ b/pkg/services/sqlstore/migrations/annotation_mig.go @@ -54,4 +54,8 @@ func addAnnotationMig(mg *Migrator) { {Name: "new_state", Type: DB_NVarchar, Length: 25, Nullable: false}, {Name: "data", Type: DB_Text, Nullable: false}, })) + + mg.AddMigration("Add column region_id to annotation table", NewAddColumnMigration(table, &Column{ + Name: "region_id", Type: DB_BigInt, Nullable: true, Default: "0", + })) } diff --git a/public/app/features/annotations/annotations_srv.ts b/public/app/features/annotations/annotations_srv.ts index 380cc93ead9..9fb69b535c5 100644 --- a/public/app/features/annotations/annotations_srv.ts +++ b/public/app/features/annotations/annotations_srv.ts @@ -35,6 +35,13 @@ export class AnnotationsSrv { // combine the annotations and flatten results var annotations = _.flattenDeep([results[0], results[1]]); + // filter out annotations that do not belong to requesting panel + annotations = _.filter(annotations, item => { + if (item.panelId && options.panel.id !== item.panelId) { + return false; + } + return true; + }); // look for alert state for this panel var alertState = _.find(results[2], {panelId: options.panel.id}); @@ -127,20 +134,9 @@ export class AnnotationsSrv { } postAnnotation(annotations) { - console.log("POST /api/annotations\n", annotations); - - // Not implemented yet - let implemented = true; - if (implemented) { - return Promise.all(_.map(annotations, annotation => { - return this.backendSrv.post('/api/annotations', annotation); - })) - .catch(error => { - console.log(error); - }); - } else { - return Promise.resolve("Not implemented"); - } + return Promise.all(_.map(annotations, annotation => { + return this.backendSrv.post('/api/annotations', annotation); + })); } translateQueryResult(annotation, results) { diff --git a/public/app/features/dashboard/addAnnotationModalCtrl.ts b/public/app/features/dashboard/addAnnotationModalCtrl.ts index 7c3962074cf..789d24bdbee 100644 --- a/public/app/features/dashboard/addAnnotationModalCtrl.ts +++ b/public/app/features/dashboard/addAnnotationModalCtrl.ts @@ -61,7 +61,6 @@ export class AddAnnotationModalCtrl { } close() { - this.graphCtrl.inAddAnnotationMode = false; this.$scope.dismiss(); } } diff --git a/public/app/plugins/datasource/grafana/partials/annotations.editor.html b/public/app/plugins/datasource/grafana/partials/annotations.editor.html index a1528a6d708..24a06a2abd6 100644 --- a/public/app/plugins/datasource/grafana/partials/annotations.editor.html +++ b/public/app/plugins/datasource/grafana/partials/annotations.editor.html @@ -4,7 +4,7 @@