Browse Source

Merge remote-tracking branch 'origin/master' into asset-alarm-mgmt

pull/151/head
Andrew Shvayka 9 years ago
parent
commit
2435ca5d0f
  1. 2
      application/pom.xml
  2. 2
      common/data/pom.xml
  3. 2
      common/message/pom.xml
  4. 2
      common/pom.xml
  5. 2
      common/transport/pom.xml
  6. 2
      dao/pom.xml
  7. 2
      extensions-api/pom.xml
  8. 2
      extensions-core/pom.xml
  9. 2
      extensions/extension-kafka/pom.xml
  10. 2
      extensions/extension-rabbitmq/pom.xml
  11. 2
      extensions/extension-rest-api-call/pom.xml
  12. 2
      extensions/pom.xml
  13. 2
      pom.xml
  14. 2
      tools/pom.xml
  15. 2
      transport/coap/pom.xml
  16. 2
      transport/http/pom.xml
  17. 2
      transport/mqtt/pom.xml
  18. 2
      transport/pom.xml
  19. 2
      ui/package.json
  20. 2
      ui/pom.xml
  21. 20
      ui/src/app/api/subscription.js
  22. 4
      ui/src/app/components/datakey-config.directive.js
  23. 10
      ui/src/app/components/datakey-config.tpl.html
  24. 2
      ui/src/app/components/legend.directive.js
  25. 2
      ui/src/app/components/legend.tpl.html
  26. 14
      ui/src/app/components/widget-config.directive.js
  27. 3
      ui/src/app/dashboard/dashboard.controller.js
  28. 2
      ui/src/app/dashboard/dashboard.tpl.html
  29. 2
      ui/src/app/locale/locale.constant.js
  30. 31
      ui/src/app/widget/lib/analogue-linear-gauge.js
  31. 30
      ui/src/app/widget/lib/analogue-radial-gauge.js
  32. 9
      ui/src/app/widget/lib/canvas-digital-gauge.js
  33. 219
      ui/src/app/widget/lib/flot-widget.js

2
application/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>thingsboard</artifactId>
</parent>
<groupId>org.thingsboard</groupId>

2
common/data/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>common</artifactId>
</parent>
<groupId>org.thingsboard.common</groupId>

2
common/message/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>common</artifactId>
</parent>
<groupId>org.thingsboard.common</groupId>

2
common/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>thingsboard</artifactId>
</parent>
<groupId>org.thingsboard</groupId>

2
common/transport/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>common</artifactId>
</parent>
<groupId>org.thingsboard.common</groupId>

2
dao/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>thingsboard</artifactId>
</parent>
<groupId>org.thingsboard</groupId>

2
extensions-api/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>thingsboard</artifactId>
</parent>
<groupId>org.thingsboard</groupId>

2
extensions-core/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>thingsboard</artifactId>
</parent>
<groupId>org.thingsboard</groupId>

2
extensions/extension-kafka/pom.xml

@ -22,7 +22,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>extensions</artifactId>
</parent>
<groupId>org.thingsboard.extensions</groupId>

2
extensions/extension-rabbitmq/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>extensions</artifactId>
</parent>
<groupId>org.thingsboard.extensions</groupId>

2
extensions/extension-rest-api-call/pom.xml

@ -22,7 +22,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>extensions</artifactId>
</parent>
<groupId>org.thingsboard.extensions</groupId>

2
extensions/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>thingsboard</artifactId>
</parent>
<groupId>org.thingsboard</groupId>

2
pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.thingsboard</groupId>
<artifactId>thingsboard</artifactId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Thingsboard</name>

2
tools/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>thingsboard</artifactId>
</parent>
<groupId>org.thingsboard</groupId>

2
transport/coap/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>transport</artifactId>
</parent>
<groupId>org.thingsboard.transport</groupId>

2
transport/http/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>transport</artifactId>
</parent>
<groupId>org.thingsboard.transport</groupId>

2
transport/mqtt/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>transport</artifactId>
</parent>
<groupId>org.thingsboard.transport</groupId>

2
transport/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>thingsboard</artifactId>
</parent>
<groupId>org.thingsboard</groupId>

2
ui/package.json

