thingsboard-aplcache

TB-61: Update import/export

6/8/2017 3:24:11 AM

Details

diff --git a/ui/src/app/api/alias-controller.js b/ui/src/app/api/alias-controller.js
index 7794363..49eb8fe 100644
--- a/ui/src/app/api/alias-controller.js
+++ b/ui/src/app/api/alias-controller.js
@@ -96,6 +96,7 @@ export default class AliasController {
                     function success(aliasInfo) {
                         aliasCtrl.resolvedAliases[aliasId] = aliasInfo;
                         if (entityAlias.filter.stateEntity) {
+                            aliasInfo.stateEntity = true;
                             aliasCtrl.resolvedAliasesToStateEntities[aliasId] =
                                 aliasCtrl.stateController.getStateParams().entityId;
                         }
@@ -120,12 +121,13 @@ export default class AliasController {
                     function success(aliasInfo) {
                         datasource.aliasName = aliasInfo.alias;
                         if (aliasInfo.resolveMultiple) {
+                            var newDatasource;
                             var resolvedEntities = aliasInfo.resolvedEntities;
                             if (resolvedEntities && resolvedEntities.length) {
                                 var datasources = [];
                                 for (var i=0;i<resolvedEntities.length;i++) {
                                     var resolvedEntity = resolvedEntities[i];
-                                    var newDatasource = angular.copy(datasource);
+                                    newDatasource = angular.copy(datasource);
                                     newDatasource.entityId = resolvedEntity.id;
                                     newDatasource.entityType = resolvedEntity.entityType;
                                     newDatasource.entityName = resolvedEntity.name;
@@ -135,15 +137,30 @@ export default class AliasController {
                                 }
                                 deferred.resolve(datasources);
                             } else {
-                                deferred.reject();
+                                if (aliasInfo.stateEntity) {
+                                    newDatasource = angular.copy(datasource);
+                                    newDatasource.unresolvedStateEntity = true;
+                                    deferred.resolve([newDatasource]);
+                                } else {
+                                    deferred.reject();
+                                }
                             }
                         } else {
                             var entity = aliasInfo.currentEntity;
-                            datasource.entityId = entity.id;
-                            datasource.entityType = entity.entityType;
-                            datasource.entityName = entity.name;
-                            datasource.name = entity.name;
-                            deferred.resolve([datasource]);
+                            if (entity) {
+                                datasource.entityId = entity.id;
+                                datasource.entityType = entity.entityType;
+                                datasource.entityName = entity.name;
+                                datasource.name = entity.name;
+                                deferred.resolve([datasource]);
+                            } else {
+                                if (aliasInfo.stateEntity) {
+                                    datasource.unresolvedStateEntity = true;
+                                    deferred.resolve([datasource]);
+                                } else {
+                                    deferred.reject();
+                                }
+                            }
                         }
                     },
                     function fail() {
diff --git a/ui/src/app/api/entity.service.js b/ui/src/app/api/entity.service.js
index 8c28a9b..91c8df3 100644
--- a/ui/src/app/api/entity.service.js
+++ b/ui/src/app/api/entity.service.js
@@ -29,10 +29,9 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
         getEntitiesByNameFilter: getEntitiesByNameFilter,
         resolveAlias: resolveAlias,
         resolveAliasFilter: resolveAliasFilter,
+        checkEntityAlias: checkEntityAlias,
         filterAliasByEntityTypes: filterAliasByEntityTypes,
-        //processEntityAliases: processEntityAliases,
         getEntityKeys: getEntityKeys,
-        checkEntityAlias: checkEntityAlias,
         createDatasourcesFromSubscriptionsInfo: createDatasourcesFromSubscriptionsInfo,
         getRelatedEntities: getRelatedEntities,
         saveRelatedEntity: saveRelatedEntity,
@@ -259,7 +258,32 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
         return entitiesInfo;
     }
 
-    function resolveAliasFilter(filter, stateParams) {
+    function resolveAlias(entityAlias, stateParams) {
+        var deferred = $q.defer();
+        var filter = entityAlias.filter;
+        resolveAliasFilter(filter, stateParams, 100).then(
+            function (result) {
+                var entities = result.entities;
+                var aliasInfo = {
+                    alias: entityAlias.alias,
+                    resolveMultiple: filter.resolveMultiple
+                };
+                var resolvedEntities = entitiesToEntitiesInfo(entities);
+                aliasInfo.resolvedEntities = resolvedEntities;
+                aliasInfo.currentEntity = null;
+                if (aliasInfo.resolvedEntities.length) {
+                    aliasInfo.currentEntity = aliasInfo.resolvedEntities[0];
+                }
+                deferred.resolve(aliasInfo);
+            },
+            function fail() {
+                deferred.reject();
+            }
+        );
+        return deferred.promise;
+    }
+
+    function resolveAliasFilter(filter, stateParams, maxItems) {
         var deferred = $q.defer();
         var result = {
             entities: [],
@@ -299,7 +323,7 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
                 }
                 break;
             case types.aliasFilterType.entityName.value:
-                getEntitiesByNameFilter(filter.entityType, filter.entityNameFilter, 100).then(
+                getEntitiesByNameFilter(filter.entityType, filter.entityNameFilter, maxItems).then(
                     function success(entities) {
                         if (entities && entities.length) {
                             result.entities = entities;
@@ -318,31 +342,6 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
         return deferred.promise;
     }
 
-    function resolveAlias(entityAlias, stateParams) {
-        var deferred = $q.defer();
-        var filter = entityAlias.filter;
-        resolveAliasFilter(filter, stateParams).then(
-            function (result) {
-                var entities = result.entities;
-                var aliasInfo = {
-                    alias: entityAlias.alias,
-                    resolveMultiple: filter.resolveMultiple
-                };
-                var resolvedEntities = entitiesToEntitiesInfo(entities);
-                aliasInfo.resolvedEntities = resolvedEntities;
-                aliasInfo.currentEntity = null;
-                if (aliasInfo.resolvedEntities.length) {
-                    aliasInfo.currentEntity = aliasInfo.resolvedEntities[0];
-                }
-                deferred.resolve(aliasInfo);
-            },
-            function fail() {
-                deferred.reject();
-            }
-        );
-        return deferred.promise;
-    }
-
     function filterAliasByEntityTypes(entityAlias, entityTypes) {
         var filter = entityAlias.filter;
         switch (filter.type) {
@@ -359,6 +358,28 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
         return false;
     }
 
+    function checkEntityAlias(entityAlias) {
+        var deferred = $q.defer();
+        resolveAliasFilter(entityAlias.filter, null, 1).then(
+            function success(result) {
+                if (result.stateEntity) {
+                    deferred.resolve(true);
+                } else {
+                    var entities = result.entities;
+                    if (entities && entities.length) {
+                        deferred.resolve(true);
+                    } else {
+                        deferred.resolve(false);
+                    }
+                }
+            },
+            function fail() {
+                deferred.resolve(false);
+            }
+        );
+        return deferred.promise;
+    }
+
     /*function processEntityAlias(index, aliasIds, entityAliases, stateParams, resolution, deferred) {
         if (index < aliasIds.length) {
             var aliasId = aliasIds[index];
@@ -433,33 +454,6 @@ function EntityService($http, $q, $filter, $translate, $log, userService, device
         return deferred.promise;
     }
 
-    function checkEntityAlias(entityAlias) {
-        var deferred = $q.defer();
-        var entityType = entityAlias.entityType;
-        var entityFilter = entityAlias.entityFilter;
-        var promise;
-        if (entityFilter.useFilter) {
-            var entityNameFilter = entityFilter.entityNameFilter;
-            promise = getEntitiesByNameFilter(entityType, entityNameFilter, 1);
-        } else {
-            var entityList = entityFilter.entityList;
-            promise = getEntities(entityType, entityList);
-        }
-        promise.then(
-            function success(entities) {
-                if (entities && entities.length > 0) {
-                    deferred.resolve(true);
-                } else {
-                    deferred.resolve(false);
-                }
-            },
-            function fail() {
-                deferred.resolve(false);
-            }
-        );
-        return deferred.promise;
-    }
-
     function createDatasourcesFromSubscriptionsInfo(subscriptionsInfo) {
         var deferred = $q.defer();
         var datasources = [];
diff --git a/ui/src/app/api/subscription.js b/ui/src/app/api/subscription.js
index 471203c..dd518c7 100644
--- a/ui/src/app/api/subscription.js
+++ b/ui/src/app/api/subscription.js
@@ -125,17 +125,22 @@ export default class Subscription {
 
     initDataSubscription() {
         var deferred = this.ctx.$q.defer();
-        var subscription = this;
-        this.ctx.aliasController.resolveDatasources(this.datasources).then(
-            function success(datasources) {
-                subscription.datasources = datasources;
-                subscription.configureData();
-                deferred.resolve();
-            },
-            function fail() {
-                deferred.reject();
-            }
-        );
+        if (!this.ctx.aliasController) {
+            this.configureData();
+            deferred.resolve();
+        } else {
+            var subscription = this;
+            this.ctx.aliasController.resolveDatasources(this.datasources).then(
+                function success(datasources) {
+                    subscription.datasources = datasources;
+                    subscription.configureData();
+                    deferred.resolve();
+                },
+                function fail() {
+                    deferred.reject();
+                }
+            );
+        }
         return deferred.promise;
     }
 
diff --git a/ui/src/app/common/dashboard-utils.service.js b/ui/src/app/common/dashboard-utils.service.js
index 51a0215..58d1dbd 100644
--- a/ui/src/app/common/dashboard-utils.service.js
+++ b/ui/src/app/common/dashboard-utils.service.js
@@ -57,6 +57,9 @@ function DashboardUtils(types, utils, timeService) {
             for (aliasId in entityAliases) {
                 entityAlias = entityAliases[aliasId];
                 entityAliases[aliasId] = validateAndUpdateEntityAlias(entityAlias);
+                if (!entityAliases[aliasId].id) {
+                    entityAliases[aliasId].id = aliasId;
+                }
             }
         }
         return configuration;
@@ -202,6 +205,12 @@ function DashboardUtils(types, utils, timeService) {
                 states[firstStateId].root = true;
             }
         }
+
+       /* var datasources = {};
+        for (var widgetId in dashboard.configuration.widgets) {
+
+        }*/
+
         dashboard.configuration = validateAndUpdateEntityAliases(dashboard.configuration);
 
         if (angular.isUndefined(dashboard.configuration.timewindow)) {
diff --git a/ui/src/app/components/widget.controller.js b/ui/src/app/components/widget.controller.js
index 103ad13..4407381 100644
--- a/ui/src/app/components/widget.controller.js
+++ b/ui/src/app/components/widget.controller.js
@@ -38,6 +38,7 @@ export default function WidgetController($scope, $timeout, $window, $element, $q
 
     var gridsterItemInited = false;
     var subscriptionInited = false;
+    var widgetSizeDetected = false;
 
     var cafs = {};
 
@@ -206,9 +207,7 @@ export default function WidgetController($scope, $timeout, $window, $element, $q
 
     initialize().then(
         function(){
-            if (checkSize()) {
-                onInit();
-            }
+            onInit();
         }
     );
 
@@ -488,10 +487,15 @@ export default function WidgetController($scope, $timeout, $window, $element, $q
         $scope.widgetErrorData = utils.processWidgetException(e);
     }
 
-    function onInit() {
-        if (!widgetContext.inited &&
-            subscriptionInited &&
-            gridsterItemInited) {
+    function isReady() {
+        return subscriptionInited && gridsterItemInited && widgetSizeDetected;
+    }
+
+    function onInit(skipSizeCheck) {
+        if (!skipSizeCheck) {
+            checkSize();
+        }
+        if (!widgetContext.inited && isReady()) {
             widgetContext.inited = true;
             try {
                 widgetTypeInstance.onInit();
@@ -516,6 +520,7 @@ export default function WidgetController($scope, $timeout, $window, $element, $q
                 widgetContext.width = width;
                 widgetContext.height = height;
                 sizeChanged = true;
+                widgetSizeDetected = true;
             }
         }
         return sizeChanged;
@@ -536,7 +541,7 @@ export default function WidgetController($scope, $timeout, $window, $element, $q
                     }
                 });
             } else {
-                onInit();
+                onInit(true);
             }
         }
     }
@@ -545,9 +550,7 @@ export default function WidgetController($scope, $timeout, $window, $element, $q
         if (item && item.gridster) {
             widgetContext.isMobile = item.gridster.isMobile;
             gridsterItemInited = true;
-            if (checkSize()) {
-                onInit();
-            }
+            onInit();
             // gridsterItemElement = $(item.$element);
             //updateVisibility();
         }
diff --git a/ui/src/app/dashboard/dashboard.controller.js b/ui/src/app/dashboard/dashboard.controller.js
index 4168864..7c97a94 100644
--- a/ui/src/app/dashboard/dashboard.controller.js
+++ b/ui/src/app/dashboard/dashboard.controller.js
@@ -344,6 +344,8 @@ export default function DashboardController(types, utils, dashboardUtils, widget
             vm.dashboardConfiguration = vm.dashboard.configuration;
             vm.dashboardCtx.dashboard = vm.dashboard;
             vm.dashboardCtx.dashboardTimewindow = vm.dashboardConfiguration.timewindow;
+            vm.dashboardCtx.aliasController = new AliasController($scope, $q, $filter, utils,
+                types, entityService, vm.dashboardCtx.stateController, vm.dashboardConfiguration.entityAliases);
             var parentScope = $window.parent.angular.element($window.frameElement).scope();
             parentScope.$root.$broadcast('widgetEditModeInited');
             parentScope.$root.$apply();
diff --git a/ui/src/app/entity/attribute/add-widget-to-dashboard-dialog.controller.js b/ui/src/app/entity/attribute/add-widget-to-dashboard-dialog.controller.js
index e5822a4..b28a46b 100644
--- a/ui/src/app/entity/attribute/add-widget-to-dashboard-dialog.controller.js
+++ b/ui/src/app/entity/attribute/add-widget-to-dashboard-dialog.controller.js
@@ -22,7 +22,8 @@ import selectTargetLayoutTemplate from '../../dashboard/layouts/select-target-la
 /* eslint-enable import/no-unresolved, import/default */
 
 /*@ngInject*/
-export default function AddWidgetToDashboardDialogController($scope, $mdDialog, $state, $q, $document, itembuffer, dashboardService, entityId, entityType, entityName, widget) {
+export default function AddWidgetToDashboardDialogController($scope, $mdDialog, $state, $q, $document,
+                                                             types, itembuffer, dashboardService, entityId, entityType, entityName, widget) {
 
     var vm = this;
 
@@ -125,12 +126,14 @@ export default function AddWidgetToDashboardDialogController($scope, $mdDialog, 
             targetDeviceAliases: {}
         };
         aliasesInfo.datasourceAliases[0] = {
-            aliasName: entityName,
-            entityType: entityType,
-            entityFilter: {
-                useFilter: false,
-                entityNameFilter: '',
-                entityList: [entityId]
+            id: 1,
+            alias: entityName,
+            filter: {
+                type: types.aliasFilterType.entityList.value,
+                stateEntity: false,
+                entityList: [entityId],
+                entityType: entityType,
+                resolveMultiple: false
             }
         };
         itembuffer.addWidgetToDashboard(theDashboard, targetState, targetLayout, vm.widget, aliasesInfo, null, 48, null, -1, -1).then(
diff --git a/ui/src/app/entity/entity-filter-dialog.controller.js b/ui/src/app/entity/entity-filter-dialog.controller.js
index 2b1a30d..17a19d6 100644
--- a/ui/src/app/entity/entity-filter-dialog.controller.js
+++ b/ui/src/app/entity/entity-filter-dialog.controller.js
@@ -64,7 +64,7 @@ export default function EntityFilterDialogController($scope, $mdDialog, $q, enti
             entity: null,
             stateEntity: false
         }
-        entityService.resolveAliasFilter(vm.filter).then(
+        entityService.resolveAliasFilter(vm.filter, null, 1).then(
             function success(result) {
                 validationResult.stateEntity = result.stateEntity;
                 var entities = result.entities;
diff --git a/ui/src/app/import-export/import-export.service.js b/ui/src/app/import-export/import-export.service.js
index af04687..7f7f774 100644
--- a/ui/src/app/import-export/import-export.service.js
+++ b/ui/src/app/import-export/import-export.service.js
@@ -359,30 +359,50 @@ export default function ImportExport($log, $translate, $q, $mdDialog, $document,
     }
 
     function prepareEntityAlias(aliasInfo) {
-        var entityFilter;
-        var entityType;
+        var alias;
+        var filter;
         if (aliasInfo.deviceId) {
-            entityFilter = {
-                useFilter: false,
-                entityNameFilter: '',
-                entityList: [aliasInfo.deviceId]
-            }
-            entityType = types.entityType.device;
+            alias = aliasInfo.aliasName;
+            filter = {
+                type: types.aliasFilterType.entityList.value,
+                stateEntity: false,
+                entityType: types.entityType.device,
+                entityList: [aliasInfo.deviceId],
+                resolveMultiple: false
+            };
         } else if (aliasInfo.deviceFilter) {
-            entityFilter = {
-                useFilter: aliasInfo.deviceFilter.useFilter,
-                entityNameFilter: aliasInfo.deviceFilter.deviceNameFilter,
-                entityList: aliasInfo.deviceFilter.deviceList
+            alias = aliasInfo.aliasName;
+            filter = {
+                type: aliasInfo.deviceFilter.useFilter ? types.aliasFilterType.entityName.value : types.aliasFilterType.entityList.value,
+                entityType: types.entityType.device,
+                resolveMultiple: false
+            }
+            if (filter.type == types.aliasFilterType.entityList.value) {
+                filter.stateEntity = false;
+                filter.entityList = aliasInfo.deviceFilter.deviceList
+            } else {
+                filter.entityNameFilter = aliasInfo.deviceFilter.deviceNameFilter;
+            }
+        } else if (aliasInfo.entityFilter) {
+            alias = aliasInfo.aliasName;
+            filter = {
+                type: aliasInfo.entityFilter.useFilter ? types.aliasFilterType.entityName.value : types.aliasFilterType.entityList.value,
+                entityType: aliasInfo.entityType,
+                resolveMultiple: false
+            }
+            if (filter.type == types.aliasFilterType.entityList.value) {
+                filter.stateEntity = false;
+                filter.entityList = aliasInfo.entityFilter.entityList;
+            } else {
+                filter.entityNameFilter = aliasInfo.entityFilter.entityNameFilter;
             }
-            entityType = types.entityType.device;
         } else {
-            entityFilter = aliasInfo.entityFilter;
-            entityType = aliasInfo.entityType;
+            alias = aliasInfo.alias;
+            filter = aliasInfo.filter;
         }
         return {
-            aliasName: aliasInfo.aliasName,
-            entityType: entityType,
-            entityFilter: entityFilter
+            alias: alias,
+            filter: filter
         };
     }
 
@@ -411,6 +431,7 @@ export default function ImportExport($log, $translate, $q, $mdDialog, $document,
                             for (datasourceIndex in datasourceAliases) {
                                 datasourceAliasesMap[aliasId] = datasourceIndex;
                                 entityAliases[aliasId] = datasourceAliases[datasourceIndex];
+                                entityAliases[aliasId].id = aliasId;
                                 aliasId++;
                             }
                         }
@@ -418,6 +439,7 @@ export default function ImportExport($log, $translate, $q, $mdDialog, $document,
                             for (datasourceIndex in targetDeviceAliases) {
                                 targetDeviceAliasesMap[aliasId] = datasourceIndex;
                                 entityAliases[aliasId] = targetDeviceAliases[datasourceIndex];
+                                entityAliases[aliasId].id = aliasId;
                                 aliasId++;
                             }
                         }
@@ -435,12 +457,10 @@ export default function ImportExport($log, $translate, $q, $mdDialog, $document,
                                                     var datasourceIndex;
                                                     if (datasourceAliasesMap[aliasId]) {
                                                         datasourceIndex = datasourceAliasesMap[aliasId];
-                                                        datasourceAliases[datasourceIndex].entityType = entityAlias.entityType;
-                                                        datasourceAliases[datasourceIndex].entityFilter = entityAlias.entityFilter;
+                                                        datasourceAliases[datasourceIndex] = entityAlias;
                                                     } else if (targetDeviceAliasesMap[aliasId]) {
                                                         datasourceIndex = targetDeviceAliasesMap[aliasId];
-                                                        targetDeviceAliases[datasourceIndex].entityType = entityAlias.entityType;
-                                                        targetDeviceAliases[datasourceIndex].entityFilter = entityAlias.entityFilter;
+                                                        targetDeviceAliases[datasourceIndex] = entityAlias;
                                                     }
                                                 }
                                                 addImportedWidget(dashboard, targetState, targetLayoutFunction, $event, widget,
@@ -622,7 +642,7 @@ export default function ImportExport($log, $translate, $q, $mdDialog, $document,
                     checkNextEntityAliasOrComplete(index, aliasIds, entityAliases, missingEntityAliases, deferred);
                 } else {
                     var missingEntityAlias = angular.copy(entityAlias);
-                    missingEntityAlias.entityFilter = null;
+                    missingEntityAlias.filter = null;
                     missingEntityAliases[aliasId] = missingEntityAlias;
                     checkNextEntityAliasOrComplete(index, aliasIds, entityAliases, missingEntityAliases, deferred);
                 }
diff --git a/ui/src/app/services/item-buffer.service.js b/ui/src/app/services/item-buffer.service.js
index 3aa4809..309e53e 100644
--- a/ui/src/app/services/item-buffer.service.js
+++ b/ui/src/app/services/item-buffer.service.js
@@ -46,16 +46,14 @@ function ItemBuffer($q, bufferStore, types, utils, dashboardUtils) {
      aliasesInfo {
         datasourceAliases: {
             datasourceIndex: {
-                aliasName: "...",
-                entityType: "...",
-                entityFilter: "..."
+                alias: "...",
+                filter: "..."
             }
         }
         targetDeviceAliases: {
             targetDeviceAliasIndex: {
-                aliasName: "...",
-                entityType: "...",
-                entityFilter: "..."
+                alias: "...",
+                filter: "..."
             }
         }
         ....
@@ -64,9 +62,8 @@ function ItemBuffer($q, bufferStore, types, utils, dashboardUtils) {
 
     function prepareAliasInfo(entityAlias) {
         return {
-            aliasName: entityAlias.alias,
-            entityType: entityAlias.entityType,
-            entityFilter: entityAlias.entityFilter
+            alias: entityAlias.alias,
+            filter: entityAlias.filter
         };
     }
 
@@ -288,8 +285,7 @@ function ItemBuffer($q, bufferStore, types, utils, dashboardUtils) {
     }
 
     function isEntityAliasEqual(alias1, alias2) {
-        return alias1.entityType === alias2.entityType &&
-            angular.equals(alias1.entityFilter, alias2.entityFilter);
+        return angular.equals(alias1.filter, alias2.filter);
     }
 
     function getEntityAliasId(entityAliases, aliasInfo) {
@@ -301,13 +297,13 @@ function ItemBuffer($q, bufferStore, types, utils, dashboardUtils) {
             }
         }
         if (!newAliasId) {
-            var newAliasName = createEntityAliasName(entityAliases, aliasInfo.aliasName);
+            var newAliasName = createEntityAliasName(entityAliases, aliasInfo.alias);
             newAliasId = 0;
             for (aliasId in entityAliases) {
                 newAliasId = Math.max(newAliasId, aliasId);
             }
             newAliasId++;
-            entityAliases[newAliasId] = {alias: newAliasName, entityType: aliasInfo.entityType, entityFilter: aliasInfo.entityFilter};
+            entityAliases[newAliasId] = {id: newAliasId, alias: newAliasName, filter: aliasInfo.filter};
         }
         return newAliasId;
     }