From 9bcd92efae532ac1724a7ace99873e720dd227f4 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 15 Jun 2022 15:08:16 +0200 Subject: [PATCH] [CST-6056] optimize fix to issue with filter suggestion --- .../search-facet-filter.component.ts | 53 +++++++++++-------- .../search-hierarchy-filter.component.html | 2 +- .../search-hierarchy-filter.component.ts | 5 +- .../search-text-filter.component.html | 2 +- .../search-text-filter.component.ts | 5 +- src/app/shared/search/search.utils.spec.ts | 4 +- src/app/shared/search/search.utils.ts | 2 +- 7 files changed, 38 insertions(+), 35 deletions(-) diff --git a/src/app/shared/search/search-filters/search-filter/search-facet-filter/search-facet-filter.component.ts b/src/app/shared/search/search-filters/search-filter/search-facet-filter/search-facet-filter.component.ts index edcd88cd21..c754d80a79 100644 --- a/src/app/shared/search/search-filters/search-filter/search-facet-filter/search-facet-filter.component.ts +++ b/src/app/shared/search/search-filters/search-filter/search-facet-filter/search-facet-filter.component.ts @@ -29,7 +29,7 @@ import { InputSuggestion } from '../../../../input-suggestions/input-suggestions import { SearchOptions } from '../../../models/search-options.model'; import { SEARCH_CONFIG_SERVICE } from '../../../../../my-dspace-page/my-dspace-page.component'; import { currentPath } from '../../../../utils/route.utils'; -import { getFacetValueForType, stripOperatorFromFilterValue } from '../../../search.utils'; +import { addOperatorToFilterValue, getFacetValueForType, stripOperatorFromFilterValue } from '../../../search.utils'; import { createPendingRemoteDataObject } from '../../../../remote-data.utils'; @Component({ @@ -234,32 +234,16 @@ export class SearchFacetFilterComponent implements OnInit, OnDestroy { * @param data The string from the input field */ onSubmit(data: any) { - if (data.match(new RegExp(`^.+,(equals|query|authority)$`))) { - this.selectedValues$.pipe(take(1)).subscribe((selectedValues) => { - if (isNotEmpty(data)) { - this.router.navigate(this.getSearchLinkParts(), { - queryParams: - { - [this.filterConfig.paramName]: [ - ...selectedValues.map((facet) => this.getFacetValue(facet)), - data - ] - }, - queryParamsHandling: 'merge' - }); - this.filter = ''; - } - this.filterSearchResults = observableOf([]); - }); - } + this.applyFilterValue(data); } /** - * On click, set the input's value to the clicked data - * @param data The value of the option that was clicked + * Submits a selected filter value to the filter + * Adds the "equals" operator to the received data before passing it on + * @param data The string selected from input suggestions */ onClick(data: any) { - this.filter = data; + this.applyFilterValue(addOperatorToFilterValue(data, 'equals')); } /** @@ -307,6 +291,31 @@ export class SearchFacetFilterComponent implements OnInit, OnDestroy { } } + /** + * Build the filter query using the value given and apply to the search. + * @param data The string from the input field + */ + protected applyFilterValue(data) { + if (data.match(new RegExp(`^.+,(equals|query|authority)$`))) { + this.selectedValues$.pipe(take(1)).subscribe((selectedValues) => { + if (isNotEmpty(data)) { + this.router.navigate(this.getSearchLinkParts(), { + queryParams: + { + [this.filterConfig.paramName]: [ + ...selectedValues.map((facet) => this.getFacetValue(facet)), + data + ] + }, + queryParamsHandling: 'merge' + }); + this.filter = ''; + } + this.filterSearchResults = observableOf([]); + }); + } + } + /** * Retrieve facet value */ diff --git a/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.html b/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.html index 02f2bc6336..49ca6fe3fd 100644 --- a/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.html +++ b/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.html @@ -24,7 +24,7 @@ [name]="filterConfig.paramName" [(ngModel)]="filter" (submitSuggestion)="onSubmit($event)" - (clickSuggestion)="onSubmit($event)" + (clickSuggestion)="onClick($event)" (findSuggestions)="findSuggestions($event)" ngDefaultControl > diff --git a/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.ts b/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.ts index a6e9fb4a00..b3349a5dd9 100644 --- a/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.ts +++ b/src/app/shared/search/search-filters/search-filter/search-hierarchy-filter/search-hierarchy-filter.component.ts @@ -3,7 +3,6 @@ import { FilterType } from '../../../models/filter-type.model'; import { renderFacetFor } from '../search-filter-type-decorator'; import { facetLoad, SearchFacetFilterComponent } from '../search-facet-filter/search-facet-filter.component'; import { addOperatorToFilterValue } from '../../../search.utils'; -import { InputSuggestion } from '../../../../input-suggestions/input-suggestions.model'; @Component({ selector: 'ds-search-hierarchy-filter', @@ -23,8 +22,6 @@ export class SearchHierarchyFilterComponent extends SearchFacetFilterComponent i * @param data The string from the input field */ onSubmit(data: any) { - this.filterSearchResults.subscribe((filterSearchResults: InputSuggestion[]) => { - super.onSubmit(addOperatorToFilterValue(data, filterSearchResults.length ? 'equals' : 'query')); - }); + super.onSubmit(addOperatorToFilterValue(data, 'query')); } } diff --git a/src/app/shared/search/search-filters/search-filter/search-text-filter/search-text-filter.component.html b/src/app/shared/search/search-filters/search-filter/search-text-filter/search-text-filter.component.html index 44aed494e3..fdf154bc04 100644 --- a/src/app/shared/search/search-filters/search-filter/search-text-filter/search-text-filter.component.html +++ b/src/app/shared/search/search-filters/search-filter/search-text-filter/search-text-filter.component.html @@ -24,7 +24,7 @@ [name]="filterConfig.paramName" [(ngModel)]="filter" (submitSuggestion)="onSubmit($event)" - (clickSuggestion)="onSubmit($event)" + (clickSuggestion)="onClick($event)" (findSuggestions)="findSuggestions($event)" ngDefaultControl> diff --git a/src/app/shared/search/search-filters/search-filter/search-text-filter/search-text-filter.component.ts b/src/app/shared/search/search-filters/search-filter/search-text-filter/search-text-filter.component.ts index 62c10e4c61..cfd81c3750 100644 --- a/src/app/shared/search/search-filters/search-filter/search-text-filter/search-text-filter.component.ts +++ b/src/app/shared/search/search-filters/search-filter/search-text-filter/search-text-filter.component.ts @@ -3,7 +3,6 @@ import { FilterType } from '../../../models/filter-type.model'; import { facetLoad, SearchFacetFilterComponent } from '../search-facet-filter/search-facet-filter.component'; import { renderFacetFor } from '../search-filter-type-decorator'; import { addOperatorToFilterValue, } from '../../../search.utils'; -import { InputSuggestion } from '../../../../input-suggestions/input-suggestions.model'; /** * This component renders a simple item page. @@ -29,8 +28,6 @@ export class SearchTextFilterComponent extends SearchFacetFilterComponent implem * @param data The string from the input field */ onSubmit(data: any) { - this.filterSearchResults.subscribe((filterSearchResults: InputSuggestion[]) => { - super.onSubmit(addOperatorToFilterValue(data, filterSearchResults.length ? 'equals' : 'query')); - }); + super.onSubmit(addOperatorToFilterValue(data, 'query')); } } diff --git a/src/app/shared/search/search.utils.spec.ts b/src/app/shared/search/search.utils.spec.ts index 75735093e8..70bf9a43a0 100644 --- a/src/app/shared/search/search.utils.spec.ts +++ b/src/app/shared/search/search.utils.spec.ts @@ -66,11 +66,11 @@ describe('Search Utils', () => { describe('addOperatorToFilterValue', () => { it('should add the operator to the value', () => { - expect(addOperatorToFilterValue('value', 'operator')).toEqual('value,operator'); + expect(addOperatorToFilterValue('value', 'equals')).toEqual('value,equals'); }); it('shouldn\'t add the operator to the value if it already contains the operator', () => { - expect(addOperatorToFilterValue('value,operator', 'operator')).toEqual('value,operator'); + expect(addOperatorToFilterValue('value,equals', 'equals')).toEqual('value,equals'); }); }); diff --git a/src/app/shared/search/search.utils.ts b/src/app/shared/search/search.utils.ts index 4d688d48eb..cfb96a5285 100644 --- a/src/app/shared/search/search.utils.ts +++ b/src/app/shared/search/search.utils.ts @@ -49,7 +49,7 @@ export function stripOperatorFromFilterValue(value: string) { * @param operator */ export function addOperatorToFilterValue(value: string, operator: string) { - if (!value.endsWith(`,${operator}`)) { + if (!value.match(new RegExp(`^.+,(equals|query|authority)$`))) { return `${value},${operator}`; } return value;