diff --git a/src/app/core/shared/search/search-configuration.service.ts b/src/app/core/shared/search/search-configuration.service.ts index 04ffaf8621..b128e457f7 100644 --- a/src/app/core/shared/search/search-configuration.service.ts +++ b/src/app/core/shared/search/search-configuration.service.ts @@ -56,6 +56,11 @@ import { getFirstSucceededRemoteData, } from '../operators'; import { ViewMode } from '../view-mode.model'; +import { SearchFilterConfig } from '../../../shared/search/models/search-filter-config.model'; +import { FacetConfigResponse } from '../../../shared/search/models/facet-config-response.model'; +import { addOperatorToFilterValue } from '../../../shared/search/search.utils'; +import { FilterConfig } from './search-filters/search-config.model'; +import { FilterType } from '../../../shared/search/models/filter-type.model'; import { SearchConfig, SortConfig, @@ -282,6 +287,21 @@ export class SearchConfigurationService implements OnDestroy { })); } + /** + * Return the {@link FilterConfig}s of the filters that should be displayed for the current configuration/scope + * + * @param configuration The search configuration + * @param scope The scope if exists + */ + public getConfigurationAdvancedSearchFilters(configuration: string, scope?: string): Observable { + return this.getConfigurationSearchConfig(configuration, scope).pipe( + map((searchConfiguration: SearchConfig) => { + return searchConfiguration.filters + .filter((filterConfig: FilterConfig) => filterConfig.type !== FilterType.range); + }), + ); + } + setPaginationId(paginationId): void { if (isNotEmpty(paginationId)) { const currentValue: PaginatedSearchOptions = this.paginatedSearchOptions.getValue(); diff --git a/src/app/shared/search/advanced-search/advanced-search.component.ts b/src/app/shared/search/advanced-search/advanced-search.component.ts index 92e43983c0..2c215883c9 100644 --- a/src/app/shared/search/advanced-search/advanced-search.component.ts +++ b/src/app/shared/search/advanced-search/advanced-search.component.ts @@ -17,7 +17,6 @@ import { } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { - map, Observable, of as observableOf, Subscription, @@ -31,10 +30,7 @@ import { import { SearchService } from '../../../core/shared/search/search.service'; import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; import { SearchFilterService } from '../../../core/shared/search/search-filter.service'; -import { - FilterConfig, - SearchConfig, -} from '../../../core/shared/search/search-filters/search-config.model'; +import { FilterConfig } from '../../../core/shared/search/search-filters/search-config.model'; import { hasValue, isNotEmpty, @@ -44,6 +40,9 @@ import { InputSuggestion } from '../../input-suggestions/input-suggestions.model import { FilterType } from '../models/filter-type.model'; import { SearchFilterConfig } from '../models/search-filter-config.model'; +/** + * This component represents the advanced search in the search sidebar. + */ @Component({ selector: 'ds-advanced-search', templateUrl: './advanced-search.component.html', @@ -60,10 +59,21 @@ import { SearchFilterConfig } from '../models/search-filter-config.model'; }) export class AdvancedSearchComponent implements OnInit, OnDestroy { + /** + * The current search configuration + */ @Input() configuration: string; + /** + * The facet configurations, used to determine if suggestions should be retrieved for the selected search filter + */ @Input() filtersConfig: SearchFilterConfig[]; + /** + * The current search scope + */ + @Input() scope: string; + advancedFilters$: Observable; advancedFilterMap: Map = new Map(); @@ -94,13 +104,7 @@ export class AdvancedSearchComponent implements OnInit, OnDestroy { } ngOnInit(): void { - this.advancedFilters$ = this.searchConfigurationService.getConfigurationSearchConfig(this.configuration).pipe( - map((searchConfiguration: SearchConfig) => { - return searchConfiguration.filters - .filter((filter: FilterConfig) => this.appConfig.search.advancedFilters.filter.includes(filter.filter)) - .filter((filter: FilterConfig) => filter.type !== FilterType.range); - }), - ); + this.advancedFilters$ = this.searchConfigurationService.getConfigurationAdvancedSearchFilters(this.configuration, this.scope); this.subs.push(this.advancedFilters$.subscribe((filters: FilterConfig[]) => { const filterMap: Map = new Map(); if (filters.length > 0) { diff --git a/src/app/shared/search/search-sidebar/search-sidebar.component.html b/src/app/shared/search/search-sidebar/search-sidebar.component.html index 9d6b4c4f95..43fdc99391 100644 --- a/src/app/shared/search/search-sidebar/search-sidebar.component.html +++ b/src/app/shared/search/search-sidebar/search-sidebar.component.html @@ -24,9 +24,10 @@ [refreshFilters]="refreshFilters" [inPlaceSearch]="inPlaceSearch"> - + [filtersConfig]="(filters | async)?.payload" + [scope]="currentScope"> { let comp: SearchSidebarComponent; let fixture: ComponentFixture; - // waitForAsync beforeEach + + let searchConfigurationService: SearchConfigurationServiceStub; + beforeEach(waitForAsync(() => { + searchConfigurationService = new SearchConfigurationServiceStub(); + TestBed.configureTestingModule({ imports: [ TranslateModule.forRoot(), diff --git a/src/app/shared/search/search-sidebar/search-sidebar.component.ts b/src/app/shared/search/search-sidebar/search-sidebar.component.ts index 1da7bd6a6e..d6cbc82ce2 100644 --- a/src/app/shared/search/search-sidebar/search-sidebar.component.ts +++ b/src/app/shared/search/search-sidebar/search-sidebar.component.ts @@ -7,6 +7,7 @@ import { EventEmitter, Inject, Input, + OnInit, Output, } from '@angular/core'; import { TranslateModule } from '@ngx-translate/core'; @@ -14,6 +15,7 @@ import { BehaviorSubject, Observable, } from 'rxjs'; +import { map } from 'rxjs/operators'; import { APP_CONFIG, @@ -21,6 +23,8 @@ import { } from '../../../../config/app-config.interface'; import { SortOptions } from '../../../core/cache/models/sort-options.model'; import { RemoteData } from '../../../core/data/remote-data'; +import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; +import { FilterConfig } from '../../../core/shared/search/search-filters/search-config.model'; import { ViewMode } from '../../../core/shared/view-mode.model'; import { ViewModeSwitchComponent } from '../../view-mode-switch/view-mode-switch.component'; import { AdvancedSearchComponent } from '../advanced-search/advanced-search.component'; @@ -48,7 +52,7 @@ import { SearchSwitchConfigurationComponent } from '../search-switch-configurati /** * Component representing the sidebar on the search page */ -export class SearchSidebarComponent { +export class SearchSidebarComponent implements OnInit { /** * The configuration to use for the search options @@ -125,9 +129,18 @@ export class SearchSidebarComponent { */ @Output() changeViewMode: EventEmitter = new EventEmitter(); + showAdvancedSearch$: Observable; + constructor( @Inject(APP_CONFIG) protected appConfig: AppConfig, + protected searchConfigurationService: SearchConfigurationService, ) { } + ngOnInit(): void { + this.showAdvancedSearch$ = this.searchConfigurationService.getConfigurationAdvancedSearchFilters(this.configuration, this.currentScope).pipe( + map((advancedFilters: FilterConfig[]) => this.appConfig.search.advancedFilters.enabled && advancedFilters.length > 0), + ); + } + } diff --git a/src/app/shared/testing/search-configuration-service.stub.ts b/src/app/shared/testing/search-configuration-service.stub.ts index 10bc62c870..f4e6c64a70 100644 --- a/src/app/shared/testing/search-configuration-service.stub.ts +++ b/src/app/shared/testing/search-configuration-service.stub.ts @@ -5,8 +5,14 @@ import { of as observableOf, } from 'rxjs'; -import { SearchConfig } from '../../core/shared/search/search-filters/search-config.model'; +import { + FilterConfig, + SearchConfig, +} from '../../core/shared/search/search-filters/search-config.model'; +/** + * Stub class of {@link SearchConfigurationService} + */ export class SearchConfigurationServiceStub { public paginationID = 'test-id'; @@ -30,6 +36,10 @@ export class SearchConfigurationServiceStub { return observableOf(a); } + getConfigurationAdvancedSearchFilters(_configuration: string, _scope?: string): Observable { + return observableOf([]); + } + getConfig () { return observableOf({ hasSucceeded: true, payload: [] }); }