Browse Source

Fix dashboards entity data query mapping. UI: Fixed entity subscription creation. UI: Improve resource load failure handling.

pull/3104/head
Igor Kulikov 6 years ago
parent
commit
349909be87
  1. 5
      dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java
  2. 52
      ui-ngx/src/app/core/services/resources.service.ts
  3. 10
      ui-ngx/src/app/modules/home/components/widget/widget.component.ts

5
dao/src/main/java/org/thingsboard/server/dao/sql/query/EntityKeyMapping.java

@ -72,6 +72,7 @@ public class EntityKeyMapping {
private static final String PHONE = "phone"; private static final String PHONE = "phone";
public static final List<String> commonEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME); public static final List<String> commonEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME);
public static final List<String> dashboardEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, TITLE);
public static final List<String> labeledEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME, TYPE, LABEL); public static final List<String> labeledEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, NAME, TYPE, LABEL);
public static final List<String> contactBasedEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, EMAIL, TITLE, COUNTRY, STATE, CITY, ADDRESS, ADDRESS_2, ZIP, PHONE); public static final List<String> contactBasedEntityFields = Arrays.asList(CREATED_TIME, ENTITY_TYPE, EMAIL, TITLE, COUNTRY, STATE, CITY, ADDRESS, ADDRESS_2, ZIP, PHONE);
@ -89,7 +90,7 @@ public class EntityKeyMapping {
allowedEntityFieldMap.put(EntityType.USER, new HashSet<>(Arrays.asList(CREATED_TIME, FIRST_NAME, LAST_NAME, EMAIL))); allowedEntityFieldMap.put(EntityType.USER, new HashSet<>(Arrays.asList(CREATED_TIME, FIRST_NAME, LAST_NAME, EMAIL)));
allowedEntityFieldMap.put(EntityType.DASHBOARD, new HashSet<>(commonEntityFields)); allowedEntityFieldMap.put(EntityType.DASHBOARD, new HashSet<>(dashboardEntityFields));
allowedEntityFieldMap.put(EntityType.RULE_CHAIN, new HashSet<>(commonEntityFields)); allowedEntityFieldMap.put(EntityType.RULE_CHAIN, new HashSet<>(commonEntityFields));
allowedEntityFieldMap.put(EntityType.RULE_NODE, new HashSet<>(commonEntityFields)); allowedEntityFieldMap.put(EntityType.RULE_NODE, new HashSet<>(commonEntityFields));
allowedEntityFieldMap.put(EntityType.WIDGET_TYPE, new HashSet<>(commonEntityFields)); allowedEntityFieldMap.put(EntityType.WIDGET_TYPE, new HashSet<>(commonEntityFields));
@ -118,12 +119,12 @@ public class EntityKeyMapping {
contactBasedAliases.put(LABEL, TITLE); contactBasedAliases.put(LABEL, TITLE);
aliases.put(EntityType.TENANT, contactBasedAliases); aliases.put(EntityType.TENANT, contactBasedAliases);
aliases.put(EntityType.CUSTOMER, contactBasedAliases); aliases.put(EntityType.CUSTOMER, contactBasedAliases);
aliases.put(EntityType.DASHBOARD, contactBasedAliases);
Map<String, String> commonEntityAliases = new HashMap<>(); Map<String, String> commonEntityAliases = new HashMap<>();
commonEntityAliases.put(TITLE, NAME); commonEntityAliases.put(TITLE, NAME);
aliases.put(EntityType.DEVICE, commonEntityAliases); aliases.put(EntityType.DEVICE, commonEntityAliases);
aliases.put(EntityType.ASSET, commonEntityAliases); aliases.put(EntityType.ASSET, commonEntityAliases);
aliases.put(EntityType.ENTITY_VIEW, commonEntityAliases); aliases.put(EntityType.ENTITY_VIEW, commonEntityAliases);
aliases.put(EntityType.DASHBOARD, commonEntityAliases);
aliases.put(EntityType.WIDGETS_BUNDLE, commonEntityAliases); aliases.put(EntityType.WIDGETS_BUNDLE, commonEntityAliases);
Map<String, String> userEntityAliases = new HashMap<>(); Map<String, String> userEntityAliases = new HashMap<>();

52
ui-ngx/src/app/core/services/resources.service.ts

@ -127,33 +127,39 @@ export class ResourcesService {
} }
SystemJS.import(url).then( SystemJS.import(url).then(
(module) => { (module) => {
let modules;
try { try {
modules = this.extractNgModules(module); let modules;
} catch (e) {} try {
if (modules && modules.length) { modules = this.extractNgModules(module);
const tasks: Promise<ModuleWithComponentFactories<any>>[] = []; } catch (e) {
for (const m of modules) {
tasks.push(this.compiler.compileModuleAndAllComponentsAsync(m));
} }
forkJoin(tasks).subscribe((compiled) => { if (modules && modules.length) {
try { const tasks: Promise<ModuleWithComponentFactories<any>>[] = [];
for (const c of compiled) { for (const m of modules) {
c.ngModuleFactory.create(this.injector); tasks.push(this.compiler.compileModuleAndAllComponentsAsync(m));
}
forkJoin(tasks).subscribe((compiled) => {
try {
for (const c of compiled) {
c.ngModuleFactory.create(this.injector);
}
this.loadedModules[url].next(modules);
this.loadedModules[url].complete();
} catch (e) {
this.loadedModules[url].error(new Error(`Unable to init module from url: ${url}`));
delete this.loadedModules[url];
} }
this.loadedModules[url].next(modules); },
this.loadedModules[url].complete(); (e) => {
} catch (e) { this.loadedModules[url].error(new Error(`Unable to compile module from url: ${url}`));
this.loadedModules[url].error(new Error(`Unable to init module from url: ${url}`));
delete this.loadedModules[url]; delete this.loadedModules[url];
} });
}, } else {
(e) => { this.loadedModules[url].error(new Error(`Module '${url}' doesn't have default export or not NgModule!`));
this.loadedModules[url].error(new Error(`Unable to compile module from url: ${url}`)); delete this.loadedModules[url];
delete this.loadedModules[url]; }
}); } catch (e) {
} else { this.loadedModules[url].error(new Error(`Unable to load module from url: ${url}`));
this.loadedModules[url].error(new Error(`Module '${url}' doesn't have default export or not NgModule!`));
delete this.loadedModules[url]; delete this.loadedModules[url];
} }
}, },

10
ui-ngx/src/app/modules/home/components/widget/widget.component.ts

@ -794,16 +794,10 @@ export class WidgetComponent extends PageComponent implements OnInit, AfterViewI
options.useDashboardTimewindow = true; options.useDashboardTimewindow = true;
} }
} }
let datasource: Datasource;
if (options.type === widgetType.alarm) { if (options.type === widgetType.alarm) {
datasource = this.entityService.createAlarmSourceFromSubscriptionInfo(subscriptionsInfo[0]); options.alarmSource = this.entityService.createAlarmSourceFromSubscriptionInfo(subscriptionsInfo[0]);
} else { } else {
datasource = this.entityService.createDatasourcesFromSubscriptionsInfo(subscriptionsInfo); options.datasources = this.entityService.createDatasourcesFromSubscriptionsInfo(subscriptionsInfo);
}
if (options.type === widgetType.alarm) {
options.alarmSource = datasource;
} else {
options.datasources = [datasource];
} }
this.createSubscription(options, subscribe).subscribe( this.createSubscription(options, subscribe).subscribe(
(subscription) => { (subscription) => {

Loading…
Cancel
Save