mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Singlestat: Adds migration button and logic to migrate singlestat to stat panel (#23845)
* Singlestat: Migration button to migrate to new stat panel * updated test
This commit is contained in:
parent
c7b7a08baf
commit
d6ba6440e4
@ -1,4 +1,5 @@
|
|||||||
import { sharedSingleStatMigrationHandler } from './SingleStatBaseOptions';
|
import { sharedSingleStatMigrationHandler, sharedSingleStatPanelChangedHandler } from './SingleStatBaseOptions';
|
||||||
|
import { PanelModel } from '@grafana/data';
|
||||||
|
|
||||||
describe('sharedSingleStatMigrationHandler', () => {
|
describe('sharedSingleStatMigrationHandler', () => {
|
||||||
it('from old valueOptions model without pluginVersion', () => {
|
it('from old valueOptions model without pluginVersion', () => {
|
||||||
@ -154,4 +155,43 @@ describe('sharedSingleStatMigrationHandler', () => {
|
|||||||
}
|
}
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('change from angular singlestat with no enabled gauge', () => {
|
||||||
|
const old: any = {
|
||||||
|
angular: {
|
||||||
|
format: 'ms',
|
||||||
|
decimals: 7,
|
||||||
|
gauge: {
|
||||||
|
maxValue: 150,
|
||||||
|
minValue: -10,
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const panel = {} as PanelModel;
|
||||||
|
sharedSingleStatPanelChangedHandler(panel, 'singlestat', old);
|
||||||
|
expect(panel.fieldConfig.defaults.unit).toBe('ms');
|
||||||
|
expect(panel.fieldConfig.defaults.min).toBe(undefined);
|
||||||
|
expect(panel.fieldConfig.defaults.max).toBe(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('change from angular singlestat with no enabled gauge', () => {
|
||||||
|
const old: any = {
|
||||||
|
angular: {
|
||||||
|
format: 'ms',
|
||||||
|
decimals: 7,
|
||||||
|
gauge: {
|
||||||
|
maxValue: 150,
|
||||||
|
minValue: -10,
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const panel = {} as PanelModel;
|
||||||
|
sharedSingleStatPanelChangedHandler(panel, 'singlestat', old);
|
||||||
|
expect(panel.fieldConfig.defaults.unit).toBe('ms');
|
||||||
|
expect(panel.fieldConfig.defaults.min).toBe(undefined);
|
||||||
|
expect(panel.fieldConfig.defaults.max).toBe(undefined);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -59,19 +59,22 @@ function migrateFromAngularSinglestat(panel: PanelModel<Partial<SingleStatBaseOp
|
|||||||
calcs: [reducer ? reducer.id : ReducerID.mean],
|
calcs: [reducer ? reducer.id : ReducerID.mean],
|
||||||
},
|
},
|
||||||
orientation: VizOrientation.Horizontal,
|
orientation: VizOrientation.Horizontal,
|
||||||
};
|
} as any;
|
||||||
|
|
||||||
const defaults: FieldConfig = {};
|
const defaults: FieldConfig = {};
|
||||||
|
|
||||||
if (prevPanel.format) {
|
if (prevPanel.format) {
|
||||||
defaults.unit = prevPanel.format;
|
defaults.unit = prevPanel.format;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prevPanel.nullPointMode) {
|
if (prevPanel.nullPointMode) {
|
||||||
defaults.nullValueMode = prevPanel.nullPointMode;
|
defaults.nullValueMode = prevPanel.nullPointMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prevPanel.nullText) {
|
if (prevPanel.nullText) {
|
||||||
defaults.noValue = prevPanel.nullText;
|
defaults.noValue = prevPanel.nullText;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prevPanel.decimals || prevPanel.decimals === 0) {
|
if (prevPanel.decimals || prevPanel.decimals === 0) {
|
||||||
defaults.decimals = prevPanel.decimals;
|
defaults.decimals = prevPanel.decimals;
|
||||||
}
|
}
|
||||||
@ -92,6 +95,7 @@ function migrateFromAngularSinglestat(panel: PanelModel<Partial<SingleStatBaseOp
|
|||||||
thresholds.push({ value: -Infinity, color });
|
thresholds.push({ value: -Infinity, color });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
defaults.thresholds = {
|
defaults.thresholds = {
|
||||||
mode: ThresholdsMode.Absolute,
|
mode: ThresholdsMode.Absolute,
|
||||||
steps: thresholds,
|
steps: thresholds,
|
||||||
|
@ -163,23 +163,4 @@ describe('Gauge Panel Migrations', () => {
|
|||||||
expect(newOptions.showThresholdMarkers).toBe(true);
|
expect(newOptions.showThresholdMarkers).toBe(true);
|
||||||
expect(newOptions.showThresholdLabels).toBe(true);
|
expect(newOptions.showThresholdLabels).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('change from angular singlestatt with no enabled gauge', () => {
|
|
||||||
const old: any = {
|
|
||||||
angular: {
|
|
||||||
format: 'ms',
|
|
||||||
decimals: 7,
|
|
||||||
gauge: {
|
|
||||||
maxValue: 150,
|
|
||||||
minValue: -10,
|
|
||||||
show: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
const panel = {} as PanelModel;
|
|
||||||
gaugePanelChangedHandler(panel, 'singlestat', old);
|
|
||||||
expect(panel.fieldConfig.defaults.unit).toBe('ms');
|
|
||||||
expect(panel.fieldConfig.defaults.min).toBe(undefined);
|
|
||||||
expect(panel.fieldConfig.defaults.max).toBe(undefined);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
@ -1,18 +1,14 @@
|
|||||||
<div class="editor-row">
|
<div class="editor-row">
|
||||||
|
|
||||||
<div class="grafana-info-box" ng-if="ctrl.panel.gauge.show">
|
<div class="grafana-info-box" ng-if="ctrl.panel.gauge.show">
|
||||||
<h5>Gauge Migration</h5>
|
<h5>Gauge migration</h5>
|
||||||
<p>
|
<p>
|
||||||
Gauge visualizations within the Singlestat panel are deprecated. Please
|
This panel is deprecated. Please migrate to the new Gauge panel.
|
||||||
migrate this panel to use the Gauge panel
|
|
||||||
|
|
||||||
<div class="gf-form-button-row">
|
<div class="gf-form-button-row">
|
||||||
<button class="btn btn-primary" ng-click="ctrl.migrateToGaugePanel(true)">
|
<button class="btn btn-primary" ng-click="ctrl.migrateToPanel('gauge')">
|
||||||
Migrate to Gauge Panel
|
Migrate to Gauge panel
|
||||||
</button>
|
</button>
|
||||||
<button class="btn btn-inverse" ng-click="ctrl.migrateToGaugePanel(false)">
|
|
||||||
Show as single stat
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
@ -22,16 +18,35 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div ng-if="ctrl.panel.prefix">
|
<div ng-if="ctrl.panel.prefix">
|
||||||
<b>NOTE:</b> Prefix will not be show in the gauge panel
|
<b>NOTE:</b> Prefix is no longer supported but can be done via a custom unit
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div ng-if="ctrl.panel.postfix">
|
<div ng-if="ctrl.panel.postfix">
|
||||||
<b>NOTE:</b> Postfix will not be show in the gauge panel
|
<b>NOTE:</b> Postfix is no longer supported but can be done via a custom unit
|
||||||
|
</div>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grafana-info-box" ng-if="!ctrl.panel.gauge.show">
|
||||||
|
<h5>Migration</h5>
|
||||||
|
<p>
|
||||||
|
This panel is deprecated. Please migrate to the new Stat panel.
|
||||||
|
|
||||||
|
<div class="gf-form-button-row">
|
||||||
|
<button class="btn btn-primary" ng-click="ctrl.migrateToPanel('stat')">
|
||||||
|
Migrate to Stat panel
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<div ng-if="ctrl.panel.prefix">
|
||||||
|
<b>NOTE:</b> Prefix is no longer supported but can be done via a custom unit
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div ng-if="ctrl.panel.links && ctrl.panel.links.length">
|
<div ng-if="ctrl.panel.postfix">
|
||||||
<b>NOTE:</b> Links will be in the upper left corner, rather than anywhere on the gauge
|
<b>NOTE:</b> Postfix is no longer supported but can be done via a custom unit
|
||||||
</div>
|
</div>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -139,13 +139,8 @@ class SingleStatCtrl extends MetricsPanelCtrl {
|
|||||||
this.addEditorTab('Value Mappings', 'public/app/plugins/panel/singlestat/mappings.html', 3);
|
this.addEditorTab('Value Mappings', 'public/app/plugins/panel/singlestat/mappings.html', 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
migrateToGaugePanel(migrate: boolean) {
|
migrateToPanel(type: string) {
|
||||||
if (migrate) {
|
this.onPluginTypeChange(config.panels[type]);
|
||||||
this.onPluginTypeChange(config.panels['gauge']);
|
|
||||||
} else {
|
|
||||||
this.panel.gauge.show = false;
|
|
||||||
this.render();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setUnitFormat() {
|
setUnitFormat() {
|
||||||
|
51
public/app/plugins/panel/stat/StatMigrations.test.ts
Normal file
51
public/app/plugins/panel/stat/StatMigrations.test.ts
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import { PanelModel } from '@grafana/data';
|
||||||
|
import { statPanelChangedHandler } from './StatMigrations';
|
||||||
|
import { BigValueGraphMode, BigValueColorMode } from '@grafana/ui';
|
||||||
|
|
||||||
|
describe('Stat Panel Migrations', () => {
|
||||||
|
it('change from angular singlestat sparkline disabled', () => {
|
||||||
|
const old: any = {
|
||||||
|
angular: {
|
||||||
|
format: 'ms',
|
||||||
|
decimals: 7,
|
||||||
|
sparkline: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const panel = {} as PanelModel;
|
||||||
|
const options = statPanelChangedHandler(panel, 'singlestat', old);
|
||||||
|
expect(options.graphMode).toBe(BigValueGraphMode.None);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('change from angular singlestat sparkline enabled', () => {
|
||||||
|
const old: any = {
|
||||||
|
angular: {
|
||||||
|
format: 'ms',
|
||||||
|
decimals: 7,
|
||||||
|
sparkline: {
|
||||||
|
show: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const panel = {} as PanelModel;
|
||||||
|
const options = statPanelChangedHandler(panel, 'singlestat', old);
|
||||||
|
expect(options.graphMode).toBe(BigValueGraphMode.Area);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('change from angular singlestat color background', () => {
|
||||||
|
const old: any = {
|
||||||
|
angular: {
|
||||||
|
format: 'ms',
|
||||||
|
decimals: 7,
|
||||||
|
colorBackground: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const panel = {} as PanelModel;
|
||||||
|
const options = statPanelChangedHandler(panel, 'singlestat', old);
|
||||||
|
expect(options.colorMode).toBe(BigValueColorMode.Background);
|
||||||
|
});
|
||||||
|
});
|
29
public/app/plugins/panel/stat/StatMigrations.ts
Normal file
29
public/app/plugins/panel/stat/StatMigrations.ts
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import { sharedSingleStatPanelChangedHandler, BigValueGraphMode, BigValueColorMode } from '@grafana/ui';
|
||||||
|
import { PanelModel } from '@grafana/data';
|
||||||
|
import { StatPanelOptions } from './types';
|
||||||
|
|
||||||
|
// This is called when the panel changes from another panel
|
||||||
|
export const statPanelChangedHandler = (
|
||||||
|
panel: PanelModel<Partial<StatPanelOptions>> | any,
|
||||||
|
prevPluginId: string,
|
||||||
|
prevOptions: any
|
||||||
|
) => {
|
||||||
|
// This handles most config changes
|
||||||
|
const options = sharedSingleStatPanelChangedHandler(panel, prevPluginId, prevOptions) as StatPanelOptions;
|
||||||
|
|
||||||
|
// Changing from angular singlestat
|
||||||
|
if (prevPluginId === 'singlestat' && prevOptions.angular) {
|
||||||
|
const oldOptions = prevOptions.angular;
|
||||||
|
|
||||||
|
options.graphMode =
|
||||||
|
oldOptions.sparkline && oldOptions.sparkline.show === true ? BigValueGraphMode.Area : BigValueGraphMode.None;
|
||||||
|
|
||||||
|
if (oldOptions.colorBackground) {
|
||||||
|
options.colorMode = BigValueColorMode.Background;
|
||||||
|
} else {
|
||||||
|
options.colorMode = BigValueColorMode.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return options;
|
||||||
|
};
|
@ -1,7 +1,8 @@
|
|||||||
import { sharedSingleStatMigrationHandler, sharedSingleStatPanelChangedHandler } from '@grafana/ui';
|
import { sharedSingleStatMigrationHandler } from '@grafana/ui';
|
||||||
import { PanelPlugin } from '@grafana/data';
|
import { PanelPlugin } from '@grafana/data';
|
||||||
import { StatPanelOptions, addStandardDataReduceOptions } from './types';
|
import { StatPanelOptions, addStandardDataReduceOptions } from './types';
|
||||||
import { StatPanel } from './StatPanel';
|
import { StatPanel } from './StatPanel';
|
||||||
|
import { statPanelChangedHandler } from './StatMigrations';
|
||||||
|
|
||||||
export const plugin = new PanelPlugin<StatPanelOptions>(StatPanel)
|
export const plugin = new PanelPlugin<StatPanelOptions>(StatPanel)
|
||||||
.useFieldConfig()
|
.useFieldConfig()
|
||||||
@ -47,5 +48,5 @@ export const plugin = new PanelPlugin<StatPanelOptions>(StatPanel)
|
|||||||
});
|
});
|
||||||
})
|
})
|
||||||
.setNoPadding()
|
.setNoPadding()
|
||||||
.setPanelChangeHandler(sharedSingleStatPanelChangedHandler)
|
.setPanelChangeHandler(statPanelChangedHandler)
|
||||||
.setMigrationHandler(sharedSingleStatMigrationHandler);
|
.setMigrationHandler(sharedSingleStatMigrationHandler);
|
||||||
|
Loading…
Reference in New Issue
Block a user