barker/bookie/src/app/product/product-list/product-list-datasource.ts

74 lines
1.9 KiB
TypeScript

import { DataSource } from '@angular/cdk/collections';
import { merge, Observable } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { MenuCategory } from '../../core/menu-category';
import { Product } from '../../core/product';
export class ProductListDataSource extends DataSource<Product> {
public data: Product[];
public filteredData: Product[];
public search: string;
public menuCategory: string;
constructor(
private readonly searchFilter: Observable<string>,
private readonly menuCategoryFilter: Observable<string>,
private readonly dataObs: Observable<Product[]>,
) {
super();
this.data = [];
this.filteredData = [];
this.search = '';
this.menuCategory = '';
}
connect(): Observable<Product[]> {
const dataMutations = [
this.dataObs.pipe(
tap((x) => {
this.data = x;
}),
),
this.searchFilter.pipe(
tap((x) => {
this.search = x;
}),
),
this.menuCategoryFilter.pipe(
tap((x) => {
this.menuCategory = x;
}),
),
];
return merge(...dataMutations).pipe(
map(() => this.getFilteredData(this.data, this.search, this.menuCategory)),
tap((x) => {
this.filteredData = x;
}),
);
}
disconnect() {}
private getFilteredData(data: Product[], search: string, menuCategory: string): Product[] {
return data
.filter(
(x: Product) =>
search === null ||
search === undefined ||
search === '' ||
`${x.name} ${x.units} ${x.saleCategory?.name} ${x.menuCategory?.name}`
.toLowerCase()
.indexOf(search.toLowerCase()) !== -1,
)
.filter(
(x) =>
menuCategory === null ||
menuCategory === undefined ||
menuCategory === '' ||
(x.menuCategory as MenuCategory).id === menuCategory,
);
}
}