Merge branch 'date-range-navigator'
# Conflicts: # ui/src/app/api/widget.service.js
This commit is contained in:
commit
4ef3311c14
@ -0,0 +1,25 @@
|
||||
{
|
||||
"widgetsBundle": {
|
||||
"alias": "date",
|
||||
"title": "Date",
|
||||
"image": null
|
||||
},
|
||||
"widgetTypes": [
|
||||
{
|
||||
"alias": "date_range_navigator",
|
||||
"name": "Date-range-navigator",
|
||||
"descriptor": {
|
||||
"type": "static",
|
||||
"sizeX": 5,
|
||||
"sizeY": 5.5,
|
||||
"resources": [],
|
||||
"templateHtml": "<date-range-navigator-widget class=\"date-range-navigator-widget\" ctx=\"ctx\"></date-range-navigator-widget>",
|
||||
"templateCss": "",
|
||||
"controllerScript": "self.onInit = function() {\n scope = self.ctx.$scope;\n scope.ctx = self.ctx;\n}",
|
||||
"settingsSchema": "{\n \"schema\": {\n \"type\": \"object\",\n \"title\": \"Settings\",\n \"properties\": {\n \"hidePicker\": {\n \"title\": \"Hide date range picker\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"onePanel\": {\n \"title\": \"Date range picker one panel\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"autoConfirm\": {\n \"title\": \"Date range picker auto confirm\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"showTemplate\": {\n \"title\": \"Date range picker show template\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"firstDayOfWeek\": {\n \"title\": \"First day of the week\",\n \"type\": \"number\",\n \"default\": 1\n },\n \"hideInterval\": {\n \"title\": \"Hide interval\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"initialInterval\": {\n\t\t\t\t\"title\": \"Initial interval\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"default\": \"week\"\n\t\t\t},\n \"hideStepSize\": {\n \"title\": \"Hide step size\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"stepSize\": {\n\t\t\t\t\"title\": \"Initial step size\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"default\": \"day\"\n\t\t\t},\n \"hideLabels\": {\n \"title\": \"Hide labels\",\n \"type\": \"boolean\",\n \"default\": false\n },\n \"useSessionStorage\": {\n \"title\": \"Use session storage\",\n \"type\": \"boolean\",\n \"default\": true\n }\n }\n },\n \"form\": [\n \"hidePicker\",\n\t\t\"onePanel\",\n\t\t\"autoConfirm\",\n\t\t\"showTemplate\",\n\t\t\"firstDayOfWeek\",\n \"hideInterval\",\n {\n\t\t\t\"key\": \"initialInterval\",\n\t\t\t\"type\": \"rc-select\",\n\t\t\t\"multiple\": false,\n\t\t\t\"items\": [\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"hour\",\n\t\t\t\t\t\"label\": \"Hour\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"day\",\n\t\t\t\t\t\"label\": \"Day\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"week\",\n\t\t\t\t\t\"label\": \"Week\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"twoWeeks\",\n\t\t\t\t\t\"label\": \"2 weeks\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"month\",\n\t\t\t\t\t\"label\": \"Month\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"threeMonths\",\n\t\t\t\t\t\"label\": \"3 months\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"sixMonths\",\n\t\t\t\t\t\"label\": \"6 months\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n \"hideStepSize\",\n {\n\t\t\t\"key\": \"stepSize\",\n\t\t\t\"type\": \"rc-select\",\n\t\t\t\"multiple\": false,\n\t\t\t\"items\": [\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"hour\",\n\t\t\t\t\t\"label\": \"Hour\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"day\",\n\t\t\t\t\t\"label\": \"Day\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"week\",\n\t\t\t\t\t\"label\": \"Week\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"twoWeeks\",\n\t\t\t\t\t\"label\": \"2 weeks\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"month\",\n\t\t\t\t\t\"label\": \"Month\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"threeMonths\",\n\t\t\t\t\t\"label\": \"3 months\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"value\": \"sixMonths\",\n\t\t\t\t\t\"label\": \"6 months\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t\"hideLabels\",\n\t\t\"useSessionStorage\"\n ]\n}",
|
||||
"dataKeySettingsSchema": "{}\n",
|
||||
"defaultConfig": "{\"datasources\":[{\"type\":\"static\",\"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\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"defaultInterval\":\"week\",\"stepSize\":\"day\"},\"title\":\"Date-range-navigator\",\"dropShadow\":true,\"enableFullscreen\":true,\"widgetStyle\":{},\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{}}"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
40
ui/package-lock.json
generated
40
ui/package-lock.json
generated
@ -5239,12 +5239,14 @@
|
||||
"balanced-match": {
|
||||
"version": "1.0.0",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
@ -5259,17 +5261,20 @@
|
||||
"code-point-at": {
|
||||
"version": "1.1.0",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"console-control-strings": {
|
||||
"version": "1.1.0",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
@ -5386,7 +5391,8 @@
|
||||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"ini": {
|
||||
"version": "1.3.5",
|
||||
@ -5398,6 +5404,7 @@
|
||||
"version": "1.0.0",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"number-is-nan": "^1.0.0"
|
||||
}
|
||||
@ -5412,6 +5419,7 @@
|
||||
"version": "3.0.4",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
}
|
||||
@ -5419,12 +5427,14 @@
|
||||
"minimist": {
|
||||
"version": "0.0.8",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"minipass": {
|
||||
"version": "2.2.4",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"safe-buffer": "^5.1.1",
|
||||
"yallist": "^3.0.0"
|
||||
@ -5443,6 +5453,7 @@
|
||||
"version": "0.5.1",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minimist": "0.0.8"
|
||||
}
|
||||
@ -5523,7 +5534,8 @@
|
||||
"number-is-nan": {
|
||||
"version": "1.0.1",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
@ -5535,6 +5547,7 @@
|
||||
"version": "1.4.0",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
@ -5656,6 +5669,7 @@
|
||||
"version": "1.0.2",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"code-point-at": "^1.0.0",
|
||||
"is-fullwidth-code-point": "^1.0.0",
|
||||
@ -8344,6 +8358,18 @@
|
||||
"tinycolor2": "*"
|
||||
}
|
||||
},
|
||||
"md-date-range-picker": {
|
||||
"version": "0.8.4",
|
||||
"resolved": "https://registry.npmjs.org/md-date-range-picker/-/md-date-range-picker-0.8.4.tgz",
|
||||
"integrity": "sha512-TgLyozMJypi92yvXaljLcermTFhd1+0rlaVwV+Duo0EplbKfDJfFF3WohWhB7VmPwJNP//o44sUlecY+r/ZvXA==",
|
||||
"requires": {
|
||||
"angular": "^1.5.8",
|
||||
"angular-animate": "^1.5.8",
|
||||
"angular-aria": "^1.5.8",
|
||||
"angular-material": "^1.1.0",
|
||||
"angular-messages": "^1.5.8"
|
||||
}
|
||||
},
|
||||
"mdPickers": {
|
||||
"version": "git://github.com/alenaksu/mdPickers.git#72592ae51c81a7260701055ea21870efa57fa7c8",
|
||||
"from": "git://github.com/alenaksu/mdPickers.git#0.7.5"
|
||||
|
||||
@ -67,6 +67,7 @@
|
||||
"material-ui": "^0.16.1",
|
||||
"material-ui-number-input": "^5.0.16",
|
||||
"md-color-picker": "0.2.6",
|
||||
"md-date-range-picker": "^0.8.4",
|
||||
"mdPickers": "git://github.com/alenaksu/mdPickers.git#0.7.5",
|
||||
"moment": "^2.15.0",
|
||||
"ngFlowchart": "git://github.com/thingsboard/ngFlowchart.git#master",
|
||||
|
||||
@ -256,13 +256,13 @@ function TimeService($translate, $http, $q, types) {
|
||||
return timewindow;
|
||||
}
|
||||
|
||||
function toHistoryTimewindow(timewindow, startTimeMs, endTimeMs) {
|
||||
|
||||
var interval = 0;
|
||||
function toHistoryTimewindow(timewindow, startTimeMs, endTimeMs, interval) {
|
||||
if (timewindow.history) {
|
||||
interval = timewindow.history.interval;
|
||||
interval = angular.isDefined(interval) ? interval : timewindow.history.interval;
|
||||
} else if (timewindow.realtime) {
|
||||
interval = timewindow.realtime.interval;
|
||||
} else {
|
||||
interval = 0;
|
||||
}
|
||||
|
||||
var aggType;
|
||||
|
||||
@ -23,6 +23,7 @@ import thingsboardAlarmsTableWidget from '../widget/lib/alarms-table-widget';
|
||||
import thingsboardEntitiesTableWidget from '../widget/lib/entities-table-widget';
|
||||
import thingsboardEntitiesHierarchyWidget from '../widget/lib/entities-hierarchy-widget';
|
||||
import thingsboardExtensionsTableWidget from '../widget/lib/extensions-table-widget';
|
||||
import thingsboardDateRangeNavigatorWidget from '../widget/lib/date-range-navigator/date-range-navigator';
|
||||
|
||||
import thingsboardRpcWidgets from '../widget/lib/rpc';
|
||||
|
||||
@ -35,6 +36,7 @@ import TbMapWidget from '../widget/lib/map-widget';
|
||||
import TbMapWidgetV2 from '../widget/lib/map-widget2';
|
||||
import TripAnimationWidget from '../widget/lib/tripAnimation/trip-animation-widget';
|
||||
|
||||
|
||||
import 'jquery.terminal/js/jquery.terminal.min.js';
|
||||
import 'jquery.terminal/css/jquery.terminal.min.css';
|
||||
|
||||
@ -44,8 +46,10 @@ import cssjs from '../../vendor/css.js/css';
|
||||
import thingsboardTypes from '../common/types.constant';
|
||||
import thingsboardUtils from '../common/utils.service';
|
||||
|
||||
export default angular.module('thingsboard.api.widget', ['oc.lazyLoad', thingsboardLedLight, thingsboardTimeseriesTableWidget,
|
||||
thingsboardAlarmsTableWidget, thingsboardEntitiesTableWidget, thingsboardEntitiesHierarchyWidget, thingsboardExtensionsTableWidget, thingsboardRpcWidgets, thingsboardTypes, thingsboardUtils, TripAnimationWidget])
|
||||
export default angular.module('thingsboard.api.widget', ['oc.lazyLoad', thingsboardLedLight,
|
||||
thingsboardTimeseriesTableWidget, thingsboardAlarmsTableWidget, thingsboardEntitiesTableWidget,
|
||||
thingsboardEntitiesHierarchyWidget, thingsboardExtensionsTableWidget, thingsboardDateRangeNavigatorWidget,
|
||||
thingsboardRpcWidgets, thingsboardTypes, thingsboardUtils, TripAnimationWidget])
|
||||
.factory('widgetService', WidgetService)
|
||||
.name;
|
||||
|
||||
|
||||
@ -29,6 +29,7 @@ import 'angular-translate-storage-cookie';
|
||||
import 'angular-translate-handler-log';
|
||||
import 'angular-translate-interpolation-messageformat';
|
||||
import 'md-color-picker';
|
||||
import 'md-date-range-picker';
|
||||
import mdPickers from 'mdPickers';
|
||||
import ngSanitize from 'angular-sanitize';
|
||||
import FBAngular from 'angular-fullscreen';
|
||||
@ -66,6 +67,7 @@ import 'angular-hotkeys/build/hotkeys.min.css';
|
||||
import 'angular-carousel/dist/angular-carousel.min.css';
|
||||
import 'angular-material-expansion-panel/dist/md-expansion-panel.min.css';
|
||||
import 'ngFlowchart/dist/flowchart.css';
|
||||
import 'md-date-range-picker/src/md-date-range-picker.css';
|
||||
import '../scss/main.scss';
|
||||
|
||||
import thingsboardThirdpartyFix from './common/thirdparty-fix';
|
||||
@ -107,6 +109,7 @@ angular.module('thingsboard', [
|
||||
angularSocialshare,
|
||||
'pascalprecht.translate',
|
||||
'mdColorPicker',
|
||||
'ngMaterialDateRangePicker',
|
||||
mdPickers,
|
||||
ngSanitize,
|
||||
FBAngular.name,
|
||||
|
||||
@ -219,14 +219,14 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
|
||||
}
|
||||
}, 0);
|
||||
},
|
||||
onUpdateTimewindow: function(startTimeMs, endTimeMs) {
|
||||
onUpdateTimewindow: function(startTimeMs, endTimeMs, interval) {
|
||||
if (!vm.originalDashboardTimewindow) {
|
||||
vm.originalDashboardTimewindow = angular.copy(vm.dashboardTimewindow);
|
||||
}
|
||||
$timeout(function() {
|
||||
vm.dashboardTimewindow = timeService.toHistoryTimewindow(vm.dashboardTimewindow, startTimeMs, endTimeMs);
|
||||
vm.dashboardTimewindow = timeService.toHistoryTimewindow(vm.dashboardTimewindow, startTimeMs, endTimeMs, interval);
|
||||
}, 0);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
addResizeListener(gridsterParent[0], onGridsterParentResize); // eslint-disable-line no-undef
|
||||
|
||||
@ -76,9 +76,9 @@ export default function WidgetController($scope, $state, $timeout, $window, $ele
|
||||
defaultSubscription: null,
|
||||
dashboardTimewindow: dashboardTimewindow,
|
||||
timewindowFunctions: {
|
||||
onUpdateTimewindow: function(startTimeMs, endTimeMs) {
|
||||
onUpdateTimewindow: function(startTimeMs, endTimeMs, interval) {
|
||||
if (widgetContext.defaultSubscription) {
|
||||
widgetContext.defaultSubscription.onUpdateTimewindow(startTimeMs, endTimeMs);
|
||||
widgetContext.defaultSubscription.onUpdateTimewindow(startTimeMs, endTimeMs, interval);
|
||||
}
|
||||
},
|
||||
onResetTimewindow: function() {
|
||||
|
||||
@ -1549,6 +1549,65 @@
|
||||
"widget-type-file": "Widget-Typdatei",
|
||||
"invalid-widget-type-file-error": "Widget-Typ kann nicht importiert werden: Ungültige Datenstruktur des Widget-Typs."
|
||||
},
|
||||
"widgets": {
|
||||
"date-range-navigator": {
|
||||
"localizationMap": {
|
||||
"Sun": "So.",
|
||||
"Mon": "Mo.",
|
||||
"Tue": "Di.",
|
||||
"Wed": "Mi.",
|
||||
"Thu": "Do.",
|
||||
"Fri": "Fr.",
|
||||
"Sat": "Sa.",
|
||||
"Jan": "Jan.",
|
||||
"Feb": "Feb.",
|
||||
"Mar": "März",
|
||||
"Apr": "Apr.",
|
||||
"May": "Mai",
|
||||
"Jun": "Juni",
|
||||
"Jul": "Juli",
|
||||
"Aug": "Aug.",
|
||||
"Sep": "Sep.",
|
||||
"Oct": "Okt.",
|
||||
"Nov": "Nov.",
|
||||
"Dec": "Dez.",
|
||||
"January": "Januar",
|
||||
"February": "Februar",
|
||||
"March": "März",
|
||||
"April": "April",
|
||||
"June": "Juni",
|
||||
"July": "Juli",
|
||||
"August": "August",
|
||||
"September": "September",
|
||||
"October": "Oktober",
|
||||
"November": "November",
|
||||
"December": "Dezember",
|
||||
"Custom Date Range": "Benutzerdefinierter Datumsbereich",
|
||||
"Date Range Template": "Datumsbereichsvorlage",
|
||||
"Today": "Heute",
|
||||
"Yesterday": "Gestern",
|
||||
"This Week": "Diese Woche",
|
||||
"Last Week": "Letzte Woche",
|
||||
"This Month": "Diesen Monat",
|
||||
"Last Month": "Im vergangenen Monat",
|
||||
"Year": "Jahr",
|
||||
"This Year": "Dieses Jahr",
|
||||
"Last Year": "Vergangenes Jahr",
|
||||
"Date picker": "Datumsauswahl",
|
||||
"Hour": "Stunde",
|
||||
"Day": "Tag",
|
||||
"Week": "Woche",
|
||||
"2 weeks": "2 Wochen",
|
||||
"Month": "Monat",
|
||||
"3 months": "3 Monate",
|
||||
"6 months": "6 Monate",
|
||||
"Custom interval": "Benutzerdefiniertes Intervall",
|
||||
"Interval": "Intervall",
|
||||
"Step size": "Schrittlänge",
|
||||
"Ok": "Ok"
|
||||
}
|
||||
}
|
||||
},
|
||||
"icon": {
|
||||
"icon": "Symbol",
|
||||
"select-icon": "Symbol auswählen",
|
||||
|
||||
@ -1555,6 +1555,65 @@
|
||||
"widget-type-file": "Widget type file",
|
||||
"invalid-widget-type-file-error": "Unable to import widget type: Invalid widget type data structure."
|
||||
},
|
||||
"widgets": {
|
||||
"date-range-navigator": {
|
||||
"localizationMap": {
|
||||
"Sun": "Sun",
|
||||
"Mon": "Mon",
|
||||
"Tue": "Tue",
|
||||
"Wed": "Wed",
|
||||
"Thu": "Thu",
|
||||
"Fri": "Fri",
|
||||
"Sat": "Sat",
|
||||
"Jan": "Jan",
|
||||
"Feb": "Feb",
|
||||
"Mar": "Mar",
|
||||
"Apr": "Apr",
|
||||
"May": "May",
|
||||
"Jun": "Jun",
|
||||
"Jul": "Jul",
|
||||
"Aug": "Aug",
|
||||
"Sep": "Sep",
|
||||
"Oct": "Oct",
|
||||
"Nov": "Nov",
|
||||
"Dec": "Dec",
|
||||
"January": "January",
|
||||
"February": "February",
|
||||
"March": "March",
|
||||
"April": "April",
|
||||
"June": "June",
|
||||
"July": "July",
|
||||
"August": "August",
|
||||
"September": "September",
|
||||
"October": "October",
|
||||
"November": "November",
|
||||
"December": "December",
|
||||
"Custom Date Range": "Custom Date Range",
|
||||
"Date Range Template": "Date Range Template",
|
||||
"Today": "Today",
|
||||
"Yesterday": "Yesterday",
|
||||
"This Week": "This Week",
|
||||
"Last Week": "Last Week",
|
||||
"This Month": "This Month",
|
||||
"Last Month": "Last Month",
|
||||
"Year": "Year",
|
||||
"This Year": "This Year",
|
||||
"Last Year": "Last Year",
|
||||
"Date picker": "Date picker",
|
||||
"Hour": "Hour",
|
||||
"Day": "Day",
|
||||
"Week": "Week",
|
||||
"2 weeks": "2 Weeks",
|
||||
"Month": "Month",
|
||||
"3 months": "3 Months",
|
||||
"6 months": "6 Months",
|
||||
"Custom interval": "Custom interval",
|
||||
"Interval": "Interval",
|
||||
"Step size": "Step size",
|
||||
"Ok": "Ok"
|
||||
}
|
||||
}
|
||||
},
|
||||
"icon": {
|
||||
"icon": "Icon",
|
||||
"select-icon": "Select icon",
|
||||
|
||||
@ -1549,6 +1549,65 @@
|
||||
"widget-type-file": "Archivo de tipo de widget",
|
||||
"invalid-widget-type-file-error": "No se puede importar tipo de widget: Estructura de datos del tipo de widget es inválida."
|
||||
},
|
||||
"widgets": {
|
||||
"date-range-navigator": {
|
||||
"localizationMap": {
|
||||
"Sun": "Dom.",
|
||||
"Mon": "Lun.",
|
||||
"Tue": "Mar.",
|
||||
"Wed": "Mié",
|
||||
"Thu": "Jue.",
|
||||
"Fri": "Vie.",
|
||||
"Sat": "Sáb.",
|
||||
"Jan": "Ene.",
|
||||
"Feb": "Feb.",
|
||||
"Mar": "Mar.",
|
||||
"Apr": "Abr.",
|
||||
"May": "May.",
|
||||
"Jun": "Jun.",
|
||||
"Jul": "Jul.",
|
||||
"Aug": "Ago.",
|
||||
"Sep": "Sept.",
|
||||
"Oct": "Oct.",
|
||||
"Nov": "Nov.",
|
||||
"Dec": "Dic.",
|
||||
"January": "Enero",
|
||||
"February": "Febrero",
|
||||
"March": "Marzo",
|
||||
"April": "Abril",
|
||||
"June": "Junio",
|
||||
"July": "Julio",
|
||||
"August": "Agosto",
|
||||
"September": "Septiembre",
|
||||
"October": "Octubre",
|
||||
"November": "Noviembre",
|
||||
"December": "Diciembre",
|
||||
"Custom Date Range": "Intervalo de fechas personalizado",
|
||||
"Date Range Template": "Plantilla de rango de fechas",
|
||||
"Today": "Hoy",
|
||||
"Yesterday": "Ayer",
|
||||
"This Week": "Esta semana",
|
||||
"Last Week": "La semana pasada",
|
||||
"This Month": "Este mes",
|
||||
"Last Month": "El mes pasado",
|
||||
"Year": "Año",
|
||||
"This Year": "Este año",
|
||||
"Last Year": "Último",
|
||||
"Date picker": "Date picker",
|
||||
"Hour": "Hora",
|
||||
"Day": "Día",
|
||||
"Week": "Semana",
|
||||
"2 weeks": "2 Semanas",
|
||||
"Month": "Mes",
|
||||
"3 months": "3 Meses",
|
||||
"6 months": "6 Meses",
|
||||
"Custom interval": "Intervalo personalizado",
|
||||
"Interval": "Intervalo",
|
||||
"Step size": "Numero de pie",
|
||||
"Ok": "De acuerdo"
|
||||
}
|
||||
}
|
||||
},
|
||||
"icon": {
|
||||
"icon": "Icono",
|
||||
"select-icon": "Seleccionar icono",
|
||||
|
||||
@ -1549,6 +1549,65 @@
|
||||
"widget-type-file": "پرونده نوع ويجت",
|
||||
"invalid-widget-type-file-error": ".وارد کردن نوع ويجت ممکن نيست: ساختار داده نوع ويجت نامعتبر است"
|
||||
},
|
||||
"widgets": {
|
||||
"date-range-navigator": {
|
||||
"localizationMap": {
|
||||
"Sun": "یکشنبه",
|
||||
"Mon": "دوشنبه",
|
||||
"Tue": "سهشنبه",
|
||||
"Wed": "چهارشنبه",
|
||||
"Thu": "پنجشنبه",
|
||||
"Fri": "جمعه",
|
||||
"Sat": "شنبه",
|
||||
"Jan": "ژانویهٔ",
|
||||
"Feb": "فوریهٔ",
|
||||
"Mar": "مارس",
|
||||
"Apr": "آوریل",
|
||||
"May": "مهٔ",
|
||||
"Jun": "ژوئن",
|
||||
"Jul": "ژوئیهٔ",
|
||||
"Aug": "اوت",
|
||||
"Sep": "سپتامبر",
|
||||
"Oct": "اکتبر",
|
||||
"Nov": "نوامبر",
|
||||
"Dec": "دسامبر",
|
||||
"January": "January",
|
||||
"February": "February",
|
||||
"March": "March",
|
||||
"April": "April",
|
||||
"June": "June",
|
||||
"July": "July",
|
||||
"August": "August",
|
||||
"September": "September",
|
||||
"October": "October",
|
||||
"November": "November",
|
||||
"December": "December",
|
||||
"Custom Date Range": "Custom Date Range",
|
||||
"Date Range Template": "Date Range Template",
|
||||
"Today": "Today",
|
||||
"Yesterday": "Yesterday",
|
||||
"This Week": "This Week",
|
||||
"Last Week": "Last Week",
|
||||
"This Month": "This Month",
|
||||
"Last Month": "Last Month",
|
||||
"Year": "Year",
|
||||
"This Year": "This Year",
|
||||
"Last Year": "Last Year",
|
||||
"Date picker": "Date picker",
|
||||
"Hour": "Hour",
|
||||
"Day": "Day",
|
||||
"Week": "Week",
|
||||
"2 weeks": "2 weeks",
|
||||
"Month": "Month",
|
||||
"3 months": "3 months",
|
||||
"6 months": "6 months",
|
||||
"Custom interval": "Custom interval",
|
||||
"Interval": "Interval",
|
||||
"Step size": "Step size",
|
||||
"Ok": "Ok"
|
||||
}
|
||||
}
|
||||
},
|
||||
"icon": {
|
||||
"icon": "آيکون",
|
||||
"select-icon": "انتخاب آيکون",
|
||||
|
||||
@ -1437,6 +1437,65 @@
|
||||
"invalid-widget-type-file-error": "Impossible d'importer le type de widget: structure de données de type widget invalide.",
|
||||
"widget-type-file": "Fichier de type Widget"
|
||||
},
|
||||
"widgets": {
|
||||
"date-range-navigator": {
|
||||
"localizationMap": {
|
||||
"Sun": "Dim.",
|
||||
"Mon": "Lun.",
|
||||
"Tue": "Mar.",
|
||||
"Wed": "Mer.",
|
||||
"Thu": "Jeu.",
|
||||
"Fri": "Ven.",
|
||||
"Sat": "Sam.",
|
||||
"Jan": "Janv.",
|
||||
"Feb": "Févr.",
|
||||
"Mar": "Mars",
|
||||
"Apr": "Avr.",
|
||||
"May": "Mai",
|
||||
"Jun": "Juin",
|
||||
"Jul": "Juil.",
|
||||
"Aug": "Août",
|
||||
"Sep": "Sept.",
|
||||
"Oct": "Oct.",
|
||||
"Nov": "Nov.",
|
||||
"Dec": "Déc.",
|
||||
"January": "Janvier",
|
||||
"February": "Février",
|
||||
"March": "Mars",
|
||||
"April": "Avril",
|
||||
"June": "Juin",
|
||||
"July": "Juillet",
|
||||
"August": "Août",
|
||||
"September": "Septembre",
|
||||
"October": "Octobre",
|
||||
"November": "Novembre",
|
||||
"December": "Décembre",
|
||||
"Custom Date Range": "Plage de dates personnalisée",
|
||||
"Date Range Template": "Modèle de plage de dates",
|
||||
"Today": "Aujourd'hui",
|
||||
"Yesterday": "Hier",
|
||||
"This Week": "Cette semaine",
|
||||
"Last Week": "La semaine dernière",
|
||||
"This Month": "Ce mois-ci",
|
||||
"Last Month": "Le mois dernier",
|
||||
"Year": "Année",
|
||||
"This Year": "Cette année",
|
||||
"Last Year": "L'année dernière",
|
||||
"Date picker": "Sélecteur de date",
|
||||
"Hour": "Heure",
|
||||
"Day": "Journée",
|
||||
"Week": "La semaine",
|
||||
"2 weeks": "2 Semaines",
|
||||
"Month": "Mois",
|
||||
"3 months": "3 Mois",
|
||||
"6 months": "6 Mois",
|
||||
"Custom interval": "Intervalle personnalisé",
|
||||
"Interval": "Intervalle",
|
||||
"Step size": "Taille de pas",
|
||||
"Ok": "Ok"
|
||||
}
|
||||
}
|
||||
},
|
||||
"widgets-bundle": {
|
||||
"add": "Ajouter un groupe de widgets",
|
||||
"add-widgets-bundle-text": "Ajouter un nouveau groupe de widgets",
|
||||
|
||||
@ -1554,6 +1554,65 @@
|
||||
"widget-type-file": "File tipo di widget",
|
||||
"invalid-widget-type-file-error": "Impossibile importare un tipo di widget: struttura dati del widget non valida."
|
||||
},
|
||||
"widgets": {
|
||||
"date-range-navigator": {
|
||||
"localizationMap": {
|
||||
"Sun": "Dom",
|
||||
"Mon": "Lun",
|
||||
"Tue": "Mar",
|
||||
"Wed": "Mer",
|
||||
"Thu": "Gio",
|
||||
"Fri": "Ven",
|
||||
"Sat": "Sab",
|
||||
"Jan": "Gen",
|
||||
"Feb": "Feb",
|
||||
"Mar": "Mar",
|
||||
"Apr": "Apr",
|
||||
"May": "Mag",
|
||||
"Jun": "Giu",
|
||||
"Jul": "Lug",
|
||||
"Aug": "Ago",
|
||||
"Sep": "Set",
|
||||
"Oct": "Ott",
|
||||
"Nov": "Nov",
|
||||
"Dec": "Dic",
|
||||
"January": "Gennaio",
|
||||
"February": "Febbraio",
|
||||
"March": "Marzo",
|
||||
"April": "Aprile",
|
||||
"June": "Giugno",
|
||||
"July": "Luglio",
|
||||
"August": "Agosto",
|
||||
"September": "Settembre",
|
||||
"October": "Ottobre",
|
||||
"November": "Novembre",
|
||||
"December": "Dicembre",
|
||||
"Custom Date Range": "Intervallo di date personalizzato",
|
||||
"Date Range Template": "Modello di intervallo di date",
|
||||
"Today": "Oggi",
|
||||
"Yesterday": "Ieri",
|
||||
"This Week": "Questa settimana",
|
||||
"Last Week": "La settimana scorsa",
|
||||
"This Month": "Questo mese",
|
||||
"Last Month": "Lo scorso mese",
|
||||
"Year": "Anno",
|
||||
"This Year": "Quest'anno",
|
||||
"Last Year": "L'anno scorso",
|
||||
"Date picker": "Date picker",
|
||||
"Hour": "Ora",
|
||||
"Day": "Giorno",
|
||||
"Week": "Settimana",
|
||||
"2 weeks": "2 Settimane",
|
||||
"Month": "Mese",
|
||||
"3 months": "3 Mesi",
|
||||
"6 months": "6 Mesi",
|
||||
"Custom interval": "Intervallo personalizzato",
|
||||
"Interval": "Intervallo",
|
||||
"Step size": "Dimensione del passo",
|
||||
"Ok": "Ok"
|
||||
}
|
||||
}
|
||||
},
|
||||
"icon": {
|
||||
"icon": "Icona",
|
||||
"select-icon": "Seleziona icona",
|
||||
|
||||
@ -1432,6 +1432,65 @@
|
||||
"widget-type-file": "ウィジェットタイプファイル",
|
||||
"invalid-widget-type-file-error": "ウィジェットタイプをインポートできません:ウィジェットタイプのデータ構造が無効です。"
|
||||
},
|
||||
"widgets": {
|
||||
"date-range-navigator": {
|
||||
"localizationMap": {
|
||||
"Sun": "日",
|
||||
"Mon": "月",
|
||||
"Tue": "火",
|
||||
"Wed": "水",
|
||||
"Thu": "木",
|
||||
"Fri": "金",
|
||||
"Sat": "土",
|
||||
"Jan": "1月",
|
||||
"Feb": "2月",
|
||||
"Mar": "3月",
|
||||
"Apr": "4月",
|
||||
"May": "5月",
|
||||
"Jun": "6月",
|
||||
"Jul": "7月",
|
||||
"Aug": "8月",
|
||||
"Sep": "9月",
|
||||
"Oct": "10月",
|
||||
"Nov": "11月",
|
||||
"Dec": "12月",
|
||||
"January": "1月",
|
||||
"February": "2月",
|
||||
"March": "行進",
|
||||
"April": "4月",
|
||||
"June": "六月",
|
||||
"July": "7月",
|
||||
"August": "8月",
|
||||
"September": "9月",
|
||||
"October": "10月",
|
||||
"November": "11月",
|
||||
"December": "12月",
|
||||
"Custom Date Range": "カスタム期間",
|
||||
"Date Range Template": "日付範囲テンプレート",
|
||||
"Today": "今日",
|
||||
"Yesterday": "昨日",
|
||||
"This Week": "今週",
|
||||
"Last Week": "先週",
|
||||
"This Month": "今月",
|
||||
"Last Month": "先月",
|
||||
"Year": "年",
|
||||
"This Year": "今年",
|
||||
"Last Year": "昨年",
|
||||
"Date picker": "日付ピッカー",
|
||||
"Hour": "時",
|
||||
"Day": "日",
|
||||
"Week": "週間",
|
||||
"2 weeks": "2週間",
|
||||
"Month": "月",
|
||||
"3 months": "3ヶ月",
|
||||
"6 months": "6ヵ月",
|
||||
"Custom interval": "カスタム間隔",
|
||||
"Interval": "間隔",
|
||||
"Step size": "刻み幅",
|
||||
"Ok": "Ok"
|
||||
}
|
||||
}
|
||||
},
|
||||
"icon": {
|
||||
"icon": "アイコン",
|
||||
"select-icon": "選択アイコン",
|
||||
|
||||
@ -1308,6 +1308,65 @@
|
||||
"widget-type-file": "위젯 타입 파일",
|
||||
"invalid-widget-type-file-error": "위젯 타입을 가져오기 할 수 없습니다.: 잘못된 위젯 타입 데이터 구조입니다."
|
||||
},
|
||||
"widgets": {
|
||||
"date-range-navigator": {
|
||||
"localizationMap": {
|
||||
"Sun": "일",
|
||||
"Mon": "월",
|
||||
"Tue": "화",
|
||||
"Wed": "수",
|
||||
"Thu": "목",
|
||||
"Fri": "금",
|
||||
"Sat": "토",
|
||||
"Jan": "1월",
|
||||
"Feb": "2월",
|
||||
"Mar": "3월",
|
||||
"Apr": "4월",
|
||||
"May": "5월",
|
||||
"Jun": "6월",
|
||||
"Jul": "7월",
|
||||
"Aug": "8월",
|
||||
"Sep": "9월",
|
||||
"Oct": "10월",
|
||||
"Nov": "11월",
|
||||
"Dec": "12월",
|
||||
"January": "일월",
|
||||
"February": "이월",
|
||||
"March": "행진",
|
||||
"April": "4 월",
|
||||
"June": "유월",
|
||||
"July": "칠월",
|
||||
"August": "팔월",
|
||||
"September": "구월",
|
||||
"October": "십월",
|
||||
"November": "십일월",
|
||||
"December": "12 월",
|
||||
"Custom Date Range": "맞춤 기간",
|
||||
"Date Range Template": "기간 템플릿",
|
||||
"Today": "오늘",
|
||||
"Yesterday": "어제",
|
||||
"This Week": "이번 주",
|
||||
"Last Week": "지난주",
|
||||
"This Month": "이번 달",
|
||||
"Last Month": "지난 달",
|
||||
"Year": "년",
|
||||
"This Year": "올해",
|
||||
"Last Year": "작년",
|
||||
"Date picker": "날짜 선택기",
|
||||
"Hour": "시간",
|
||||
"Day": "일",
|
||||
"Week": "주",
|
||||
"2 weeks": "이주",
|
||||
"Month": "달",
|
||||
"3 months": "3 개월",
|
||||
"6 months": "6 개월",
|
||||
"Custom interval": "사용자 지정 간격",
|
||||
"Interval": "간격",
|
||||
"Step size": "단계 크기",
|
||||
"Ok": "Ok"
|
||||
}
|
||||
}
|
||||
},
|
||||
"icon": {
|
||||
"icon": "Icon",
|
||||
"select-icon": "Select icon",
|
||||
|
||||
@ -1548,6 +1548,65 @@
|
||||
"widget-type-file": "Файл типа виджета",
|
||||
"invalid-widget-type-file-error": "Не удалось импортировать виджет: неизвестная схема данных типа виджета."
|
||||
},
|
||||
"widgets": {
|
||||
"date-range-navigator": {
|
||||
"localizationMap": {
|
||||
"Sun": "Вс",
|
||||
"Mon": "Пн",
|
||||
"Tue": "Вт",
|
||||
"Wed": "Ср",
|
||||
"Thu": "Чт",
|
||||
"Fri": "Пт",
|
||||
"Sat": "Сб",
|
||||
"Jan": "Янв.",
|
||||
"Feb": "Февр.",
|
||||
"Mar": "Март",
|
||||
"Apr": "Апр.",
|
||||
"May": "Май",
|
||||
"Jun": "Июнь",
|
||||
"Jul": "Июль",
|
||||
"Aug": "Авг.",
|
||||
"Sep": "Сент.",
|
||||
"Oct": "Окт.",
|
||||
"Nov": "Нояб.",
|
||||
"Dec": "Дек.",
|
||||
"January": "Январь",
|
||||
"February": "Февраль",
|
||||
"March": "Март",
|
||||
"April": "Апрель",
|
||||
"June": "Июнь",
|
||||
"July": "Июль",
|
||||
"August": "Август",
|
||||
"September": "Сентябрь",
|
||||
"October": "Октября",
|
||||
"November": "Ноябрь",
|
||||
"December": "Декабрь",
|
||||
"Custom Date Range": "Пользовательский диапазон дат",
|
||||
"Date Range Template": "Шаблон диапазона дат",
|
||||
"Today": "Сегодня",
|
||||
"Yesterday": "Вчера",
|
||||
"This Week": "На этой неделе",
|
||||
"Last Week": "Прошлая неделя",
|
||||
"This Month": "Этот месяц",
|
||||
"Last Month": "Прошлый месяц",
|
||||
"Year": "Год",
|
||||
"This Year": "В этом году",
|
||||
"Last Year": "Прошлый год",
|
||||
"Date picker": "Выбор даты",
|
||||
"Hour": "Час",
|
||||
"Day": "День",
|
||||
"Week": "Неделю",
|
||||
"2 weeks": "2 Недели",
|
||||
"Month": "Месяц",
|
||||
"3 months": "3 Месяца",
|
||||
"6 months": "6 Месяцев",
|
||||
"Custom interval": "Пользовательский интервал",
|
||||
"Interval": "Интервал",
|
||||
"Step size": "Размер шага",
|
||||
"Ok": "Ok"
|
||||
}
|
||||
}
|
||||
},
|
||||
"icon": {
|
||||
"icon": "Иконка",
|
||||
"select-icon": "Выбрать иконку",
|
||||
|
||||
@ -1514,6 +1514,65 @@
|
||||
"widget-type-file": "Gösterge türü dosyası",
|
||||
"invalid-widget-type-file-error": "Gösterge türü içe aktarılamadı: Geçersiz gösterge türü veri yapısı."
|
||||
},
|
||||
"widgets": {
|
||||
"date-range-navigator": {
|
||||
"localizationMap": {
|
||||
"Sun": "Paz",
|
||||
"Mon": "Pzt",
|
||||
"Tue": "Sal",
|
||||
"Wed": "Çar",
|
||||
"Thu": "Per",
|
||||
"Fri": "Cum",
|
||||
"Sat": "Cmt",
|
||||
"Jan": "Oca",
|
||||
"Feb": "Şub",
|
||||
"Mar": "Mar",
|
||||
"Apr": "Nis",
|
||||
"May": "May",
|
||||
"Jun": "Haz",
|
||||
"Jul": "Tem",
|
||||
"Aug": "Ağu",
|
||||
"Sep": "Eyl",
|
||||
"Oct": "Eki",
|
||||
"Nov": "Kas",
|
||||
"Dec": "Ara",
|
||||
"January": "Ocak",
|
||||
"February": "Şubat",
|
||||
"March": "Mart",
|
||||
"April": "Nisan",
|
||||
"June": "Haziran",
|
||||
"July": "Temmuz",
|
||||
"August": "Ağustos",
|
||||
"September": "Eylül",
|
||||
"October": "Ekim",
|
||||
"November": "Kasım",
|
||||
"December": "Aralık",
|
||||
"Custom Date Range": "Özel Tarih Aralığı",
|
||||
"Date Range Template": "Tarih Aralığı Şablonu",
|
||||
"Today": "Bugün",
|
||||
"Yesterday": "Dün",
|
||||
"This Week": "Bu hafta",
|
||||
"Last Week": "Geçen hafta",
|
||||
"This Month": "Bu ay",
|
||||
"Last Month": "Geçen ay",
|
||||
"Year": "Yıl",
|
||||
"This Year": "Bu yıl",
|
||||
"Last Year": "Geçen yıl",
|
||||
"Date picker": "Tarih seçici",
|
||||
"Hour": "Saat",
|
||||
"Day": "Gün",
|
||||
"Week": "Hafta",
|
||||
"2 weeks": "2 Hafta",
|
||||
"Month": "Ay",
|
||||
"3 months": "3 Ay",
|
||||
"6 months": "6 Ay",
|
||||
"Custom interval": "Özel aralık",
|
||||
"Interval": "Aralık",
|
||||
"Step size": "Adım boyutu",
|
||||
"Ok": "Ok"
|
||||
}
|
||||
}
|
||||
},
|
||||
"icon": {
|
||||
"icon": "İkon",
|
||||
"select-icon": "İkon seç",
|
||||
|
||||
@ -1418,6 +1418,65 @@
|
||||
"widget-type-file": "部件类型文件",
|
||||
"invalid-widget-type-file-error": "无法导入部件类型:无效的部件类型数据结构。"
|
||||
},
|
||||
"widgets": {
|
||||
"date-range-navigator": {
|
||||
"localizationMap": {
|
||||
"Sun": "周日",
|
||||
"Mon": "周一",
|
||||
"Tue": "周二",
|
||||
"Wed": "周三",
|
||||
"Thu": "周四",
|
||||
"Fri": "周五",
|
||||
"Sat": "周六",
|
||||
"Jan": "1月",
|
||||
"Feb": "2月",
|
||||
"Mar": "3月",
|
||||
"Apr": "4月",
|
||||
"May": "5月",
|
||||
"Jun": "6月",
|
||||
"Jul": "7月",
|
||||
"Aug": "8月",
|
||||
"Sep": "9月",
|
||||
"Oct": "10月",
|
||||
"Nov": "11月",
|
||||
"Dec": "12月",
|
||||
"January": "一月",
|
||||
"February": "二月",
|
||||
"March": "游行",
|
||||
"April": "四月",
|
||||
"June": "六月",
|
||||
"July": "七月",
|
||||
"August": "八月",
|
||||
"September": "九月",
|
||||
"October": "十月",
|
||||
"November": "十一月",
|
||||
"December": "十二月",
|
||||
"Custom Date Range": "自定义日期范围",
|
||||
"Date Range Template": "日期范围模板",
|
||||
"Today": "今天",
|
||||
"Yesterday": "昨天",
|
||||
"This Week": "本星期",
|
||||
"Last Week": "上个星期",
|
||||
"This Month": "这个月",
|
||||
"Last Month": "上个月",
|
||||
"Year": "年",
|
||||
"This Year": "今年",
|
||||
"Last Year": "去年",
|
||||
"Date picker": "日期选择器",
|
||||
"Hour": "小时",
|
||||
"Day": "天",
|
||||
"Week": "周",
|
||||
"2 weeks": "2周",
|
||||
"Month": "月",
|
||||
"3 months": "3个月",
|
||||
"6 months": "6个月",
|
||||
"Custom interval": "自定义间隔",
|
||||
"Interval": "间隔",
|
||||
"Step size": "一步的大小",
|
||||
"Ok": "Ok"
|
||||
}
|
||||
}
|
||||
},
|
||||
"icon": {
|
||||
"icon": "图标",
|
||||
"select-icon": "选择图标",
|
||||
|
||||
@ -0,0 +1,301 @@
|
||||
/*
|
||||
* Copyright © 2016-2019 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.
|
||||
*/
|
||||
/* eslint-disable import/no-unresolved, import/default */
|
||||
import widgetTpl from './date-range-navigator.tpl.html';
|
||||
import './date-range-navigator.scss';
|
||||
/* eslint-enable import/no-unresolved, import/default */
|
||||
|
||||
export default angular.module('thingsboard.widgets.dateRangeNavigator', [])
|
||||
.directive('dateRangeNavigatorWidget', DateRangeNavigatorWidget)
|
||||
.name;
|
||||
|
||||
/*@ngInject*/
|
||||
function DateRangeNavigatorWidget() {
|
||||
return {
|
||||
restrict: "E",
|
||||
scope: true,
|
||||
bindToController: {
|
||||
tableId: '=',
|
||||
ctx: '='
|
||||
},
|
||||
controller: DateRangeNavigatorWidgetController,
|
||||
controllerAs: 'vm',
|
||||
templateUrl: widgetTpl
|
||||
};
|
||||
}
|
||||
|
||||
/*@ngInject*/
|
||||
function DateRangeNavigatorWidgetController($scope, $window, $filter) {
|
||||
|
||||
let vm = this,
|
||||
hour = 3600000,
|
||||
day = 86400000,
|
||||
week = 604800000,
|
||||
month = 2629743000,
|
||||
words = [
|
||||
"Mon",
|
||||
"Tue",
|
||||
"Wed",
|
||||
"Thu",
|
||||
"Fri",
|
||||
"Sat",
|
||||
"Sun",
|
||||
"January",
|
||||
"February",
|
||||
"March",
|
||||
"April",
|
||||
"May",
|
||||
"June",
|
||||
"July",
|
||||
"August",
|
||||
"September",
|
||||
"October",
|
||||
"November",
|
||||
"December",
|
||||
"Ok",
|
||||
'Custom Date Range',
|
||||
'Date Range Template',
|
||||
'Today',
|
||||
'Yesterday',
|
||||
'This Week',
|
||||
'Last Week',
|
||||
'Month',
|
||||
'This Month',
|
||||
'Last Month',
|
||||
'Year',
|
||||
'This Year',
|
||||
'Last Year'
|
||||
],
|
||||
firstUpdate = true;
|
||||
|
||||
$scope.datesMap = {
|
||||
hour: {
|
||||
ts: hour,
|
||||
label: "Hour"
|
||||
},
|
||||
day: {
|
||||
ts: day,
|
||||
label: "Day"
|
||||
},
|
||||
week: {
|
||||
ts: week,
|
||||
label: "Week"
|
||||
},
|
||||
twoWeeks: {
|
||||
ts: week * 2,
|
||||
label: "2 weeks"
|
||||
},
|
||||
month: {
|
||||
ts: month,
|
||||
label: "Month"
|
||||
},
|
||||
threeMonths: {
|
||||
ts: month * 3,
|
||||
label: "3 months"
|
||||
},
|
||||
sixMonths: {
|
||||
ts: month * 6,
|
||||
label: "6 months"
|
||||
}
|
||||
};
|
||||
$scope.advancedModel = {};
|
||||
$scope.endRestrictionDate = Date.now();
|
||||
$scope.localizationMap = getLocalizationMap();
|
||||
|
||||
$scope.changeInterval = changeInterval;
|
||||
$scope.goForth = goForth;
|
||||
$scope.goBack = goBack;
|
||||
$scope.triggerChange = triggerChange;
|
||||
|
||||
$scope.$watch('vm.ctx', function () {
|
||||
if (vm.ctx && vm.ctx.dashboard.dashboardTimewindow) {
|
||||
$scope.settings = vm.ctx.widgetConfig.settings;
|
||||
let selection;
|
||||
if ($scope.settings.useSessionStorage) {
|
||||
selection = readFromStorage('date-range');
|
||||
}
|
||||
if (selection) {
|
||||
$scope.advancedModel = {
|
||||
selectedTemplateName: selection.name,
|
||||
dateStart: selection.start,
|
||||
dateEnd: selection.end
|
||||
};
|
||||
} else {
|
||||
let end = new Date();
|
||||
end.setHours(23, 59, 59, 999);
|
||||
|
||||
let formattedDate = getFormattedDate(
|
||||
(end.getTime() + 1) - $scope.datesMap[$scope.settings.initialInterval || "week"].ts,
|
||||
end.getTime()
|
||||
);
|
||||
$scope.advancedModel = formattedDate;
|
||||
}
|
||||
$scope.selectedStepSize = $scope.datesMap[$scope.settings.stepSize || "day"].ts;
|
||||
|
||||
widgetContextTimewindowSync();
|
||||
}
|
||||
});
|
||||
|
||||
$scope.$on('dashboardTimewindowChanged', function () {
|
||||
$scope.dashboardTimewindowChanged = true;
|
||||
widgetContextTimewindowSync();
|
||||
});
|
||||
|
||||
function getLocalizationMap() {
|
||||
let result = {};
|
||||
|
||||
words.forEach(function (key) {
|
||||
result[key] = $filter('translate')('widgets.date-range-navigator.localizationMap.' + key);
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function triggerChange() {
|
||||
updateTimewindow($scope.advancedModel.dateStart.getTime(), $scope.advancedModel.dateEnd.getTime() + day - 1);
|
||||
}
|
||||
|
||||
function widgetContextTimewindowSync() {
|
||||
if (vm.ctx && vm.ctx.dashboardTimewindow && $scope.dashboardTimewindowChanged &&
|
||||
vm.ctx.dashboard.dashboardTimewindow.history &&
|
||||
vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow) {
|
||||
|
||||
|
||||
if (!firstUpdate) {
|
||||
updateAdvancedModel();
|
||||
}
|
||||
updateDateInterval();
|
||||
if ($scope.settings.useSessionStorage) {
|
||||
updateStorageDate();
|
||||
}
|
||||
if (firstUpdate) {
|
||||
updateTimewindow($scope.advancedModel.dateStart.getTime(), $scope.advancedModel.dateEnd.getTime());
|
||||
firstUpdate = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getFormattedDate(startTime, endTime) {
|
||||
var template;
|
||||
|
||||
let startDate = new Date(startTime);
|
||||
let endDate = new Date(endTime);
|
||||
|
||||
if (getDateDiff(startDate, endDate) === 0) {
|
||||
template = $filter('date')(startDate, 'dd MMM yyyy');
|
||||
} else {
|
||||
template = $filter('date')(
|
||||
startDate,
|
||||
'dd' + (startDate.getMonth() !== endDate.getMonth() || startDate.getFullYear() !== endDate.getFullYear() ? ' MMM' : '') + (startDate.getFullYear() !== endDate.getFullYear() ? ' yyyy' : '')
|
||||
)
|
||||
+ ' - ' +
|
||||
$filter('date')(
|
||||
endDate,
|
||||
'dd MMM yyyy'
|
||||
);
|
||||
}
|
||||
|
||||
return {
|
||||
selectedTemplateName: template,
|
||||
dateStart: startDate,
|
||||
dateEnd: endDate
|
||||
};
|
||||
}
|
||||
|
||||
function readFromStorage(itemKey) {
|
||||
if ($window.sessionStorage.getItem(itemKey)) {
|
||||
let selection = angular.fromJson($window.sessionStorage.getItem(itemKey));
|
||||
selection.start = new Date(parseInt(selection.start));
|
||||
selection.end = new Date(parseInt(selection.end));
|
||||
return selection;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function goForth() {
|
||||
let startTime = vm.ctx.dashboard.dashboardTimewindow.history ?
|
||||
vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.startTimeMs :
|
||||
$scope.advancedModel.dateStart.getTime();
|
||||
let endTime = vm.ctx.dashboard.dashboardTimewindow.history ?
|
||||
vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.endTimeMs :
|
||||
$scope.advancedModel.dateEnd.getTime();
|
||||
updateTimewindow(startTime + $scope.selectedStepSize, endTime + $scope.selectedStepSize);
|
||||
}
|
||||
|
||||
function goBack() {
|
||||
let startTime = vm.ctx.dashboard.dashboardTimewindow.history ?
|
||||
vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.startTimeMs :
|
||||
$scope.advancedModel.dateStart.getTime();
|
||||
let endTime = vm.ctx.dashboard.dashboardTimewindow.history ?
|
||||
vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.endTimeMs :
|
||||
$scope.advancedModel.dateEnd.getTime();
|
||||
updateTimewindow(startTime - $scope.selectedStepSize, endTime - $scope.selectedStepSize);
|
||||
}
|
||||
|
||||
function changeInterval() {
|
||||
let endTime = vm.ctx.dashboard.dashboardTimewindow.history ?
|
||||
vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.endTimeMs :
|
||||
$scope.advancedModel.dateEnd.getTime();
|
||||
updateTimewindow(endTime - $scope.selectedDateInterval / 2, endTime + $scope.selectedDateInterval / 2);
|
||||
}
|
||||
|
||||
function getDateDiff(date1, date2) {
|
||||
if (!date1 || !date2) return;
|
||||
var _d1 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate()),
|
||||
_d2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());
|
||||
return _d2 - _d1;
|
||||
}
|
||||
|
||||
function updateTimewindow(startTime, endTime) {
|
||||
vm.ctx.dashboard.dashboardTimewindowApi.onUpdateTimewindow(startTime, endTime, 10);
|
||||
}
|
||||
|
||||
function updateDateInterval() {
|
||||
let interval = $scope.advancedModel.dateEnd.getTime() - $scope.advancedModel.dateStart.getTime();
|
||||
|
||||
for (let i in $scope.datesMap) {
|
||||
if ($scope.datesMap.hasOwnProperty(i)) {
|
||||
if ($scope.datesMap[i].ts === interval || $scope.datesMap[i].ts === interval + 1 || $scope.datesMap[i].ts === interval - 1) {
|
||||
$scope.selectedDateInterval = $scope.datesMap[i].ts;
|
||||
$scope.customInterval = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$scope.selectedDateInterval = interval;
|
||||
$scope.customInterval = {ts: interval, label: "Custom interval"};
|
||||
}
|
||||
|
||||
function updateAdvancedModel() {
|
||||
$scope.advancedModel = getFormattedDate(vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.startTimeMs, vm.ctx.dashboard.dashboardTimewindow.history.fixedTimewindow.endTimeMs);
|
||||
}
|
||||
|
||||
function updateStorageDate() {
|
||||
saveIntoStorage('date-range', {
|
||||
start: $scope.advancedModel.dateStart.getTime(),
|
||||
end: $scope.advancedModel.dateEnd.getTime(),
|
||||
name: $scope.advancedModel.selectedTemplateName
|
||||
});
|
||||
}
|
||||
|
||||
function saveIntoStorage(keyName, selection) {
|
||||
if (selection) {
|
||||
$window.sessionStorage.setItem(keyName, angular.toJson(selection));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,108 @@
|
||||
/**
|
||||
* Copyright © 2016-2019 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.
|
||||
*/
|
||||
.date-range-navigator-widget {
|
||||
display: flex;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.date-range-navigator {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: space-evenly;
|
||||
width: 100%;
|
||||
margin: auto;
|
||||
|
||||
.drn__element {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
max-width: 100%;
|
||||
height: 60px;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
.navigation {
|
||||
md-input-container {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.picker {
|
||||
.picker__wrapper {
|
||||
position: relative;
|
||||
max-width: 100%;
|
||||
padding: 2px;
|
||||
|
||||
> label {
|
||||
position: absolute;
|
||||
right: -3px;
|
||||
bottom: 100%;
|
||||
left: 0;
|
||||
padding-left: 3px;
|
||||
color: #787878;
|
||||
transform: scale(.75);
|
||||
transform-origin: left bottom;
|
||||
}
|
||||
}
|
||||
|
||||
.md-select-value {
|
||||
min-width: 225px;
|
||||
border-color: #e1e1e1;
|
||||
|
||||
.md-select-icon {
|
||||
color: #757575;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.short-mode {
|
||||
display: block;
|
||||
width: 90%;
|
||||
|
||||
.drn__element {
|
||||
width: 100%;
|
||||
|
||||
md-input-container {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.picker {
|
||||
.picker__wrapper {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.md-select-value {
|
||||
min-width: initial;
|
||||
}
|
||||
}
|
||||
|
||||
&.labels-hidden {
|
||||
.drn__element {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.long-mode {
|
||||
&.labels-hidden {
|
||||
.drn__element {
|
||||
height: 36px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,72 @@
|
||||
<!--
|
||||
|
||||
Copyright © 2016-2019 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.
|
||||
|
||||
-->
|
||||
<div class="date-range-navigator"
|
||||
ng-class="{'short-mode':vm.ctx.width < 400, 'labels-hidden': settings.hideLabels, 'long-mode': vm.ctx.width >= 400}"
|
||||
>
|
||||
<div class="drn__element picker" ng-hide="settings.hidePicker" ng-if="vm.ctx">
|
||||
<div class="picker__wrapper">
|
||||
<label ng-hide="settings.hideLabels" ng-bind="'widgets.date-range-navigator.localizationMap.Date picker' | translate"></label>
|
||||
<md-date-range ng-model="advancedModel"
|
||||
md-on-select="triggerChange()"
|
||||
localization-map="localizationMap"
|
||||
one-panel="settings.onePanel"
|
||||
auto-confirm="settings.autoConfirm"
|
||||
show-template="settings.showTemplate"
|
||||
first-day-of-week="settings.firstDayOfWeek"
|
||||
></md-date-range>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="drn__element navigation" ng-hide="settings.hideInterval">
|
||||
<md-input-container class="md-block"
|
||||
flex-gt-sm
|
||||
>
|
||||
<label ng-hide="settings.hideLabels" ng-bind="'widgets.date-range-navigator.localizationMap.Interval' | translate"></label>
|
||||
<md-select ng-model="selectedDateInterval"
|
||||
ng-change="changeInterval()"
|
||||
aria-label="Pick date interval"
|
||||
>
|
||||
<md-option ng-if="customInterval" ng-value="customInterval.ts">{{'widgets.date-range-navigator.localizationMap.' + customInterval.label | translate}}</md-option>
|
||||
<md-option ng-repeat="(dateKey, dateValue) in datesMap" ng-value="dateValue.ts">
|
||||
{{'widgets.date-range-navigator.localizationMap.' + dateValue.label | translate}}
|
||||
</md-option>
|
||||
</md-select>
|
||||
</md-input-container>
|
||||
</div>
|
||||
|
||||
<div class="drn__element step" ng-hide="settings.hideStepSize">
|
||||
<md-button ng-click="goBack()" class="md-icon-button">
|
||||
<md-icon>keyboard_arrow_left</md-icon>
|
||||
</md-button>
|
||||
<md-input-container class="md-block"
|
||||
flex-gt-sm
|
||||
>
|
||||
<label ng-hide="settings.hideLabels" ng-bind="'widgets.date-range-navigator.localizationMap.Step size' | translate"></label>
|
||||
<md-select ng-model="selectedStepSize"
|
||||
aria-label="Pick date interval"
|
||||
>
|
||||
<md-option ng-repeat="(dateKey, dateValue) in datesMap" ng-value="dateValue.ts">
|
||||
{{'widgets.date-range-navigator.localizationMap.'+dateValue.label | translate}}
|
||||
</md-option>
|
||||
</md-select>
|
||||
</md-input-container>
|
||||
<md-button ng-click="goForth()" class="md-icon-button">
|
||||
<md-icon>keyboard_arrow_right</md-icon>
|
||||
</md-button>
|
||||
</div>
|
||||
</div>
|
||||
Loading…
x
Reference in New Issue
Block a user