UI: Entities table model improvements.

This commit is contained in:
Igor Kulikov 2020-04-08 19:31:08 +03:00
parent f9375a0fca
commit b0c5479c64
19 changed files with 187 additions and 65 deletions

View File

@ -29,8 +29,8 @@ export abstract class ContactBasedComponent<T extends ContactBased<HasId>> exten
protected constructor(protected store: Store<AppState>, protected constructor(protected store: Store<AppState>,
protected fb: FormBuilder, protected fb: FormBuilder,
protected entityValue: T, protected entityValue: T,
protected entitiesTableConfig: EntityTableConfig<T>) { protected entitiesTableConfigValue: EntityTableConfig<T>) {
super(store, fb, entityValue, entitiesTableConfig); super(store, fb, entityValue, entitiesTableConfigValue);
} }
buildForm(entity: T): FormGroup { buildForm(entity: T): FormGroup {

View File

@ -25,7 +25,7 @@
<tb-entity-details-panel <tb-entity-details-panel
[entitiesTableConfig]="entitiesTableConfig" [entitiesTableConfig]="entitiesTableConfig"
[entityId]="dataSource.currentEntity?.id" [entityId]="dataSource.currentEntity?.id"
(closeEntityDetails)="isDetailsOpen = false" (closeEntityDetails)="isDetailsOpen = false; detailsPanelOpened.emit(isDetailsOpen);"
(entityUpdated)="onEntityUpdated($event)" (entityUpdated)="onEntityUpdated($event)"
(entityAction)="onEntityAction($event)" (entityAction)="onEntityAction($event)"
> >
@ -227,11 +227,12 @@
fxLayoutAlign="center center" fxLayoutAlign="center center"
class="no-data-found" translate>{{ translations.noEntities }}</span> class="no-data-found" translate>{{ translations.noEntities }}</span>
</div> </div>
<mat-divider></mat-divider> <mat-divider *ngIf="displayPagination"></mat-divider>
<mat-paginator [length]="dataSource.total() | async" <mat-paginator *ngIf="displayPagination"
[length]="dataSource.total() | async"
[pageIndex]="pageLink.page" [pageIndex]="pageLink.page"
[pageSize]="pageLink.pageSize" [pageSize]="pageLink.pageSize"
[pageSizeOptions]="[10, 20, 30]"></mat-paginator> [pageSizeOptions]="pageSizeOptions"></mat-paginator>
</div> </div>
</div> </div>
</mat-drawer-content> </mat-drawer-content>

View File

@ -19,7 +19,7 @@ import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
Component, Component,
ComponentFactoryResolver, ComponentFactoryResolver,
ElementRef, ElementRef, EventEmitter,
Input, OnChanges, Input, OnChanges,
OnInit, SimpleChanges, OnInit, SimpleChanges,
ViewChild ViewChild
@ -27,14 +27,14 @@ import {
import { PageComponent } from '@shared/components/page.component'; import { PageComponent } from '@shared/components/page.component';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { AppState } from '@core/core.state'; import { AppState } from '@core/core.state';
import { PageLink, TimePageLink } from '@shared/models/page/page-link'; import { MAX_SAFE_PAGE_SIZE, PageLink, TimePageLink } from '@shared/models/page/page-link';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { MatPaginator } from '@angular/material/paginator'; import { MatPaginator } from '@angular/material/paginator';
import { MatSort } from '@angular/material/sort'; import { MatSort } from '@angular/material/sort';
import { EntitiesDataSource } from '@home/models/datasource/entity-datasource'; import { EntitiesDataSource } from '@home/models/datasource/entity-datasource';
import { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators'; import { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators';
import { Direction, SortOrder } from '@shared/models/page/sort-order'; import { Direction, SortOrder } from '@shared/models/page/sort-order';
import { forkJoin, fromEvent, merge, Observable } from 'rxjs'; import { forkJoin, fromEvent, merge, Observable, Subscription } from 'rxjs';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { BaseData, HasId } from '@shared/models/base-data'; import { BaseData, HasId } from '@shared/models/base-data';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
@ -87,12 +87,16 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn
selectionEnabled; selectionEnabled;
defaultPageSize = 10;
displayPagination = true;
pageSizeOptions;
pageLink: PageLink; pageLink: PageLink;
textSearchMode = false; textSearchMode = false;
timewindow: Timewindow; timewindow: Timewindow;
dataSource: EntitiesDataSource<BaseData<HasId>>; dataSource: EntitiesDataSource<BaseData<HasId>>;
isDetailsOpen = false; isDetailsOpen = false;
detailsPanelOpened = new EventEmitter<boolean>();
@ViewChild('entityTableHeader', {static: true}) entityTableHeaderAnchor: TbAnchorComponent; @ViewChild('entityTableHeader', {static: true}) entityTableHeaderAnchor: TbAnchorComponent;
@ -101,6 +105,10 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn
@ViewChild(MatPaginator) paginator: MatPaginator; @ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort; @ViewChild(MatSort) sort: MatSort;
private sortSubscription: Subscription;
private updateDataSubscription: Subscription;
private viewInited = false;
constructor(protected store: Store<AppState>, constructor(protected store: Store<AppState>,
private route: ActivatedRoute, private route: ActivatedRoute,
public translate: TranslateService, public translate: TranslateService,
@ -183,6 +191,10 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn
}; };
} }
this.displayPagination = this.entitiesTableConfig.displayPagination;
this.defaultPageSize = this.entitiesTableConfig.defaultPageSize;
this.pageSizeOptions = [this.defaultPageSize, this.defaultPageSize * 2, this.defaultPageSize * 3];
if (this.entitiesTableConfig.useTimePageLink) { if (this.entitiesTableConfig.useTimePageLink) {
this.timewindow = historyInterval(DAY); this.timewindow = historyInterval(DAY);
const currentTime = Date.now(); const currentTime = Date.now();
@ -191,6 +203,7 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn
} else { } else {
this.pageLink = new PageLink(10, 0, null, sortOrder); this.pageLink = new PageLink(10, 0, null, sortOrder);
} }
this.pageLink.pageSize = this.displayPagination ? this.defaultPageSize : MAX_SAFE_PAGE_SIZE;
this.dataSource = this.entitiesTableConfig.dataSource(() => { this.dataSource = this.entitiesTableConfig.dataSource(() => {
this.dataLoaded(); this.dataLoaded();
}); });
@ -200,6 +213,11 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn
if (this.entitiesTableConfig.loadDataOnInit) { if (this.entitiesTableConfig.loadDataOnInit) {
this.dataSource.loadEntities(this.pageLink); this.dataSource.loadEntities(this.pageLink);
} }
if (this.viewInited) {
setTimeout(() => {
this.updatePaginationSubscriptions();
}, 0);
}
} }
ngAfterViewInit() { ngAfterViewInit() {
@ -209,15 +227,31 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn
debounceTime(150), debounceTime(150),
distinctUntilChanged(), distinctUntilChanged(),
tap(() => { tap(() => {
this.paginator.pageIndex = 0; if (this.displayPagination) {
this.paginator.pageIndex = 0;
}
this.updateData(); this.updateData();
}) })
) )
.subscribe(); .subscribe();
this.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0); this.updatePaginationSubscriptions();
this.viewInited = true;
}
merge(this.sort.sortChange, this.paginator.page) private updatePaginationSubscriptions() {
if (this.sortSubscription) {
this.sortSubscription.unsubscribe();
this.sortSubscription = null;
}
if (this.updateDataSubscription) {
this.updateDataSubscription.unsubscribe();
this.updateDataSubscription = null;
}
if (this.displayPagination) {
this.sortSubscription = this.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0);
}
this.updateDataSubscription = (this.displayPagination ? merge(this.sort.sortChange, this.paginator.page) : this.sort.sortChange)
.pipe( .pipe(
tap(() => this.updateData()) tap(() => this.updateData())
) )
@ -232,8 +266,12 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn
if (closeDetails) { if (closeDetails) {
this.isDetailsOpen = false; this.isDetailsOpen = false;
} }
this.pageLink.page = this.paginator.pageIndex; if (this.displayPagination) {
this.pageLink.pageSize = this.paginator.pageSize; this.pageLink.page = this.paginator.pageIndex;
this.pageLink.pageSize = this.paginator.pageSize;
} else {
this.pageLink.page = 0;
}
if (this.sort.active) { if (this.sort.active) {
this.pageLink.sortOrder = { this.pageLink.sortOrder = {
property: this.sort.active, property: this.sort.active,
@ -264,6 +302,12 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn
} }
onRowClick($event: Event, entity) { onRowClick($event: Event, entity) {
if (!this.entitiesTableConfig.handleRowClick($event, entity)) {
this.toggleEntityDetails($event, entity);
}
}
toggleEntityDetails($event: Event, entity) {
if ($event) { if ($event) {
$event.stopPropagation(); $event.stopPropagation();
} }
@ -272,6 +316,7 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn
} else { } else {
this.isDetailsOpen = !this.isDetailsOpen; this.isDetailsOpen = !this.isDetailsOpen;
} }
this.detailsPanelOpened.emit(this.isDetailsOpen);
} }
addEntity($event: Event) { addEntity($event: Event) {
@ -371,16 +416,20 @@ export class EntitiesTableComponent extends PageComponent implements AfterViewIn
exitFilterMode() { exitFilterMode() {
this.textSearchMode = false; this.textSearchMode = false;
this.pageLink.textSearch = null; this.pageLink.textSearch = null;
this.paginator.pageIndex = 0; if (this.displayPagination) {
this.paginator.pageIndex = 0;
}
this.updateData(); this.updateData();
} }
resetSortAndFilter(update: boolean = true) { resetSortAndFilter(update: boolean = true) {
this.pageLink.textSearch = null; this.pageLink.textSearch = null;
if (this.entitiesTableConfig.useTimePageLink) { if (this.entitiesTableConfig.useTimePageLink) {
this.timewindow = historyInterval(24 * 60 * 60 * 1000); this.timewindow = historyInterval(DAY);
}
if (this.displayPagination) {
this.paginator.pageIndex = 0;
} }
this.paginator.pageIndex = 0;
const sortable = this.sort.sortables.get(this.entitiesTableConfig.defaultSortOrder.property); const sortable = this.sort.sortables.get(this.entitiesTableConfig.defaultSortOrder.property);
this.sort.active = sortable.id; this.sort.active = sortable.id;
this.sort.direction = this.entitiesTableConfig.defaultSortOrder.direction === Direction.ASC ? 'asc' : 'desc'; this.sort.direction = this.entitiesTableConfig.defaultSortOrder.direction === Direction.ASC ? 'asc' : 'desc';

View File

@ -51,8 +51,6 @@ import { deepClone } from '@core/utils';
}) })
export class EntityDetailsPanelComponent extends PageComponent implements OnInit, AfterViewInit, OnDestroy { export class EntityDetailsPanelComponent extends PageComponent implements OnInit, AfterViewInit, OnDestroy {
@Input() entitiesTableConfig: EntityTableConfig<BaseData<HasId>>;
@Output() @Output()
closeEntityDetails = new EventEmitter<void>(); closeEntityDetails = new EventEmitter<void>();
@ -66,6 +64,7 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit
entityTabsComponent: EntityTabsComponent<BaseData<HasId>>; entityTabsComponent: EntityTabsComponent<BaseData<HasId>>;
detailsForm: NgForm; detailsForm: NgForm;
entitiesTableConfigValue: EntityTableConfig<BaseData<HasId>>;
isEditValue = false; isEditValue = false;
selectedTab = 0; selectedTab = 0;
@ -102,9 +101,26 @@ export class EntityDetailsPanelComponent extends PageComponent implements OnInit
} }
} }
@Input()
set entitiesTableConfig(entitiesTableConfig: EntityTableConfig<BaseData<HasId>>) {
this.entitiesTableConfigValue = entitiesTableConfig;
if (this.entityComponent) {
this.entityComponent.entitiesTableConfig = entitiesTableConfig;
}
if (this.entityTabsComponent) {
this.entityTabsComponent.entitiesTableConfig = entitiesTableConfig;
}
}
get entitiesTableConfig(): EntityTableConfig<BaseData<HasId>> {
return this.entitiesTableConfigValue;
}
set isEdit(val: boolean) { set isEdit(val: boolean) {
this.isEditValue = val; this.isEditValue = val;
this.entityComponent.isEdit = val; if (this.entityComponent) {
this.entityComponent.isEdit = val;
}
if (this.entityTabsComponent) { if (this.entityTabsComponent) {
this.entityTabsComponent.isEdit = val; this.entityTabsComponent.isEdit = val;
} }

View File

@ -20,12 +20,25 @@ import { Input, OnInit, Directive } from '@angular/core';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { AppState } from '@core/core.state'; import { AppState } from '@core/core.state';
import { EntityTableConfig } from '@home/models/entity/entities-table-config.models'; import { EntityTableConfig } from '@home/models/entity/entities-table-config.models';
import { PageLink } from '@shared/models/page/page-link';
@Directive() @Directive()
export abstract class EntityTableHeaderComponent<T extends BaseData<HasId>> extends PageComponent implements OnInit { export abstract class EntityTableHeaderComponent<T extends BaseData<HasId>,
P extends PageLink = PageLink,
L extends BaseData<HasId> = T,
C extends EntityTableConfig<T, P, L> = EntityTableConfig<T, P, L>>
extends PageComponent implements OnInit {
entitiesTableConfigValue: C;
@Input() @Input()
entitiesTableConfig: EntityTableConfig<T>; set entitiesTableConfig(entitiesTableConfig: C) {
this.setEntitiesTableConfig(entitiesTableConfig);
}
get entitiesTableConfig(): C {
return this.entitiesTableConfigValue;
}
protected constructor(protected store: Store<AppState>) { protected constructor(protected store: Store<AppState>) {
super(store); super(store);
@ -34,4 +47,8 @@ export abstract class EntityTableHeaderComponent<T extends BaseData<HasId>> exte
ngOnInit() { ngOnInit() {
} }
protected setEntitiesTableConfig(entitiesTableConfig: C) {
this.entitiesTableConfigValue = entitiesTableConfig;
}
} }

View File

@ -38,6 +38,15 @@ export abstract class EntityComponent<T extends BaseData<HasId>,
isEditValue: boolean; isEditValue: boolean;
@Input()
set entitiesTableConfig(entitiesTableConfig: C) {
this.entitiesTableConfigValue = entitiesTableConfig;
}
get entitiesTableConfig(): C {
return this.entitiesTableConfigValue;
}
@Input() @Input()
set isEdit(isEdit: boolean) { set isEdit(isEdit: boolean) {
this.isEditValue = isEdit; this.isEditValue = isEdit;
@ -72,7 +81,7 @@ export abstract class EntityComponent<T extends BaseData<HasId>,
protected constructor(protected store: Store<AppState>, protected constructor(protected store: Store<AppState>,
protected fb: FormBuilder, protected fb: FormBuilder,
protected entityValue: T, protected entityValue: T,
protected entitiesTableConfig: C) { protected entitiesTableConfigValue: C) {
super(store); super(store);
this.entityForm = this.buildForm(this.entityValue); this.entityForm = this.buildForm(this.entityValue);
} }

View File

@ -29,7 +29,6 @@ import {
OnDestroy, OnDestroy,
OnInit, OnInit,
SimpleChanges, SimpleChanges,
Type,
ViewChild, ViewChild,
ViewContainerRef, ViewContainerRef,
ViewEncapsulation ViewEncapsulation
@ -44,7 +43,8 @@ import {
Widget, Widget,
WidgetActionDescriptor, WidgetActionDescriptor,
widgetActionSources, widgetActionSources,
WidgetActionType, WidgetComparisonSettings, WidgetActionType,
WidgetComparisonSettings,
WidgetResource, WidgetResource,
widgetType, widgetType,
WidgetTypeParameters WidgetTypeParameters
@ -90,27 +90,7 @@ import { DashboardService } from '@core/http/dashboard.service';
import { DatasourceService } from '@core/api/datasource.service'; import { DatasourceService } from '@core/api/datasource.service';
import { WidgetSubscription } from '@core/api/widget-subscription'; import { WidgetSubscription } from '@core/api/widget-subscription';
import { EntityService } from '@core/http/entity.service'; import { EntityService } from '@core/http/entity.service';
import { AssetService } from '@core/http/asset.service'; import { ServicesMap } from '@home/models/services.map';
import { DialogService } from '@core/services/dialog.service';
import { CustomDialogService } from '@home/components/widget/dialog/custom-dialog.service';
import { DatePipe } from '@angular/common';
import { AttributeService } from '@core/http/attribute.service';
import { TranslateService } from '@ngx-translate/core';
import { HttpClient } from '@angular/common/http';
import { EntityRelationService } from '@app/core/http/entity-relation.service';
const ServicesMap = new Map<string, Type<any>>();
ServicesMap.set('deviceService', DeviceService);
ServicesMap.set('assetService', AssetService);
ServicesMap.set('attributeService', AttributeService);
ServicesMap.set('entityRelationService', EntityRelationService);
ServicesMap.set('entityService', EntityService);
ServicesMap.set('dialogs', DialogService);
ServicesMap.set('customDialog', CustomDialogService);
ServicesMap.set('date', DatePipe);
ServicesMap.set('utils', UtilsService);
ServicesMap.set('translate', TranslateService);
ServicesMap.set('http', HttpClient);
@Component({ @Component({
selector: 'tb-widget', selector: 'tb-widget',

View File

@ -39,6 +39,7 @@ export type EntityByIdOperation<T extends BaseData<HasId>> = (id: HasUUID) => Ob
export type EntityIdOneWayOperation = (id: HasUUID) => Observable<any>; export type EntityIdOneWayOperation = (id: HasUUID) => Observable<any>;
export type EntityActionFunction<T extends BaseData<HasId>> = (action: EntityAction<T>) => boolean; export type EntityActionFunction<T extends BaseData<HasId>> = (action: EntityAction<T>) => boolean;
export type CreateEntityOperation<T extends BaseData<HasId>> = () => Observable<T>; export type CreateEntityOperation<T extends BaseData<HasId>> = () => Observable<T>;
export type EntityRowClickFunction<T extends BaseData<HasId>> = (event: Event, entity: T) => boolean;
export type CellContentFunction<T extends BaseData<HasId>> = (entity: T, key: string) => string; export type CellContentFunction<T extends BaseData<HasId>> = (entity: T, key: string) => string;
export type CellTooltipFunction<T extends BaseData<HasId>> = (entity: T, key: string) => string | undefined; export type CellTooltipFunction<T extends BaseData<HasId>> = (entity: T, key: string) => string | undefined;
@ -147,12 +148,14 @@ export class EntityTableConfig<T extends BaseData<HasId>, P extends PageLink = P
entityTabsComponent: Type<EntityTabsComponent<T, P, L>>; entityTabsComponent: Type<EntityTabsComponent<T, P, L>>;
addDialogStyle = {}; addDialogStyle = {};
defaultSortOrder: SortOrder = {property: 'createdTime', direction: Direction.ASC}; defaultSortOrder: SortOrder = {property: 'createdTime', direction: Direction.ASC};
displayPagination = true;
defaultPageSize = 10;
columns: Array<EntityColumn<L>> = []; columns: Array<EntityColumn<L>> = [];
cellActionDescriptors: Array<CellActionDescriptor<L>> = []; cellActionDescriptors: Array<CellActionDescriptor<L>> = [];
groupActionDescriptors: Array<GroupActionDescriptor<L>> = []; groupActionDescriptors: Array<GroupActionDescriptor<L>> = [];
headerActionDescriptors: Array<HeaderActionDescriptor> = []; headerActionDescriptors: Array<HeaderActionDescriptor> = [];
addActionDescriptors: Array<HeaderActionDescriptor> = []; addActionDescriptors: Array<HeaderActionDescriptor> = [];
headerComponent: Type<EntityTableHeaderComponent<L>>; headerComponent: Type<EntityTableHeaderComponent<T, P, L>>;
addEntity: CreateEntityOperation<T> = null; addEntity: CreateEntityOperation<T> = null;
dataSource: (dataLoadedFunction: () => void) => EntitiesDataSource<L> = (dataLoadedFunction: () => void) => { dataSource: (dataLoadedFunction: () => void) => EntitiesDataSource<L> = (dataLoadedFunction: () => void) => {
return new EntitiesDataSource(this.entitiesFetchFunction, this.entitySelectionEnabled, dataLoadedFunction); return new EntitiesDataSource(this.entitiesFetchFunction, this.entitySelectionEnabled, dataLoadedFunction);
@ -169,6 +172,7 @@ export class EntityTableConfig<T extends BaseData<HasId>, P extends PageLink = P
deleteEntity: EntityIdOneWayOperation = () => of(); deleteEntity: EntityIdOneWayOperation = () => of();
entitiesFetchFunction: EntitiesFetchFunction<L, P> = () => of(emptyPageData<L>()); entitiesFetchFunction: EntitiesFetchFunction<L, P> = () => of(emptyPageData<L>());
onEntityAction: EntityActionFunction<T> = () => false; onEntityAction: EntityActionFunction<T> = () => false;
handleRowClick: EntityRowClickFunction<L> = () => false;
entityTitle: EntityStringFunction<T> = (entity) => entity?.name; entityTitle: EntityStringFunction<T> = (entity) => entity?.name;
} }

View File

@ -0,0 +1,44 @@
///
/// Copyright © 2016-2020 The Thingsboard Authors
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
import { Type } from '@angular/core';
import { DeviceService } from '@core/http/device.service';
import { AssetService } from '@core/http/asset.service';
import { AttributeService } from '@core/http/attribute.service';
import { EntityRelationService } from '@core/http/entity-relation.service';
import { EntityService } from '@core/http/entity.service';
import { DialogService } from '@core/services/dialog.service';
import { CustomDialogService } from '@home/components/widget/dialog/custom-dialog.service';
import { DatePipe } from '@angular/common';
import { UtilsService } from '@core/services/utils.service';
import { TranslateService } from '@ngx-translate/core';
import { HttpClient } from '@angular/common/http';
export const ServicesMap = new Map<string, Type<any>>(
[
['deviceService', DeviceService],
['assetService', AssetService],
['attributeService', AttributeService],
['entityRelationService', EntityRelationService],
['entityService', EntityService],
['dialogs', DialogService],
['customDialog', CustomDialogService],
['date', DatePipe],
['utils', UtilsService],
['translate', TranslateService],
['http', HttpClient]
]
);

View File

@ -40,9 +40,9 @@ export class AssetComponent extends EntityComponent<AssetInfo> {
constructor(protected store: Store<AppState>, constructor(protected store: Store<AppState>,
protected translate: TranslateService, protected translate: TranslateService,
@Inject('entity') protected entityValue: AssetInfo, @Inject('entity') protected entityValue: AssetInfo,
@Inject('entitiesTableConfig') protected entitiesTableConfig: EntityTableConfig<AssetInfo>, @Inject('entitiesTableConfig') protected entitiesTableConfigValue: EntityTableConfig<AssetInfo>,
public fb: FormBuilder) { public fb: FormBuilder) {
super(store, fb, entityValue, entitiesTableConfig); super(store, fb, entityValue, entitiesTableConfigValue);
} }
ngOnInit() { ngOnInit() {

View File

@ -35,9 +35,9 @@ export class CustomerComponent extends ContactBasedComponent<Customer> {
constructor(protected store: Store<AppState>, constructor(protected store: Store<AppState>,
protected translate: TranslateService, protected translate: TranslateService,
@Inject('entity') protected entityValue: Customer, @Inject('entity') protected entityValue: Customer,
@Inject('entitiesTableConfig') protected entitiesTableConfig: EntityTableConfig<Customer>, @Inject('entitiesTableConfig') protected entitiesTableConfigValue: EntityTableConfig<Customer>,
protected fb: FormBuilder) { protected fb: FormBuilder) {
super(store, fb, entityValue, entitiesTableConfig); super(store, fb, entityValue, entitiesTableConfigValue);
} }
hideDelete() { hideDelete() {

View File

@ -47,9 +47,9 @@ export class DashboardFormComponent extends EntityComponent<Dashboard> {
protected translate: TranslateService, protected translate: TranslateService,
private dashboardService: DashboardService, private dashboardService: DashboardService,
@Inject('entity') protected entityValue: Dashboard, @Inject('entity') protected entityValue: Dashboard,
@Inject('entitiesTableConfig') protected entitiesTableConfig: EntityTableConfig<Dashboard>, @Inject('entitiesTableConfig') protected entitiesTableConfigValue: EntityTableConfig<Dashboard>,
public fb: FormBuilder) { public fb: FormBuilder) {
super(store, fb, entityValue, entitiesTableConfig); super(store, fb, entityValue, entitiesTableConfigValue);
} }
ngOnInit() { ngOnInit() {

View File

@ -44,9 +44,9 @@ export class DeviceComponent extends EntityComponent<DeviceInfo> {
private deviceService: DeviceService, private deviceService: DeviceService,
private clipboardService: ClipboardService, private clipboardService: ClipboardService,
@Inject('entity') protected entityValue: DeviceInfo, @Inject('entity') protected entityValue: DeviceInfo,
@Inject('entitiesTableConfig') protected entitiesTableConfig: EntityTableConfig<DeviceInfo>, @Inject('entitiesTableConfig') protected entitiesTableConfigValue: EntityTableConfig<DeviceInfo>,
public fb: FormBuilder) { public fb: FormBuilder) {
super(store, fb, entityValue, entitiesTableConfig); super(store, fb, entityValue, entitiesTableConfigValue);
} }
ngOnInit() { ngOnInit() {

View File

@ -52,9 +52,9 @@ export class EntityViewComponent extends EntityComponent<EntityViewInfo> {
constructor(protected store: Store<AppState>, constructor(protected store: Store<AppState>,
protected translate: TranslateService, protected translate: TranslateService,
@Inject('entity') protected entityValue: EntityViewInfo, @Inject('entity') protected entityValue: EntityViewInfo,
@Inject('entitiesTableConfig') protected entitiesTableConfig: EntityTableConfig<EntityViewInfo>, @Inject('entitiesTableConfig') protected entitiesTableConfigValue: EntityTableConfig<EntityViewInfo>,
public fb: FormBuilder) { public fb: FormBuilder) {
super(store, fb, entityValue, entitiesTableConfig); super(store, fb, entityValue, entitiesTableConfigValue);
} }
ngOnInit() { ngOnInit() {

View File

@ -34,9 +34,9 @@ export class RuleChainComponent extends EntityComponent<RuleChain> {
constructor(protected store: Store<AppState>, constructor(protected store: Store<AppState>,
protected translate: TranslateService, protected translate: TranslateService,
@Inject('entity') protected entityValue: RuleChain, @Inject('entity') protected entityValue: RuleChain,
@Inject('entitiesTableConfig') protected entitiesTableConfig: EntityTableConfig<RuleChain>, @Inject('entitiesTableConfig') protected entitiesTableConfigValue: EntityTableConfig<RuleChain>,
public fb: FormBuilder) { public fb: FormBuilder) {
super(store, fb, entityValue, entitiesTableConfig); super(store, fb, entityValue, entitiesTableConfigValue);
} }
hideDelete() { hideDelete() {

View File

@ -34,9 +34,9 @@ export class TenantComponent extends ContactBasedComponent<Tenant> {
constructor(protected store: Store<AppState>, constructor(protected store: Store<AppState>,
protected translate: TranslateService, protected translate: TranslateService,
@Inject('entity') protected entityValue: Tenant, @Inject('entity') protected entityValue: Tenant,
@Inject('entitiesTableConfig') protected entitiesTableConfig: EntityTableConfig<Tenant>, @Inject('entitiesTableConfig') protected entitiesTableConfigValue: EntityTableConfig<Tenant>,
protected fb: FormBuilder) { protected fb: FormBuilder) {
super(store, fb, entityValue, entitiesTableConfig); super(store, fb, entityValue, entitiesTableConfigValue);
} }
hideDelete() { hideDelete() {

View File

@ -42,9 +42,9 @@ export class UserComponent extends EntityComponent<User> {
constructor(protected store: Store<AppState>, constructor(protected store: Store<AppState>,
@Inject('entity') protected entityValue: User, @Inject('entity') protected entityValue: User,
@Inject('entitiesTableConfig') protected entitiesTableConfig: EntityTableConfig<User>, @Inject('entitiesTableConfig') protected entitiesTableConfigValue: EntityTableConfig<User>,
public fb: FormBuilder) { public fb: FormBuilder) {
super(store, fb, entityValue, entitiesTableConfig); super(store, fb, entityValue, entitiesTableConfigValue);
} }
hideDelete() { hideDelete() {

View File

@ -31,9 +31,9 @@ export class WidgetsBundleComponent extends EntityComponent<WidgetsBundle> {
constructor(protected store: Store<AppState>, constructor(protected store: Store<AppState>,
@Inject('entity') protected entityValue: WidgetsBundle, @Inject('entity') protected entityValue: WidgetsBundle,
@Inject('entitiesTableConfig') protected entitiesTableConfig: EntityTableConfig<WidgetsBundle>, @Inject('entitiesTableConfig') protected entitiesTableConfigValue: EntityTableConfig<WidgetsBundle>,
public fb: FormBuilder) { public fb: FormBuilder) {
super(store, fb, entityValue, entitiesTableConfig); super(store, fb, entityValue, entitiesTableConfigValue);
} }
hideDelete() { hideDelete() {

View File

@ -19,6 +19,8 @@ import { emptyPageData, PageData } from '@shared/models/page/page-data';
import { getDescendantProp, isObject } from '@core/utils'; import { getDescendantProp, isObject } from '@core/utils';
import { SortDirection } from '@angular/material/sort'; import { SortDirection } from '@angular/material/sort';
export const MAX_SAFE_PAGE_SIZE = 2147483647;
export type PageLinkSearchFunction<T> = (entity: T, textSearch: string) => boolean; export type PageLinkSearchFunction<T> = (entity: T, textSearch: string) => boolean;
const defaultPageLinkSearchFunction: PageLinkSearchFunction<any> = const defaultPageLinkSearchFunction: PageLinkSearchFunction<any> =