Entity view updates

This commit is contained in:
Volodymyr Babak 2018-10-15 21:56:30 +03:00
parent ee2bd0ed88
commit 6bd8f1f959
28 changed files with 172 additions and 37 deletions

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>thingsboard</artifactId> <artifactId>thingsboard</artifactId>
</parent> </parent>
<artifactId>application</artifactId> <artifactId>application</artifactId>

View File

@ -165,9 +165,9 @@ quota:
database: database:
entities: entities:
type: "${DATABASE_ENTITIES_TYPE:sql}" # cassandra OR sql type: "${DATABASE_ENTITIES_TYPE:cassandra}" # cassandra OR sql
ts: ts:
type: "${DATABASE_TS_TYPE:sql}" # cassandra OR sql (for hybrid mode, only this value should be cassandra) type: "${DATABASE_TS_TYPE:cassandra}" # cassandra OR sql (for hybrid mode, only this value should be cassandra)
# Cassandra driver configuration parameters # Cassandra driver configuration parameters

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>thingsboard</artifactId> <artifactId>thingsboard</artifactId>
</parent> </parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>common</artifactId> <artifactId>common</artifactId>
</parent> </parent>
<groupId>org.thingsboard.common</groupId> <groupId>org.thingsboard.common</groupId>

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>thingsboard</artifactId> <artifactId>thingsboard</artifactId>
</parent> </parent>
<artifactId>dao</artifactId> <artifactId>dao</artifactId>

View File

