diff --git a/src/app/shared/stores/global-search/global-search.state.spec.ts b/src/app/shared/stores/global-search/global-search.state.spec.ts index dd78a40d0..e204398a9 100644 --- a/src/app/shared/stores/global-search/global-search.state.spec.ts +++ b/src/app/shared/stores/global-search/global-search.state.spec.ts @@ -262,6 +262,40 @@ describe('GlobalSearchState', () => { const params = mockGetResources.mock.calls[0][0]; expect(params['cardSearchFilter[defaultKey][]']).toBe('default-value'); + expect(params['cardSearchFilter[defaultKey][any-of]']).toBeUndefined(); + }); + + it('should AND the default value with an any-of clause for an explicitly selected value', () => { + const { store, mockGetResources } = setup(); + + store.dispatch(new SetDefaultFilterValue('defaultKey', 'default-value')); + store.dispatch( + new UpdateSelectedFilterOption('defaultKey', [ + { label: 'A', value: 'selected-value', cardSearchResultCount: null }, + ]) + ); + store.dispatch(new FetchResources()); + + const params = mockGetResources.mock.calls[0][0]; + expect(params['cardSearchFilter[defaultKey][]']).toBe('default-value'); + expect(params['cardSearchFilter[defaultKey][any-of]']).toBe('selected-value'); + }); + + it('should OR multiple selected values together via a single any-of clause', () => { + const { store, mockGetResources } = setup(); + + store.dispatch(new SetDefaultFilterValue('defaultKey', 'default-value')); + store.dispatch( + new UpdateSelectedFilterOption('defaultKey', [ + { label: 'A', value: 'selected-value-1', cardSearchResultCount: null }, + { label: 'B', value: 'selected-value-2', cardSearchResultCount: null }, + ]) + ); + store.dispatch(new FetchResources()); + + const params = mockGetResources.mock.calls[0][0]; + expect(params['cardSearchFilter[defaultKey][]']).toBe('default-value'); + expect(params['cardSearchFilter[defaultKey][any-of]']).toBe('selected-value-1,selected-value-2'); }); }); }); diff --git a/src/app/shared/stores/global-search/global-search.state.ts b/src/app/shared/stores/global-search/global-search.state.ts index bc7bb2710..eb94222ea 100644 --- a/src/app/shared/stores/global-search/global-search.state.ts +++ b/src/app/shared/stores/global-search/global-search.state.ts @@ -327,7 +327,7 @@ export class GlobalSearchState { let hasCedarFilters = state.extraFilters.length > 0; Object.entries(state.selectedFilterOptions).forEach(([key, options]) => { - if (key in state.defaultFilterOptions) return; + if (key in state.defaultFilterOptions && options.length === 0) return; const filter = state.filters.find((f) => f.key === key) ?? state.extraFilters.find((f) => f.key === key); if (filter?.cedarPropertyIri) { @@ -344,7 +344,10 @@ export class GlobalSearchState { filtersParams[`cardSearchFilter[${key}][is-present]`] = firstOptionValue; } } else { - filtersParams[`cardSearchFilter[${key}][]`] = options.map((option) => option.value); + const selectedValues = options.map((option) => option.value); + if (selectedValues.length) { + filtersParams[`cardSearchFilter[${key}][any-of]`] = selectedValues.join(','); + } } } });