UI: Entities table model improvements.
This commit is contained in:
parent
f9375a0fca
commit
b0c5479c64
@ -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 {
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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';
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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',
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
44
ui-ngx/src/app/modules/home/models/services.map.ts
Normal file
44
ui-ngx/src/app/modules/home/models/services.map.ts
Normal 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]
|
||||||
|
]
|
||||||
|
);
|
||||||
@ -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() {
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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> =
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user