Skip to content
Comment thread
alexandrevryghem marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<div class="labels">
@for (appliedFilter of appliedFilters$ | async; track appliedFilter.value) {
@for (appliedFilter of visibleFilters$ | async; track appliedFilter.value) {
<ds-search-label-loader
[appliedFilter]="appliedFilter"
[inPlaceSearch]="inPlaceSearch">
Expand Down
49 changes: 44 additions & 5 deletions src/app/shared/search/search-labels/search-labels.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,17 @@ import { AsyncPipe } from '@angular/common';
import {
Component,
Input,
OnChanges,
OnInit,
SimpleChanges,
} from '@angular/core';
import { AppliedFilter } from '@dspace/core/shared/search/models/applied-filter.model';
import { BehaviorSubject } from 'rxjs';
import {
BehaviorSubject,
combineLatest,
Observable,
} from 'rxjs';
import { map } from 'rxjs/operators';

import { SearchService } from '../search.service';
import { SearchLabelLoaderComponent } from './search-label-loader/search-label-loader.component';
Expand All @@ -23,22 +30,54 @@ import { SearchLabelLoaderComponent } from './search-label-loader/search-label-l
/**
* Component that represents the labels containing the currently active filters
*/
export class SearchLabelsComponent implements OnInit {
export class SearchLabelsComponent implements OnInit, OnChanges {

/**
* True when the search component should show results on the current page
*/
@Input() inPlaceSearch: boolean;

appliedFilters$: BehaviorSubject<AppliedFilter[]>;
/**
* The fixed filter query to exclude from the visible filters
*/
@Input() fixedFilterQuery: string;

/**
* BehaviorSubject that holds the current fixed filter query,
* updated whenever the fixedFilterQuery input changes
*/
fixedFilterQuery$: BehaviorSubject<string> = new BehaviorSubject<string>(null);

/**
* Observable of applied filters with fixed filter queries excluded,
* so they are not displayed as badges in the search UI
*/
visibleFilters$: Observable<AppliedFilter[]>;

constructor(
protected searchService: SearchService,
) {
}

ngOnInit(): void {
this.appliedFilters$ = this.searchService.appliedFilters$;
ngOnChanges(changes: SimpleChanges): void {
if (changes.fixedFilterQuery) {
this.fixedFilterQuery$.next(this.fixedFilterQuery);
}
}

ngOnInit(): void {
this.visibleFilters$ = combineLatest([
this.searchService.appliedFilters$,
this.fixedFilterQuery$,
]).pipe(
map(([filters, fixedFilterQuery]: [AppliedFilter[], string]) => {
if (!filters || !fixedFilterQuery) {
return filters;
}
return filters.filter((appliedFilter: AppliedFilter) =>
!fixedFilterQuery.includes(appliedFilter.filter),
);
}),
);
}
}
2 changes: 1 addition & 1 deletion src/app/shared/search/search.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@
</ds-search-form>
<div class="row mb-3 mb-md-1">
<div class="labels col-12">
<ds-search-labels [inPlaceSearch]="inPlaceSearch">
<ds-search-labels [inPlaceSearch]="inPlaceSearch" [fixedFilterQuery]="fixedFilterQuery">
</ds-search-labels>
</div>
</div>
Expand Down
Loading