Commit 4f3e29b43339f44189fe4ea7a906326823468e3f

Authored by Igor Kulikov
1 parent 2ca2b1b1

UI: Fix pageLink without pagination. Minor fixes

@@ -8997,10 +8997,10 @@ @@ -8997,10 +8997,10 @@
8997 "integrity": "sha512-4O3GWAYJaauMCILm07weko2rHA8a4kjn7+8Lg4s1d7SxwS/3IpkVD/GljbRrIJ1c1W/XGJ3GbuK7RyYZEJChhw==" 8997 "integrity": "sha512-4O3GWAYJaauMCILm07weko2rHA8a4kjn7+8Lg4s1d7SxwS/3IpkVD/GljbRrIJ1c1W/XGJ3GbuK7RyYZEJChhw=="
8998 }, 8998 },
8999 "ngx-flowchart": { 8999 "ngx-flowchart": {
9000 - "version": "git://github.com/thingsboard/ngx-flowchart.git#a4157b0eef2eb3646ef920447c7b06b39d54f87f", 9000 + "version": "git://github.com/thingsboard/ngx-flowchart.git#7a02f4748b5e7821a883c903107af5f20415d026",
9001 "from": "git://github.com/thingsboard/ngx-flowchart.git#master", 9001 "from": "git://github.com/thingsboard/ngx-flowchart.git#master",
9002 "requires": { 9002 "requires": {
9003 - "tslib": "^1.10.0" 9003 + "tslib": "^1.13.0"
9004 }, 9004 },
9005 "dependencies": { 9005 "dependencies": {
9006 "tslib": { 9006 "tslib": {
@@ -337,6 +337,7 @@ export class WidgetSubscription implements IWidgetSubscription { @@ -337,6 +337,7 @@ export class WidgetSubscription implements IWidgetSubscription {
337 } 337 }
338 338
339 private initDataSubscription(): Observable<any> { 339 private initDataSubscription(): Observable<any> {
  340 + this.notifyDataLoading();
340 const initDataSubscriptionSubject = new ReplaySubject(1); 341 const initDataSubscriptionSubject = new ReplaySubject(1);
341 this.loadStDiff().subscribe(() => { 342 this.loadStDiff().subscribe(() => {
342 if (!this.ctx.aliasController) { 343 if (!this.ctx.aliasController) {
@@ -431,6 +432,7 @@ export class WidgetSubscription implements IWidgetSubscription { @@ -431,6 +432,7 @@ export class WidgetSubscription implements IWidgetSubscription {
431 }); 432 });
432 this.configureLoadedData(); 433 this.configureLoadedData();
433 this.hasResolvedData = this.datasources.length > 0; 434 this.hasResolvedData = this.datasources.length > 0;
  435 + this.updateDataTimewindow();
434 this.notifyDataLoaded(); 436 this.notifyDataLoaded();
435 this.onDataUpdated(true); 437 this.onDataUpdated(true);
436 }) 438 })
@@ -731,6 +733,7 @@ export class WidgetSubscription implements IWidgetSubscription { @@ -731,6 +733,7 @@ export class WidgetSubscription implements IWidgetSubscription {
731 if (this.type === widgetType.alarm) { 733 if (this.type === widgetType.alarm) {
732 this.updateAlarmDataSubscription(); 734 this.updateAlarmDataSubscription();
733 } else { 735 } else {
  736 + this.notifyDataLoading();
734 this.dataSubscribe(); 737 this.dataSubscribe();
735 } 738 }
736 } 739 }
@@ -831,13 +834,21 @@ export class WidgetSubscription implements IWidgetSubscription { @@ -831,13 +834,21 @@ export class WidgetSubscription implements IWidgetSubscription {
831 } 834 }
832 } 835 }
833 836
834 - private dataSubscribe() { 837 + private updateDataTimewindow() {
835 if (!this.hasDataPageLink) { 838 if (!this.hasDataPageLink) {
836 if (this.type === widgetType.timeseries && this.timeWindowConfig) { 839 if (this.type === widgetType.timeseries && this.timeWindowConfig) {
837 this.updateRealtimeSubscription(); 840 this.updateRealtimeSubscription();
838 if (this.comparisonEnabled) { 841 if (this.comparisonEnabled) {
839 this.updateSubscriptionForComparison(); 842 this.updateSubscriptionForComparison();
840 } 843 }
  844 + }
  845 + }
  846 + }
  847 +
  848 + private dataSubscribe() {
  849 + if (!this.hasDataPageLink) {
  850 + if (this.type === widgetType.timeseries && this.timeWindowConfig) {
  851 + this.updateDataTimewindow();
841 if (this.subscriptionTimewindow.fixedWindow) { 852 if (this.subscriptionTimewindow.fixedWindow) {
842 this.onDataUpdated(); 853 this.onDataUpdated();
843 } 854 }
@@ -1025,6 +1036,11 @@ export class WidgetSubscription implements IWidgetSubscription { @@ -1025,6 +1036,11 @@ export class WidgetSubscription implements IWidgetSubscription {
1025 } 1036 }
1026 } 1037 }
1027 1038
  1039 + private notifyDataLoading() {
  1040 + this.loadingData = true;
  1041 + this.callbacks.dataLoading(this);
  1042 + }
  1043 +
1028 private notifyDataLoaded() { 1044 private notifyDataLoaded() {
1029 this.loadingData = false; 1045 this.loadingData = false;
1030 this.callbacks.dataLoading(this); 1046 this.callbacks.dataLoading(this);
@@ -1268,6 +1284,7 @@ export class WidgetSubscription implements IWidgetSubscription { @@ -1268,6 +1284,7 @@ export class WidgetSubscription implements IWidgetSubscription {
1268 if (this.caulculateLegendData) { 1284 if (this.caulculateLegendData) {
1269 this.updateLegend(index, data.data, detectChanges); 1285 this.updateLegend(index, data.data, detectChanges);
1270 } 1286 }
  1287 + this.notifyDataLoaded();
1271 this.onDataUpdated(detectChanges); 1288 this.onDataUpdated(detectChanges);
1272 } 1289 }
1273 } 1290 }
@@ -330,7 +330,7 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, @@ -330,7 +330,7 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit,
330 this.defaultPageSize = pageSize; 330 this.defaultPageSize = pageSize;
331 } 331 }
332 this.pageSizeOptions = [this.defaultPageSize, this.defaultPageSize * 2, this.defaultPageSize * 3]; 332 this.pageSizeOptions = [this.defaultPageSize, this.defaultPageSize * 2, this.defaultPageSize * 3];
333 - this.pageLink.pageSize = this.displayPagination ? this.defaultPageSize : Number.POSITIVE_INFINITY; 333 + this.pageLink.pageSize = this.displayPagination ? this.defaultPageSize : 1024;
334 334
335 this.pageLink.searchPropagatedAlarms = isDefined(this.widgetConfig.searchPropagatedAlarms) 335 this.pageLink.searchPropagatedAlarms = isDefined(this.widgetConfig.searchPropagatedAlarms)
336 ? this.widgetConfig.searchPropagatedAlarms : true; 336 ? this.widgetConfig.searchPropagatedAlarms : true;
@@ -535,10 +535,15 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, @@ -535,10 +535,15 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit,
535 } else { 535 } else {
536 this.pageLink.page = 0; 536 this.pageLink.page = 0;
537 } 537 }
538 - this.pageLink.sortOrder = {  
539 - key: findEntityKeyByColumnDef(this.sort.active, this.columns),  
540 - direction: Direction[this.sort.direction.toUpperCase()]  
541 - }; 538 + const key = findEntityKeyByColumnDef(this.sort.active, this.columns);
  539 + if (key) {
  540 + this.pageLink.sortOrder = {
  541 + key,
  542 + direction: Direction[this.sort.direction.toUpperCase()]
  543 + };
  544 + } else {
  545 + this.pageLink.sortOrder = null;
  546 + }
542 const sortOrderLabel = fromEntityColumnDef(this.sort.active, this.columns); 547 const sortOrderLabel = fromEntityColumnDef(this.sort.active, this.columns);
543 const keyFilters: KeyFilter[] = null; // TODO: 548 const keyFilters: KeyFilter[] = null; // TODO:
544 this.alarmsDatasource.loadAlarms(this.pageLink, sortOrderLabel, keyFilters); 549 this.alarmsDatasource.loadAlarms(this.pageLink, sortOrderLabel, keyFilters);
@@ -240,7 +240,7 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni @@ -240,7 +240,7 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni
240 this.defaultPageSize = pageSize; 240 this.defaultPageSize = pageSize;
241 } 241 }
242 this.pageSizeOptions = [this.defaultPageSize, this.defaultPageSize * 2, this.defaultPageSize * 3]; 242 this.pageSizeOptions = [this.defaultPageSize, this.defaultPageSize * 2, this.defaultPageSize * 3];
243 - this.pageLink.pageSize = this.displayPagination ? this.defaultPageSize : Number.POSITIVE_INFINITY; 243 + this.pageLink.pageSize = this.displayPagination ? this.defaultPageSize : 1024;
244 244
245 const cssString = constructTableCssString(this.widgetConfig); 245 const cssString = constructTableCssString(this.widgetConfig);
246 const cssParser = new cssjs(); 246 const cssParser = new cssjs();
@@ -460,10 +460,15 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni @@ -460,10 +460,15 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni
460 } else { 460 } else {
461 this.pageLink.page = 0; 461 this.pageLink.page = 0;
462 } 462 }
463 - this.pageLink.sortOrder = {  
464 - key: findEntityKeyByColumnDef(this.sort.active, this.columns),  
465 - direction: Direction[this.sort.direction.toUpperCase()]  
466 - }; 463 + const key = findEntityKeyByColumnDef(this.sort.active, this.columns);
  464 + if (key) {
  465 + this.pageLink.sortOrder = {
  466 + key,
  467 + direction: Direction[this.sort.direction.toUpperCase()]
  468 + };
  469 + } else {
  470 + this.pageLink.sortOrder = null;
  471 + }
467 const sortOrderLabel = fromEntityColumnDef(this.sort.active, this.columns); 472 const sortOrderLabel = fromEntityColumnDef(this.sort.active, this.columns);
468 const keyFilters: KeyFilter[] = null; // TODO: 473 const keyFilters: KeyFilter[] = null; // TODO:
469 this.entityDatasource.loadEntities(this.pageLink, sortOrderLabel, keyFilters); 474 this.entityDatasource.loadEntities(this.pageLink, sortOrderLabel, keyFilters);
@@ -159,7 +159,7 @@ function parseTemplate(template: string, data: { $datasource?: Datasource, [key: @@ -159,7 +159,7 @@ function parseTemplate(template: string, data: { $datasource?: Datasource, [key:
159 } 159 }
160 template = createLabelFromDatasource(data.$datasource, template); 160 template = createLabelFromDatasource(data.$datasource, template);
161 161
162 - let match = varsRegex.exec(template); 162 + let match = /\${([^}]*)}/g.exec(template);
163 while (match !== null) { 163 while (match !== null) {
164 const variable = match[0]; 164 const variable = match[0];
165 let label = match[1]; 165 let label = match[1];
@@ -186,7 +186,7 @@ function parseTemplate(template: string, data: { $datasource?: Datasource, [key: @@ -186,7 +186,7 @@ function parseTemplate(template: string, data: { $datasource?: Datasource, [key:
186 textValue = value; 186 textValue = value;
187 } 187 }
188 template = template.split(variable).join(textValue); 188 template = template.split(variable).join(textValue);
189 - match = varsRegex.exec(template); 189 + match = /\${([^}]*)}/g.exec(template);
190 } 190 }
191 191
192 let actionTags: string; 192 let actionTags: string;
@@ -96,7 +96,10 @@ export function entityDataSortOrderFromString(strSortOrder: string, columns: Ent @@ -96,7 +96,10 @@ export function entityDataSortOrderFromString(strSortOrder: string, columns: Ent
96 if (!property && !property.length) { 96 if (!property && !property.length) {
97 return null; 97 return null;
98 } 98 }
99 - const column = findColumnByLabel(property, columns); 99 + let column = findColumnByLabel(property, columns);
  100 + if (!column) {
  101 + column = findColumnByName(property, columns);
  102 + }
100 if (column && column.entityKey) { 103 if (column && column.entityKey) {
101 return {key: column.entityKey, direction}; 104 return {key: column.entityKey, direction};
102 } 105 }
@@ -113,13 +116,22 @@ export function findColumnByEntityKey(key: EntityKey, columns: EntityColumn[]): @@ -113,13 +116,22 @@ export function findColumnByEntityKey(key: EntityKey, columns: EntityColumn[]):
113 } 116 }
114 117
115 export function findEntityKeyByColumnDef(def: string, columns: EntityColumn[]): EntityKey { 118 export function findEntityKeyByColumnDef(def: string, columns: EntityColumn[]): EntityKey {
116 - return findColumnByDef(def, columns).entityKey; 119 + if (def) {
  120 + const column = findColumnByDef(def, columns);
  121 + return column ? column.entityKey : null;
  122 + } else {
  123 + return null;
  124 + }
117 } 125 }
118 126
119 export function findColumn(searchProperty: string, searchValue: string, columns: EntityColumn[]): EntityColumn { 127 export function findColumn(searchProperty: string, searchValue: string, columns: EntityColumn[]): EntityColumn {
120 return columns.find(theColumn => theColumn[searchProperty] === searchValue); 128 return columns.find(theColumn => theColumn[searchProperty] === searchValue);
121 } 129 }
122 130
  131 +export function findColumnByName(name: string, columns: EntityColumn[]): EntityColumn {
  132 + return findColumn('name', name, columns);
  133 +}
  134 +
123 export function findColumnByLabel(label: string, columns: EntityColumn[]): EntityColumn { 135 export function findColumnByLabel(label: string, columns: EntityColumn[]): EntityColumn {
124 let column: EntityColumn; 136 let column: EntityColumn;
125 const alarmColumns = columns.filter(c => c.type === DataKeyType.alarm); 137 const alarmColumns = columns.filter(c => c.type === DataKeyType.alarm);