thingsboard-aplcache

Details

diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java
index 6ef0acb..2f3edbe 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/entityview/JpaEntityViewDao.java
@@ -100,7 +100,7 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
                 entityViewRepository.findByTenantIdAndCustomerId(
                         fromTimeUUID(tenantId),
                         fromTimeUUID(customerId),
-                        Objects.toString(pageLink, ""),
+                        Objects.toString(pageLink.getTextSearch(), ""),
                         pageLink.getIdOffset() == null ? NULL_UUID_STR : fromTimeUUID(pageLink.getIdOffset()),
                         new PageRequest(0, pageLink.getLimit())
                 ));
@@ -116,7 +116,7 @@ public class JpaEntityViewDao extends JpaAbstractSearchTextDao<EntityViewEntity,
                         fromTimeUUID(tenantId),
                         fromTimeUUID(customerId),
                         fromTimeUUID(entityId),
-                        Objects.toString(pageLink, ""),
+                        Objects.toString(pageLink.getTextSearch(), ""),
                         pageLink.getIdOffset() == null ? NULL_UUID_STR : fromTimeUUID(pageLink.getIdOffset()),
                         new PageRequest(0, pageLink.getLimit())
                 ));
diff --git a/ui/src/app/api/entity-view.service.js b/ui/src/app/api/entity-view.service.js
index d6d5868..e34d3a4 100644
--- a/ui/src/app/api/entity-view.service.js
+++ b/ui/src/app/api/entity-view.service.js
@@ -156,9 +156,6 @@ function EntityViewService($http, $q, $window, userService, attributeService, cu
         var deferred = $q.defer();
         var url = '/api/entityView';
 
-        entityView.keys = {};
-        entityView.keys.timeseries = ['temp'];
-
         $http.post(url, entityView).then(function success(response) {
             deferred.resolve(response.data);
         }, function fail() {
diff --git a/ui/src/app/entity-view/entity-view.directive.js b/ui/src/app/entity-view/entity-view.directive.js
index 4ec03a1..e31b0d4 100644
--- a/ui/src/app/entity-view/entity-view.directive.js
+++ b/ui/src/app/entity-view/entity-view.directive.js
@@ -20,7 +20,8 @@ import entityViewFieldsetTemplate from './entity-view-fieldset.tpl.html';
 /* eslint-enable import/no-unresolved, import/default */
 
 /*@ngInject*/
-export default function EntityViewDirective($compile, $templateCache, $filter, toast, $translate, types, clipboardService, entityViewService, customerService) {
+export default function EntityViewDirective($compile, $templateCache, $filter, toast, $translate, $mdConstant,
+                                            types, clipboardService, entityViewService, customerService) {
     var linker = function (scope, element) {
         var template = $templateCache.get(entityViewFieldsetTemplate);
         element.html(template);
@@ -32,6 +33,9 @@ export default function EntityViewDirective($compile, $templateCache, $filter, t
 
         scope.allowedEntityTypes = [types.entityType.device, types.entityType.asset];
 
+        var semicolon = 186;
+        scope.separatorKeys = [$mdConstant.KEY_CODE.ENTER, $mdConstant.KEY_CODE.COMMA, semicolon];
+
         scope.$watch('entityView', function(newVal) {
             if (newVal) {
                 if (scope.entityView.customerId && scope.entityView.customerId.id !== types.id.nullUid) {
@@ -49,6 +53,14 @@ export default function EntityViewDirective($compile, $templateCache, $filter, t
                 }
                 scope.startTs = new Date(scope.entityView.startTs);
                 scope.endTs = new Date(scope.entityView.endTs);
+                if (!scope.entityView.keys) {
+                    scope.entityView.keys = {};
+                    scope.entityView.keys.timeseries = [];
+                    scope.entityView.keys.attributes = {};
+                    scope.entityView.keys.attributes.ss = [];
+                    scope.entityView.keys.attributes.cs = [];
+                    scope.entityView.keys.attributes.sh = [];
+                }
             }
         });
 
diff --git a/ui/src/app/entity-view/entity-view-fieldset.tpl.html b/ui/src/app/entity-view/entity-view-fieldset.tpl.html
index c73b0a2..29287f9 100644
--- a/ui/src/app/entity-view/entity-view-fieldset.tpl.html
+++ b/ui/src/app/entity-view/entity-view-fieldset.tpl.html
@@ -62,6 +62,39 @@
             <label translate>entity-view.description</label>
             <textarea ng-model="entityView.additionalInfo.description" rows="2"></textarea>
         </md-input-container>
+        <section layout="column">
+            <label translate class="tb-title no-padding">entity-view.client-attributes</label>
+            <md-chips style="padding-bottom: 15px;"
+                      ng-required="false"
+                      readonly="!isEdit"
+                      ng-model="entityView.keys.attributes.cs"
+                      placeholder="{{'entity-view.client-attributes' | translate}}"
+                      md-separator-keys="separatorKeys">
+            </md-chips>
+            <label translate class="tb-title no-padding">entity-view.shared-attributes</label>
+            <md-chips style="padding-bottom: 15px;"
+                      ng-required="false"
+                      readonly="!isEdit"
+                      ng-model="entityView.keys.attributes.sh"
+                      placeholder="{{'entity-view.shared-attributes' | translate}}"
+                      md-separator-keys="separatorKeys">
+            </md-chips>
+            <label translate class="tb-title no-padding">entity-view.server-attributes</label>
+            <md-chips style="padding-bottom: 15px;"
+                      ng-required="false"
+                      readonly="!isEdit"
+                      ng-model="entityView.keys.attributes.ss"
+                      placeholder="{{'entity-view.server-attributes' | translate}}"
+                      md-separator-keys="separatorKeys">
+            </md-chips>
+            <label translate class="tb-title no-padding">entity-view.latest-timeseries</label>
+            <md-chips ng-required="false"
+                      readonly="!isEdit"
+                      ng-model="entityView.keys.timeseries"
+                      placeholder="{{'entity-view.latest-timeseries' | translate}}"
+                      md-separator-keys="separatorKeys">
+            </md-chips>
+        </section>
         <section layout="row" layout-align="start start">
             <mdp-date-picker ng-model="startTs"
                              mdp-max-date="maxStartTs"
diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json
index 87a1b1b..4018c3a 100644
--- a/ui/src/app/locale/locale.constant-en_US.json
+++ b/ui/src/app/locale/locale.constant-en_US.json
@@ -828,7 +828,11 @@
         "select-entity-view": "Select entity view",
         "make-public": "Make entity view public",
         "start-ts": "Start ts",
-        "end-ts": "End ts"
+        "end-ts": "End ts",
+        "client-attributes": "Client attributes",
+        "shared-attributes": "Shared attributes",
+        "server-attributes": "Server attributes",
+        "latest-timeseries": "Latest timeseries"
     },
     "event": {
         "event-type": "Event type",