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

44 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 } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { Case } from '../core/case';
export class CauseListDatasource extends DataSource<Case> {
private dataValues: Case[] = [];
private data: Observable<Case[]> = new Observable<Case[]>();
constructor(public d: Observable<Case[]>, private paginator?: MatPaginator) {
super();
this.data = d.pipe(tap((x) => (this.dataValues = x)));
}
connect(): Observable<Case[]> {
const dataMutations: (Observable<Case[]> | EventEmitter<PageEvent>)[] = [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);
}
}