RED-3800: update filter service

This commit is contained in:
Dan Percic 2022-05-11 12:46:03 +03:00
parent 37ab9a6ed7
commit e20ed84ca2

View File

@ -1,10 +1,10 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable, Subject } from 'rxjs'; import { BehaviorSubject, Observable, Subject } from 'rxjs';
import { map, startWith, switchMapTo } from 'rxjs/operators'; import { map, startWith, switchMap } from 'rxjs/operators';
import { processFilters, toFlatFilters } from './filter-utils'; import { processFilters, toFlatFilters } from './filter-utils';
import { IFilterGroup } from './models/filter-group.model'; import { IFilterGroup } from './models/filter-group.model';
import { INestedFilter } from './models/nested-filter.model'; import { INestedFilter } from './models/nested-filter.model';
import { get, shareDistinctLast, shareLast } from '../utils'; import { any, get, shareDistinctLast, shareLast } from '../utils';
import { NestedFilter } from './models/nested-filter'; import { NestedFilter } from './models/nested-filter';
import { Filter } from './models/filter'; import { Filter } from './models/filter';
import { IFilter } from './models/filter.model'; import { IFilter } from './models/filter.model';
@ -13,18 +13,22 @@ import { IFilter } from './models/filter.model';
export class FilterService { export class FilterService {
readonly showResetFilters$: Observable<boolean>; readonly showResetFilters$: Observable<boolean>;
readonly filterGroups$: Observable<IFilterGroup[]>; readonly filterGroups$: Observable<IFilterGroup[]>;
readonly #singleFilters = new Map<string, BehaviorSubject<IFilter | undefined>>(); readonly #singleFilters = new Map<string, BehaviorSubject<IFilter | undefined>>();
private readonly _filterGroups$ = new BehaviorSubject<IFilterGroup[]>([]); readonly #filterGroups$ = new BehaviorSubject<IFilterGroup[]>([]);
private readonly _refresh$ = new Subject(); readonly #refresh$ = new Subject();
constructor() { constructor() {
this.filterGroups$ = this._refresh$.pipe(startWith(''), switchMapTo(this._filterGroups$.asObservable()), shareLast()); this.filterGroups$ = this.#refresh$.pipe(
startWith(''),
switchMap(() => this.#filterGroups$.asObservable()),
shareLast(),
);
this.showResetFilters$ = this._showResetFilters$; this.showResetFilters$ = this._showResetFilters$;
} }
get filterGroups(): IFilterGroup[] { get filterGroups(): IFilterGroup[] {
return Object.values(this._filterGroups$.getValue()); return Object.values(this.#filterGroups$.getValue());
} }
get enabledFlatFilters() { get enabledFlatFilters() {
@ -38,13 +42,13 @@ export class FilterService {
private get _showResetFilters$(): Observable<boolean> { private get _showResetFilters$(): Observable<boolean> {
return this.filterGroups$.pipe( return this.filterGroups$.pipe(
map(value => toFlatFilters(value)), map(value => toFlatFilters(value)),
map(f => !!f.find(el => el.checked)), any(filter => !!filter.checked),
shareDistinctLast(), shareDistinctLast(),
); );
} }
refresh(): void { refresh(): void {
this._refresh$.next(true); this.#refresh$.next(true);
} }
toggleFilter(filterGroupSlug: string, key: string, checkChildren = false): void { toggleFilter(filterGroupSlug: string, key: string, checkChildren = false): void {
@ -75,11 +79,11 @@ export class FilterService {
addFilterGroup(value: IFilterGroup): void { addFilterGroup(value: IFilterGroup): void {
const oldFilters = this.getGroup(value.slug)?.filters; const oldFilters = this.getGroup(value.slug)?.filters;
if (!oldFilters) { if (!oldFilters) {
return this._filterGroups$.next([...this.filterGroups, value]); return this.#filterGroups$.next([...this.filterGroups, value]);
} }
const newGroup = { ...value, filters: processFilters(oldFilters, value.filters) }; const newGroup = { ...value, filters: processFilters(oldFilters, value.filters) };
this._filterGroups$.next([...this.filterGroups.filter(f => f.slug !== newGroup.slug), newGroup]); this.#filterGroups$.next([...this.filterGroups.filter(f => f.slug !== newGroup.slug), newGroup]);
} }
addFilterGroups(values: IFilterGroup[], removeOldFilters = false): void { addFilterGroups(values: IFilterGroup[], removeOldFilters = false): void {
@ -93,7 +97,7 @@ export class FilterService {
}); });
const filterSlugs = newFilters.map(f => f.slug); const filterSlugs = newFilters.map(f => f.slug);
this._filterGroups$.next( this.#filterGroups$.next(
removeOldFilters ? newFilters : [...this.filterGroups.filter(f => !filterSlugs.includes(f.slug)), ...newFilters], removeOldFilters ? newFilters : [...this.filterGroups.filter(f => !filterSlugs.includes(f.slug)), ...newFilters],
); );
} }