@ -1,7 +1,7 @@
{
"name": "thingsboard",
"private": true,
"version": "1.2.3",
"version": "1.3.0",
"description": "Thingsboard UI",
"licenses": [
{

2
ui/pom.xml

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.thingsboard</groupId>
<version>1.2.3</version>
<version>1.3.0-SNAPSHOT</version>
<artifactId>thingsboard</artifactId>
</parent>
<groupId>org.thingsboard</groupId>

20
ui/src/app/api/subscription.js

@ -126,6 +126,7 @@ export default class Subscription {
dataKey: dataKey,
dataIndex: dataIndex++
};
legendKey.dataKey.hidden = false;
this.legendData.keys.push(legendKey);
var legendKeyData = {
min: null,
@ -146,11 +147,11 @@ export default class Subscription {
this.legendData.keys = this.ctx.$filter('orderBy')(this.legendData.keys, '+label');
registration = this.ctx.$scope.$watch(
function() {
return subscription.legendData.data;
return subscription.legendData.keys;
},
function (newValue, oldValue) {
for(var i = 0; i < newValue.length; i++) {
if(newValue[i].hidden != oldValue[i].hidden) {
if(newValue[i].dataKey.hidden != oldValue[i].dataKey.hidden) {
subscription.updateDataVisibility(i);
}
}
@ -307,7 +308,7 @@ export default class Subscription {
}
updateDataVisibility(index) {
var hidden = this.legendData.data[index].hidden;
var hidden = this.legendData.keys[index].dataKey.hidden;
if (hidden) {
this.hiddenData[index].data = this.data[index].data;
this.data[index].data = [];
@ -418,7 +419,7 @@ export default class Subscription {
this.notifyDataLoaded();
var update = true;
var currentData;
if (this.displayLegend && this.legendData.data[datasourceIndex + dataKeyIndex].hidden) {
if (this.displayLegend && this.legendData.keys[datasourceIndex + dataKeyIndex].dataKey.hidden) {
currentData = this.hiddenData[datasourceIndex + dataKeyIndex];
} else {
currentData = this.data[datasourceIndex + dataKeyIndex];
@ -445,18 +446,21 @@ export default class Subscription {
}
updateLegend(dataIndex, data, apply) {
var dataKey = this.legendData.keys[dataIndex].dataKey;
var decimals = angular.isDefined(dataKey.decimals) ? dataKey.decimals : this.decimals;
var units = dataKey.units && dataKey.units.length ? dataKey.units : this.units;
var legendKeyData = this.legendData.data[dataIndex];
if (this.legendConfig.showMin) {
legendKeyData.min = this.ctx.widgetUtils.formatValue(calculateMin(data), this.decimals, this.units);
legendKeyData.min = this.ctx.widgetUtils.formatValue(calculateMin(data), decimals, units);
}
if (this.legendConfig.showMax) {
legendKeyData.max = this.ctx.widgetUtils.formatValue(calculateMax(data), this.decimals, this.units);
legendKeyData.max = this.ctx.widgetUtils.formatValue(calculateMax(data), decimals, units);
}
if (this.legendConfig.showAvg) {
legendKeyData.avg = this.ctx.widgetUtils.formatValue(calculateAvg(data), this.decimals, this.units);
legendKeyData.avg = this.ctx.widgetUtils.formatValue(calculateAvg(data), decimals, units);
}
if (this.legendConfig.showTotal) {
legendKeyData.total = this.ctx.widgetUtils.formatValue(calculateTotal(data), this.decimals, this.units);
legendKeyData.total = this.ctx.widgetUtils.formatValue(calculateTotal(data), decimals, units);
}
this.callbacks.legendDataUpdated(this, apply !== false);
}

4
ui/src/app/components/datakey-config.directive.js

@ -76,6 +76,8 @@ function DatakeyConfig($compile, $templateCache, $q, types) {
scope.model.name = ngModelCtrl.$viewValue.name;
scope.model.label = ngModelCtrl.$viewValue.label;
scope.model.color = ngModelCtrl.$viewValue.color;
scope.model.units = ngModelCtrl.$viewValue.units;
scope.model.decimals = ngModelCtrl.$viewValue.decimals;
scope.model.funcBody = ngModelCtrl.$viewValue.funcBody;
scope.model.postFuncBody = ngModelCtrl.$viewValue.postFuncBody;
scope.model.usePostProcessing = scope.model.postFuncBody ? true : false;
@ -97,6 +99,8 @@ function DatakeyConfig($compile, $templateCache, $q, types) {
value.name = scope.model.name;
value.label = scope.model.label;
value.color = scope.model.color;
value.units = scope.model.units;
value.decimals = scope.model.decimals;
value.funcBody = scope.model.funcBody;
if (!scope.model.postFuncBody) {
delete value.postFuncBody;

10
ui/src/app/components/datakey-config.tpl.html

@ -48,6 +48,16 @@
md-color-history="false">
</div>
</div>
<div layout="row" layout-align="start center">
<md-input-container flex>
<label translate>datakey.units</label>
<input name="units" ng-model="model.units">
</md-input-container>
<md-input-container flex>
<label translate>datakey.decimals</label>
<input name="decimals" ng-model="model.decimals" type="number" min="0" max="15" step="1" ng-pattern="/^\d*$/">
</md-input-container>
</div>
<section layout="column" ng-if="model.type === types.dataKeyType.function">
<span translate>datakey.data-generation-func</span>
<br/>

2
ui/src/app/components/legend.directive.js

@ -45,7 +45,7 @@ function Legend($compile, $templateCache, types) {
scope.legendConfig.position === types.position.top.value;
scope.toggleHideData = function(index) {
scope.legendData.data[index].hidden = !scope.legendData.data[index].hidden;
scope.legendData.keys[index].dataKey.hidden = !scope.legendData.keys[index].dataKey.hidden;
}
$compile(element.contents())(scope);

2
ui/src/app/components/legend.tpl.html

@ -30,7 +30,7 @@
<td><span class="tb-legend-line" ng-style="{backgroundColor: legendKey.dataKey.color}"></span></td>
<td class="tb-legend-label"
ng-click="toggleHideData(legendKey.dataIndex)"
ng-class="{ 'tb-hidden-label': legendData.data[legendKey.dataIndex].hidden, 'tb-horizontal': isHorizontal }">
ng-class="{ 'tb-hidden-label': legendData.keys[legendKey.dataIndex].dataKey.hidden, 'tb-horizontal': isHorizontal }">
{{ legendKey.dataKey.label }}
</td>
<td class="tb-legend-value" ng-if="legendConfig.showMin === true">{{ legendData.data[legendKey.dataIndex].min }}</td>

14
ui/src/app/components/widget-config.directive.js

@ -355,10 +355,10 @@ function WidgetConfig($compile, $templateCache, $rootScope, $timeout, types, uti
var matches = false;
do {
matches = false;
if (value.datasources) {
for (var d in value.datasources) {
var datasource = value.datasources[d];
for (var k in datasource.dataKeys) {
if (value.config.datasources) {
for (var d=0;d<value.config.datasources.length;d++) {
var datasource = value.config.datasources[d];
for (var k=0;k<datasource.dataKeys.length;k++) {
var dataKey = datasource.dataKeys[k];
if (dataKey.label === label) {
i++;
@ -375,9 +375,9 @@ function WidgetConfig($compile, $templateCache, $rootScope, $timeout, types, uti
scope.genNextColor = function () {
var i = 0;
var value = ngModelCtrl.$viewValue;
if (value.datasources) {
for (var d in value.datasources) {
var datasource = value.datasources[d];
if (value.config.datasources) {
for (var d=0;d<value.config.datasources.length;d++) {
var datasource = value.config.datasources[d];
i += datasource.dataKeys.length;
}
}

3
ui/src/app/dashboard/dashboard.controller.js

@ -983,8 +983,11 @@ export default function DashboardController(types, dashboardUtils, widgetService
if (revert) {
vm.dashboard = vm.prevDashboard;
vm.dashboardConfiguration = vm.dashboard.configuration;
vm.dashboardCtx.dashboardTimewindow = vm.dashboardConfiguration.timewindow;
openDashboardState(vm.prevDashboardState);
entityAliasesUpdated();
} else {
vm.dashboard.configuration.timewindow = vm.dashboardCtx.dashboardTimewindow;
}
}
}

2
ui/src/app/dashboard/dashboard.tpl.html

@ -63,7 +63,7 @@
is-toolbar
direction="left"
tooltip-direction="bottom" aggregation
ng-model="vm.dashboardConfiguration.timewindow">
ng-model="vm.dashboardCtx.dashboardTimewindow">
</tb-timewindow>
<tb-aliases-entity-select ng-show="!vm.isEdit && vm.displayEntitiesSelect()"
tooltip-direction="bottom"

2
ui/src/app/locale/locale.constant.js

@ -385,6 +385,8 @@ export default angular.module('thingsboard.locale', [])
"advanced": "Advanced",
"label": "Label",
"color": "Color",
"units": "Special symbol to show next to value",
"decimals": "Number of digits after floating point",
"data-generation-func": "Data generation function",
"use-data-post-processing-func": "Use data post-processing function",
"configuration": "Data key configuration",

31
ui/src/app/widget/lib/analogue-linear-gauge.js

@ -41,8 +41,7 @@ export default class TbAnalogueLinearGauge {
var valueInt = settings.valueInt || 3;
var valueDec = (angular.isDefined(settings.valueDec) && settings.valueDec !== null)
? settings.valueDec : ctx.decimals;
var valueDec = getValueDec(settings);
step = parseFloat(parseFloat(step).toFixed(valueDec));
@ -74,6 +73,32 @@ export default class TbAnalogueLinearGauge {
var progressColorStart = tinycolor(keyColor).setAlpha(0.05).toRgbString();
var progressColorEnd = tinycolor(keyColor).darken().toRgbString();
function getUnits(settings) {
var dataKey;
if (ctx.data && ctx.data[0]) {
dataKey = ctx.data[0].dataKey;
}
if (dataKey && dataKey.units && dataKey.units.length) {
return dataKey.units;
} else {
return angular.isDefined(settings.units) && settings.units.length > 0 ? settings.units : ctx.units;
}
}
function getValueDec(settings) {
var dataKey;
if (ctx.data && ctx.data[0]) {
dataKey = ctx.data[0].dataKey;
}
if (dataKey && angular.isDefined(dataKey.decimals)) {
return dataKey.decimals;
} else {
return (angular.isDefined(settings.valueDec) && settings.valueDec !== null)
? settings.valueDec : ctx.decimals;
}
}
function getFontFamily(fontSettings) {
var family = fontSettings && fontSettings.family ? fontSettings.family : 'Roboto';
if (family === 'RobotoDraft') {
@ -92,7 +117,7 @@ export default class TbAnalogueLinearGauge {
maxValue: maxValue,
majorTicks: majorTicks,
minorTicks: settings.minorTicks || 2,
units: angular.isDefined(settings.units) && settings.units.length > 0 ? settings.units : ctx.units,
units: getUnits(settings),
title: ((settings.showUnitTitle !== false) ?
(settings.unitTitle && settings.unitTitle.length > 0 ?
settings.unitTitle : dataKey.label) : ''),

30
ui/src/app/widget/lib/analogue-radial-gauge.js

@ -42,8 +42,7 @@ export default class TbAnalogueRadialGauge {
var valueInt = settings.valueInt || 3;
var valueDec = (angular.isDefined(settings.valueDec) && settings.valueDec !== null)
? settings.valueDec : ctx.decimals;
var valueDec = getValueDec(settings);
step = parseFloat(parseFloat(step).toFixed(valueDec));
@ -71,6 +70,31 @@ export default class TbAnalogueRadialGauge {
var colorNumbers = tinycolor(keyColor).darken(20).toRgbString();
function getUnits(settings) {
var dataKey;
if (ctx.data && ctx.data[0]) {
dataKey = ctx.data[0].dataKey;
}
if (dataKey && dataKey.units && dataKey.units.length) {
return dataKey.units;
} else {
return angular.isDefined(settings.units) && settings.units.length > 0 ? settings.units : ctx.units;
}
}
function getValueDec(settings) {
var dataKey;
if (ctx.data && ctx.data[0]) {
dataKey = ctx.data[0].dataKey;
}
if (dataKey && angular.isDefined(dataKey.decimals)) {
return dataKey.decimals;
} else {
return (angular.isDefined(settings.valueDec) && settings.valueDec !== null)
? settings.valueDec : ctx.decimals;
}
}
function getFontFamily(fontSettings) {
var family = fontSettings && fontSettings.family ? fontSettings.family : 'Roboto';
if (family === 'RobotoDraft') {
@ -89,7 +113,7 @@ export default class TbAnalogueRadialGauge {
maxValue: maxValue,
majorTicks: majorTicks,
minorTicks: settings.minorTicks || 2,
units: angular.isDefined(settings.units) && settings.units.length > 0 ? settings.units : ctx.units,
units: getUnits(settings),
title: ((settings.showUnitTitle !== false) ?
(settings.unitTitle && settings.unitTitle.length > 0 ?
settings.unitTitle : dataKey.label) : ''),

9
ui/src/app/widget/lib/canvas-digital-gauge.js

@ -54,10 +54,13 @@ export default class TbCanvasDigitalGauge {
this.localSettings.levelColors = settings.levelColors.slice();
}
this.localSettings.decimals = (angular.isDefined(settings.decimals) && settings.decimals !== null)
? settings.decimals : ctx.decimals;
this.localSettings.decimals = angular.isDefined(dataKey.decimals) ? dataKey.decimals :
((angular.isDefined(settings.decimals) && settings.decimals !== null)
? settings.decimals : ctx.decimals);
this.localSettings.units = dataKey.units && dataKey.units.length ? dataKey.units :
(angular.isDefined(settings.units) && settings.units.length > 0 ? settings.units : ctx.units);
this.localSettings.units = angular.isDefined(settings.units) && settings.units.length > 0 ? settings.units : ctx.units;
this.localSettings.hideValue = settings.showValue !== true;
this.localSettings.hideMinMax = settings.showMinMax !== true;

219
ui/src/app/widget/lib/flot-widget.js

@ -104,8 +104,10 @@ export default class TbFlot {
if (this.chartType === 'pie') {
ctx.tooltipFormatter = function(item) {
var units = item.series.dataKey.units && item.series.dataKey.units.length ? item.series.dataKey.units : tbFlot.ctx.trackUnits;
var decimals = angular.isDefined(item.series.dataKey.decimals) ? item.series.dataKey.decimals : tbFlot.ctx.trackDecimals;
var divElement = seriesInfoDiv(item.series.dataKey.label, item.series.dataKey.color,
item.datapoint[1][0][1], tbFlot.ctx.trackUnits, tbFlot.ctx.trackDecimals, true, item.series.percent);
item.datapoint[1][0][1], units, decimals, true, item.series.percent);
return divElement.prop('outerHTML');
};
} else {
@ -127,18 +129,19 @@ export default class TbFlot {
if (tbFlot.ctx.tooltipIndividual && seriesHoverInfo.index !== seriesIndex) {
continue;
}
var units = seriesHoverInfo.units && seriesHoverInfo.units.length ? seriesHoverInfo.units : tbFlot.ctx.trackUnits;
var decimals = angular.isDefined(seriesHoverInfo.decimals) ? seriesHoverInfo.decimals : tbFlot.ctx.trackDecimals;
var divElement = seriesInfoDiv(seriesHoverInfo.label, seriesHoverInfo.color,
seriesHoverInfo.value, tbFlot.ctx.trackUnits, tbFlot.ctx.trackDecimals, seriesHoverInfo.index === seriesIndex);
seriesHoverInfo.value, units, decimals, seriesHoverInfo.index === seriesIndex);
content += divElement.prop('outerHTML');
}
return content;
};
}
ctx.trackDecimals = angular.isDefined(settings.decimals) ?
settings.decimals : ctx.decimals;
ctx.trackDecimals = ctx.decimals;
ctx.trackUnits = angular.isDefined(settings.units) ? settings.units : ctx.units;
ctx.trackUnits = ctx.units;
ctx.tooltipIndividual = this.chartType === 'pie' || (angular.isDefined(settings.tooltipIndividual) ? settings.tooltipIndividual : false);
ctx.tooltipCumulative = angular.isDefined(settings.tooltipCumulative) ? settings.tooltipCumulative : false;
@ -172,7 +175,7 @@ export default class TbFlot {
font: angular.copy(font),
labelFont: angular.copy(font)
};
options.yaxis = {
this.yaxis = {
font: angular.copy(font),
labelFont: angular.copy(font)
};
@ -188,32 +191,33 @@ export default class TbFlot {
options.xaxis.labelFont.size = options.xaxis.font.size+2;
options.xaxis.labelFont.weight = "bold";
}
if (settings.yaxis) {
ctx.yAxisTickFormatter = function(value/*, axis*/) {
if (settings.yaxis.showLabels === false) {
options.yaxis.tickFormatter = function() {
return '';
};
} else if (ctx.trackUnits && ctx.trackUnits.length > 0) {
options.yaxis.tickFormatter = function(value, axis) {
var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1,
formatted = "" + Math.round(value * factor) / factor;
if (axis.tickDecimals != null) {
var decimal = formatted.indexOf("."),
precision = decimal === -1 ? 0 : formatted.length - decimal - 1;
if (precision < axis.tickDecimals) {
formatted = (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision);
}
}
formatted += ' ' + tbFlot.ctx.trackUnits;
return formatted;
};
return '';
}
var factor = this.tickDecimals ? Math.pow(10, this.tickDecimals) : 1,
formatted = "" + Math.round(value * factor) / factor;
if (this.tickDecimals != null) {
var decimal = formatted.indexOf("."),
precision = decimal === -1 ? 0 : formatted.length - decimal - 1;
if (precision < this.tickDecimals) {
formatted = (precision ? formatted : formatted + ".") + ("" + factor).substr(1, this.tickDecimals - precision);
}
}
options.yaxis.font.color = settings.yaxis.color || options.yaxis.font.color;
options.yaxis.label = settings.yaxis.title || null;
options.yaxis.labelFont.color = options.yaxis.font.color;
options.yaxis.labelFont.size = options.yaxis.font.size+2;
options.yaxis.labelFont.weight = "bold";
formatted += ' ' + this.tickUnits;
return formatted;
}
this.yaxis.tickFormatter = ctx.yAxisTickFormatter;
if (settings.yaxis) {
this.yaxis.font.color = settings.yaxis.color || this.yaxis.font.color;
this.yaxis.label = settings.yaxis.title || null;
this.yaxis.labelFont.color = this.yaxis.font.color;
this.yaxis.labelFont.size = this.yaxis.font.size+2;
this.yaxis.labelFont.weight = "bold";
}
options.grid.borderWidth = 1;
@ -229,7 +233,7 @@ export default class TbFlot {
options.xaxis.tickLength = 0;
}
if (settings.grid.horizontalLines === false) {
options.yaxis.tickLength = 0;
this.yaxis.tickLength = 0;
}
}
@ -311,6 +315,8 @@ export default class TbFlot {
this.subscription = subscription;
this.$element = $element;
var colors = [];
this.yaxes = [];
var yaxesMap = {};
for (var i = 0; i < this.subscription.data.length; i++) {
var series = this.subscription.data[i];
colors.push(series.dataKey.color);
@ -342,8 +348,29 @@ export default class TbFlot {
series.highlightColor = lineColor.toRgbString();
if (this.yaxis) {
var units = series.dataKey.units && series.dataKey.units.length ? series.dataKey.units : this.ctx.trackUnits;
var yaxis;
if (keySettings.showSeparateAxis) {
yaxis = this.createYAxis(keySettings, units);
this.yaxes.push(yaxis);
} else {
yaxis = yaxesMap[units];
if (!yaxis) {
yaxis = this.createYAxis(keySettings, units);
yaxesMap[units] = yaxis;
this.yaxes.push(yaxis);
}
}
series.yaxisIndex = this.yaxes.indexOf(yaxis);
series.yaxis = series.yaxisIndex+1;
yaxis.keysInfo[i] = {hidden: false};
yaxis.hidden = false;
}
}
this.options.colors = colors;
this.options.yaxes = angular.copy(this.yaxes);
if (this.chartType === 'line' || this.chartType === 'bar') {
if (this.chartType === 'bar') {
this.options.series.bars.barWidth = this.subscription.timeWindow.interval * 0.6;
@ -373,6 +400,23 @@ export default class TbFlot {
}
}
createYAxis(keySettings, units) {
var yaxis = angular.copy(this.yaxis);
var label = keySettings.axisTitle && keySettings.axisTitle.length ? keySettings.axisTitle : yaxis.label;
var tickDecimals = angular.isDefined(keySettings.axisTickDecimals) ? keySettings.axisTickDecimals : 0;
var position = keySettings.axisPosition && keySettings.axisPosition.length ? keySettings.axisPosition : "left";
yaxis.label = label;
yaxis.tickUnits = units;
yaxis.tickDecimals = tickDecimals;
yaxis.alignTicksWithAxis = position == "right" ? 1 : null;
yaxis.position = position;
yaxis.keysInfo = [];
return yaxis;
}
update() {
if (this.updateTimeoutHandle) {
this.ctx.$scope.$timeout.cancel(this.updateTimeoutHandle);
@ -381,17 +425,64 @@ export default class TbFlot {
if (this.subscription) {
if (!this.isMouseInteraction && this.ctx.plot) {
if (this.chartType === 'line' || this.chartType === 'bar') {
var axisVisibilityChanged = false;
if (this.yaxis) {
for (var i = 0; i < this.subscription.data.length; i++) {
var series = this.subscription.data[i];
var yaxisIndex = series.yaxisIndex;
if (this.yaxes[yaxisIndex].keysInfo[i].hidden != series.dataKey.hidden) {
this.yaxes[yaxisIndex].keysInfo[i].hidden = series.dataKey.hidden;
axisVisibilityChanged = true;
}
}
if (axisVisibilityChanged) {
this.options.yaxes.length = 0;
for (var y = 0; y < this.yaxes.length; y++) {
var yaxis = this.yaxes[y];
var hidden = true;
for (var k = 0; k < yaxis.keysInfo.length; k++) {
if (yaxis.keysInfo[k]) {
hidden = hidden && yaxis.keysInfo[k].hidden;
}
}
yaxis.hidden = hidden
var newIndex = -1;
if (!yaxis.hidden) {
this.options.yaxes.push(yaxis);
newIndex = this.options.yaxes.length;
}
for (k = 0; k < yaxis.keysInfo.length; k++) {
if (yaxis.keysInfo[k]) {
this.subscription.data[k].yaxis = newIndex;
}
}
}
this.options.yaxis = {
show: this.options.yaxes.length ? true : false
};
}
}
this.options.xaxis.min = this.subscription.timeWindow.minTime;
this.options.xaxis.max = this.subscription.timeWindow.maxTime;
this.ctx.plot.getOptions().xaxes[0].min = this.subscription.timeWindow.minTime;
this.ctx.plot.getOptions().xaxes[0].max = this.subscription.timeWindow.maxTime;
if (this.chartType === 'bar') {
this.options.series.bars.barWidth = this.subscription.timeWindow.interval * 0.6;
this.ctx.plot.getOptions().series.bars.barWidth = this.subscription.timeWindow.interval * 0.6;
}
this.ctx.plot.setData(this.subscription.data);
this.ctx.plot.setupGrid();
this.ctx.plot.draw();
if (axisVisibilityChanged) {
this.redrawPlot();
} else {
this.ctx.plot.getOptions().xaxes[0].min = this.subscription.timeWindow.minTime;
this.ctx.plot.getOptions().xaxes[0].max = this.subscription.timeWindow.maxTime;
if (this.chartType === 'bar') {
this.ctx.plot.getOptions().series.bars.barWidth = this.subscription.timeWindow.interval * 0.6;
}
this.ctx.plot.setData(this.subscription.data);
this.ctx.plot.setupGrid();
this.ctx.plot.draw();
}
} else if (this.chartType === 'pie') {
if (this.ctx.animatedPie) {
this.nextPieDataAnimation(true);
@ -720,6 +811,26 @@ export default class TbFlot {
"title": "Show points",
"type": "boolean",
"default": false
},
"showSeparateAxis": {
"title": "Show separate axis",
"type": "boolean",
"default": false
},
"axisTitle": {
"title": "Axis title",
"type": "string",
"default": ""
},
"axisTickDecimals": {
"title": "Axis tick number of digits after floating point",
"type": "number",
"default": 0
},
"axisPosition": {
"title": "Axis position",
"type": "string",
"default": "left"
}
},
"required": ["showLines", "fillLines", "showPoints"]
@ -727,7 +838,26 @@ export default class TbFlot {
"form": [
"showLines",
"fillLines",
"showPoints"
"showPoints",
"showSeparateAxis",
"axisTitle",
"axisTickDecimals",
{
"key": "axisPosition",
"type": "rc-select",
"multiple": false,
"items": [
{
"value": "left",
"label": "Left"
},
{
"value": "right",
"label": "Right"
}
]
}
]
}
}
@ -754,6 +884,17 @@ export default class TbFlot {
}
}
redrawPlot() {
if (this.ctx.plot) {
this.ctx.plot.destroy();
if (this.chartType === 'pie' && this.ctx.animatedPie) {
this.ctx.plot = $.plot(this.$element, this.pieData, this.options);
} else {
this.ctx.plot = $.plot(this.$element, this.subscription.data, this.options);
}
}
}
destroy() {
if (this.ctx.plot) {
this.ctx.plot.destroy();
@ -968,6 +1109,8 @@ export default class TbFlot {
hoverIndex: hoverIndex,
color: series.dataKey.color,
label: series.dataKey.label,
units: series.dataKey.units,
decimals: series.dataKey.decimals,
time: pointTime,
distance: hoverDistance,
index: i

Loading…
Cancel
Save