Browse Source

add: loading state management for extensible table

pull/20804/head
sumeyyeKurtulus 2 years ago
parent
commit
291fcbcd92
  1. 1
      npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html
  2. 45
      npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts

1
npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.html

@ -1,5 +1,6 @@
<ngx-datatable <ngx-datatable
default default
[loadingIndicator]="isLoading"
[rows]="data" [rows]="data"
[count]="recordsTotal" [count]="recordsTotal"
[list]="list" [list]="list"

45
npm/ng-packs/packages/components/extensible/src/lib/components/extensible-table/extensible-table.component.ts

@ -1,5 +1,6 @@
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
ChangeDetectorRef,
Component, Component,
EventEmitter, EventEmitter,
inject, inject,
@ -7,6 +8,7 @@ import {
Input, Input,
LOCALE_ID, LOCALE_ID,
OnChanges, OnChanges,
OnDestroy,
Output, Output,
SimpleChanges, SimpleChanges,
TemplateRef, TemplateRef,
@ -14,8 +16,7 @@ import {
} from '@angular/core'; } from '@angular/core';
import { AsyncPipe, formatDate, NgComponentOutlet, NgTemplateOutlet } from '@angular/common'; import { AsyncPipe, formatDate, NgComponentOutlet, NgTemplateOutlet } from '@angular/common';
import { Observable } from 'rxjs'; import { combineLatest, Observable, map } from 'rxjs';
import { map } from 'rxjs/operators';
import { NgbTooltip } from '@ng-bootstrap/ng-bootstrap'; import { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';
import { NgxDatatableModule } from '@swimlane/ngx-datatable'; import { NgxDatatableModule } from '@swimlane/ngx-datatable';
@ -30,6 +31,8 @@ import {
LocalizationModule, LocalizationModule,
PermissionDirective, PermissionDirective,
PermissionService, PermissionService,
RouterWaitService,
SubscriptionService,
} from '@abp/ng.core'; } from '@abp/ng.core';
import { import {
AbpVisibleDirective, AbpVisibleDirective,
@ -71,7 +74,7 @@ const DEFAULT_ACTIONS_COLUMN_WIDTH = 150;
templateUrl: './extensible-table.component.html', templateUrl: './extensible-table.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class ExtensibleTableComponent<R = any> implements OnChanges { export class ExtensibleTableComponent<R = any> implements OnChanges, OnDestroy {
protected _actionsText!: string; protected _actionsText!: string;
@Input() @Input()
set actionsText(value: string) { set actionsText(value: string) {
@ -110,6 +113,11 @@ export class ExtensibleTableComponent<R = any> implements OnChanges {
#injector = inject(Injector); #injector = inject(Injector);
getInjected = this.#injector.get.bind(this.#injector); getInjected = this.#injector.get.bind(this.#injector);
permissionService = this.#injector.get(PermissionService); permissionService = this.#injector.get(PermissionService);
subscriptionService = this.#injector.get(SubscriptionService);
listService = this.#injector.get(ListService);
routerWaitService = this.#injector.get(RouterWaitService);
cdRef = this.#injector.get(ChangeDetectorRef);
isLoading = true;
constructor() { constructor() {
const extensions = this.#injector.get(ExtensionsService); const extensions = this.#injector.get(ExtensionsService);
@ -123,6 +131,8 @@ export class ExtensibleTableComponent<R = any> implements OnChanges {
this.actionList.toArray().map(action => ({ requiredPolicy: action.permission })), this.actionList.toArray().map(action => ({ requiredPolicy: action.permission })),
).length > 0; ).length > 0;
this.setColumnWidths(DEFAULT_ACTIONS_COLUMN_WIDTH); this.setColumnWidths(DEFAULT_ACTIONS_COLUMN_WIDTH);
this.subscribeLoading();
} }
private setColumnWidths(actionsColumn: number | undefined) { private setColumnWidths(actionsColumn: number | undefined) {
@ -227,4 +237,33 @@ export class ExtensibleTableComponent<R = any> implements OnChanges {
return visibleActions.length > 0; return visibleActions.length > 0;
} }
subscribeLoading() {
this.subscriptionService.addOne(
combineLatest([this.listService.isLoading$, this.routerWaitService.getLoading$()]),
([listLoading, routerLoading]) => {
if (listLoading || routerLoading) {
this.startLoading();
} else {
this.stopLoading();
}
},
);
}
startLoading() {
if (this.isLoading) {
return;
}
this.isLoading = true;
this.cdRef.detectChanges();
}
stopLoading() {
this.isLoading = false;
}
ngOnDestroy() {
this.subscriptionService.closeAll();
}
} }

Loading…
Cancel
Save