Heatmap: Fix null options migration (#79083)

* Fix heatmap null options migration

Some dashboard generation libraries, such as grafanalib, may produce
heatmaps with a null 'options' attribute. This condition triggers a
panic during migration, resulting in a blank heatmap panel.

This commit addresses the issue by returning default options if a panel has
a null 'options'.

Signed-off-by: Neil Shen <overvenus@gmail.com>

* Nullish coalescing panel.options

Signed-off-by: Neil Shen <overvenus@gmail.com>

---------

Signed-off-by: Neil Shen <overvenus@gmail.com>
pull/79499/head
Neil Shen 2 years ago committed by GitHub
parent 8af08d0df2
commit 999c9c5ea3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 59
      public/app/plugins/panel/heatmap/migrations.test.ts
  2. 2
      public/app/plugins/panel/heatmap/migrations.ts

@ -1,6 +1,6 @@
import { PanelModel, FieldConfigSource } from '@grafana/data';
import { heatmapChangedHandler } from './migrations';
import { heatmapChangedHandler, heatmapMigrationHandler } from './migrations';
describe('Heatmap Migrations', () => {
let prevFieldConfig: FieldConfigSource;
@ -91,6 +91,63 @@ describe('Heatmap Migrations', () => {
`);
});
it('Null Options', () => {
const panel = {} as PanelModel;
panel.options = null;
panel.options = heatmapMigrationHandler(panel);
expect(panel).toMatchInlineSnapshot(`
{
"fieldConfig": {
"defaults": {},
"overrides": [],
},
"options": {
"calculate": true,
"calculation": {},
"cellGap": 2,
"cellRadius": undefined,
"cellValues": {
"decimals": undefined,
},
"color": {
"exponent": 0.5,
"fill": undefined,
"max": undefined,
"min": undefined,
"mode": "scheme",
"reverse": false,
"scale": "exponential",
"scheme": "Oranges",
"steps": 128,
},
"exemplars": {
"color": "rgba(255,0,255,0.7)",
},
"legend": {
"show": false,
},
"rowsFrame": {
"layout": "auto",
},
"showValue": "never",
"tooltip": {
"show": false,
"yHistogram": false,
},
"yAxis": {
"axisPlacement": "left",
"axisWidth": undefined,
"decimals": undefined,
"max": undefined,
"min": undefined,
"reverse": false,
"unit": undefined,
},
},
}
`);
});
it('Cell padding defaults', () => {
// zero becomes 1
expect(

@ -14,7 +14,7 @@ import { Options, defaultOptions, HeatmapColorMode } from './types';
/** Called when the version number changes */
export const heatmapMigrationHandler = (panel: PanelModel): Partial<Options> => {
// Migrating from angular
if (Object.keys(panel.options).length === 0) {
if (Object.keys(panel.options ?? {}).length === 0) {
return heatmapChangedHandler(panel, 'heatmap', { angular: panel }, panel.fieldConfig);
}
return panel.options;

Loading…
Cancel
Save