Browse Source

added option to sort tab entities in alphabetical order

pull/14159/head
Maksym Tsymbarov 11 months ago
parent
commit
6be7bd61a3
  1. 10
      ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-widget-settings.component.html
  2. 10
      ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-widget-settings.component.ts
  3. 2
      ui-ngx/src/app/modules/home/components/widget/lib/timeseries-table-widget.component.html
  4. 44
      ui-ngx/src/app/modules/home/components/widget/lib/timeseries-table-widget.component.ts
  5. 3
      ui-ngx/src/assets/dashboard/api_usage.json
  6. 6
      ui-ngx/src/assets/locale/locale.constant-en_US.json

10
ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-widget-settings.component.html

@ -115,6 +115,16 @@
<mat-slide-toggle class="mat-slide" formControlName="useEntityLabel">
{{ 'widgets.table.use-entity-label-tab-name' | translate }}
</mat-slide-toggle>
<div class="tb-form-row">
<div class="fixed-title-width" translate>widgets.table.sort-by</div>
<div class="flex flex-1 flex-row gap-2">
<tb-toggle-select class="flex-1" appearance="fill" selectMediaBreakpoint="xs" formControlName="sortEntityAliasKey">
<tb-toggle-option [value]="TabSortKey.TIMESTAMP">{{ 'widgets.table.sort-timestamp-option' | translate }}</tb-toggle-option>
<tb-toggle-option [value]="TabSortKey.NAME_ASC">{{ 'widgets.table.sort-asc' | translate }}</tb-toggle-option>
<tb-toggle-option [value]="TabSortKey.NAME_DESC">{{ 'widgets.table.sort-desc' | translate }}</tb-toggle-option>
</tb-toggle-select>
</div>
</div>
</div>
<div class="tb-form-panel tb-slide-toggle">
<div class="tb-form-panel-title" style="padding-bottom: 16px;" translate>widgets.table.rows</div>

10
ui-ngx/src/app/modules/home/components/widget/lib/settings/cards/timeseries-table-widget-settings.component.ts

@ -20,6 +20,7 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms
import { Store } from '@ngrx/store';
import { AppState } from '@core/core.state';
import { buildPageStepSizeValues } from '@home/components/widget/lib/table-widget.models';
import { TabSortKey } from '@app/modules/home/components/widget/lib/timeseries-table-widget.component'
@Component({
selector: 'tb-timeseries-table-widget-settings',
@ -28,6 +29,8 @@ import { buildPageStepSizeValues } from '@home/components/widget/lib/table-widge
})
export class TimeseriesTableWidgetSettingsComponent extends WidgetSettingsComponent {
TabSortKey = TabSortKey;
timeseriesTableWidgetSettingsForm: UntypedFormGroup;
pageStepSizeValues = [];
@ -58,12 +61,14 @@ export class TimeseriesTableWidgetSettingsComponent extends WidgetSettingsCompon
hideEmptyLines: false,
disableStickyHeader: false,
useRowStyleFunction: false,
rowStyleFunction: ''
rowStyleFunction: '',
tabSortKey: TabSortKey.TIMESTAMP
};
}
protected prepareInputSettings(settings: WidgetSettings): WidgetSettings {
settings.pageStepIncrement = settings.pageStepIncrement ?? settings.defaultPageSize;
settings.tabSortKey = settings.sortEntityAliasKey ?? TabSortKey.TIMESTAMP;
this.pageStepSizeValues = buildPageStepSizeValues(settings.pageStepCount, settings.pageStepIncrement);
return settings;
}
@ -93,7 +98,8 @@ export class TimeseriesTableWidgetSettingsComponent extends WidgetSettingsCompon
hideEmptyLines: [settings.hideEmptyLines, []],
disableStickyHeader: [settings.disableStickyHeader, []],
useRowStyleFunction: [settings.useRowStyleFunction, []],
rowStyleFunction: [settings.rowStyleFunction, [Validators.required]]
rowStyleFunction: [settings.rowStyleFunction, [Validators.required]],
sortEntityAliasKey: [settings.sortEntityAliasKey, []],
});
}

2
ui-ngx/src/app/modules/home/components/widget/lib/timeseries-table-widget.component.html

@ -41,7 +41,7 @@
class="flex-1"
mat-stretch-tabs="false"
[(selectedIndex)]="sourceIndex" (selectedIndexChange)="onSourceIndexChanged()">
<mat-tab *ngFor="let source of sources; trackBy: trackBySourcesIndex; let index = index;" [label]="getTabLabel(source)">
<mat-tab *ngFor="let source of sources; trackBy: trackBySourcesIndex; let index = index;" [label]="source.displayName">
<ng-template [ngIf]="isActiveTab(index)">
<div class="table-container flex-1">
<table mat-table [dataSource]="source.timeseriesDatasource" [trackBy]="trackByRowTimestamp"