@ -84,8 +84,7 @@ public class CassandraEntityViewDao extends CassandraAbstractSearchTextDao<Entit
@Override @Override
public EntityView save(EntityView domain) { public EntityView save(EntityView domain) {
EntityView savedEntityView = super.save(domain); EntityView savedEntityView = super.save(domain);
EntitySubtype entitySubtype = new EntitySubtype(savedEntityView.getTenantId(), EntityType.ENTITY_VIEW, EntitySubtype entitySubtype = new EntitySubtype(savedEntityView.getTenantId(), EntityType.ENTITY_VIEW, savedEntityView.getType());
savedEntityView.getId().getEntityType().toString());
EntitySubtypeEntity entitySubtypeEntity = new EntitySubtypeEntity(entitySubtype); EntitySubtypeEntity entitySubtypeEntity = new EntitySubtypeEntity(entitySubtype);
Statement saveStatement = cluster.getMapper(EntitySubtypeEntity.class).saveQuery(entitySubtypeEntity); Statement saveStatement = cluster.getMapper(EntitySubtypeEntity.class).saveQuery(entitySubtypeEntity);
executeWrite(saveStatement); executeWrite(saveStatement);

View File

@ -107,7 +107,7 @@ public class EntityViewServiceImpl extends AbstractEntityService implements Enti
EntityView savedEntityView = entityViewDao.save(entityView); EntityView savedEntityView = entityViewDao.save(entityView);
List<ListenableFuture<List<Void>>> futures = new ArrayList<>(); List<ListenableFuture<List<Void>>> futures = new ArrayList<>();
if (savedEntityView.getKeys() != null) { if (savedEntityView.getKeys() != null && savedEntityView.getKeys().getAttributes() != null) {
futures.add(copyAttributesFromEntityToEntityView(savedEntityView, DataConstants.CLIENT_SCOPE, savedEntityView.getKeys().getAttributes().getCs())); futures.add(copyAttributesFromEntityToEntityView(savedEntityView, DataConstants.CLIENT_SCOPE, savedEntityView.getKeys().getAttributes().getCs()));
futures.add(copyAttributesFromEntityToEntityView(savedEntityView, DataConstants.SERVER_SCOPE, savedEntityView.getKeys().getAttributes().getSs())); futures.add(copyAttributesFromEntityToEntityView(savedEntityView, DataConstants.SERVER_SCOPE, savedEntityView.getKeys().getAttributes().getSs()));
futures.add(copyAttributesFromEntityToEntityView(savedEntityView, DataConstants.SHARED_SCOPE, savedEntityView.getKeys().getAttributes().getSh())); futures.add(copyAttributesFromEntityToEntityView(savedEntityView, DataConstants.SHARED_SCOPE, savedEntityView.getKeys().getAttributes().getSh()));

View File

@ -79,12 +79,16 @@ public class BaseTimeseriesService implements TimeseriesService {
if (entityId.getEntityType().equals(EntityType.ENTITY_VIEW)) { if (entityId.getEntityType().equals(EntityType.ENTITY_VIEW)) {
EntityView entityView = entityViewService.findEntityViewById((EntityViewId) entityId); EntityView entityView = entityViewService.findEntityViewById((EntityViewId) entityId);
List<String> filteredKeys = new ArrayList<>(keys); List<String> filteredKeys = new ArrayList<>(keys);
if (!entityView.getKeys().getTimeseries().isEmpty()) { if (entityView.getKeys() != null && entityView.getKeys().getTimeseries() != null &&
!entityView.getKeys().getTimeseries().isEmpty()) {
filteredKeys.retainAll(entityView.getKeys().getTimeseries()); filteredKeys.retainAll(entityView.getKeys().getTimeseries());
} }
List<ReadTsKvQuery> queries = List<ReadTsKvQuery> queries =
filteredKeys.stream() filteredKeys.stream()
.map(key -> new BaseReadTsKvQuery(key, entityView.getStartTimeMs(), entityView.getEndTimeMs(), 1, "ASC")) .map(key -> {
long endTs = entityView.getEndTimeMs() != 0 ? entityView.getEndTimeMs() : Long.MAX_VALUE;
return new BaseReadTsKvQuery(key, entityView.getStartTimeMs(), endTs, 1, "DESC");
})
.collect(Collectors.toList()); .collect(Collectors.toList());
if (queries.size() > 0) { if (queries.size() > 0) {
@ -100,8 +104,18 @@ public class BaseTimeseriesService implements TimeseriesService {
@Override @Override
public ListenableFuture<List<TsKvEntry>> findAllLatest(EntityId entityId) { public ListenableFuture<List<TsKvEntry>> findAllLatest(EntityId entityId) {
validate(entityId); validate(entityId);
if (entityId.getEntityType().equals(EntityType.ENTITY_VIEW)) {
EntityView entityView = entityViewService.findEntityViewById((EntityViewId) entityId);
if (entityView.getKeys() != null && entityView.getKeys().getTimeseries() != null &&
!entityView.getKeys().getTimeseries().isEmpty()) {
return findLatest(entityId, entityView.getKeys().getTimeseries());
} else {
return Futures.immediateFuture(new ArrayList<>());
}
} else {
return timeseriesDao.findAllLatest(entityId); return timeseriesDao.findAllLatest(entityId);
} }
}
@Override @Override
public ListenableFuture<List<Void>> save(EntityId entityId, TsKvEntry tsKvEntry) { public ListenableFuture<List<Void>> save(EntityId entityId, TsKvEntry tsKvEntry) {

View File

@ -24,7 +24,7 @@ import java.util.Arrays;
@RunWith(ClasspathSuite.class) @RunWith(ClasspathSuite.class)
@ClassnameFilters({ @ClassnameFilters({
"org.thingsboard.server.dao.service.*ServiceSqlTest" "org.thingsboard.server.dao.service.*.TimeseriesServiceSqlTest"
}) })
public class SqlDaoServiceTestSuite { public class SqlDaoServiceTestSuite {

View File

@ -45,6 +45,7 @@ import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.dao.dashboard.DashboardService; import org.thingsboard.server.dao.dashboard.DashboardService;
import org.thingsboard.server.dao.device.DeviceCredentialsService; import org.thingsboard.server.dao.device.DeviceCredentialsService;
import org.thingsboard.server.dao.device.DeviceService; import org.thingsboard.server.dao.device.DeviceService;
import org.thingsboard.server.dao.entityview.EntityViewService;
import org.thingsboard.server.dao.event.EventService; import org.thingsboard.server.dao.event.EventService;
import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.relation.RelationService;
import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.rule.RuleChainService;
@ -88,6 +89,9 @@ public abstract class AbstractServiceTest {
@Autowired @Autowired
protected AssetService assetService; protected AssetService assetService;
@Autowired
protected EntityViewService entityViewService;
@Autowired @Autowired
protected DeviceCredentialsService deviceCredentialsService; protected DeviceCredentialsService deviceCredentialsService;

View File

@ -17,9 +17,15 @@ package org.thingsboard.server.dao.service.timeseries;
import com.datastax.driver.core.utils.UUIDs; import com.datastax.driver.core.utils.UUIDs;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.thingsboard.server.common.data.EntityView;
import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.kv.Aggregation; import org.thingsboard.server.common.data.kv.Aggregation;
import org.thingsboard.server.common.data.kv.BaseDeleteTsKvQuery; import org.thingsboard.server.common.data.kv.BaseDeleteTsKvQuery;
import org.thingsboard.server.common.data.kv.BaseReadTsKvQuery; import org.thingsboard.server.common.data.kv.BaseReadTsKvQuery;
@ -30,6 +36,7 @@ import org.thingsboard.server.common.data.kv.KvEntry;
import org.thingsboard.server.common.data.kv.LongDataEntry; import org.thingsboard.server.common.data.kv.LongDataEntry;
import org.thingsboard.server.common.data.kv.StringDataEntry; import org.thingsboard.server.common.data.kv.StringDataEntry;
import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.data.kv.TsKvEntry;
import org.thingsboard.server.common.data.objects.TelemetryEntityView;
import org.thingsboard.server.dao.service.AbstractServiceTest; import org.thingsboard.server.dao.service.AbstractServiceTest;
import java.util.ArrayList; import java.util.ArrayList;
@ -61,6 +68,22 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest {
KvEntry doubleKvEntry = new DoubleDataEntry(DOUBLE_KEY, Double.MAX_VALUE); KvEntry doubleKvEntry = new DoubleDataEntry(DOUBLE_KEY, Double.MAX_VALUE);
KvEntry booleanKvEntry = new BooleanDataEntry(BOOLEAN_KEY, Boolean.TRUE); KvEntry booleanKvEntry = new BooleanDataEntry(BOOLEAN_KEY, Boolean.TRUE);
private TenantId tenantId;
@Before
public void before() {
Tenant tenant = new Tenant();
tenant.setTitle("My tenant");
Tenant savedTenant = tenantService.saveTenant(tenant);
Assert.assertNotNull(savedTenant);
tenantId = savedTenant.getId();
}
@After
public void after() {
tenantService.deleteTenant(tenantId);
}
@Test @Test
public void testFindAllLatest() throws Exception { public void testFindAllLatest() throws Exception {
DeviceId deviceId = new DeviceId(UUIDs.timeBased()); DeviceId deviceId = new DeviceId(UUIDs.timeBased());
@ -69,7 +92,15 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest {
saveEntries(deviceId, TS - 1); saveEntries(deviceId, TS - 1);
saveEntries(deviceId, TS); saveEntries(deviceId, TS);
List<TsKvEntry> tsList = tsService.findAllLatest(deviceId).get(); testLatestTsAndVerify(deviceId);
EntityView entityView = saveAndCreateEntityView(deviceId, Arrays.asList(STRING_KEY, DOUBLE_KEY, LONG_KEY, BOOLEAN_KEY));
testLatestTsAndVerify(entityView.getId());
}
private void testLatestTsAndVerify(EntityId entityId) throws ExecutionException, InterruptedException {
List<TsKvEntry> tsList = tsService.findAllLatest(entityId).get();
assertNotNull(tsList); assertNotNull(tsList);
assertEquals(4, tsList.size()); assertEquals(4, tsList.size());
@ -89,6 +120,18 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest {
assertEquals(expected, tsList); assertEquals(expected, tsList);
} }
private EntityView saveAndCreateEntityView(DeviceId deviceId, List<String> timeseries) {
EntityView entityView = new EntityView();
entityView.setName("entity_view_name");
entityView.setType("default");
entityView.setTenantId(tenantId);
TelemetryEntityView keys = new TelemetryEntityView();
keys.setTimeseries(timeseries);
entityView.setKeys(keys);
entityView.setEntityId(deviceId);
return entityViewService.saveEntityView(entityView);
}
@Test @Test
public void testFindLatest() throws Exception { public void testFindLatest() throws Exception {
DeviceId deviceId = new DeviceId(UUIDs.timeBased()); DeviceId deviceId = new DeviceId(UUIDs.timeBased());
@ -100,6 +143,12 @@ public abstract class BaseTimeseriesServiceTest extends AbstractServiceTest {
List<TsKvEntry> entries = tsService.findLatest(deviceId, Collections.singleton(STRING_KEY)).get(); List<TsKvEntry> entries = tsService.findLatest(deviceId, Collections.singleton(STRING_KEY)).get();
Assert.assertEquals(1, entries.size()); Assert.assertEquals(1, entries.size());
Assert.assertEquals(toTsEntry(TS, stringKvEntry), entries.get(0)); Assert.assertEquals(toTsEntry(TS, stringKvEntry), entries.get(0));
EntityView entityView = saveAndCreateEntityView(deviceId, Arrays.asList(STRING_KEY));
entries = tsService.findLatest(entityView.getId(), Collections.singleton(STRING_KEY)).get();
Assert.assertEquals(1, entries.size());
Assert.assertEquals(toTsEntry(TS, stringKvEntry), entries.get(0));
} }
@Test @Test

View File

@ -19,12 +19,12 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>thingsboard</artifactId> <artifactId>thingsboard</artifactId>
</parent> </parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<artifactId>netty-mqtt</artifactId> <artifactId>netty-mqtt</artifactId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Netty MQTT Client</name> <name>Netty MQTT Client</name>

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<artifactId>thingsboard</artifactId> <artifactId>thingsboard</artifactId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>Thingsboard</name> <name>Thingsboard</name>

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>thingsboard</artifactId> <artifactId>thingsboard</artifactId>
</parent> </parent>
<artifactId>rule-engine</artifactId> <artifactId>rule-engine</artifactId>

View File

@ -22,7 +22,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>rule-engine</artifactId> <artifactId>rule-engine</artifactId>
</parent> </parent>
<groupId>org.thingsboard.rule-engine</groupId> <groupId>org.thingsboard.rule-engine</groupId>

View File

@ -22,7 +22,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>rule-engine</artifactId> <artifactId>rule-engine</artifactId>
</parent> </parent>
<groupId>org.thingsboard.rule-engine</groupId> <groupId>org.thingsboard.rule-engine</groupId>

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>thingsboard</artifactId> <artifactId>thingsboard</artifactId>
</parent> </parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>transport</artifactId> <artifactId>transport</artifactId>
</parent> </parent>
<groupId>org.thingsboard.transport</groupId> <groupId>org.thingsboard.transport</groupId>

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>transport</artifactId> <artifactId>transport</artifactId>
</parent> </parent>
<groupId>org.thingsboard.transport</groupId> <groupId>org.thingsboard.transport</groupId>

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>transport</artifactId> <artifactId>transport</artifactId>
</parent> </parent>
<groupId>org.thingsboard.transport</groupId> <groupId>org.thingsboard.transport</groupId>

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>thingsboard</artifactId> <artifactId>thingsboard</artifactId>
</parent> </parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>

View File

@ -20,7 +20,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>
<version>2.1.2</version> <version>2.1.3-SNAPSHOT</version>
<artifactId>thingsboard</artifactId> <artifactId>thingsboard</artifactId>
</parent> </parent>
<groupId>org.thingsboard</groupId> <groupId>org.thingsboard</groupId>

View File

@ -78,31 +78,79 @@
ng-required="false" ng-required="false"
readonly="!isEdit" readonly="!isEdit"
ng-model="entityView.keys.attributes.cs" ng-model="entityView.keys.attributes.cs"
placeholder="{{'entity-view.client-attributes' | translate}}" placeholder="{{'entity-view.client-attributes-placeholder' | translate}}"
md-separator-keys="separatorKeys"> md-separator-keys="separatorKeys">
<md-autocomplete
md-no-cache="true"
id="ca_datakey"
md-selected-item="selectedAttributeDataKey"
md-search-text="attributeDataKeySearchText"
md-items="item in dataKeysSearch(attributeDataKeySearchText, types.dataKeyType.attribute)"
md-item-text="item.name"
md-min-length="0"
placeholder="{{'entity-view.client-attributes-placeholder' | translate }}"
md-menu-class="tb-attribute-datakey-autocomplete">
<span md-highlight-text="attributeDataKeySearchText" md-highlight-flags="^i">{{item}}</span>
</md-autocomplete>
</md-chips> </md-chips>
<label translate class="tb-title no-padding">entity-view.shared-attributes</label> <label translate class="tb-title no-padding">entity-view.shared-attributes</label>
<md-chips style="padding-bottom: 15px;" <md-chips style="padding-bottom: 15px;"
ng-required="false" ng-required="false"
readonly="!isEdit" readonly="!isEdit"
ng-model="entityView.keys.attributes.sh" ng-model="entityView.keys.attributes.sh"
placeholder="{{'entity-view.shared-attributes' | translate}}" placeholder="{{'entity-view.shared-attributes-placeholder' | translate}}"
md-separator-keys="separatorKeys"> md-separator-keys="separatorKeys">
<md-autocomplete
md-no-cache="true"
id="sh_datakey"
md-selected-item="selectedAttributeDataKey"
md-search-text="attributeDataKeySearchText"
md-items="item in dataKeysSearch(attributeDataKeySearchText, types.dataKeyType.attribute)"
md-item-text="item.name"
md-min-length="0"
placeholder="{{'entity-view.server-attributes-placeholder' | translate }}"
md-menu-class="tb-attribute-datakey-autocomplete">
<span md-highlight-text="attributeDataKeySearchText" md-highlight-flags="^i">{{item}}</span>
</md-autocomplete>
</md-chips> </md-chips>
<label translate class="tb-title no-padding">entity-view.server-attributes</label> <label translate class="tb-title no-padding">entity-view.server-attributes</label>
<md-chips style="padding-bottom: 15px;" <md-chips style="padding-bottom: 15px;"
ng-required="false" ng-required="false"
readonly="!isEdit" readonly="!isEdit"
ng-model="entityView.keys.attributes.ss" ng-model="entityView.keys.attributes.ss"
placeholder="{{'entity-view.server-attributes' | translate}}" placeholder="{{'entity-view.server-attributes-placeholder' | translate}}"
md-separator-keys="separatorKeys"> md-separator-keys="separatorKeys">
<md-autocomplete
md-no-cache="true"
id="ss_datakey"
md-selected-item="selectedAttributeDataKey"
md-search-text="attributeDataKeySearchText"
md-items="item in dataKeysSearch(attributeDataKeySearchText, types.dataKeyType.attribute)"
md-item-text="item.name"
md-min-length="0"
placeholder="{{'entity-view.server-attributes-placeholder' | translate }}"
md-menu-class="tb-attribute-datakey-autocomplete">
<span md-highlight-text="attributeDataKeySearchText" md-highlight-flags="^i">{{item}}</span>
</md-autocomplete>
</md-chips> </md-chips>
<label translate class="tb-title no-padding">entity-view.latest-timeseries</label> <label translate class="tb-title no-padding">entity-view.timeseries</label>
<md-chips ng-required="false" <md-chips ng-required="false"
readonly="!isEdit" readonly="!isEdit"
ng-model="entityView.keys.timeseries" ng-model="entityView.keys.timeseries"
placeholder="{{'entity-view.latest-timeseries' | translate}}" placeholder="{{'entity-view.timeseries-placeholder' | translate}}"
md-separator-keys="separatorKeys"> md-separator-keys="separatorKeys">
<md-autocomplete
md-no-cache="true"
id="timeseries_datakey"
md-selected-item="selectedTimeseriesDataKey"
md-search-text="timeseriesDataKeySearchText"
md-items="item in dataKeysSearch(timeseriesDataKeySearchText, types.dataKeyType.timeseries)"
md-item-text="item.name"
md-min-length="0"
placeholder="{{'entity-view.timeseries-placeholder' | translate }}"
md-menu-class="tb-timeseries-datakey-autocomplete">
<span md-highlight-text="timeseriesDataKeySearchText" md-highlight-flags="^i">{{item}}</span>
</md-autocomplete>
</md-chips> </md-chips>
</section> </section>
<section layout="column"> <section layout="column">

View File

@ -20,8 +20,8 @@ import entityViewFieldsetTemplate from './entity-view-fieldset.tpl.html';
/* eslint-enable import/no-unresolved, import/default */ /* eslint-enable import/no-unresolved, import/default */
/*@ngInject*/ /*@ngInject*/
export default function EntityViewDirective($compile, $templateCache, $filter, toast, $translate, $mdConstant, export default function EntityViewDirective($q, $compile, $templateCache, $filter, toast, $translate, $mdConstant,
types, clipboardService, entityViewService, customerService) { types, clipboardService, entityViewService, customerService, entityService) {
var linker = function (scope, element) { var linker = function (scope, element) {
var template = $templateCache.get(entityViewFieldsetTemplate); var template = $templateCache.get(entityViewFieldsetTemplate);
element.html(template); element.html(template);
@ -53,9 +53,13 @@ export default function EntityViewDirective($compile, $templateCache, $filter, t
} }
if (scope.entityView.startTimeMs > 0) { if (scope.entityView.startTimeMs > 0) {
scope.startTimeMs = new Date(scope.entityView.startTimeMs); scope.startTimeMs = new Date(scope.entityView.startTimeMs);
} else {
scope.startTimeMs = null;
} }
if (scope.entityView.endTimeMs > 0) { if (scope.entityView.endTimeMs > 0) {
scope.endTimeMs = new Date(scope.entityView.endTimeMs); scope.endTimeMs = new Date(scope.entityView.endTimeMs);
} else {
scope.endTimeMs = null;
} }
if (!scope.entityView.keys) { if (!scope.entityView.keys) {
scope.entityView.keys = {}; scope.entityView.keys = {};
@ -68,6 +72,19 @@ export default function EntityViewDirective($compile, $templateCache, $filter, t
} }
}); });
scope.dataKeysSearch = function (searchText, type) {
var deferred = $q.defer();
entityService.getEntityKeys(scope.entityView.entityId.entityType, scope.entityView.entityId.id, searchText, type, {ignoreLoading: true}).then(
function success(keys) {
deferred.resolve(keys);
},
function fail() {
deferred.resolve([]);
}
);
return deferred.promise;
};
scope.$watch('startTimeMs', function (newDate) { scope.$watch('startTimeMs', function (newDate) {
if (newDate) { if (newDate) {

View File

@ -844,7 +844,11 @@
"client-attributes": "Client attributes", "client-attributes": "Client attributes",
"shared-attributes": "Shared attributes", "shared-attributes": "Shared attributes",
"server-attributes": "Server attributes", "server-attributes": "Server attributes",
"latest-timeseries": "Latest timeseries", "timeseries": "Timeseries",
"client-attributes-placeholder": "Client attributes",
"shared-attributes-placeholder": "Shared attributes",
"server-attributes-placeholder": "Server attributes",
"timeseries-placeholder": "Timeseries",
"related-entity": "Related entity" "related-entity": "Related entity"
}, },
"event": { "event": {

View File

@ -839,7 +839,7 @@
"client-attributes": "Client attributes", "client-attributes": "Client attributes",
"shared-attributes": "Shared attributes", "shared-attributes": "Shared attributes",
"server-attributes": "Server attributes", "server-attributes": "Server attributes",
"latest-timeseries": "Latest timeseries" "timeseries": "Timeseries"
}, },
"event": { "event": {
"event-type": "Tipo de evento", "event-type": "Tipo de evento",