diff --git a/src/lib/filtering/filter-card/filter-card.component.html b/src/lib/filtering/filter-card/filter-card.component.html index fae3b07..9a9f759 100644 --- a/src/lib/filtering/filter-card/filter-card.component.html +++ b/src/lib/filtering/filter-card/filter-card.component.html @@ -1,4 +1,4 @@ - + -
+
-
+
@@ -31,7 +31,7 @@ [ngTemplateOutletContext]="{ filter: filter, filterGroup: secondaryGroup, - atLeastOneIsExpandable: atLeastOneSecondaryFilterIsExpandable$ | async + atLeastOneIsExpandable: atLeastOneSecondaryFilterIsExpandable() }" [ngTemplateOutlet]="defaultFilterTemplate" > @@ -44,7 +44,7 @@ -
+
this.#filterService.getGroup(this.primaryFiltersSlug)); readonly secondaryFilterGroup = computed(() => this.#filterService.getGroup(this.secondaryFiltersSlug)); primaryFilters = computed(() => { this.#searchValueChanged(); - return this.#searchService.searchIn(this.primaryFilterGroup()?.filters ?? []); + return this.searchService.searchIn(this.primaryFilterGroup()?.filters ?? []); }); atLeastOneFilterIsExpandable = computed(() => atLeastOneIsExpandable(this.primaryFilterGroup())); diff --git a/src/lib/filtering/popup-filter/popup-filter.component.html b/src/lib/filtering/popup-filter/popup-filter.component.html index f03fd52..36d198d 100644 --- a/src/lib/filtering/popup-filter/popup-filter.component.html +++ b/src/lib/filtering/popup-filter/popup-filter.component.html @@ -1,32 +1,32 @@ - +
diff --git a/src/lib/filtering/popup-filter/popup-filter.component.ts b/src/lib/filtering/popup-filter/popup-filter.component.ts index 3434d39..8a9bd35 100644 --- a/src/lib/filtering/popup-filter/popup-filter.component.ts +++ b/src/lib/filtering/popup-filter/popup-filter.component.ts @@ -1,9 +1,5 @@ -import { ChangeDetectionStrategy, Component, Input, OnInit, TemplateRef } from '@angular/core'; -import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; -import { delay, map } from 'rxjs/operators'; -import { shareDistinctLast, shareLast, some } from '../../utils'; +import { ChangeDetectionStrategy, Component, computed, inject, Input, OnInit, signal, Signal, TemplateRef } from '@angular/core'; import { FilterService } from '../filter.service'; -import { IFilterGroup } from '../models/filter-group.model'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; @Component({ @@ -12,43 +8,22 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; styleUrls: ['./popup-filter.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class PopupFilterComponent implements OnInit { +export class PopupFilterComponent { @Input() primaryFiltersSlug!: string; @Input() fileId?: string; @Input() actionsTemplate?: TemplateRef; @Input() secondaryFiltersSlug = ''; @Input() primaryFiltersLabel: string = _('filter-menu.filter-types'); - readonly expanded = new BehaviorSubject(false); - readonly expanded$ = this.expanded.asObservable().pipe(delay(200)); + readonly #filterService = inject(FilterService); + protected readonly expanded = signal(false); - hasActiveFilters$!: Observable; - primaryFilterGroup$!: Observable; - secondaryFilterGroup$!: Observable; - primaryFiltersDisabled$!: Observable; - - constructor(readonly filterService: FilterService) {} - - private get _hasActiveFilters$() { - return combineLatest([this.primaryFilterGroup$, this.secondaryFilterGroup$]).pipe( - map(([primary, secondary]) => [...(primary?.filters || []), ...(secondary?.filters || [])]), - some(f => f.checked || !!f.indeterminate), - shareDistinctLast(), - ); - } - - private get _primaryFiltersDisabled$(): Observable { - return this.primaryFilterGroup$.pipe( - map(group => group?.filters?.length === 0), - shareDistinctLast(), - ); - } - - ngOnInit(): void { - this.primaryFilterGroup$ = this.filterService.getGroup$(this.primaryFiltersSlug).pipe(shareLast()); - this.secondaryFilterGroup$ = this.filterService.getGroup$(this.secondaryFiltersSlug).pipe(shareLast()); - - this.hasActiveFilters$ = this._hasActiveFilters$; - this.primaryFiltersDisabled$ = this._primaryFiltersDisabled$; - } + protected readonly primaryFilterGroup = computed(() => this.#filterService.getGroup(this.primaryFiltersSlug)); + protected readonly secondaryFilterGroup = computed(() => this.#filterService.getGroup(this.secondaryFiltersSlug)); + protected readonly primaryFiltersDisabled = computed(() => this.primaryFilterGroup()?.filters?.length === 0); + protected readonly hasActiveFilters = computed(() => + [...(this.primaryFilterGroup()?.filters || []), ...(this.secondaryFilterGroup()?.filters || [])].some( + f => f.checked || !!f.indeterminate, + ), + ); } diff --git a/src/lib/listing/services/listing.service.ts b/src/lib/listing/services/listing.service.ts index e291712..36a4775 100644 --- a/src/lib/listing/services/listing.service.ts +++ b/src/lib/listing/services/listing.service.ts @@ -7,6 +7,7 @@ import { Id, IListable } from '../models'; import { EntitiesService } from './entities.service'; import { getLength, shareDistinctLast, shareLast, some } from '../../utils'; import { SortingService } from '../../sorting'; +import { toObservable } from '@angular/core/rxjs-interop'; @Injectable() export class ListingService, PrimaryKey extends Id = Class['id']> { @@ -60,10 +61,10 @@ export class ListingService, PrimaryKey exte } private get _getDisplayed$(): Observable { - const { filterGroups$ } = this._filterService; + const { filterGroups } = this._filterService; const { valueChanges$ } = this._searchService; - return combineLatest([this._entitiesService.all$, filterGroups$, valueChanges$]).pipe( + return combineLatest([this._entitiesService.all$, toObservable(filterGroups), valueChanges$]).pipe( map(([entities, filterGroups]) => getFilteredEntities(entities, filterGroups)), map(entities => this._searchService.searchIn(entities)), tap(displayed => {