111731: Added apply filter functionality

This commit is contained in:
Alexandre Vryghem
2024-04-12 22:23:14 +02:00
parent 3cdf426594
commit 7eb26582db
3 changed files with 34 additions and 8 deletions

View File

@@ -1,12 +1,12 @@
<h3>{{ 'search.sidebar.advanced-search.title' | translate }}</h3> <h3>{{ 'search.sidebar.advanced-search.title' | translate }}</h3>
<div *ngVar="advancedFilterMap$ | async as advancedFilterMap" class="advanced-search b-3 p-3"> <div *ngVar="advancedFilterMap$ | async as advancedFilterMap" class="advanced-search b-3 p-3">
<h5>{{ 'search.sidebar.advanced-search.filter-by' | translate }}</h5> <h5>{{ 'search.sidebar.advanced-search.filter-by' | translate }}</h5>
<select [(ngModel)]="currentFilter" class="form-control mb-2"> <select [(ngModel)]="currentFilter" (keyup.enter)="applyFilter()" class="form-control mb-2">
<option *ngFor="let advancedFilter of (advancedFilters$ | async) | keyvalue" [value]="advancedFilter.value.filter"> <option *ngFor="let advancedFilter of (advancedFilters$ | async) | keyvalue" [value]="advancedFilter.value.filter">
{{ 'search.filters.filter.' + advancedFilter.value.filter + '.head' | translate }} {{ 'search.filters.filter.' + advancedFilter.value.filter + '.head' | translate }}
</option> </option>
</select> </select>
<select [(ngModel)]="currentOperator" class="form-control mb-2"> <select [(ngModel)]="currentOperator" (keyup.enter)="applyFilter()" class="form-control mb-2">
<option *ngFor="let operator of advancedFilterMap.get(currentFilter)?.operators" [value]="operator.operator"> <option *ngFor="let operator of advancedFilterMap.get(currentFilter)?.operators" [value]="operator.operator">
{{ 'search.filters.operator.' + operator.operator + '.text' | translate }} {{ 'search.filters.operator.' + operator.operator + '.text' | translate }}
</option> </option>
@@ -17,10 +17,11 @@
[action]="router.url" [action]="router.url"
[name]="'f.' + currentFilter" [name]="'f.' + currentFilter"
[(ngModel)]="currentValue" [(ngModel)]="currentValue"
(submitSuggestion)="applyFilter()"
(findSuggestions)="findSuggestions($event)" (findSuggestions)="findSuggestions($event)"
ngDefaultControl> ngDefaultControl>
</ds-filter-input-suggestions> </ds-filter-input-suggestions>
<button [disabled]="currentValue === ''" class="btn btn-primary mt-2"> <button (click)="applyFilter()" [disabled]="currentValue === ''" class="btn btn-primary mt-2">
{{ 'search.sidebar.advanced-search.add' | translate }} {{ 'search.sidebar.advanced-search.add' | translate }}
</button> </button>
</div> </div>

View File

