Merge pull request #362 from Terny22/analogue-compass-widget
Added new analogue compass widget
This commit is contained in:
commit
99923be034
@ -68,6 +68,22 @@
|
||||
"dataKeySettingsSchema": "{}\n",
|
||||
"defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temperature\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"maxValue\":60,\"startAngle\":67.5,\"ticksAngle\":225,\"showBorder\":true,\"defaultColor\":\"#e65100\",\"needleCircleSize\":7,\"highlights\":[{\"from\":-60,\"to\":-50,\"color\":\"#42a5f5\"},{\"from\":-50,\"to\":-40,\"color\":\"rgba(66, 165, 245, 0.83)\"},{\"from\":-40,\"to\":-30,\"color\":\"rgba(66, 165, 245, 0.66)\"},{\"from\":-30,\"to\":-20,\"color\":\"rgba(66, 165, 245, 0.5)\"},{\"from\":-20,\"to\":-10,\"color\":\"rgba(66, 165, 245, 0.33)\"},{\"from\":-10,\"to\":0,\"color\":\"rgba(66, 165, 245, 0.16)\"},{\"from\":0,\"to\":10,\"color\":\"rgba(229, 115, 115, 0.16)\"},{\"from\":10,\"to\":20,\"color\":\"rgba(229, 115, 115, 0.33)\"},{\"from\":20,\"to\":30,\"color\":\"rgba(229, 115, 115, 0.5)\"},{\"from\":30,\"to\":40,\"color\":\"rgba(229, 115, 115, 0.66)\"},{\"from\":40,\"to\":50,\"color\":\"rgba(229, 115, 115, 0.83)\"},{\"from\":50,\"to\":60,\"color\":\"#e57373\"}],\"showUnitTitle\":true,\"colorPlate\":\"#cfd8dc\",\"colorMajorTicks\":\"#444\",\"colorMinorTicks\":\"#666\",\"minorTicks\":2,\"valueInt\":3,\"valueDec\":1,\"highlightsWidth\":15,\"valueBox\":true,\"animation\":true,\"animationDuration\":1000,\"animationRule\":\"bounce\",\"colorNeedleShadowUp\":\"rgba(2, 255, 255, 0)\",\"colorNeedleShadowDown\":\"rgba(188, 143, 143, 0.78)\",\"units\":\"°C\",\"majorTicksCount\":12,\"numbersFont\":{\"family\":\"Roboto\",\"size\":20,\"style\":\"normal\",\"weight\":\"normal\",\"color\":\"#263238\"},\"titleFont\":{\"family\":\"Roboto\",\"size\":24,\"style\":\"normal\",\"weight\":\"normal\",\"color\":\"#263238\"},\"unitsFont\":{\"family\":\"Roboto\",\"size\":28,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#616161\"},\"valueFont\":{\"family\":\"Segment7Standard\",\"size\":30,\"style\":\"normal\",\"weight\":\"normal\",\"shadowColor\":\"rgba(0, 0, 0, 0.49)\",\"color\":\"#444\"},\"colorValueBoxRect\":\"#888\",\"colorValueBoxRectEnd\":\"#666\",\"colorValueBoxBackground\":\"#babab2\",\"colorValueBoxShadow\":\"rgba(0,0,0,1)\",\"unitTitle\":\"Temperature\",\"minValue\":-60},\"title\":\"Temperature radial gauge - Canvas Gauges\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400}}"
|
||||
}
|
||||
},
|
||||
{
|
||||
"alias": "analogue_compass",
|
||||
"name": "Analogue Compass",
|
||||
"descriptor": {
|
||||
"type": "latest",
|
||||
"sizeX": 6,
|
||||
"sizeY": 5,
|
||||
"resources": [],
|
||||
"templateHtml": "<canvas id=\"compass\"></canvas>",
|
||||
"templateCss": "",
|
||||
"controllerScript": "self.onInit = function() {\n self.ctx.gauge = new TbAnalogueCompass(self.ctx, 'compass');\n}\n\nself.onDataUpdated = function() {\n self.ctx.gauge.update();\n}\n\nself.onResize = function() {\n self.ctx.gauge.resize();\n}\n\nself.onMobileModeChanged = function() {\n self.ctx.gauge.mobileModeChanged();\n}\n\nself.getSettingsSchema = function() {\n return TbAnalogueCompass.settingsSchema;\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1\n };\n}\n\nself.onDestroy = function() {\n}\n",
|
||||
"settingsSchema": "{}",
|
||||
"dataKeySettingsSchema": "{}\n",
|
||||
"defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"minorTicks\":22,\"needleCircleSize\":15,\"showBorder\":true,\"borderOuterWidth\":10,\"colorPlate\":\"#222\",\"colorMajorTicks\":\"#f5f5f5\",\"colorMinorTicks\":\"#ddd\",\"colorNeedle\":\"#f08080\",\"colorNeedleCircle\":\"#e8e8e8\",\"colorBorder\":\"#ccc\",\"majorTickFont\":{\"family\":\"Roboto\",\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#ccc\"},\"animation\":true,\"animationDuration\":500,\"animationRule\":\"cycle\",\"animationTarget\":\"needle\",\"majorTicks\":[\"N\",\"NE\",\"E\",\"SE\",\"S\",\"SW\",\"W\",\"NW\"]},\"title\":\"Analogue Compass\",\"dropShadow\":true,\"enableFullscreen\":true,\"widgetStyle\":{},\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{}}"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -27,6 +27,7 @@ import thingsboardRpcWidgets from '../widget/lib/rpc';
|
||||
import TbFlot from '../widget/lib/flot-widget';
|
||||
import TbAnalogueLinearGauge from '../widget/lib/analogue-linear-gauge';
|
||||
import TbAnalogueRadialGauge from '../widget/lib/analogue-radial-gauge';
|
||||
import TbAnalogueCompass from '../widget/lib/analogue-compass';
|
||||
import TbCanvasDigitalGauge from '../widget/lib/canvas-digital-gauge';
|
||||
import TbMapWidget from '../widget/lib/map-widget';
|
||||
import TbMapWidgetV2 from '../widget/lib/map-widget2';
|
||||
@ -57,6 +58,7 @@ function WidgetService($rootScope, $http, $q, $filter, $ocLazyLoad, $window, $tr
|
||||
$window.TbFlot = TbFlot;
|
||||
$window.TbAnalogueLinearGauge = TbAnalogueLinearGauge;
|
||||
$window.TbAnalogueRadialGauge = TbAnalogueRadialGauge;
|
||||
$window.TbAnalogueCompass = TbAnalogueCompass;
|
||||
$window.TbCanvasDigitalGauge = TbCanvasDigitalGauge;
|
||||
$window.TbMapWidget = TbMapWidget;
|
||||
$window.TbMapWidgetV2 = TbMapWidgetV2;
|
||||
|
||||
438
ui/src/app/widget/lib/analogue-compass.js
Normal file
438
ui/src/app/widget/lib/analogue-compass.js
Normal file
@ -0,0 +1,438 @@
|
||||
/*
|
||||
* Copyright © 2016-2017 The Thingsboard Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import $ from 'jquery';
|
||||
import canvasGauges from 'canvas-gauges';
|
||||
/*import tinycolor from 'tinycolor2';*/
|
||||
|
||||
export default class TbAnalogueCompass {
|
||||
constructor(ctx, canvasId) {
|
||||
this.ctx = ctx;
|
||||
|
||||
canvasGauges.performance = window.performance; // eslint-disable-line no-undef, angular/window-service
|
||||
|
||||
var gaugeElement = $('#'+canvasId, ctx.$container);
|
||||
|
||||
var settings = ctx.settings;
|
||||
var majorTicks = (settings.majorTicks && settings.majorTicks.length > 0) ? angular.copy(settings.majorTicks) : ["N","NE","E","SE","S","SW","W","NW"];
|
||||
majorTicks.push(majorTicks[0]);
|
||||
|
||||
function getFontFamily(fontSettings) {
|
||||
var family = fontSettings && fontSettings.family ? fontSettings.family : 'Roboto';
|
||||
if (family === 'RobotoDraft') {
|
||||
family = 'Roboto';
|
||||
}
|
||||
return family;
|
||||
}
|
||||
|
||||
var gaugeData = {
|
||||
|
||||
renderTo: gaugeElement[0],
|
||||
|
||||
// Generic options
|
||||
minValue: 0,
|
||||
maxValue: 360,
|
||||
majorTicks: majorTicks,
|
||||
minorTicks: settings.minorTicks || 22,
|
||||
ticksAngle: 360,
|
||||
startAngle: 180,
|
||||
strokeTicks: settings.showStrokeTicks || false,
|
||||
highlights: false,
|
||||
valueBox: false,
|
||||
|
||||
//needle
|
||||
needleCircleSize: settings.needleCircleSize || 15,
|
||||
needleType: 'line',
|
||||
needleStart: 75,
|
||||
needleEnd: 99,
|
||||
needleWidth: 3,
|
||||
needleCircleOuter: false,
|
||||
|
||||
//borders
|
||||
borders: settings.showBorder || false,
|
||||
borderInnerWidth: 0,
|
||||
borderMiddleWidth: 0,
|
||||
borderOuterWidth: settings.borderOuterWidth || 10,
|
||||
borderShadowWidth: 0,
|
||||
|
||||
//colors
|
||||
colorPlate: settings.colorPlate || '#222',
|
||||
colorMajorTicks: settings.colorMajorTicks || '#f5f5f5',
|
||||
colorMinorTicks: settings.colorMinorTicks || '#ddd',
|
||||
colorNeedle: settings.colorNeedle || '#f08080',
|
||||
colorNeedleEnd: settings.colorNeedle || '#f08080',
|
||||
colorNeedleCircleInner: settings.colorNeedleCircle || '#e8e8e8',
|
||||
colorNeedleCircleInnerEnd: settings.colorNeedleCircle || '#e8e8e8',
|
||||
colorBorderOuter: settings.colorBorder || '#ccc',
|
||||
colorBorderOuterEnd: settings.colorBorder || '#ccc',
|
||||
colorNeedleShadowDown: "#222",
|
||||
|
||||
//fonts
|
||||
fontNumbers: getFontFamily(settings.majorTickFont),
|
||||
fontNumbersSize: settings.majorTickFont && settings.majorTickFont.size ? settings.majorTickFont.size : 20,
|
||||
fontNumbersStyle: settings.majorTickFont && settings.majorTickFont.style ? settings.majorTickFont.style : 'normal',
|
||||
fontNumbersWeight: settings.majorTickFont && settings.majorTickFont.weight ? settings.majorTickFont.weight : '500',
|
||||
colorNumbers: settings.majorTickFont && settings.majorTickFont.color ? settings.majorTickFont.color : '#ccc',
|
||||
|
||||
//animations
|
||||
animation: settings.animation !== false && !ctx.isMobile,
|
||||
animationDuration: (angular.isDefined(settings.animationDuration) && settings.animationDuration !== null) ? settings.animationDuration : 500,
|
||||
animationRule: settings.animationRule || 'cycle',
|
||||
animationTarget: settings.animationTarget || 'needle'
|
||||
};
|
||||
this.gauge = new canvasGauges.RadialGauge(gaugeData).draw();
|
||||
}
|
||||
|
||||
update() {
|
||||
if (this.ctx.data.length > 0) {
|
||||
var cellData = this.ctx.data[0];
|
||||
if (cellData.data.length > 0) {
|
||||
var tvPair = cellData.data[cellData.data.length -
|
||||
1];
|
||||
var value = tvPair[1];
|
||||
this.gauge.value = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mobileModeChanged() {
|
||||
var animation = this.ctx.settings.animation !== false && !this.ctx.isMobile;
|
||||
this.gauge.update({animation: animation});
|
||||
}
|
||||
|
||||
resize() {
|
||||
this.gauge.update({width: this.ctx.width, height: this.ctx.height});
|
||||
}
|
||||
|
||||
static get settingsSchema() {
|
||||
return {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"title": "Settings",
|
||||
"properties": {
|
||||
"majorTicks": {
|
||||
"title": "Major ticks names",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"title": "Tick name",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"minorTicks": {
|
||||
"title": "Minor ticks count",
|
||||
"type": "number",
|
||||
"default": 22
|
||||
},
|
||||
"showStrokeTicks": {
|
||||
"title": "Show ticks stroke",
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"needleCircleSize": {
|
||||
"title": "Needle circle size",
|
||||
"type": "number",
|
||||
"default": 15
|
||||
},
|
||||
"showBorder": {
|
||||
"title": "Show border",
|
||||
"type": "boolean",
|
||||
"default": true
|
||||
},
|
||||
"borderOuterWidth": {
|
||||
"title": "Border width",
|
||||
"type": "number",
|
||||
"default": 10
|
||||
},
|
||||
"colorPlate": {
|
||||
"title": "Plate color",
|
||||
"type": "string",
|
||||
"default": "#222"
|
||||
},
|
||||
"colorMajorTicks": {
|
||||
"title": "Major ticks color",
|
||||
"type": "string",
|
||||
"default": "#f5f5f5"
|
||||
},
|
||||
"colorMinorTicks": {
|
||||
"title": "Minor ticks color",
|
||||
"type": "string",
|
||||
"default": "#ddd"
|
||||
},
|
||||
"colorNeedle": {
|
||||
"title": "Needle color",
|
||||
"type": "string",
|
||||
"default": "#f08080"
|
||||
},
|
||||
"colorNeedleCircle": {
|
||||
"title": "Needle circle color",
|
||||
"type": "string",
|
||||
"default": "#e8e8e8"
|
||||
},
|
||||
"colorBorder": {
|
||||
"title": "Border color",
|
||||
"type": "string",
|
||||
"default": "#ccc"
|
||||
},
|
||||
"majorTickFont": {
|
||||
"title": "Major tick font",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"family": {
|
||||
"title": "Font family",
|
||||
"type": "string",
|
||||
"default": "Roboto"
|
||||
},
|
||||
"size": {
|
||||
"title": "Size",
|
||||
"type": "number",
|
||||
"default": 20
|
||||
},
|
||||
"style": {
|
||||
"title": "Style",
|
||||
"type": "string",
|
||||
"default": "normal"
|
||||
},
|
||||
"weight": {
|
||||
"title": "Weight",
|
||||
"type": "string",
|
||||
"default": "500"
|
||||
},
|
||||
"color": {
|
||||
"title": "color",
|
||||
"type": "string",
|
||||
"default": "#ccc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation": {
|
||||
"title": "Enable animation",
|
||||
"type": "boolean",
|
||||
"default": true
|
||||
},
|
||||
"animationDuration": {
|
||||
"title": "Animation duration",
|
||||
"type": "number",
|
||||
"default": 500
|
||||
},
|
||||
"animationRule": {
|
||||
"title": "Animation rule",
|
||||
"type": "string",
|
||||
"default": "cycle"
|
||||
},
|
||||
"animationTarget": {
|
||||
"title": "Animation target",
|
||||
"type": "string",
|
||||
"default": "needle"
|
||||
}
|
||||
},
|
||||
"required": []
|
||||
},
|
||||
"form": [
|
||||
{
|
||||
"key": "majorTicks",
|
||||
"items":[
|
||||
"majorTicks[]"
|
||||
]
|
||||
},
|
||||
"minorTicks",
|
||||
"showStrokeTicks",
|
||||
"needleCircleSize",
|
||||
"showBorder",
|
||||
"borderOuterWidth",
|
||||
{
|
||||
"key": "colorPlate",
|
||||
"type": "color"
|
||||
},
|
||||
{
|
||||
"key": "colorMajorTicks",
|
||||
"type": "color"
|
||||
},
|
||||
{
|
||||
"key": "colorMinorTicks",
|
||||
"type": "color"
|
||||
},
|
||||
{
|
||||
"key": "colorNeedle",
|
||||
"type": "color"
|
||||
},
|
||||
{
|
||||
"key": "colorNeedleCircle",
|
||||
"type": "color"
|
||||
},
|
||||
{
|
||||
"key": "colorBorder",
|
||||
"type": "color"
|
||||
},
|
||||
{
|
||||
"key": "majorTickFont",
|
||||
"items": [
|
||||
"majorTickFont.family",
|
||||
"majorTickFont.size",
|
||||
{
|
||||
"key": "majorTickFont.style",
|
||||
"type": "rc-select",
|
||||
"multiple": false,
|
||||
"items": [
|
||||
{
|
||||
"value": "normal",
|
||||
"label": "Normal"
|
||||
},
|
||||
{
|
||||
"value": "italic",
|
||||
"label": "Italic"
|
||||
},
|
||||
{
|
||||
"value": "oblique",
|
||||
"label": "Oblique"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "majorTickFont.weight",
|
||||
"type": "rc-select",
|
||||
"multiple": false,
|
||||
"items": [
|
||||
{
|
||||
"value": "normal",
|
||||
"label": "Normal"
|
||||
},
|
||||
{
|
||||
"value": "bold",
|
||||
"label": "Bold"
|
||||
},
|
||||
{
|
||||
"value": "bolder",
|
||||
"label": "Bolder"
|
||||
},
|
||||
{
|
||||
"value": "lighter",
|
||||
"label": "Lighter"
|
||||
},
|
||||
{
|
||||
"value": "100",
|
||||
"label": "100"
|
||||
},
|
||||
{
|
||||
"value": "200",
|
||||
"label": "200"
|
||||
},
|
||||
{
|
||||
"value": "300",
|
||||
"label": "300"
|
||||
},
|
||||
{
|
||||
"value": "400",
|
||||
"label": "400"
|
||||
},
|
||||
{
|
||||
"value": "500",
|
||||
"label": "500"
|
||||
},
|
||||
{
|
||||
"value": "600",
|
||||
"label": "600"
|
||||
},
|
||||
{
|
||||
"value": "700",
|
||||
"label": "800"
|
||||
},
|
||||
{
|
||||
"value": "800",
|
||||
"label": "800"
|
||||
},
|
||||
{
|
||||
"value": "900",
|
||||
"label": "900"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "majorTickFont.color",
|
||||
"type": "color"
|
||||
}
|
||||
]
|
||||
},
|
||||
"animation",
|
||||
"animationDuration",
|
||||
{
|
||||
"key": "animationRule",
|
||||
"type": "rc-select",
|
||||
"multiple": false,
|
||||
"items": [
|
||||
{
|
||||
"value": "linear",
|
||||
"label": "Linear"
|
||||
},
|
||||
{
|
||||
"value": "quad",
|
||||
"label": "Quad"
|
||||
},
|
||||
{
|
||||
"value": "quint",
|
||||
"label": "Quint"
|
||||
},
|
||||
{
|
||||
"value": "cycle",
|
||||
"label": "Cycle"
|
||||
},
|
||||
{
|
||||
"value": "bounce",
|
||||
"label": "Bounce"
|
||||
},
|
||||
{
|
||||
"value": "elastic",
|
||||
"label": "Elastic"
|
||||
},
|
||||
{
|
||||
"value": "dequad",
|
||||
"label": "Dequad"
|
||||
},
|
||||
{
|
||||
"value": "dequint",
|
||||
"label": "Dequint"
|
||||
},
|
||||
{
|
||||
"value": "decycle",
|
||||
"label": "Decycle"
|
||||
},
|
||||
{
|
||||
"value": "debounce",
|
||||
"label": "Debounce"
|
||||
},
|
||||
{
|
||||
"value": "delastic",
|
||||
"label": "Delastic"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "animationTarget",
|
||||
"type": "rc-select",
|
||||
"multiple": false,
|
||||
"items": [
|
||||
{
|
||||
"value": "needle",
|
||||
"label": "Needle"
|
||||
},
|
||||
{
|
||||
"value": "plate",
|
||||
"label": "Plate"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user