luthor/otis/src/app/compliance-list/compliance-list-datasource.ts

43 lines
1.3 KiB
TypeScript

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<ComplianceList> {
constructor(public data: ComplianceList[], private paginator?: MatPaginator) {
super();
}
connect(): Observable<ComplianceList[]> {
const dataMutations: (Observable<ComplianceList[]> | EventEmitter<PageEvent>)[] = [
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);
}
}