thingsboard-developers
Changes
ui/src/app/common/dashboard-utils.service.js 18(+16 -2)
ui/src/app/components/dashboard.directive.js 160(+73 -87)
Details
diff --git a/tools/src/main/java/org/thingsboard/client/tools/RestClient.java b/tools/src/main/java/org/thingsboard/client/tools/RestClient.java
index d635dbc..7000496 100644
--- a/tools/src/main/java/org/thingsboard/client/tools/RestClient.java
+++ b/tools/src/main/java/org/thingsboard/client/tools/RestClient.java
@@ -26,9 +26,16 @@ import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.support.HttpRequestWrapper;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate;
+import org.thingsboard.server.common.data.Customer;
import org.thingsboard.server.common.data.Device;
+import org.thingsboard.server.common.data.alarm.Alarm;
+import org.thingsboard.server.common.data.alarm.AlarmSeverity;
+import org.thingsboard.server.common.data.alarm.AlarmStatus;
+import org.thingsboard.server.common.data.asset.Asset;
+import org.thingsboard.server.common.data.id.AssetId;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId;
+import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.security.DeviceCredentials;
import java.io.IOException;
@@ -71,18 +78,40 @@ public class RestClient implements ClientHttpRequestInterceptor {
}
}
- public Device createDevice(String name) {
+ public Customer createCustomer(String title) {
+ Customer customer = new Customer();
+ customer.setTitle(title);
+ return restTemplate.postForEntity(baseURL + "/api/customer", customer, Customer.class).getBody();
+ }
+
+ public Device createDevice(String name, String type) {
Device device = new Device();
device.setName(name);
+ device.setType(type);
return restTemplate.postForEntity(baseURL + "/api/device", device, Device.class).getBody();
}
+ public Asset createAsset(String name, String type) {
+ Asset asset = new Asset();
+ asset.setName(name);
+ asset.setType(type);
+ return restTemplate.postForEntity(baseURL + "/api/asset", asset, Asset.class).getBody();
+ }
+
+ public Alarm createAlarm(Alarm alarm) {
+ return restTemplate.postForEntity(baseURL + "/api/alarm", alarm, Alarm.class).getBody();
+ }
public Device assignDevice(CustomerId customerId, DeviceId deviceId) {
return restTemplate.postForEntity(baseURL + "/api/customer/{customerId}/device/{deviceId}", null, Device.class,
customerId.toString(), deviceId.toString()).getBody();
}
+ public Asset assignAsset(CustomerId customerId, AssetId assetId) {
+ return restTemplate.postForEntity(baseURL + "/api/customer/{customerId}/asset/{assetId}", null, Asset.class,
+ customerId.toString(), assetId.toString()).getBody();
+ }
+
public DeviceCredentials getCredentials(DeviceId id) {
return restTemplate.getForEntity(baseURL + "/api/device/" + id.getId().toString() + "/credentials", DeviceCredentials.class).getBody();
}
@@ -91,11 +120,14 @@ public class RestClient implements ClientHttpRequestInterceptor {
return restTemplate;
}
+ public String getToken() {
+ return token;
+ }
+
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] bytes, ClientHttpRequestExecution execution) throws IOException {
HttpRequest wrapper = new HttpRequestWrapper(request);
wrapper.getHeaders().set(JWT_TOKEN_HEADER_PARAM, "Bearer " + token);
return execution.execute(wrapper, bytes);
}
-
-}
+}
\ No newline at end of file
ui/src/app/common/dashboard-utils.service.js 18(+16 -2)
diff --git a/ui/src/app/common/dashboard-utils.service.js b/ui/src/app/common/dashboard-utils.service.js
index 64a2c64..c4b2486 100644
--- a/ui/src/app/common/dashboard-utils.service.js
+++ b/ui/src/app/common/dashboard-utils.service.js
@@ -425,12 +425,26 @@ function DashboardUtils(types, utils, timeService) {
var prevColumns = prevGridSettings ? prevGridSettings.columns : 24;
var ratio = gridSettings.columns / prevColumns;
layout.gridSettings = gridSettings;
+ var maxRow = 0;
for (var w in layout.widgets) {
var widget = layout.widgets[w];
+ maxRow = Math.max(maxRow, widget.row + widget.sizeY);
+ }
+ var newMaxRow = Math.round(maxRow * ratio);
+ for (w in layout.widgets) {
+ widget = layout.widgets[w];
+ if (widget.row + widget.sizeY == maxRow) {
+ widget.row = Math.round(widget.row * ratio);
+ widget.sizeY = newMaxRow - widget.row;
+ } else {
+ widget.row = Math.round(widget.row * ratio);
+ widget.sizeY = Math.round(widget.sizeY * ratio);
+ }
widget.sizeX = Math.round(widget.sizeX * ratio);
- widget.sizeY = Math.round(widget.sizeY * ratio);
widget.col = Math.round(widget.col * ratio);
- widget.row = Math.round(widget.row * ratio);
+ if (widget.col + widget.sizeX > gridSettings.columns) {
+ widget.sizeX = gridSettings.columns - widget.col;
+ }
}
}
ui/src/app/components/dashboard.directive.js 160(+73 -87)
diff --git a/ui/src/app/components/dashboard.directive.js b/ui/src/app/components/dashboard.directive.js
index 36bda51..c489c32 100644
--- a/ui/src/app/components/dashboard.directive.js
+++ b/ui/src/app/components/dashboard.directive.js
@@ -235,61 +235,6 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
removeResizeListener(gridsterParent[0], onGridsterParentResize); // eslint-disable-line no-undef
});
- $scope.$watchCollection('vm.widgets', function () {
- var ids = [];
- for (var i=0;i<vm.widgets.length;i++) {
- var widget = vm.widgets[i];
- if (!widget.id) {
- widget.id = utils.guid();
- }
- ids.push(widget.id);
- }
- ids.sort(function (id1, id2) {
- return id1.localeCompare(id2);
- });
- if (angular.equals(ids, vm.widgetIds)) {
- return;
- }
- vm.widgetIds = ids;
- for (i=0;i<vm.widgets.length;i++) {
- widget = vm.widgets[i];
- var layoutInfoObject = vm.widgetLayoutInfo[widget.id];
- if (!layoutInfoObject) {
- layoutInfoObject = {
- widget: widget
- };
- Object.defineProperty(layoutInfoObject, 'sizeX', {
- get: function() { return widgetSizeX(this.widget) },
- set: function(newSizeX) { setWidgetSizeX(this.widget, newSizeX)}
- });
- Object.defineProperty(layoutInfoObject, 'sizeY', {
- get: function() { return widgetSizeY(this.widget) },
- set: function(newSizeY) { setWidgetSizeY(this.widget, newSizeY)}
- });
- Object.defineProperty(layoutInfoObject, 'row', {
- get: function() { return widgetRow(this.widget) },
- set: function(newRow) { setWidgetRow(this.widget, newRow)}
- });
- Object.defineProperty(layoutInfoObject, 'col', {
- get: function() { return widgetCol(this.widget) },
- set: function(newCol) { setWidgetCol(this.widget, newCol)}
- });
- vm.widgetLayoutInfo[widget.id] = layoutInfoObject;
- }
- }
- for (var widgetId in vm.widgetLayoutInfo) {
- if (ids.indexOf(widgetId) === -1) {
- delete vm.widgetLayoutInfo[widgetId];
- }
- }
- sortWidgets();
- $mdUtil.nextTick(function () {
- if (autofillHeight()) {
- updateMobileOpts();
- }
- });
- });
-
function onGridsterParentResize() {
if (gridsterParent.height() && autofillHeight()) {
updateMobileOpts();
@@ -340,38 +285,6 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
return isMobileSize;
}
- $scope.$watch(function() { return $mdMedia('gt-sm'); }, function() {
- updateMobileOpts();
- sortWidgets();
- });
-
- $scope.$watch('vm.isMobile', function () {
- updateMobileOpts();
- sortWidgets();
- });
-
- $scope.$watch('vm.autofillHeight', function () {
- updateMobileOpts();
- });
-
- $scope.$watch('vm.mobileAutofillHeight', function () {
- updateMobileOpts();
- });
-
- $scope.$watch('vm.mobileRowHeight', function () {
- updateMobileOpts();
- });
-
- $scope.$watch('vm.isMobileDisabled', function () {
- updateMobileOpts();
- sortWidgets();
- });
-
- $scope.$watch('vm.widgetLayouts', function () {
- updateMobileOpts();
- sortWidgets();
- });
-
$scope.$watch('vm.columns', function () {
var columns = vm.columns ? vm.columns : 24;
if (vm.gridsterOpts.columns != columns) {
@@ -385,6 +298,19 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
}
});
+ $scope.$watch(function() {
+ return $mdMedia('gt-sm') + ',' + vm.isMobile + ',' + vm.isMobileDisabled;
+ }, function() {
+ updateMobileOpts();
+ sortWidgets();
+ });
+
+ $scope.$watch(function() {
+ return vm.autofillHeight + ',' + vm.mobileAutofillHeight + ',' + vm.mobileRowHeight;
+ }, function () {
+ updateMobileOpts();
+ });
+
$scope.$watch('vm.margins', function () {
var margins = vm.margins ? vm.margins : [10, 10];
if (!angular.equals(vm.gridsterOpts.margins, margins)) {
@@ -411,6 +337,66 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
}
});
+ $scope.$watchCollection('vm.widgets', function () {
+ var ids = [];
+ for (var i=0;i<vm.widgets.length;i++) {
+ var widget = vm.widgets[i];
+ if (!widget.id) {
+ widget.id = utils.guid();
+ }
+ ids.push(widget.id);
+ }
+ ids.sort(function (id1, id2) {
+ return id1.localeCompare(id2);
+ });
+ if (angular.equals(ids, vm.widgetIds)) {
+ return;
+ }
+ vm.widgetIds = ids;
+ for (i=0;i<vm.widgets.length;i++) {
+ widget = vm.widgets[i];
+ var layoutInfoObject = vm.widgetLayoutInfo[widget.id];
+ if (!layoutInfoObject) {
+ layoutInfoObject = {
+ widget: widget
+ };
+ Object.defineProperty(layoutInfoObject, 'sizeX', {
+ get: function() { return widgetSizeX(this.widget) },
+ set: function(newSizeX) { setWidgetSizeX(this.widget, newSizeX)}
+ });
+ Object.defineProperty(layoutInfoObject, 'sizeY', {
+ get: function() { return widgetSizeY(this.widget) },
+ set: function(newSizeY) { setWidgetSizeY(this.widget, newSizeY)}
+ });
+ Object.defineProperty(layoutInfoObject, 'row', {
+ get: function() { return widgetRow(this.widget) },
+ set: function(newRow) { setWidgetRow(this.widget, newRow)}
+ });
+ Object.defineProperty(layoutInfoObject, 'col', {
+ get: function() { return widgetCol(this.widget) },
+ set: function(newCol) { setWidgetCol(this.widget, newCol)}
+ });
+ vm.widgetLayoutInfo[widget.id] = layoutInfoObject;
+ }
+ }
+ for (var widgetId in vm.widgetLayoutInfo) {
+ if (ids.indexOf(widgetId) === -1) {
+ delete vm.widgetLayoutInfo[widgetId];
+ }
+ }
+ sortWidgets();
+ $mdUtil.nextTick(function () {
+ if (autofillHeight()) {
+ updateMobileOpts();
+ }
+ });
+ });
+
+ $scope.$watch('vm.widgetLayouts', function () {
+ updateMobileOpts();
+ sortWidgets();
+ });
+
$scope.$on('gridster-resized', function (event, sizes, theGridster) {
if (checkIsLocalGridsterElement(theGridster)) {
vm.gridster = theGridster;