@@ -2,8 +2,10 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AdvancedSearchComponent } from './advanced-search.component'; import { AdvancedSearchComponent } from './advanced-search.component';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { RouterStub } from '../../testing/router.stub'; import { RouterStub } from '../../testing/router.stub';
import { SearchService } from '../../../core/shared/search/search.service';
import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service';
import { SearchFilterService } from '../../../core/shared/search/search-filter.service'; import { SearchFilterService } from '../../../core/shared/search/search-filter.service';
import { SearchServiceStub } from '../../testing/search-service.stub';
import { SearchConfigurationServiceStub } from '../../testing/search-configuration-service.stub'; import { SearchConfigurationServiceStub } from '../../testing/search-configuration-service.stub';
import { SearchFilterServiceStub } from '../../testing/search-filter-service.stub'; import { SearchFilterServiceStub } from '../../testing/search-filter-service.stub';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
@@ -13,11 +15,13 @@ describe('AdvancedSearchComponent', () => {
let fixture: ComponentFixture<AdvancedSearchComponent>; let fixture: ComponentFixture<AdvancedSearchComponent>;
let router: RouterStub; let router: RouterStub;
let searchService: SearchServiceStub;
let searchConfigurationService: SearchConfigurationServiceStub; let searchConfigurationService: SearchConfigurationServiceStub;
let searchFilterService: SearchFilterServiceStub; let searchFilterService: SearchFilterServiceStub;
beforeEach(async () => { beforeEach(async () => {
router = new RouterStub(); router = new RouterStub();
searchService = new SearchServiceStub();
searchConfigurationService = new SearchConfigurationServiceStub(); searchConfigurationService = new SearchConfigurationServiceStub();
searchFilterService = new SearchFilterServiceStub(); searchFilterService = new SearchFilterServiceStub();
@@ -30,6 +34,7 @@ describe('AdvancedSearchComponent', () => {
], ],
providers: [ providers: [
{ provide: Router, useValue: router }, { provide: Router, useValue: router },
{ provide: SearchService, useValue: searchService },
{ provide: SearchConfigurationService, useValue: searchConfigurationService }, { provide: SearchConfigurationService, useValue: searchConfigurationService },
{ provide: SearchFilterService, useValue: searchFilterService }, { provide: SearchFilterService, useValue: searchFilterService },
], ],

View File

@@ -1,19 +1,21 @@
import { Component, Input, OnInit } from '@angular/core'; import { Component, Input, OnInit, OnDestroy } from '@angular/core';
import { map, Observable, of as observableOf } from 'rxjs'; import { map, Observable, of as observableOf, Subscription } from 'rxjs';
import { take } from 'rxjs/operators';
import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service';
import { FilterConfig, SearchConfig } from '../../../core/shared/search/search-filters/search-config.model'; import { FilterConfig, SearchConfig } from '../../../core/shared/search/search-filters/search-config.model';
import { SearchFilterService } from '../../../core/shared/search/search-filter.service'; import { SearchFilterService } from '../../../core/shared/search/search-filter.service';
import { SearchFilterConfig } from '../models/search-filter-config.model'; import { SearchFilterConfig } from '../models/search-filter-config.model';
import { Router } from '@angular/router'; import { Router, Params } from '@angular/router';
import { InputSuggestion } from '../../input-suggestions/input-suggestions.model'; import { InputSuggestion } from '../../input-suggestions/input-suggestions.model';
import { hasValue } from '../../empty.util'; import { hasValue, isNotEmpty } from '../../empty.util';
import { SearchService } from '../../../core/shared/search/search.service';
@Component({ @Component({
selector: 'ds-advanced-search', selector: 'ds-advanced-search',
templateUrl: './advanced-search.component.html', templateUrl: './advanced-search.component.html',
styleUrls: ['./advanced-search.component.scss'], styleUrls: ['./advanced-search.component.scss'],
}) })
export class AdvancedSearchComponent implements OnInit { export class AdvancedSearchComponent implements OnInit, OnDestroy {
@Input() configuration: string; @Input() configuration: string;
@@ -37,8 +39,11 @@ export class AdvancedSearchComponent implements OnInit {
*/ */
filterSearchResults$: Observable<InputSuggestion[]> = observableOf([]); filterSearchResults$: Observable<InputSuggestion[]> = observableOf([]);
subs: Subscription[] = [];
constructor( constructor(
protected router: Router, protected router: Router,
protected searchService: SearchService,
protected searchConfigurationService: SearchConfigurationService, protected searchConfigurationService: SearchConfigurationService,
protected searchFilterService: SearchFilterService, protected searchFilterService: SearchFilterService,
) { ) {
@@ -63,6 +68,10 @@ export class AdvancedSearchComponent implements OnInit {
); );
} }
ngOnDestroy(): void {
this.subs.forEach((sub: Subscription) => sub.unsubscribe());
}
findSuggestions(query: string): void { findSuggestions(query: string): void {
if (hasValue(this.filtersConfig)) { if (hasValue(this.filtersConfig)) {
for (const filterConfig of this.filtersConfig) { for (const filterConfig of this.filtersConfig) {
@@ -73,4 +82,15 @@ export class AdvancedSearchComponent implements OnInit {
} }
} }
applyFilter(): void {
if (isNotEmpty(this.currentValue)) {
this.subs.push(this.searchConfigurationService.selectNewAppliedFilterParams(this.currentFilter, this.currentValue.trim(), this.currentOperator).pipe(take(1)).subscribe((params: Params) => {
void this.router.navigate([this.searchService.getSearchLink()], {
queryParams: params,
});
this.currentValue = '';
}));
}
}
} }