74 lines
1.9 KiB
TypeScript
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,
|
|
);
|
|
}
|
|
}
|