diff --git a/public/app/plugins/panel/timeseries/migrations.test.ts b/public/app/plugins/panel/timeseries/migrations.test.ts index 03815e8aa56..4da0458f154 100644 --- a/public/app/plugins/panel/timeseries/migrations.test.ts +++ b/public/app/plugins/panel/timeseries/migrations.test.ts @@ -1,6 +1,6 @@ import { cloneDeep } from 'lodash'; -import { PanelModel, FieldConfigSource, FieldMatcherID } from '@grafana/data'; +import { PanelModel, FieldConfigSource, FieldMatcherID, ReducerID } from '@grafana/data'; import { TooltipDisplayMode, SortOrder } from '@grafana/schema'; import { graphPanelChangedHandler } from './migrations'; @@ -144,6 +144,116 @@ describe('Graph Migrations', () => { panel.options = graphPanelChangedHandler(panel, 'graph', old, prevFieldConfig); expect(panel.options.legend.width).toBe(200); }); + + test('hide allZeros', () => { + const old = { + angular: { + legend: { + show: true, + values: false, + min: false, + max: false, + current: false, + total: false, + avg: false, + hideZero: true, + }, + }, + }; + const panel = {} as PanelModel; + panel.options = graphPanelChangedHandler(panel, 'graph', old, prevFieldConfig); + expect(panel.fieldConfig.overrides).toHaveLength(1); + expect(panel.fieldConfig.overrides[0].matcher.options.reducer).toBe(ReducerID.allIsZero); + expect(panel.fieldConfig.overrides).toMatchInlineSnapshot(` + [ + { + "matcher": { + "id": "byValue", + "options": { + "op": "gte", + "reducer": "allIsZero", + "value": 0, + }, + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": false, + }, + }, + ], + }, + ] + `); + }); + + test('hide allZeros allNulls', () => { + const old = { + angular: { + legend: { + show: true, + values: false, + min: false, + max: false, + current: false, + total: false, + avg: false, + hideEmpty: true, + hideZero: true, + }, + }, + }; + const panel = {} as PanelModel; + panel.options = graphPanelChangedHandler(panel, 'graph', old, prevFieldConfig); + expect(panel.fieldConfig.overrides).toHaveLength(2); + expect(panel.fieldConfig.overrides).toMatchInlineSnapshot(` + [ + { + "matcher": { + "id": "byValue", + "options": { + "op": "gte", + "reducer": "allIsZero", + "value": 0, + }, + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": false, + }, + }, + ], + }, + { + "matcher": { + "id": "byValue", + "options": { + "op": "gte", + "reducer": "allIsNull", + "value": 0, + }, + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": false, + }, + }, + ], + }, + ] + `); + }); }); describe('stacking', () => { diff --git a/public/app/plugins/panel/timeseries/migrations.ts b/public/app/plugins/panel/timeseries/migrations.ts index a71d4c22f4a..9f1c774a94c 100644 --- a/public/app/plugins/panel/timeseries/migrations.ts +++ b/public/app/plugins/panel/timeseries/migrations.ts @@ -12,6 +12,7 @@ import { FieldType, NullValueMode, PanelTypeChangedHandler, + ReducerID, Threshold, ThresholdsMode, } from '@grafana/data'; @@ -30,6 +31,7 @@ import { StackingMode, SortOrder, GraphTransform, + ComparisonOperation, } from '@grafana/schema'; import { defaultGraphConfig } from './config'; @@ -350,6 +352,14 @@ export function graphToTimeseriesOptions(angular: any): { fieldConfig: FieldConf if (angular.legend.sideWidth) { options.legend.width = angular.legend.sideWidth; } + + if (legendConfig.hideZero) { + overrides.push(getLegendHideFromOverride(ReducerID.allIsZero)); + } + + if (legendConfig.hideEmpty) { + overrides.push(getLegendHideFromOverride(ReducerID.allIsNull)); + } } const tooltipConfig = angular.tooltip; @@ -614,3 +624,26 @@ function migrateHideFrom(panel: { }); } } + +function getLegendHideFromOverride(reducer: ReducerID.allIsZero | ReducerID.allIsNull) { + return { + matcher: { + id: FieldMatcherID.byValue, + options: { + reducer: reducer, + op: ComparisonOperation.GTE, + value: 0, + }, + }, + properties: [ + { + id: 'custom.hideFrom', + value: { + tooltip: true, + viz: false, + legend: true, + }, + }, + ], + }; +}