mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Revert "Revert "Merge branch 'utkarshcmu-rangeMaps'""
This reverts commit 58b91befde.
This commit is contained in:
@@ -204,35 +204,3 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="editor-row">
|
|
||||||
<div class="section" style="margin-bottom: 20px">
|
|
||||||
<div class="tight-form last">
|
|
||||||
<ul class="tight-form-list">
|
|
||||||
<li class="tight-form-item">
|
|
||||||
<strong>Value to text mapping</strong>
|
|
||||||
</li>
|
|
||||||
<li class="tight-form-item" ng-repeat-start="map in ctrl.panel.valueMaps">
|
|
||||||
<i class="fa fa-remove pointer" ng-click="ctrl.removeValueMap(map)"></i>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<input type="text" ng-model="map.value" placeholder="value" class="input-mini tight-form-input" ng-blur="ctrl.render()">
|
|
||||||
</li>
|
|
||||||
<li class="tight-form-item">
|
|
||||||
<i class="fa fa-arrow-right"></i>
|
|
||||||
</li>
|
|
||||||
<li ng-repeat-end>
|
|
||||||
<input type="text" placeholder="text" ng-model="map.text" class="input-mini tight-form-input" ng-blur="ctrl.render()">
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li>
|
|
||||||
<a class="pointer tight-form-item last" ng-click="ctrl.addValueMap();">
|
|
||||||
<i class="fa fa-plus"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
<div class="clearfix"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|||||||
58
public/app/plugins/panel/singlestat/mappings.html
Normal file
58
public/app/plugins/panel/singlestat/mappings.html
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<div class="editor-row">
|
||||||
|
<div class="gf-form-group">
|
||||||
|
<div class="gf-form">
|
||||||
|
<span class="gf-form-label">
|
||||||
|
Type
|
||||||
|
</span>
|
||||||
|
<div class="gf-form-select-wrapper">
|
||||||
|
<select class="gf-form-input" ng-model="ctrl.panel.mappingType"
|
||||||
|
ng-options="f.value as f.name for f in ctrl.panel.mappingTypes" ng-change="ctrl.render()"></select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="editor-row" ng-if="ctrl.panel.mappingType==1">
|
||||||
|
<h5 class="page-heading">Set valuea mappings</h5>
|
||||||
|
<div class="gf-form-group">
|
||||||
|
<div class="gf-form" ng-repeat="map in ctrl.panel.valueMaps">
|
||||||
|
<span class="gf-form-label">
|
||||||
|
<i class="fa fa-remove pointer" ng-click="ctrl.removeValueMap(map)"></i>
|
||||||
|
</span>
|
||||||
|
<input type="text" ng-model="map.value" placeholder="value" class="gf-form-input max-width-6" ng-blur="ctrl.render()">
|
||||||
|
<span class="gf-form-label">
|
||||||
|
<i class="fa fa-arrow-right"></i>
|
||||||
|
</span>
|
||||||
|
<input type="text" placeholder="text" ng-model="map.text" class="gf-form-input max-width-8" ng-blur="ctrl.render()">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="gf-form-button-row">
|
||||||
|
<button class="btn btn-inverse" ng-click="ctrl.addValueMap();">
|
||||||
|
<i class="fa fa-plus"></i>
|
||||||
|
Add a value mapping
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="editor-row" ng-if="ctrl.panel.mappingType==2">
|
||||||
|
<h5 class="page-heading">Set range mappings</h5>
|
||||||
|
<div class="gf-form-group">
|
||||||
|
<div class="gf-form" ng-repeat="rangeMap in ctrl.panel.rangeMaps">
|
||||||
|
<span class="gf-form-label">
|
||||||
|
<i class="fa fa-remove pointer" ng-click="ctrl.removeRangeMap(rangeMap)"></i>
|
||||||
|
</span>
|
||||||
|
<span class="gf-form-label">From</span>
|
||||||
|
<input type="text" ng-model="rangeMap.from" class="gf-form-input max-width-6" ng-blur="ctrl.render()">
|
||||||
|
<span class="gf-form-label">To</span>
|
||||||
|
<input type="text" ng-model="rangeMap.to" class="gf-form-input max-width-6" ng-blur="ctrl.render()">
|
||||||
|
<span class="gf-form-label">Text</span>
|
||||||
|
<input type="text" ng-model="rangeMap.text" class="gf-form-input max-width-8" ng-blur="ctrl.render()">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="gf-form-button-row">
|
||||||
|
<button class="btn btn-inverse" ng-click="ctrl.addRangeMap()">
|
||||||
|
<i class="fa fa-plus"></i>
|
||||||
|
Add a range mapping
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -35,6 +35,14 @@ class SingleStatCtrl extends MetricsPanelCtrl {
|
|||||||
valueMaps: [
|
valueMaps: [
|
||||||
{ value: 'null', op: '=', text: 'N/A' }
|
{ 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',
|
nullPointMode: 'connected',
|
||||||
valueName: 'avg',
|
valueName: 'avg',
|
||||||
prefixFontSize: '50%',
|
prefixFontSize: '50%',
|
||||||
@@ -73,6 +81,7 @@ class SingleStatCtrl extends MetricsPanelCtrl {
|
|||||||
onInitEditMode() {
|
onInitEditMode() {
|
||||||
this.fontSizes = ['20%', '30%','50%','70%','80%','100%', '110%', '120%', '150%', '170%', '200%'];
|
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('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();
|
this.unitFormats = kbn.getUnitFormats();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,23 +206,45 @@ class SingleStatCtrl extends MetricsPanelCtrl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// check value to text mappings
|
// check value to text mappings if its enabled
|
||||||
for (var i = 0; i < this.panel.valueMaps.length; i++) {
|
if (this.panel.mappingType === 1) {
|
||||||
var map = this.panel.valueMaps[i];
|
for (var i = 0; i < this.panel.valueMaps.length; i++) {
|
||||||
// special null case
|
var map = this.panel.valueMaps[i];
|
||||||
if (map.value === 'null') {
|
// special null case
|
||||||
if (data.value === null || data.value === void 0) {
|
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;
|
data.valueFormated = map.text;
|
||||||
return;
|
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
|
// value/number to range mapping
|
||||||
var value = parseFloat(map.value);
|
var from = parseFloat(map.from);
|
||||||
if (value === data.valueRounded) {
|
var to = parseFloat(map.to);
|
||||||
data.valueFormated = map.text;
|
if (to >= data.valueRounded && from <= data.valueRounded) {
|
||||||
return;
|
data.valueFormated = map.text;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,6 +263,16 @@ class SingleStatCtrl extends MetricsPanelCtrl {
|
|||||||
this.panel.valueMaps.push({value: '', op: '=', text: '' });
|
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) {
|
link(scope, elem, attrs, ctrl) {
|
||||||
var $location = this.$location;
|
var $location = this.$location;
|
||||||
var linkSrv = this.linkSrv;
|
var linkSrv = this.linkSrv;
|
||||||
|
|||||||
@@ -84,4 +84,29 @@ describe('SingleStatCtrl', function() {
|
|||||||
expect(ctx.data.valueFormated).to.be('OK');
|
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');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user