Skip to content

Commit 6297173

Browse files
Mattia VianelliFrancescoMolinaro
authored andcommitted
Merged in task/dspace-cris-2025_02_x/DSC-2624 (pull request DSpace#4218)
Task/dspace cris 2025 02 x/DSC-2624 Approved-by: Francesco Molinaro
2 parents 2f17784 + 50c11ce commit 6297173

File tree

4 files changed

+59
-18
lines changed

4 files changed

+59
-18
lines changed

src/app/shared/search/search-results/search-results.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<div class="d-flex justify-content-between">
1414
@if (!disableHeader) {
15-
<h1>{{ (configuration ? configuration + '.search.results.head' : 'search.results.head') | translate }}</h1>
15+
<h1>{{ ((configuration$ | async) ? (configuration$ | async) + '.search.results.head' : 'search.results.head') | translate }}</h1>
1616
}
1717
@if (showCsvExport) {
1818
<ds-search-export-csv [searchConfig]="searchConfig" [total]="searchResults?.payload?.totalElements"></ds-search-export-csv>

src/app/shared/search/search-results/search-results.component.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ export class SearchResultsComponent {
7878
*/
7979
activeFilters$: Observable<SearchFilter[]>;
8080

81+
filters$: Observable<SearchFilter[]>;
82+
8183
/**
8284
* Filter applied to show labels, once populated the activeFilters$ will be loaded
8385
*/
@@ -200,12 +202,16 @@ export class SearchResultsComponent {
200202
*/
201203
@Input() customData: any;
202204

205+
configuration$: Observable<string>;
206+
203207
constructor(
204208
protected searchConfigService: SearchConfigurationService,
205209
protected searchService: SearchService,
206210
) {
207211
this.activeFilters$ = this.searchConfigService.getCurrentFilters();
208212
this.appliedFilters$ = this.searchService.appliedFilters$;
213+
this.filters$ = this.searchConfigService.getCurrentFilters();
214+
this.configuration$ = this.searchConfigService.getCurrentConfiguration(this.configuration);
209215
}
210216

211217
/**

src/app/shared/search/search.component.spec.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,7 @@ const routeServiceStub = {
204204
getQueryParamsWithPrefix: () => {
205205
return of(null);
206206
},
207-
setParameter: (key: any, value: any) => {
208-
return;
209-
},
207+
setParameter: jasmine.createSpy('setParameter'),
210208
};
211209

212210
let searchConfigurationServiceStub;
@@ -318,6 +316,17 @@ describe('SearchComponent', () => {
318316
comp = null;
319317
});
320318

319+
it('should set the "configuration" and "fixedFilterQuery" parameters in the route service', () => {
320+
spyOn(routeServiceStub, 'setParameter');
321+
comp.configuration = 'test-configuration';
322+
comp.fixedFilterQuery = 'test-fixed-filter-query';
323+
324+
fixture.detectChanges();
325+
326+
expect(routeServiceStub.setParameter).toHaveBeenCalledWith('configuration', 'test-configuration');
327+
expect(routeServiceStub.setParameter).toHaveBeenCalledWith('fixedFilterQuery', 'test-fixed-filter-query');
328+
});
329+
321330
it('should init search parameters properly and call retrieveSearchResults', fakeAsync(() => {
322331
spyOn((comp as any), 'retrieveSearchResults').and.callThrough();
323332
fixture.detectChanges();

src/app/shared/search/search.component.ts

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ import {
2525
BehaviorSubject,
2626
combineLatest,
2727
Observable,
28+
of,
2829
Subscription,
2930
} from 'rxjs';
3031
import {
31-
debounceTime,
3232
distinctUntilChanged,
3333
filter,
3434
map,
@@ -512,9 +512,27 @@ export class SearchComponent implements OnDestroy, OnInit {
512512
this.searchLink = this.getSearchLink();
513513
this.currentContext$.next(this.context);
514514

515+
// Raw query param observable for configuration
516+
const configurationParam$: Observable<string> =
517+
this.routeService.getQueryParameterValue('configuration').pipe(distinctUntilChanged());
518+
519+
515520
// Determinate PaginatedSearchOptions and listen to any update on it
516-
const configuration$: Observable<string> = this.searchConfigService
521+
const configurationFromService$: Observable<string> = this.searchConfigService
517522
.getCurrentConfiguration(this.configuration).pipe(distinctUntilChanged());
523+
524+
// Effective configuration: param value OR input @Input() configuration OR 'default'
525+
const configuration$: Observable<string> = combineLatest([
526+
configurationParam$,
527+
configurationFromService$,
528+
of(this.configuration),
529+
]).pipe(
530+
map(([paramValue, serviceValue, inputValue]) =>
531+
hasValue(paramValue) ? paramValue : (hasValue(inputValue) ? inputValue : hasValue(serviceValue) ? serviceValue : 'default'),
532+
),
533+
distinctUntilChanged(),
534+
);
535+
518536
const searchSortOptions$: Observable<SortOptions[]> = combineLatest([configuration$, this.currentScope$]).pipe(
519537
switchMap(([configuration, scope]: [string, string]) => this.searchConfigService.getConfigurationSearchConfig(configuration, scope)),
520538
map((searchConfig: SearchConfig) => this.searchConfigService.getConfigurationSortOptions(searchConfig)),
@@ -528,25 +546,33 @@ export class SearchComponent implements OnDestroy, OnInit {
528546
distinctUntilChanged(),
529547
);
530548
const searchOptions$: Observable<PaginatedSearchOptions> = this.getSearchOptions().pipe(distinctUntilChanged());
549+
const queryFromQueryParam$: Observable<string> = this.routeService.getQueryParameterValue('query').pipe(distinctUntilChanged());
531550

532-
this.subs.push(combineLatest([configuration$, searchSortOptions$, searchOptions$, sortOption$, this.currentScope$]).pipe(
533-
filter(([configuration, searchSortOptions, searchOptions, sortOption, scope]: [string, SortOptions[], PaginatedSearchOptions, SortOptions, string]) => {
551+
this.subs.push(combineLatest([configuration$, searchSortOptions$, searchOptions$, sortOption$, this.currentScope$, queryFromQueryParam$]).pipe(
552+
filter(([configuration, searchSortOptions, searchOptions, sortOption, scope, queryFromQueryParam]: [string, SortOptions[], PaginatedSearchOptions, SortOptions, string, string]) => {
534553
// filter for search options related to instanced paginated id
535554
return searchOptions.pagination.id === this.paginationId;
536555
}),
537-
debounceTime(100),
538-
).subscribe(([configuration, searchSortOptions, searchOptions, sortOption, scope]: [string, SortOptions[], PaginatedSearchOptions, SortOptions, string]) => {
539-
// Build the PaginatedSearchOptions object
540-
const searchOptionsConfiguration = searchOptions.configuration || configuration;
541-
const combinedOptions = Object.assign({}, searchOptions,
542-
{
543-
configuration: searchOptionsConfiguration,
544-
sort: sortOption || searchOptions.sort,
545-
forcedEmbeddedKeys: this.forcedEmbeddedKeys.get(searchOptionsConfiguration) || this.forcedEmbeddedKeys.get('default'),
546-
});
556+
// debounceTime(100),
557+
).subscribe(([configuration, searchSortOptions, searchOptions, sortOption, scope, queryFromQueryParam]:
558+
[string, SortOptions[], PaginatedSearchOptions, SortOptions, string, string]) => {
559+
// Always apply the freshly resolved configuration (do NOT keep stale one)
560+
const combinedOptions = Object.assign({}, searchOptions, {
561+
configuration,
562+
sort: sortOption || searchOptions.sort,
563+
forcedEmbeddedKeys: this.forcedEmbeddedKeys.get(configuration) || this.forcedEmbeddedKeys.get('default'),
564+
});
547565
if (combinedOptions.query === '') {
548566
combinedOptions.query = this.query;
549567
}
568+
if (this.searchOptions$.value) {
569+
const currentOptions = this.searchOptions$.value;
570+
const query = currentOptions.query;
571+
if (isNotEmpty(query) && (isEmpty(combinedOptions.query) || isEmpty(queryFromQueryParam))) {
572+
combinedOptions.query = '';
573+
this.query = '';
574+
}
575+
}
550576
if (isEmpty(combinedOptions.scope)) {
551577
combinedOptions.scope = scope;
552578
}

0 commit comments

Comments
 (0)