UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

105 lines 17.6 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { Injectable } from '@angular/core'; import { BehaviorSubject, combineLatest, Subject } from 'rxjs'; import { debounceTime, distinctUntilChanged, filter, map, skip, switchMap, takeUntil } from 'rxjs/operators'; export class NzTableDataService { constructor() { this.destroy$ = new Subject(); this.pageIndex$ = new BehaviorSubject(1); this.frontPagination$ = new BehaviorSubject(true); this.pageSize$ = new BehaviorSubject(10); this.listOfData$ = new BehaviorSubject([]); this.pageIndexDistinct$ = this.pageIndex$.pipe(distinctUntilChanged()); this.pageSizeDistinct$ = this.pageSize$.pipe(distinctUntilChanged()); this.listOfCalcOperator$ = new BehaviorSubject([]); this.queryParams$ = combineLatest([ this.pageIndexDistinct$, this.pageSizeDistinct$, this.listOfCalcOperator$ ]).pipe(debounceTime(0), skip(1), map(([pageIndex, pageSize, listOfCalc]) => { return { pageIndex, pageSize, sort: listOfCalc .filter(item => item.sortFn) .map(item => { return { key: item.key, value: item.sortOrder }; }), filter: listOfCalc .filter(item => item.filterFn) .map(item => { return { key: item.key, value: item.filterValue }; }) }; })); this.listOfDataAfterCalc$ = combineLatest([this.listOfData$, this.listOfCalcOperator$]).pipe(map(([listOfData, listOfCalcOperator]) => { let listOfDataAfterCalc = [...listOfData]; const listOfFilterOperator = listOfCalcOperator.filter(item => { const { filterValue, filterFn } = item; const isReset = filterValue === null || filterValue === undefined || (Array.isArray(filterValue) && filterValue.length === 0); return !isReset && typeof filterFn === 'function'; }); for (const item of listOfFilterOperator) { const { filterFn, filterValue } = item; listOfDataAfterCalc = listOfDataAfterCalc.filter(data => filterFn(filterValue, data)); } const listOfSortOperator = listOfCalcOperator .filter(item => item.sortOrder !== null && typeof item.sortFn === 'function') .sort((a, b) => +b.sortPriority - +a.sortPriority); if (listOfCalcOperator.length) { listOfDataAfterCalc.sort((record1, record2) => { for (const item of listOfSortOperator) { const { sortFn, sortOrder } = item; if (sortFn && sortOrder) { const compareResult = sortFn(record1, record2, sortOrder); if (compareResult !== 0) { return sortOrder === 'ascend' ? compareResult : -compareResult; } } } return 0; }); } return listOfDataAfterCalc; })); this.listOfFrontEndCurrentPageData$ = combineLatest([this.pageIndexDistinct$, this.pageSizeDistinct$, this.listOfDataAfterCalc$]).pipe(takeUntil(this.destroy$), filter(value => { const [pageIndex, pageSize, listOfData] = value; const maxPageIndex = Math.ceil(listOfData.length / pageSize) || 1; return pageIndex <= maxPageIndex; }), map(([pageIndex, pageSize, listOfData]) => { return listOfData.slice((pageIndex - 1) * pageSize, pageIndex * pageSize); })); this.listOfCurrentPageData$ = this.frontPagination$.pipe(switchMap(pagination => (pagination ? this.listOfFrontEndCurrentPageData$ : this.listOfData$))); this.total$ = this.frontPagination$.pipe(switchMap(pagination => (pagination ? this.listOfDataAfterCalc$ : this.listOfData$)), map(list => list.length), distinctUntilChanged()); } updatePageSize(size) { this.pageSize$.next(size); } updateFrontPagination(pagination) { this.frontPagination$.next(pagination); } updatePageIndex(index) { this.pageIndex$.next(index); } updateListOfData(list) { this.listOfData$.next(list); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } } NzTableDataService.decorators = [ { type: Injectable } ]; NzTableDataService.ctorParameters = () => []; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29tcG9uZW50cy90YWJsZS9zcmMvdGFibGUtZGF0YS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTdHLE1BQU0sT0FBTyxrQkFBa0I7SUFnSDdCO1FBL0dRLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUM1QyxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUN0RCxjQUFTLEdBQUcsSUFBSSxlQUFlLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDNUMsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBNkIsRUFBRSxDQUFDLENBQUM7UUFDMUUsdUJBQWtCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLHNCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUNoRSx3QkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FTdkMsRUFBRSxDQUFDLENBQUM7UUFDTixpQkFBWSxHQUFtQyxhQUFhLENBQUM7WUFDM0QsSUFBSSxDQUFDLGtCQUFrQjtZQUN2QixJQUFJLENBQUMsaUJBQWlCO1lBQ3RCLElBQUksQ0FB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IE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHNraXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTnpUYWJsZURhdGEsIE56VGFibGVGaWx0ZXJGbiwgTnpUYWJsZUZpbHRlclZhbHVlLCBOelRhYmxlUXVlcnlQYXJhbXMsIE56VGFibGVTb3J0Rm4sIE56VGFibGVTb3J0T3JkZXIgfSBmcm9tICcuL3RhYmxlLnR5cGVzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE56VGFibGVEYXRhU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuICBwcml2YXRlIHBhZ2VJbmRleCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMSk7XG4gIHByaXZhdGUgZnJvbnRQYWdpbmF0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHByaXZhdGUgcGFnZVNpemUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDEwKTtcbiAgcHJpdmF0ZSBsaXN0T2ZEYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVhZG9ubHlBcnJheTxOelRhYmxlRGF0YT4+KFtdKTtcbiAgcGFnZUluZGV4RGlzdGluY3QkID0gdGhpcy5wYWdlSW5kZXgkLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHBhZ2VTaXplRGlzdGluY3QkID0gdGhpcy5wYWdlU2l6ZSQucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgbGlzdE9mQ2FsY09wZXJhdG9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgQXJyYXk8e1xuICAgICAga2V5Pzogc3RyaW5nO1xuICAgICAgc29ydEZuOiBOelRhYmxlU29ydEZuIHwgbnVsbCB8IGJvb2xlYW47XG4gICAgICBzb3J0T3JkZXI6IE56VGFibGVTb3J0T3JkZXI7XG4gICAgICBmaWx0ZXJGbjogTnpUYWJsZUZpbHRlckZuIHwgbnVsbCB8IGJvb2xlYW47XG4gICAgICBmaWx0ZXJWYWx1ZTogTnpUYWJsZUZpbHRlclZhbHVlO1xuICAgICAgc29ydFByaW9yaXR5OiBudW1iZXIgfCBib29sZWFuO1xuICAgIH0+XG4gID4oW10pO1xuICBxdWVyeVBhcmFtcyQ6IE9ic2VydmFibGU8TnpUYWJsZVF1ZXJ5UGFyYW1zPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMucGFnZUluZGV4RGlzdGluY3QkLFxuICAgIHRoaXMucGFnZVNpemVEaXN0aW5jdCQsXG4gICAgdGhpcy5saXN0T2ZDYWxjT3BlcmF0b3IkXG4gIF0pLnBpcGUoXG4gICAgZGVib3VuY2VUaW1lKDApLFxuICAgIHNraXAoMSksXG4gICAgbWFwKChbcGFnZUluZGV4LCBwYWdlU2l6ZSwgbGlzdE9mQ2FsY10pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhZ2VJbmRleCxcbiAgICAgICAgcGFnZVNpemUsXG4gICAgICAgIHNvcnQ6IGxpc3RPZkNhbGNcbiAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zb3J0Rm4pXG4gICAgICAgICAgLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGtleTogaXRlbS5rZXkhLFxuICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5zb3J0T3JkZXJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgIGZpbHRlcjogbGlzdE9mQ2FsY1xuICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLmZpbHRlckZuKVxuICAgICAgICAgIC5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBrZXk6IGl0ZW0ua2V5ISxcbiAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0uZmlsdGVyVmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSlcbiAgKTtcbiAgcHJpdmF0ZSBsaXN0T2ZEYXRhQWZ0ZXJDYWxjJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMubGlzdE9mRGF0YSQsIHRoaXMubGlzdE9mQ2FsY09wZXJhdG9yJF0pLnBpcGUoXG4gICAgbWFwKChbbGlzdE9mRGF0YSwgbGlzdE9mQ2FsY09wZXJhdG9yXSkgPT4ge1xuICAgICAgbGV0IGxpc3RPZkRhdGFBZnRlckNhbGMgPSBbLi4ubGlzdE9mRGF0YV07XG4gICAgICBjb25zdCBsaXN0T2ZGaWx0ZXJPcGVyYXRvciA9IGxpc3RPZkNhbGNPcGVyYXRvci5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZmlsdGVyVmFsdWUsIGZpbHRlckZuIH0gPSBpdGVtO1xuICAgICAgICBjb25zdCBpc1Jlc2V0ID0gZmlsdGVyVmFsdWUgPT09IG51bGwgfHwgZmlsdGVyVmFsdWUgPT09IHVuZGVmaW5lZCB8fCAoQXJyYXkuaXNBcnJheShmaWx0ZXJWYWx1ZSkgJiYgZmlsdGVyVmFsdWUhLmxlbmd0aCA9PT0gMCk7XG4gICAgICAgIHJldHVybiAhaXNSZXNldCAmJiB0eXBlb2YgZmlsdGVyRm4gPT09ICdmdW5jdGlvbic7XG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0T2ZGaWx0ZXJPcGVyYXRvcikge1xuICAgICAgICBjb25zdCB7IGZpbHRlckZuLCBmaWx0ZXJWYWx1ZSB9ID0gaXRlbTtcbiAgICAgICAgbGlzdE9mRGF0YUFmdGVyQ2FsYyA9IGxpc3RPZkRhdGFBZnRlckNhbGMuZmlsdGVyKGRhdGEgPT4gKGZpbHRlckZuIGFzIE56VGFibGVGaWx0ZXJGbikoZmlsdGVyVmFsdWUsIGRhdGEpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxpc3RPZlNvcnRPcGVyYXRvciA9IGxpc3RPZkNhbGNPcGVyYXRvclxuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zb3J0T3JkZXIgIT09IG51bGwgJiYgdHlwZW9mIGl0ZW0uc29ydEZuID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gK2Iuc29ydFByaW9yaXR5IC0gK2Euc29ydFByaW9yaXR5KTtcbiAgICAgIGlmIChsaXN0T2ZDYWxjT3BlcmF0b3IubGVuZ3RoKSB7XG4gICAgICAgIGxpc3RPZkRhdGFBZnRlckNhbGMuc29ydCgocmVjb3JkMSwgcmVjb3JkMikgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0T2ZTb3J0T3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc29ydEZuLCBzb3J0T3JkZXIgfSA9IGl0ZW07XG4gICAgICAgICAgICBpZiAoc29ydEZuICYmIHNvcnRPcmRlcikge1xuICAgICAgICAgICAgICBjb25zdCBjb21wYXJlUmVzdWx0ID0gKHNvcnRGbiBhcyBOelRhYmxlU29ydEZuKShyZWNvcmQxLCByZWNvcmQyLCBzb3J0T3JkZXIpO1xuICAgICAgICAgICAgICBpZiAoY29tcGFyZVJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdhc2NlbmQnID8gY29tcGFyZVJlc3VsdCA6IC1jb21wYXJlUmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsaXN0T2ZEYXRhQWZ0ZXJDYWxjO1xuICAgIH0pXG4gICk7XG4gIHByaXZhdGUgbGlzdE9mRnJvbnRFbmRDdXJyZW50UGFnZURhdGEkID0gY29tYmluZUxhdGVzdChbdGhpcy5wYWdlSW5kZXhEaXN0aW5jdCQsIHRoaXMucGFnZVNpemVEaXN0aW5jdCQsIHRoaXMubGlzdE9mRGF0YUFmdGVyQ2FsYyRdKS5waXBlKFxuICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICBmaWx0ZXIodmFsdWUgPT4ge1xuICAgICAgY29uc3QgW3BhZ2VJbmRleCwgcGFnZVNpemUsIGxpc3RPZkRhdGFdID0gdmFsdWU7XG4gICAgICBjb25zdCBtYXhQYWdlSW5kZXggPSBNYXRoLmNlaWwobGlzdE9mRGF0YS5sZW5ndGggLyBwYWdlU2l6ZSkgfHwgMTtcbiAgICAgIHJldHVybiBwYWdlSW5kZXggPD0gbWF4UGFnZUluZGV4O1xuICAgIH0pLFxuICAgIG1hcCgoW3BhZ2VJbmRleCwgcGFnZVNpemUsIGxpc3RPZkRhdGFdKSA9PiB7XG4gICAgICByZXR1cm4gbGlzdE9mRGF0YS5zbGljZSgocGFnZUluZGV4IC0gMSkgKiBwYWdlU2l6ZSwgcGFnZUluZGV4ICogcGFnZVNpemUpO1xuICAgIH0pXG4gICk7XG4gIGxpc3RPZkN1cnJlbnRQYWdlRGF0YSQgPSB0aGlzLmZyb250UGFnaW5hdGlvbiQucGlwZShcbiAgICBzd2l0Y2hNYXAocGFnaW5hdGlvbiA9PiAocGFnaW5hdGlvbiA/IHRoaXMubGlzdE9mRnJvbnRFbmRDdXJyZW50UGFnZURhdGEkIDogdGhpcy5saXN0T2ZEYXRhJCkpXG4gICk7XG4gIHRvdGFsJCA9IHRoaXMuZnJvbnRQYWdpbmF0aW9uJC5waXBlKFxuICAgIHN3aXRjaE1hcChwYWdpbmF0aW9uID0+IChwYWdpbmF0aW9uID8gdGhpcy5saXN0T2ZEYXRhQWZ0ZXJDYWxjJCA6IHRoaXMubGlzdE9mRGF0YSQpKSxcbiAgICBtYXAobGlzdCA9PiBsaXN0Lmxlbmd0aCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICApO1xuXG4gIHVwZGF0ZVBhZ2VTaXplKHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFnZVNpemUkLm5leHQoc2l6ZSk7XG4gIH1cbiAgdXBkYXRlRnJvbnRQYWdpbmF0aW9uKHBhZ2luYXRpb246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmZyb250UGFnaW5hdGlvbiQubmV4dChwYWdpbmF0aW9uKTtcbiAgfVxuICB1cGRhdGVQYWdlSW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFnZUluZGV4JC5uZXh0KGluZGV4KTtcbiAgfVxuICB1cGRhdGVMaXN0T2ZEYXRhKGxpc3Q6IFJlYWRvbmx5QXJyYXk8TnpUYWJsZURhdGE+KTogdm9pZCB7XG4gICAgdGhpcy5saXN0T2ZEYXRhJC5uZXh0KGxpc3QpO1xuICB9XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=