import { DataSource } from '@angular/cdk/collections'; import { EventEmitter } from '@angular/core'; import { MatPaginator, PageEvent } from '@angular/material/paginator'; import { merge, Observable } from 'rxjs'; import { map, tap } from 'rxjs/operators'; import { Case } from '../core/case'; export class CauseListDatasource extends DataSource { private dataValues: Case[] = []; private data: Observable = new Observable(); constructor(public d: Observable, private paginator?: MatPaginator) { super(); this.data = d.pipe(tap((x) => (this.dataValues = x))); } connect(): Observable { const dataMutations: (Observable | EventEmitter)[] = [this.data]; if (this.paginator) { dataMutations.push((this.paginator as MatPaginator).page); } return merge(...dataMutations) .pipe( tap((x: Case[]) => { if (this.paginator) { this.paginator.length = x.length; } }), ) .pipe(map((x: Case[]) => this.getPagedData(this.dataValues))); } disconnect() {} private getPagedData(data: Case[]) { if (this.paginator === undefined) { return data; } const startIndex = this.paginator.pageIndex * this.paginator.pageSize; return data.slice(startIndex, startIndex + this.paginator.pageSize); } }