Skip to content

Commit c45442e

Browse files
Mattia VianelliFrancescoMolinaro
authored andcommitted
Merged in task/dspace-cris-2024_02_x/DSC-2624 (pull request DSpace#4217)
Task/dspace cris 2024 02 x/DSC-2624 Approved-by: Francesco Molinaro
2 parents 276d4c2 + 17a81b5 commit c45442e

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
@@ -11,7 +11,7 @@
1111
}
1212

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

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

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

86+
filters$: Observable<SearchFilter[]>;
87+
8688
/**
8789
* Filter applied to show labels, once populated the activeFilters$ will be loaded
8890
*/
@@ -205,10 +207,14 @@ export class SearchResultsComponent {
205207
*/
206208
@Input() customData: any;
207209

210+
configuration$: Observable<string>;
211+
208212
constructor(
209213
protected searchConfigService: SearchConfigurationService,
210214
protected searchService: SearchService,
211215
) {
216+
this.filters$ = this.searchConfigService.getCurrentFilters();
217+
this.configuration$ = this.searchConfigService.getCurrentConfiguration(this.configuration);
212218
this.activeFilters$ = this.searchConfigService.getCurrentFilters();
213219
this.appliedFilters$ = this.searchService.appliedFilters$;
214220
}

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

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

213211
let searchConfigurationServiceStub;
@@ -319,6 +317,17 @@ describe('SearchComponent', () => {
319317
comp = null;
320318
});
321319

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

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

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ import {
2626
BehaviorSubject,
2727
combineLatest,
2828
Observable,
29+
of,
2930
Subscription,
3031
} from 'rxjs';
3132
import {
32-
debounceTime,
3333
distinctUntilChanged,
3434
filter,
3535
map,
@@ -515,9 +515,27 @@ export class SearchComponent implements OnDestroy, OnInit {
515515
this.searchLink = this.getSearchLink();
516516
this.currentContext$.next(this.context);
517517

518+
// Raw query param observable for configuration
519+
const configurationParam$: Observable<string> =
520+
this.routeService.getQueryParameterValue('configuration').pipe(distinctUntilChanged());
521+
522+
518523
// Determinate PaginatedSearchOptions and listen to any update on it
519-
const configuration$: Observable<string> = this.searchConfigService
524+
const configurationFromService$: Observable<string> = this.searchConfigService
520525
.getCurrentConfiguration(this.configuration).pipe(distinctUntilChanged());
526+
527+
// Effective configuration: param value OR input @Input() configuration OR 'default'
528+
const configuration$: Observable<string> = combineLatest([
529+
configurationParam$,
530+
configurationFromService$,
531+
of(this.configuration),
532+
]).pipe(
533+
map(([paramValue, serviceValue, inputValue]) =>
534+
hasValue(paramValue) ? paramValue : (hasValue(inputValue) ? inputValue : hasValue(serviceValue) ? serviceValue : 'default'),
535+
),
536+
distinctUntilChanged(),
537+
);
538+
521539
const searchSortOptions$: Observable<SortOptions[]> = combineLatest([configuration$, this.currentScope$]).pipe(
522540
switchMap(([configuration, scope]: [string, string]) => this.searchConfigService.getConfigurationSearchConfig(configuration, scope)),
523541
map((searchConfig: SearchConfig) => this.searchConfigService.getConfigurationSortOptions(searchConfig)),
@@ -531,25 +549,33 @@ export class SearchComponent implements OnDestroy, OnInit {
531549
distinctUntilChanged(),
532550
);
533551
const searchOptions$: Observable<PaginatedSearchOptions> = this.getSearchOptions().pipe(distinctUntilChanged());
552+
const queryFromQueryParam$: Observable<string> = this.routeService.getQueryParameterValue('query').pipe(distinctUntilChanged());
534553

535-
this.subs.push(combineLatest([configuration$, searchSortOptions$, searchOptions$, sortOption$, this.currentScope$]).pipe(
536-
filter(([configuration, searchSortOptions, searchOptions, sortOption, scope]: [string, SortOptions[], PaginatedSearchOptions, SortOptions, string]) => {
554+
this.subs.push(combineLatest([configuration$, searchSortOptions$, searchOptions$, sortOption$, this.currentScope$, queryFromQueryParam$]).pipe(
555+
filter(([configuration, searchSortOptions, searchOptions, sortOption, scope, queryFromQueryParam]: [string, SortOptions[], PaginatedSearchOptions, SortOptions, string, string]) => {
537556
// filter for search options related to instanced paginated id
538557
return searchOptions.pagination.id === this.paginationId;
539558
}),
540-
debounceTime(100),
541-
).subscribe(([configuration, searchSortOptions, searchOptions, sortOption, scope]: [string, SortOptions[], PaginatedSearchOptions, SortOptions, string]) => {
542-
// Build the PaginatedSearchOptions object
543-
const searchOptionsConfiguration = searchOptions.configuration || configuration;
544-
const combinedOptions = Object.assign({}, searchOptions,
545-
{
546-
configuration: searchOptionsConfiguration,
547-
sort: sortOption || searchOptions.sort,
548-
forcedEmbeddedKeys: this.forcedEmbeddedKeys.get(searchOptionsConfiguration) || this.forcedEmbeddedKeys.get('default'),
549-
});
559+
// debounceTime(100),
560+
).subscribe(([configuration, searchSortOptions, searchOptions, sortOption, scope, queryFromQueryParam]:
561+
[string, SortOptions[], PaginatedSearchOptions, SortOptions, string, string]) => {
562+
// Always apply the freshly resolved configuration (do NOT keep stale one)
563+
const combinedOptions = Object.assign({}, searchOptions, {
564+
configuration,
565+
sort: sortOption || searchOptions.sort,
566+
forcedEmbeddedKeys: this.forcedEmbeddedKeys.get(configuration) || this.forcedEmbeddedKeys.get('default'),
567+
});
550568
if (combinedOptions.query === '') {
551569
combinedOptions.query = this.query;
552570
}
571+
if (this.searchOptions$.value) {
572+
const currentOptions = this.searchOptions$.value;
573+
const query = currentOptions.query;
574+
if (isNotEmpty(query) && (isEmpty(combinedOptions.query) || isEmpty(queryFromQueryParam))) {
575+
combinedOptions.query = '';
576+
this.query = '';
577+
}
578+
}
553579
if (isEmpty(combinedOptions.scope)) {
554580
combinedOptions.scope = scope;
555581
}

0 commit comments

Comments
 (0)