44
ui-ngx/src/app/modules/home/components/widget/lib/timeseries-table-widget.component.ts

@ -107,11 +107,18 @@ import { FormBuilder } from '@angular/forms';
import { DEFAULT_OVERLAY_POSITIONS } from '@shared/models/overlay.models';
import { DateFormatSettings, ValueFormatProcessor } from '@shared/models/widget-settings.models';
export enum TabSortKey {
NAME_ASC = 'NAME_ASC',
NAME_DESC = 'NAME_DESC',
TIMESTAMP = 'timestamp'
}
export interface TimeseriesTableWidgetSettings extends TableWidgetSettings {
showTimestamp: boolean;
showMilliseconds: boolean;
hideEmptyLines: boolean;
dateFormat: DateFormatSettings;
tabSortKey: TabSortKey;
}
interface TimeseriesWidgetLatestDataKeySettings extends TableWidgetDataKeySettings {
@ -152,6 +159,7 @@ interface TimeseriesTableSource {
timeseriesDatasource: TimeseriesDatasource;
header: TimeseriesHeader[];
rowDataTemplate: {[key: string]: any};
displayName: string;
}
@Component({
@ -392,12 +400,33 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI
this.updateDatasources();
}
public getTabLabel(source: TimeseriesTableSource){
if (this.useEntityLabel) {
return source.datasource.entityLabel || source.datasource.entityName;
} else {
return source.datasource.entityName;
private getTabLabel(source: Datasource, entityLabelCache:Map<string,string>):string {
if (entityLabelCache.has(source.entityId)) {
return entityLabelCache.get(source.entityId);
}
const value = this.useEntityLabel
? (source.entityLabel || source.entityName)
: source.entityName;
const translated = this.utils.customTranslation(value);
entityLabelCache.set(source.entityId, translated);
return translated;
}
private sortDatasources(source: Datasource[], entityLabelCache:Map<string,string>): Datasource[] {
source.forEach(ds => this.getTabLabel(ds, entityLabelCache));
if (this.settings.tabSortKey === TabSortKey.TIMESTAMP) {
return source;
}
return source.sort((a, b) => {
const valueA = entityLabelCache.get(a.entityId);
const valueB = entityLabelCache.get(b.entityId);
return this.settings.tabSortKey === TabSortKey.NAME_ASC
? valueA.localeCompare(valueB)
: valueB.localeCompare(valueA);
});
}
private updateDatasources() {
@ -405,9 +434,11 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI
this.sourceIndex = 0;
let keyOffset = 0;
let latestKeyOffset = 0;
const entityLabelCache = new Map<string,string>();
const pageSize = this.displayPagination ? this.defaultPageSize : Number.POSITIVE_INFINITY;
if (this.datasources) {
for (const datasource of this.datasources) {
const sortedDatasources = this.sortDatasources(this.datasources, entityLabelCache);
for (const datasource of sortedDatasources) {
const sortOrder: SortOrder = sortOrderFromString(this.defaultSortOrder);
const source = {} as TimeseriesTableSource;
source.header = this.prepareHeader(datasource);
@ -424,6 +455,7 @@ export class TimeseriesTableWidgetComponent extends PageComponent implements OnI
source.pageLink = new PageLink(pageSize, 0, null, sortOrder);
source.rowDataTemplate = {};
source.rowDataTemplate.Timestamp = null;
source.displayName = entityLabelCache.get(datasource.entityId);
if (this.showTimestamp) {
source.displayedColumns.push('0');
}

3
ui-ngx/src/assets/dashboard/api_usage.json

@ -98,7 +98,8 @@
"settings": {
"showTimestamp": true,
"displayPagination": true,
"defaultPageSize": 10
"defaultPageSize": 10,
"tabSortKey": "timestamp"
},
"title": "{i18n:api-usage.exceptions}",
"dropShadow": true,

6
ui-ngx/src/assets/locale/locale.constant-en_US.json

@ -9132,7 +9132,11 @@
"alarm-column-error": "At least one alarm column should be specified",
"table-tabs": "Table tabs",
"show-cell-actions-menu-mobile": "Show cell actions dropdown menu in mobile mode",
"disable-sorting": "Disable sorting"
"disable-sorting": "Disable sorting",
"sort-by": "Sort tabs by",
"sort-asc": "Name Ascending",
"sort-desc": "Name Descending",
"sort-timestamp-option": "Created time"
},
"latest-chart": {
"total": "Total",

Loading…
Cancel
Save