diff --git a/public/app/features/dashboard/panel_model.ts b/public/app/features/dashboard/panel_model.ts index b7e8a68c722..6aded0da1d7 100644 --- a/public/app/features/dashboard/panel_model.ts +++ b/public/app/features/dashboard/panel_model.ts @@ -62,7 +62,7 @@ const mustKeepProps: { [str: string]: boolean } = { const defaults: any = { gridPos: { x: 0, y: 0, h: 3, w: 6 }, datasource: null, - targets: [{}], + targets: [{ refId: 'A' }], cachedPluginOptions: {}, transparent: false, }; @@ -83,7 +83,7 @@ export class PanelModel { collapsed?: boolean; panels?: any; soloMode?: boolean; - targets: any[]; + targets: DataQuery[]; datasource: string; thresholds?: any; @@ -118,6 +118,18 @@ export class PanelModel { // defaults _.defaultsDeep(this, _.cloneDeep(defaults)); + // queries must have refId + this.ensureQueryIds(); + } + + ensureQueryIds() { + if (this.targets) { + for (const query of this.targets) { + if (!query.refId) { + query.refId = this.getNextQueryLetter(); + } + } + } } getOptions(panelDefaults) { @@ -243,7 +255,7 @@ export class PanelModel { addQuery(query?: Partial) { query = query || { refId: 'A' }; query.refId = this.getNextQueryLetter(); - this.targets.push(query); + this.targets.push(query as DataQuery); } getNextQueryLetter(): string { diff --git a/public/app/features/dashboard/specs/panel_model.test.ts b/public/app/features/dashboard/specs/panel_model.test.ts index 36bb8d6297e..89976fa275a 100644 --- a/public/app/features/dashboard/specs/panel_model.test.ts +++ b/public/app/features/dashboard/specs/panel_model.test.ts @@ -9,6 +9,10 @@ describe('PanelModel', () => { model = new PanelModel({ type: 'table', showColumns: true, + targets: [ + {refId: 'A'}, + {noRefId: true} + ] }); }); @@ -20,6 +24,10 @@ describe('PanelModel', () => { expect(model.showColumns).toBe(true); }); + it('should add missing refIds', () => { + expect(model.targets[1].refId).toBe('B'); + }); + it('getSaveModel should remove defaults', () => { const saveModel = model.getSaveModel(); expect(saveModel.gridPos).toBe(undefined);