From 6df0cae0c9eadfb08ee15a86bd69fa7d562f9f19 Mon Sep 17 00:00:00 2001 From: Ashley Harrison Date: Fri, 2 Jul 2021 09:26:00 +0100 Subject: [PATCH] Annotations: Fix types? --- .../components/AnnotationQueryEditor.test.tsx | 12 +++++---- .../components/AnnotationQueryEditor.tsx | 3 +-- .../datasource/grafana/datasource.test.ts | 13 ++++++--- .../plugins/datasource/grafana/datasource.ts | 27 ++++++++++++------- .../app/plugins/datasource/grafana/types.ts | 4 +-- 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.test.tsx b/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.test.tsx index 9402498a435..7eb4554de06 100644 --- a/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.test.tsx +++ b/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; -import { GrafanaAnnotationQuery, GrafanaAnnotationType } from '../types'; +import { GrafanaAnnotationQuery, GrafanaAnnotationType, GrafanaQueryType } from '../types'; import AnnotationQueryEditor from './AnnotationQueryEditor'; describe('AnnotationQueryEditor', () => { @@ -11,11 +11,9 @@ describe('AnnotationQueryEditor', () => { beforeEach(() => { mockQuery = { refId: 'Anno', + queryType: GrafanaQueryType.Annotations, type: GrafanaAnnotationType.Tags, limit: 100, - enable: true, - name: 'a name', - iconColor: 'a color', }; }); @@ -31,7 +29,11 @@ describe('AnnotationQueryEditor', () => { expect(maxLimit).toBeInTheDocument(); }); - describe('when the query type is "Tags"', () => { + describe('when the query type is "Tags" and the tags array exists', () => { + beforeEach(() => { + mockQuery.tags = []; + }); + it('has a "Match any" toggle', () => { render(); const matchAny = screen.getByLabelText('Match any'); diff --git a/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.tsx b/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.tsx index 97490d3d652..53deda3bdbb 100644 --- a/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.tsx +++ b/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.tsx @@ -97,7 +97,7 @@ export default function AnnotationQueryEditor({ query, onChange }: Props) { /> - {type === GrafanaAnnotationType.Tags && ( + {type === GrafanaAnnotationType.Tags && tags && ( @@ -105,7 +105,6 @@ export default function AnnotationQueryEditor({ query, onChange }: Props) { ({ ...((jest.requireActual('@grafana/runtime') as unknown) as object), @@ -79,7 +79,7 @@ describe('grafana data source', () => { }); function setupAnnotationQueryOptions(annotation: Partial, dashboard?: { id: number }) { - return ({ + return { annotation, dashboard, range: { @@ -87,5 +87,10 @@ function setupAnnotationQueryOptions(annotation: Partial to: dateTime(1432288401), }, rangeRaw: { from: 'now-24h', to: 'now' }, - } as unknown) as AnnotationQueryRequest; + } as { + range: TimeRange; + rangeRaw: RawTimeRange; + annotation: GrafanaAnnotationQuery; + dashboard: any; + }; } diff --git a/public/app/plugins/datasource/grafana/datasource.ts b/public/app/plugins/datasource/grafana/datasource.ts index 0b0011725ce..4d22925a9ac 100644 --- a/public/app/plugins/datasource/grafana/datasource.ts +++ b/public/app/plugins/datasource/grafana/datasource.ts @@ -2,29 +2,31 @@ import { from, merge, Observable, of } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { getBackendSrv, getGrafanaLiveSrv, getTemplateSrv, toDataQueryResponse } from '@grafana/runtime'; import { - AnnotationQueryRequest, + AnnotationQuery, DataQueryRequest, DataQueryResponse, DataSourceApi, DataSourceInstanceSettings, isValidLiveChannelAddress, parseLiveChannelAddress, + RawTimeRange, StreamingFrameOptions, + TimeRange, toDataFrame, } from '@grafana/data'; -import { GrafanaAnnotationQuery, GrafanaAnnotationType, GrafanaQuery, GrafanaQueryType } from './types'; +import { GrafanaAnnotationQuery, GrafanaAnnotationType, GrafanaQueryType } from './types'; import AnnotationQueryEditor from './components/AnnotationQueryEditor'; import { getDashboardSrv } from '../../../features/dashboard/services/DashboardSrv'; let counter = 100; -export class GrafanaDatasource extends DataSourceApi { +export class GrafanaDatasource extends DataSourceApi { constructor(instanceSettings: DataSourceInstanceSettings) { super(instanceSettings); this.annotations = { QueryEditor: AnnotationQueryEditor, - prepareAnnotation(json: any): GrafanaAnnotationQuery { + prepareAnnotation(json: any): AnnotationQuery { // Previously, these properties lived outside of target // This should handle migrating them json.target = json.target ?? { @@ -35,13 +37,13 @@ export class GrafanaDatasource extends DataSourceApi { }; // using spread syntax caused an infinite loop in StandardAnnotationQueryEditor return json; }, - prepareQuery(anno: GrafanaAnnotationQuery): GrafanaQuery { - return { ...anno, refId: anno.name, queryType: GrafanaQueryType.Annotations }; + prepareQuery(anno: AnnotationQuery): GrafanaAnnotationQuery { + return { ...anno.target!, refId: anno.name, queryType: GrafanaQueryType.Annotations }; }, }; } - query(request: DataQueryRequest): Observable { + query(request: DataQueryRequest): Observable { const queries: Array> = []; const templateSrv = getTemplateSrv(); for (const target of request.targets) { @@ -53,7 +55,7 @@ export class GrafanaDatasource extends DataSourceApi { this.getAnnotations({ range: request.range, rangeRaw: request.range.raw, - annotation: target.target as any, + annotation: target, dashboard: getDashboardSrv().getCurrent(), }) ); @@ -109,7 +111,12 @@ export class GrafanaDatasource extends DataSourceApi { return Promise.resolve([]); } - async getAnnotations(options: AnnotationQueryRequest): Promise { + async getAnnotations(options: { + range: TimeRange; + rangeRaw: RawTimeRange; + annotation: GrafanaAnnotationQuery; + dashboard: any; + }): Promise { const templateSrv = getTemplateSrv(); const annotation = (options.annotation as unknown) as GrafanaAnnotationQuery; const params: any = { @@ -154,7 +161,7 @@ export class GrafanaDatasource extends DataSourceApi { const annotations = await getBackendSrv().get( '/api/annotations', params, - `grafana-data-source-annotations-${annotation.name}-${options.dashboard?.id}` + `grafana-data-source-annotations-${annotation.refId}-${options.dashboard?.id}` ); return { data: [toDataFrame(annotations)] }; } diff --git a/public/app/plugins/datasource/grafana/types.ts b/public/app/plugins/datasource/grafana/types.ts index c0a152f036e..a51002bda7e 100644 --- a/public/app/plugins/datasource/grafana/types.ts +++ b/public/app/plugins/datasource/grafana/types.ts @@ -1,4 +1,4 @@ -import { AnnotationQuery, DataQuery } from '@grafana/data'; +import { DataQuery } from '@grafana/data'; import { LiveDataFilter } from '@grafana/runtime'; //---------------------------------------------- @@ -32,7 +32,7 @@ export enum GrafanaAnnotationType { Tags = 'tags', } -export interface GrafanaAnnotationQuery extends AnnotationQuery { +export interface GrafanaAnnotationQuery extends GrafanaQuery { type: GrafanaAnnotationType; // tags limit: number; // 100 tags?: string[];