diff --git a/public/app/plugins/panel/singlestat/editor.html b/public/app/plugins/panel/singlestat/editor.html
index fc3c9f69542..0504277a5e1 100644
--- a/public/app/plugins/panel/singlestat/editor.html
+++ b/public/app/plugins/panel/singlestat/editor.html
@@ -204,35 +204,3 @@
-
-
diff --git a/public/app/plugins/panel/singlestat/mappings.html b/public/app/plugins/panel/singlestat/mappings.html
new file mode 100644
index 00000000000..a1105a159dd
--- /dev/null
+++ b/public/app/plugins/panel/singlestat/mappings.html
@@ -0,0 +1,58 @@
+
+
+
Set valuea mappings
+
+
+
diff --git a/public/app/plugins/panel/singlestat/module.ts b/public/app/plugins/panel/singlestat/module.ts
index 3c0b9e5342a..e2e529d00c7 100644
--- a/public/app/plugins/panel/singlestat/module.ts
+++ b/public/app/plugins/panel/singlestat/module.ts
@@ -35,6 +35,14 @@ class SingleStatCtrl extends MetricsPanelCtrl {
valueMaps: [
{ value: 'null', op: '=', text: 'N/A' }
],
+ mappingTypes: [
+ {name: 'value to text', value: 1},
+ {name: 'range to text', value: 2},
+ ],
+ rangeMaps: [
+ { from: 'null', to: 'null', text: 'N/A' }
+ ],
+ mappingType: 1,
nullPointMode: 'connected',
valueName: 'avg',
prefixFontSize: '50%',
@@ -73,6 +81,7 @@ class SingleStatCtrl extends MetricsPanelCtrl {
onInitEditMode() {
this.fontSizes = ['20%', '30%','50%','70%','80%','100%', '110%', '120%', '150%', '170%', '200%'];
this.addEditorTab('Options', 'public/app/plugins/panel/singlestat/editor.html', 2);
+ this.addEditorTab('Value Mappings', 'public/app/plugins/panel/singlestat/mappings.html', 3);
this.unitFormats = kbn.getUnitFormats();
}
@@ -197,23 +206,45 @@ class SingleStatCtrl extends MetricsPanelCtrl {
}
}
- // check value to text mappings
- for (var i = 0; i < this.panel.valueMaps.length; i++) {
- var map = this.panel.valueMaps[i];
- // special null case
- if (map.value === 'null') {
- if (data.value === null || data.value === void 0) {
+ // check value to text mappings if its enabled
+ if (this.panel.mappingType === 1) {
+ for (var i = 0; i < this.panel.valueMaps.length; i++) {
+ var map = this.panel.valueMaps[i];
+ // special null case
+ if (map.value === 'null') {
+ if (data.value === null || data.value === void 0) {
+ data.valueFormated = map.text;
+ return;
+ }
+ continue;
+ }
+
+ // value/number to text mapping
+ var value = parseFloat(map.value);
+ if (value === data.valueRounded) {
data.valueFormated = map.text;
return;
}
- continue;
}
+ } else if (this.panel.mappingType === 2) {
+ for (var i = 0; i < this.panel.rangeMaps.length; i++) {
+ var map = this.panel.rangeMaps[i];
+ // special null case
+ if (map.from === 'null' && map.to === 'null') {
+ if (data.value === null || data.value === void 0) {
+ data.valueFormated = map.text;
+ return;
+ }
+ continue;
+ }
- // value/number to text mapping
- var value = parseFloat(map.value);
- if (value === data.valueRounded) {
- data.valueFormated = map.text;
- return;
+ // value/number to range mapping
+ var from = parseFloat(map.from);
+ var to = parseFloat(map.to);
+ if (to >= data.valueRounded && from <= data.valueRounded) {
+ data.valueFormated = map.text;
+ return;
+ }
}
}
@@ -232,6 +263,16 @@ class SingleStatCtrl extends MetricsPanelCtrl {
this.panel.valueMaps.push({value: '', op: '=', text: '' });
}
+ removeRangeMap(rangeMap) {
+ var index = _.indexOf(this.panel.rangeMaps, rangeMap);
+ this.panel.rangeMaps.splice(index, 1);
+ this.render();
+ };
+
+ addRangeMap() {
+ this.panel.rangeMaps.push({from: '', to: '', text: ''});
+ }
+
link(scope, elem, attrs, ctrl) {
var $location = this.$location;
var linkSrv = this.linkSrv;
diff --git a/public/app/plugins/panel/singlestat/specs/singlestat-specs.ts b/public/app/plugins/panel/singlestat/specs/singlestat-specs.ts
index dc85454b64a..3d6c565443b 100644
--- a/public/app/plugins/panel/singlestat/specs/singlestat-specs.ts
+++ b/public/app/plugins/panel/singlestat/specs/singlestat-specs.ts
@@ -84,4 +84,29 @@ describe('SingleStatCtrl', function() {
expect(ctx.data.valueFormated).to.be('OK');
});
});
+
+ singleStatScenario('When range to text mapping is specifiedfor first range', function(ctx) {
+ ctx.setup(function() {
+ ctx.datapoints = [[41,50]];
+ ctx.ctrl.panel.mappingType = 2;
+ ctx.ctrl.panel.rangeMaps = [{from: '10', to: '50', text: 'OK'},{from: '51', to: '100', text: 'NOT OK'}];
+ });
+
+ it('Should replace value with text OK', function() {
+ expect(ctx.data.valueFormated).to.be('OK');
+ });
+ });
+
+ singleStatScenario('When range to text mapping is specified for other ranges', function(ctx) {
+ ctx.setup(function() {
+ ctx.datapoints = [[65,75]];
+ ctx.ctrl.panel.mappingType = 2;
+ ctx.ctrl.panel.rangeMaps = [{from: '10', to: '50', text: 'OK'},{from: '51', to: '100', text: 'NOT OK'}];
+ });
+
+ it('Should replace value with text NOT OK', function() {
+ expect(ctx.data.valueFormated).to.be('NOT OK');
+ });
+ });
+
});