Commit 762c6dae558e0d25ebffd3b54222801a2a977560
Committed by
Andrew Shvayka
1 parent
1eccfcc7
improved performance of table widgets - removed unused ngZone.run and detectChan…
…ges, changed functions trackByRowIndex - now is used index, not id, minor improvements for functions, used after data updating.
Showing
5 changed files
with
64 additions
and
34 deletions
@@ -61,7 +61,7 @@ | @@ -61,7 +61,7 @@ | ||
61 | </div> | 61 | </div> |
62 | </mat-toolbar> | 62 | </mat-toolbar> |
63 | <div fxFlex class="table-container"> | 63 | <div fxFlex class="table-container"> |
64 | - <table mat-table [dataSource]="alarmsDatasource" | 64 | + <table mat-table [dataSource]="alarmsDatasource" [trackBy]="trackByRowIndex" |
65 | matSort [matSortActive]="sortOrderProperty" [matSortDirection]="pageLinkSortDirection()" matSortDisableClear> | 65 | matSort [matSortActive]="sortOrderProperty" [matSortDirection]="pageLinkSortDirection()" matSortDisableClear> |
66 | <ng-container matColumnDef="select" sticky> | 66 | <ng-container matColumnDef="select" sticky> |
67 | <mat-header-cell *matHeaderCellDef style="width: 30px;"> | 67 | <mat-header-cell *matHeaderCellDef style="width: 30px;"> |
@@ -247,11 +247,8 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, | @@ -247,11 +247,8 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, | ||
247 | } | 247 | } |
248 | 248 | ||
249 | public onDataUpdated() { | 249 | public onDataUpdated() { |
250 | - this.ngZone.run(() => { | ||
251 | - this.updateTitle(true); | ||
252 | - this.alarmsDatasource.updateAlarms(); | ||
253 | - this.ctx.detectChanges(); | ||
254 | - }); | 250 | + this.updateTitle(true); |
251 | + this.alarmsDatasource.updateAlarms(); | ||
255 | } | 252 | } |
256 | 253 | ||
257 | public pageLinkSortDirection(): SortDirection { | 254 | public pageLinkSortDirection(): SortDirection { |
@@ -565,6 +562,10 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, | @@ -565,6 +562,10 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, | ||
565 | return column.def; | 562 | return column.def; |
566 | } | 563 | } |
567 | 564 | ||
565 | + public trackByRowIndex(index: number) { | ||
566 | + return index; | ||
567 | + } | ||
568 | + | ||
568 | public headerStyle(key: EntityColumn): any { | 569 | public headerStyle(key: EntityColumn): any { |
569 | const columnWidth = this.columnWidth[key.def]; | 570 | const columnWidth = this.columnWidth[key.def]; |
570 | return widthStyle(columnWidth); | 571 | return widthStyle(columnWidth); |
@@ -606,7 +607,19 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, | @@ -606,7 +607,19 @@ export class AlarmsTableWidgetComponent extends PageComponent implements OnInit, | ||
606 | } else { | 607 | } else { |
607 | content = this.defaultContent(key, contentInfo, value); | 608 | content = this.defaultContent(key, contentInfo, value); |
608 | } | 609 | } |
609 | - return isDefined(content) ? this.domSanitizer.bypassSecurityTrustHtml(content) : ''; | 610 | + |
611 | + if (!isDefined(content)) { | ||
612 | + return ''; | ||
613 | + | ||
614 | + } else { | ||
615 | + switch (typeof content) { | ||
616 | + case 'string': | ||
617 | + return this.domSanitizer.bypassSecurityTrustHtml(content); | ||
618 | + default: | ||
619 | + return content; | ||
620 | + } | ||
621 | + } | ||
622 | + | ||
610 | } else { | 623 | } else { |
611 | return ''; | 624 | return ''; |
612 | } | 625 | } |
@@ -38,7 +38,7 @@ | @@ -38,7 +38,7 @@ | ||
38 | </div> | 38 | </div> |
39 | </mat-toolbar> | 39 | </mat-toolbar> |
40 | <div fxFlex class="table-container"> | 40 | <div fxFlex class="table-container"> |
41 | - <table mat-table [dataSource]="entityDatasource" | 41 | + <table mat-table [dataSource]="entityDatasource" [trackBy]="trackByRowIndex" |
42 | matSort [matSortActive]="sortOrderProperty" [matSortDirection]="pageLinkSortDirection()" matSortDisableClear> | 42 | matSort [matSortActive]="sortOrderProperty" [matSortDirection]="pageLinkSortDirection()" matSortDisableClear> |
43 | <ng-container [matColumnDef]="column.def" *ngFor="let column of columns; trackBy: trackByColumnDef;"> | 43 | <ng-container [matColumnDef]="column.def" *ngFor="let column of columns; trackBy: trackByColumnDef;"> |
44 | <mat-header-cell [ngStyle]="headerStyle(column)" *matHeaderCellDef mat-sort-header> {{ column.title }} </mat-header-cell> | 44 | <mat-header-cell [ngStyle]="headerStyle(column)" *matHeaderCellDef mat-sort-header> {{ column.title }} </mat-header-cell> |
@@ -206,11 +206,8 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni | @@ -206,11 +206,8 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni | ||
206 | } | 206 | } |
207 | 207 | ||
208 | public onDataUpdated() { | 208 | public onDataUpdated() { |
209 | - this.ngZone.run(() => { | ||
210 | - this.updateTitle(true); | ||
211 | - this.entityDatasource.dataUpdated(); | ||
212 | - this.ctx.detectChanges(); | ||
213 | - }); | 209 | + this.updateTitle(true); |
210 | + this.entityDatasource.dataUpdated(); | ||
214 | } | 211 | } |
215 | 212 | ||
216 | public pageLinkSortDirection(): SortDirection { | 213 | public pageLinkSortDirection(): SortDirection { |
@@ -488,6 +485,10 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni | @@ -488,6 +485,10 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni | ||
488 | return column.def; | 485 | return column.def; |
489 | } | 486 | } |
490 | 487 | ||
488 | + public trackByRowIndex(index: number) { | ||
489 | + return index; | ||
490 | + } | ||
491 | + | ||
491 | public headerStyle(key: EntityColumn): any { | 492 | public headerStyle(key: EntityColumn): any { |
492 | const columnWidth = this.columnWidth[key.def]; | 493 | const columnWidth = this.columnWidth[key.def]; |
493 | return widthStyle(columnWidth); | 494 | return widthStyle(columnWidth); |
@@ -529,7 +530,19 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni | @@ -529,7 +530,19 @@ export class EntitiesTableWidgetComponent extends PageComponent implements OnIni | ||
529 | } else { | 530 | } else { |
530 | content = this.defaultContent(key, contentInfo, value); | 531 | content = this.defaultContent(key, contentInfo, value); |
531 | } | 532 | } |
532 | - return isDefined(content) ? this.domSanitizer.bypassSecurityTrustHtml(content) : ''; | 533 | + |
534 | + if (!isDefined(content)) { | ||
535 | + return ''; | ||
536 | + | ||
537 | + } else { | ||
538 | + switch (typeof content) { | ||
539 | + case 'string': | ||
540 | + return this.domSanitizer.bypassSecurityTrustHtml(content); | ||
541 | + default: | ||
542 | + return content; | ||
543 | + } | ||
544 | + } | ||
545 | + | ||
533 | } else { | 546 | } else { |
534 | return ''; | 547 | return ''; |
535 | } | 548 | } |
@@ -40,7 +40,7 @@ import { | @@ -40,7 +40,7 @@ import { | ||
40 | } from '@shared/models/widget.models'; | 40 | } from '@shared/models/widget.models'; |
41 | import { UtilsService } from '@core/services/utils.service'; | 41 | import { UtilsService } from '@core/services/utils.service'; |
42 | import { TranslateService } from '@ngx-translate/core'; | 42 | import { TranslateService } from '@ngx-translate/core'; |
43 | -import { hashCode, isDefined, isNumber } from '@core/utils'; | 43 | +import {hashCode, isDefined, isDefinedAndNotNull, isNumber} from '@core/utils'; |
44 | import cssjs from '@core/css/css'; | 44 | import cssjs from '@core/css/css'; |
45 | import { PageLink } from '@shared/models/page/page-link'; | 45 | import { PageLink } from '@shared/models/page/page-link'; |
46 | import { Direction, SortOrder, sortOrderFromString } from '@shared/models/page/sort-order'; | 46 | import { Direction, SortOrder, sortOrderFromString } from '@shared/models/page/sort-order'; |
@@ -197,11 +197,8 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI | @@ -197,11 +197,8 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI | ||
197 | } | 197 | } |
198 | 198 | ||
199 | public onDataUpdated() { | 199 | public onDataUpdated() { |
200 | - this.ngZone.run(() => { | ||
201 | - this.sources.forEach((source) => { | ||
202 | - source.timeseriesDatasource.dataUpdated(this.data); | ||
203 | - }); | ||
204 | - this.ctx.detectChanges(); | 200 | + this.sources.forEach((source) => { |
201 | + source.timeseriesDatasource.dataUpdated(this.data); | ||
205 | }); | 202 | }); |
206 | } | 203 | } |
207 | 204 | ||
@@ -410,7 +407,18 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI | @@ -410,7 +407,18 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI | ||
410 | const units = contentInfo.units || this.ctx.widgetConfig.units; | 407 | const units = contentInfo.units || this.ctx.widgetConfig.units; |
411 | content = this.ctx.utils.formatValue(value, decimals, units, true); | 408 | content = this.ctx.utils.formatValue(value, decimals, units, true); |
412 | } | 409 | } |
413 | - return isDefined(content) ? this.domSanitizer.bypassSecurityTrustHtml(content) : ''; | 410 | + |
411 | + if (!isDefined(content)) { | ||
412 | + return ''; | ||
413 | + | ||
414 | + } else { | ||
415 | + switch (typeof content) { | ||
416 | + case 'string': | ||
417 | + return this.domSanitizer.bypassSecurityTrustHtml(content); | ||
418 | + default: | ||
419 | + return content; | ||
420 | + } | ||
421 | + } | ||
414 | } | 422 | } |
415 | } | 423 | } |
416 | 424 | ||
@@ -515,26 +523,22 @@ class TimeseriesDatasource implements DataSource<TimeseriesRow> { | @@ -515,26 +523,22 @@ class TimeseriesDatasource implements DataSource<TimeseriesRow> { | ||
515 | row[d + 1] = cellData[1]; | 523 | row[d + 1] = cellData[1]; |
516 | }); | 524 | }); |
517 | } | 525 | } |
526 | + | ||
518 | const rows: TimeseriesRow[] = []; | 527 | const rows: TimeseriesRow[] = []; |
519 | - for (const t of Object.keys(rowsMap)) { | ||
520 | - if (this.hideEmptyLines) { | ||
521 | - let hideLine = true; | ||
522 | - for (let c = 0; (c < data.length) && hideLine; c++) { | ||
523 | - if (rowsMap[t][c + 1]) { | ||
524 | - hideLine = false; | ||
525 | - } | ||
526 | - } | ||
527 | - if (!hideLine) { | ||
528 | - rows.push(rowsMap[t]); | ||
529 | - } | 528 | + |
529 | + for (const value of Object.values(rowsMap)) { | ||
530 | + this.hideEmptyLines = true; | ||
531 | + | ||
532 | + if (this.hideEmptyLines && isDefinedAndNotNull(value[1])) { | ||
533 | + rows.push(value); | ||
530 | } else { | 534 | } else { |
531 | - rows.push(rowsMap[t]); | 535 | + rows.push(value); |
532 | } | 536 | } |
533 | } | 537 | } |
538 | + | ||
534 | return rows; | 539 | return rows; |
535 | } | 540 | } |
536 | 541 | ||
537 | - | ||
538 | isEmpty(): Observable<boolean> { | 542 | isEmpty(): Observable<boolean> { |
539 | return this.rowsSubject.pipe( | 543 | return this.rowsSubject.pipe( |
540 | map((rows) => !rows.length) | 544 | map((rows) => !rows.length) |