totopia-backend/src/app/pages/infos/info/component/free-board-list.data-source.ts
byung eun park a62f3e0d31 free board
2019-11-06 22:08:08 +09:00

74 lines
1.9 KiB
TypeScript

import { DataSource } from '@angular/cdk/table';
import { BehaviorSubject, Observable, merge } from 'rxjs';
import { switchMap, map } from 'rxjs/operators';
import { MatPaginator } from '@angular/material/paginator';
import { MatSort } from '@angular/material/sort';
import { CollectionViewer } from '@angular/cdk/collections';
import { FreeBoard } from 'src/modules/infos/model/free-board.model';
import { FreeBoardService } from 'src/modules/infos/service/free-board.service';
import { Page } from 'src/modules/common/data/model/page';
export class FreeBoardDataSource extends DataSource<FreeBoard> {
private filterSubject = new BehaviorSubject('');
private pageSubject = new BehaviorSubject<Page<FreeBoard>>({});
constructor(
private freeBoardService: FreeBoardService,
private paginator: MatPaginator,
private sort: MatSort
) {
super();
}
// Filter
get filter(): string {
return this.filterSubject.value;
}
set filter(filter: string) {
this.filterSubject.next(filter);
}
get page(): Page<FreeBoard> {
return this.pageSubject.value;
}
set page(value: Page<FreeBoard>) {
this.pageSubject.next(value);
}
connect(
collectionViewer: CollectionViewer
): Observable<FreeBoard[] | readonly FreeBoard[]> {
const displayDataChanges = [
this.paginator.page,
this.sort.sortChange,
this.filterSubject
];
return merge(...displayDataChanges).pipe(
switchMap(() => {
const filter = this.filter;
const sortActive = this.sort.active;
const sortDirection = this.sort.direction;
const pageIndex = this.paginator.pageIndex;
const pageSize = this.paginator.pageSize;
return this.freeBoardService.getAll().pipe(
map(page => {
this.page = page;
return page.content;
})
);
})
);
}
disconnect(collectionViewer: CollectionViewer): void {
this.filterSubject.complete();
}
}