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