mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 01:54:15 +00:00
[CST-4009] default sort option configured with default sort order
This commit is contained in:
@@ -45,7 +45,7 @@ describe('MyDSpacePageComponent', () => {
|
|||||||
pagination.id = 'mydspace-results-pagination';
|
pagination.id = 'mydspace-results-pagination';
|
||||||
pagination.currentPage = 1;
|
pagination.currentPage = 1;
|
||||||
pagination.pageSize = 10;
|
pagination.pageSize = 10;
|
||||||
const sortOption = { name: 'score', metadata: null };
|
const sortOption = { name: 'score', sortOrder: 'DESC', metadata: null };
|
||||||
const sort: SortOptions = new SortOptions('score', SortDirection.DESC);
|
const sort: SortOptions = new SortOptions('score', SortDirection.DESC);
|
||||||
const mockResults = createSuccessfulRemoteDataObject$(['test', 'data']);
|
const mockResults = createSuccessfulRemoteDataObject$(['test', 'data']);
|
||||||
const searchServiceStub = jasmine.createSpyObj('SearchService', {
|
const searchServiceStub = jasmine.createSpyObj('SearchService', {
|
||||||
|
@@ -160,10 +160,10 @@ export class MyDSpacePageComponent implements OnInit {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const configuration$ = this.searchConfigService.getCurrentConfiguration('workspace');
|
const configuration$ = this.searchConfigService.getCurrentConfiguration('workspace');
|
||||||
|
const searchConfig$ = this.searchConfigService.getConfigurationSearchConfigObservable(configuration$, this.service);
|
||||||
|
|
||||||
this.sortOptions$ = this.searchConfigService.getConfigurationSortOptionsObservable(configuration$, this.service);
|
this.sortOptions$ = this.searchConfigService.getConfigurationSortOptionsObservable(searchConfig$);
|
||||||
|
this.searchConfigService.initializeSortOptionsFromConfiguration(searchConfig$);
|
||||||
this.searchConfigService.initializeSortOptionsFromConfiguration(this.sortOptions$);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -40,7 +40,7 @@ const pagination: PaginationComponentOptions = new PaginationComponentOptions();
|
|||||||
pagination.id = 'search-results-pagination';
|
pagination.id = 'search-results-pagination';
|
||||||
pagination.currentPage = 1;
|
pagination.currentPage = 1;
|
||||||
pagination.pageSize = 10;
|
pagination.pageSize = 10;
|
||||||
const sortOption = { name: 'score', metadata: null };
|
const sortOption = { name: 'score', sortOrder: 'DESC', metadata: null };
|
||||||
const sort: SortOptions = new SortOptions('score', SortDirection.DESC);
|
const sort: SortOptions = new SortOptions('score', SortDirection.DESC);
|
||||||
const mockResults = createSuccessfulRemoteDataObject$(['test', 'data']);
|
const mockResults = createSuccessfulRemoteDataObject$(['test', 'data']);
|
||||||
const searchServiceStub = jasmine.createSpyObj('SearchService', {
|
const searchServiceStub = jasmine.createSpyObj('SearchService', {
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import { ChangeDetectionStrategy, Component, Inject, Input, OnInit } from '@angular/core';
|
import { ChangeDetectionStrategy, Component, Inject, Input, OnInit } from '@angular/core';
|
||||||
import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs';
|
import { BehaviorSubject, Observable, Subscription } from 'rxjs';
|
||||||
import { map, startWith, switchMap, take, } from 'rxjs/operators';
|
import { startWith, switchMap } from 'rxjs/operators';
|
||||||
import { PaginatedList } from '../core/data/paginated-list.model';
|
import { PaginatedList } from '../core/data/paginated-list.model';
|
||||||
import { RemoteData } from '../core/data/remote-data';
|
import { RemoteData } from '../core/data/remote-data';
|
||||||
import { DSpaceObject } from '../core/shared/dspace-object.model';
|
import { DSpaceObject } from '../core/shared/dspace-object.model';
|
||||||
@@ -8,7 +8,7 @@ import { pushInOut } from '../shared/animations/push';
|
|||||||
import { HostWindowService } from '../shared/host-window.service';
|
import { HostWindowService } from '../shared/host-window.service';
|
||||||
import { SidebarService } from '../shared/sidebar/sidebar.service';
|
import { SidebarService } from '../shared/sidebar/sidebar.service';
|
||||||
import { hasValue, isEmpty } from '../shared/empty.util';
|
import { hasValue, isEmpty } from '../shared/empty.util';
|
||||||
import { getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload } from '../core/shared/operators';
|
import { getFirstSucceededRemoteData } from '../core/shared/operators';
|
||||||
import { RouteService } from '../core/services/route.service';
|
import { RouteService } from '../core/services/route.service';
|
||||||
import { SEARCH_CONFIG_SERVICE } from '../+my-dspace-page/my-dspace-page.component';
|
import { SEARCH_CONFIG_SERVICE } from '../+my-dspace-page/my-dspace-page.component';
|
||||||
import { PaginatedSearchOptions } from '../shared/search/paginated-search-options.model';
|
import { PaginatedSearchOptions } from '../shared/search/paginated-search-options.model';
|
||||||
@@ -139,9 +139,10 @@ export class SearchComponent implements OnInit {
|
|||||||
this.configuration$ = this.searchConfigService.getCurrentConfiguration('default');
|
this.configuration$ = this.searchConfigService.getCurrentConfiguration('default');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sortOptions$ = this.searchConfigService.getConfigurationSortOptionsObservable(this.configuration$, this.service);
|
const searchConfig$ = this.searchConfigService.getConfigurationSearchConfigObservable(this.configuration$, this.service);
|
||||||
|
|
||||||
this.searchConfigService.initializeSortOptionsFromConfiguration(this.sortOptions$);
|
this.sortOptions$ = this.searchConfigService.getConfigurationSortOptionsObservable(searchConfig$);
|
||||||
|
this.searchConfigService.initializeSortOptionsFromConfiguration(searchConfig$);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -21,7 +21,7 @@ import { RouteService } from '../../services/route.service';
|
|||||||
import { getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload } from '../operators';
|
import { getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload } from '../operators';
|
||||||
import { hasNoValue, hasValue, isNotEmpty, isNotEmptyOperator } from '../../../shared/empty.util';
|
import { hasNoValue, hasValue, isNotEmpty, isNotEmptyOperator } from '../../../shared/empty.util';
|
||||||
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
|
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
|
||||||
import { SearchConfig, SortOption } from './search-filters/search-config.model';
|
import { SearchConfig } from './search-filters/search-config.model';
|
||||||
import { SearchService } from './search.service';
|
import { SearchService } from './search.service';
|
||||||
import { of } from 'rxjs/internal/observable/of';
|
import { of } from 'rxjs/internal/observable/of';
|
||||||
import { PaginationService } from '../../pagination/pagination.service';
|
import { PaginationService } from '../../pagination/pagination.service';
|
||||||
@@ -205,40 +205,33 @@ export class SearchConfigurationService implements OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an observable of SortOptions[] every time the configuration$ stream emits.
|
* Creates an observable of SearchConfig every time the configuration$ stream emits.
|
||||||
* @param configuration$
|
* @param configuration$
|
||||||
* @param service
|
* @param service
|
||||||
*/
|
*/
|
||||||
getConfigurationSortOptionsObservable(configuration$: Observable<string>, service: SearchService): Observable<SortOptions[]> {
|
getConfigurationSearchConfigObservable(configuration$: Observable<string>, service: SearchService): Observable<SearchConfig> {
|
||||||
return configuration$.pipe(
|
return configuration$.pipe(
|
||||||
distinctUntilChanged(),
|
distinctUntilChanged(),
|
||||||
switchMap((configuration) => service.getSearchConfigurationFor(null, configuration)),
|
switchMap((configuration) => service.getSearchConfigurationFor(null, configuration)),
|
||||||
getFirstSucceededRemoteDataPayload(),
|
getFirstSucceededRemoteDataPayload());
|
||||||
map((searchConfig: SearchConfig) => {
|
|
||||||
const sortOptions = [];
|
|
||||||
searchConfig.sortOptions.forEach((sortOption: SortOption) => {
|
|
||||||
console.log(sortOption);
|
|
||||||
const firstOrder = (sortOption.sortOrder.toLowerCase() === SortDirection.ASC.toLowerCase()) ? SortDirection.ASC : SortDirection.DESC;
|
|
||||||
const secondOrder = (sortOption.sortOrder.toLowerCase() !== SortDirection.ASC.toLowerCase()) ? SortDirection.ASC : SortDirection.DESC;
|
|
||||||
sortOptions.push(new SortOptions(sortOption.name, firstOrder));
|
|
||||||
sortOptions.push(new SortOptions(sortOption.name, secondOrder));
|
|
||||||
});
|
|
||||||
return sortOptions;
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Every time sortOptions change (after a configuration change) it update the navigation with the default sort option
|
* Every time searchConfig change (after a configuration change) it update the navigation with the default sort option
|
||||||
* and emit the new paginateSearchOptions value.
|
* and emit the new paginateSearchOptions value.
|
||||||
* @param configuration$
|
* @param configuration$
|
||||||
* @param service
|
* @param service
|
||||||
*/
|
*/
|
||||||
initializeSortOptionsFromConfiguration(sortOptions$: Observable<SortOptions[]>) {
|
initializeSortOptionsFromConfiguration(searchConfig$: Observable<SearchConfig>) {
|
||||||
const subscription = sortOptions$.pipe(switchMap((sortOptions) => combineLatest([
|
const subscription = searchConfig$.pipe(switchMap((searchConfig) => combineLatest([
|
||||||
of(sortOptions),
|
of(searchConfig),
|
||||||
this.paginatedSearchOptions.pipe(take(1))
|
this.paginatedSearchOptions.pipe(take(1))
|
||||||
]))).subscribe(([sortOptions, searchOptions]) => {
|
]))).subscribe(([searchConfig, searchOptions]) => {
|
||||||
const updateValue = Object.assign(new PaginatedSearchOptions({}), searchOptions, { sort: sortOptions[0]});
|
const field = searchConfig.sortOptions[0].name;
|
||||||
|
const direction = searchConfig.sortOptions[0].sortOrder.toLowerCase() === SortDirection.ASC.toLowerCase() ? SortDirection.ASC : SortDirection.DESC;
|
||||||
|
const updateValue = Object.assign(new PaginatedSearchOptions({}), searchOptions, {
|
||||||
|
sort: new SortOptions(field, direction)
|
||||||
|
});
|
||||||
this.paginationService.updateRoute(this.paginationID,
|
this.paginationService.updateRoute(this.paginationID,
|
||||||
{
|
{
|
||||||
sortDirection: updateValue.sort.direction,
|
sortDirection: updateValue.sort.direction,
|
||||||
@@ -249,6 +242,22 @@ export class SearchConfigurationService implements OnDestroy {
|
|||||||
this.subs.push(subscription);
|
this.subs.push(subscription);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an observable of available SortOptions[] every time the searchConfig$ stream emits.
|
||||||
|
* @param searchConfig$
|
||||||
|
* @param service
|
||||||
|
*/
|
||||||
|
getConfigurationSortOptionsObservable(searchConfig$: Observable<SearchConfig>): Observable<SortOptions[]> {
|
||||||
|
return searchConfig$.pipe(map((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;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets up a subscription to all necessary parameters to make sure the searchOptions emits a new value every time they update
|
* 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
|
* @param {SearchOptions} defaults Default values for when no parameters are available
|
||||||
|
Reference in New Issue
Block a user