mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 01:54:15 +00:00
[CST-4009] fix sort options on pagination change
This commit is contained in:
@@ -31,6 +31,8 @@ import { SearchResult } from '../shared/search/search-result.model';
|
||||
import { Context } from '../core/shared/context.model';
|
||||
import { SortDirection, SortOptions } from '../core/cache/models/sort-options.model';
|
||||
import { SearchConfig } from '../core/shared/search/search-filters/search-config.model';
|
||||
import {RouteService} from '../core/services/route.service';
|
||||
import {Router} from '@angular/router';
|
||||
|
||||
export const MYDSPACE_ROUTE = '/mydspace';
|
||||
export const SEARCH_CONFIG_SERVICE: InjectionToken<SearchConfigurationService> = new InjectionToken<SearchConfigurationService>('searchConfigurationService');
|
||||
@@ -116,7 +118,9 @@ export class MyDSpacePageComponent implements OnInit {
|
||||
constructor(private service: SearchService,
|
||||
private sidebarService: SidebarService,
|
||||
private windowService: HostWindowService,
|
||||
@Inject(SEARCH_CONFIG_SERVICE) public searchConfigService: MyDSpaceConfigurationService) {
|
||||
@Inject(SEARCH_CONFIG_SERVICE) public searchConfigService: MyDSpaceConfigurationService,
|
||||
private routeService: RouteService,
|
||||
private router: Router) {
|
||||
this.isXsOrSm$ = this.windowService.isXsOrSm();
|
||||
this.service.setServiceOptions(MyDSpaceResponseParsingService, MyDSpaceRequest);
|
||||
}
|
||||
@@ -158,26 +162,11 @@ export class MyDSpacePageComponent implements OnInit {
|
||||
})
|
||||
);
|
||||
|
||||
this.sortOptions$ = this.context$.pipe(
|
||||
switchMap((context) => this.service.getSearchConfigurationFor(null, context)),
|
||||
getFirstSucceededRemoteDataPayload(),
|
||||
map((searchConfig: SearchConfig) => {
|
||||
const sortOptions = [];
|
||||
searchConfig.sortOptions.forEach(sortOption => {
|
||||
sortOptions.push(new SortOptions(sortOption.name, SortDirection.ASC));
|
||||
sortOptions.push(new SortOptions(sortOption.name, SortDirection.DESC));
|
||||
});
|
||||
return sortOptions;
|
||||
}));
|
||||
const configuration$ = this.routeService.getRouteParameterValue('configuration');
|
||||
|
||||
combineLatest([
|
||||
this.sortOptions$,
|
||||
this.searchConfigService.paginatedSearchOptions
|
||||
]).pipe(take(1))
|
||||
.subscribe(([sortOptions, searchOptions]) => {
|
||||
const updateValue = Object.assign(new PaginatedSearchOptions({}), searchOptions, { sort: sortOptions[0]});
|
||||
this.searchConfigService.paginatedSearchOptions.next(updateValue);
|
||||
});
|
||||
this.sortOptions$ = this.searchConfigService.getConfigurationSortOptionsObservable(configuration$, this.service);
|
||||
|
||||
this.searchConfigService.initializeSortOptionsFromConfiguration(this.sortOptions$, this.router);
|
||||
|
||||
}
|
||||
|
||||
|
@@ -18,8 +18,7 @@ import { SearchService } from '../core/shared/search/search.service';
|
||||
import { currentPath } from '../shared/utils/route.utils';
|
||||
import { Router} from '@angular/router';
|
||||
import { Context } from '../core/shared/context.model';
|
||||
import { SortDirection, SortOptions } from '../core/cache/models/sort-options.model';
|
||||
import { SearchConfig } from '../core/shared/search/search-filters/search-config.model';
|
||||
import { SortOptions } from '../core/cache/models/sort-options.model';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-search',
|
||||
@@ -140,28 +139,10 @@ export class SearchComponent implements OnInit {
|
||||
this.configuration$ = this.routeService.getRouteParameterValue('configuration');
|
||||
}
|
||||
|
||||
this.sortOptions$ = this.configuration$.pipe(
|
||||
switchMap((configuration) => this.service.getSearchConfigurationFor(null, configuration)),
|
||||
getFirstSucceededRemoteDataPayload(),
|
||||
map((searchConfig: SearchConfig) => {
|
||||
const sortOptions = [];
|
||||
searchConfig.sortOptions.forEach(sortOption => {
|
||||
sortOptions.push(new SortOptions(sortOption.name, SortDirection.ASC));
|
||||
sortOptions.push(new SortOptions(sortOption.name, SortDirection.DESC));
|
||||
});
|
||||
console.log(searchConfig, sortOptions);
|
||||
return sortOptions;
|
||||
}));
|
||||
this.sortOptions$ = this.searchConfigService.getConfigurationSortOptionsObservable(this.configuration$, this.service);
|
||||
|
||||
this.searchConfigService.initializeSortOptionsFromConfiguration(this.sortOptions$, this.router);
|
||||
|
||||
combineLatest([
|
||||
this.sortOptions$,
|
||||
this.searchConfigService.paginatedSearchOptions
|
||||
]).pipe(take(1))
|
||||
.subscribe(([sortOptions, searchOptions]) => {
|
||||
const updateValue = Object.assign(new PaginatedSearchOptions({}), searchOptions, { sort: sortOptions[0]});
|
||||
console.log(updateValue);
|
||||
this.searchConfigService.paginatedSearchOptions.next(updateValue);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -1,8 +1,15 @@
|
||||
import { Injectable, OnDestroy } from '@angular/core';
|
||||
import { ActivatedRoute, Params } from '@angular/router';
|
||||
import { ActivatedRoute, NavigationExtras, Params, Router } from '@angular/router';
|
||||
|
||||
import { BehaviorSubject, combineLatest as observableCombineLatest, merge as observableMerge, Observable, Subscription } from 'rxjs';
|
||||
import { filter, map, startWith } from 'rxjs/operators';
|
||||
import {
|
||||
BehaviorSubject,
|
||||
combineLatest,
|
||||
combineLatest as observableCombineLatest,
|
||||
merge as observableMerge,
|
||||
Observable,
|
||||
Subscription
|
||||
} from 'rxjs';
|
||||
import { distinctUntilChanged, filter, map, startWith, switchMap, take } from 'rxjs/operators';
|
||||
import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model';
|
||||
import { SearchOptions } from '../../../shared/search/search-options.model';
|
||||
import { PaginatedSearchOptions } from '../../../shared/search/paginated-search-options.model';
|
||||
@@ -11,9 +18,12 @@ import { RemoteData } from '../../data/remote-data';
|
||||
import { DSpaceObjectType } from '../dspace-object-type.model';
|
||||
import { SortDirection, SortOptions } from '../../cache/models/sort-options.model';
|
||||
import { RouteService } from '../../services/route.service';
|
||||
import { getFirstSucceededRemoteData } from '../operators';
|
||||
import { getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload } from '../operators';
|
||||
import { hasNoValue, hasValue, isNotEmpty, isNotEmptyOperator } from '../../../shared/empty.util';
|
||||
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
|
||||
import { SearchConfig } from './search-filters/search-config.model';
|
||||
import { SearchService } from './search.service';
|
||||
import { of } from 'rxjs/internal/observable/of';
|
||||
|
||||
/**
|
||||
* Service that performs all actions that have to do with the current search configuration
|
||||
@@ -209,6 +219,51 @@ export class SearchConfigurationService implements OnDestroy {
|
||||
return this.routeService.getQueryParamsWithPrefix('f.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an observable of SortOptions[] every time the configuration$ stream emits.
|
||||
* @param configuration$
|
||||
* @param service
|
||||
*/
|
||||
getConfigurationSortOptionsObservable(configuration$: Observable<string>, service: SearchService): Observable<SortOptions[]> {
|
||||
return configuration$.pipe(
|
||||
distinctUntilChanged(),
|
||||
switchMap((configuration) => service.getSearchConfigurationFor(null, configuration)),
|
||||
getFirstSucceededRemoteDataPayload(),
|
||||
map((searchConfig: SearchConfig) => {
|
||||
const sortOptions = [];
|
||||
searchConfig.sortOptions.forEach(sortOption => {
|
||||
sortOptions.push(new SortOptions(sortOption.name, SortDirection.ASC));
|
||||
sortOptions.push(new SortOptions(sortOption.name, SortDirection.DESC));
|
||||
});
|
||||
return sortOptions;
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* Every time sortOptions change (after a configuration change) it update the navigation with the default sort option
|
||||
* and emit the new paginateSearchOptions value.
|
||||
* @param configuration$
|
||||
* @param service
|
||||
*/
|
||||
initializeSortOptionsFromConfiguration(sortOptions$: Observable<SortOptions[]>, router: Router) {
|
||||
const subscription = sortOptions$.pipe(switchMap((sortOptions) => combineLatest([
|
||||
of(sortOptions),
|
||||
this.paginatedSearchOptions.pipe(take(1))
|
||||
]))).subscribe(([sortOptions, searchOptions]) => {
|
||||
const updateValue = Object.assign(new PaginatedSearchOptions({}), searchOptions, { sort: sortOptions[0]});
|
||||
const navigationExtras: NavigationExtras = {
|
||||
queryParams: {
|
||||
sortDirection: updateValue.sort.direction,
|
||||
sortField: updateValue.sort.field,
|
||||
},
|
||||
queryParamsHandling: 'merge'
|
||||
};
|
||||
router.navigate([], navigationExtras);
|
||||
this.paginatedSearchOptions.next(updateValue);
|
||||
});
|
||||
this.subs.push(subscription);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets up a subscription to all necessary parameters to make sure the searchOptions emits a new value every time they update
|
||||
* @param {SearchOptions} defaults Default values for when no parameters are available
|
||||
|
@@ -3045,6 +3045,10 @@
|
||||
|
||||
"sorting.dc.date.issued.DESC": "Date Issued Descending",
|
||||
|
||||
"sorting.dc.date.accessioned.ASC": "Accessioned Date Ascending",
|
||||
|
||||
"sorting.dc.date.accessioned.DESC": "Accessioned Date Descending",
|
||||
|
||||
|
||||
"statistics.title": "Statistics",
|
||||
|
||||
|
Reference in New Issue
Block a user