111731: Used yml config to configure the visibility advanced search component & its filters

This commit is contained in:
Alexandre Vryghem
2024-05-02 21:59:10 +02:00
parent e251c2c341
commit 561ccc398e
9 changed files with 54 additions and 65 deletions

View File

@@ -5,6 +5,8 @@ import {
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { APP_CONFIG } from '../../../../config/app-config.interface';
import { environment } from '../../../../environments/environment.test';
import { SearchService } from '../../../core/shared/search/search.service'; import { SearchService } from '../../../core/shared/search/search.service';
import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service';
import { SearchFilterService } from '../../../core/shared/search/search-filter.service'; import { SearchFilterService } from '../../../core/shared/search/search-filter.service';
@@ -39,6 +41,7 @@ describe('AdvancedSearchComponent', () => {
{ provide: SearchService, useValue: searchService }, { provide: SearchService, useValue: searchService },
{ provide: SearchConfigurationService, useValue: searchConfigurationService }, { provide: SearchConfigurationService, useValue: searchConfigurationService },
{ provide: SearchFilterService, useValue: searchFilterService }, { provide: SearchFilterService, useValue: searchFilterService },
{ provide: APP_CONFIG, useValue: environment },
], ],
}).compileComponents(); }).compileComponents();

View File

@@ -5,6 +5,7 @@ import {
} from '@angular/common'; } from '@angular/common';
import { import {
Component, Component,
Inject,
Input, Input,
OnDestroy, OnDestroy,
OnInit, OnInit,
@@ -23,6 +24,10 @@ import {
} from 'rxjs'; } from 'rxjs';
import { take } from 'rxjs/operators'; import { take } from 'rxjs/operators';
import {
APP_CONFIG,
AppConfig,
} from '../../../../config/app-config.interface';
import { SearchService } from '../../../core/shared/search/search.service'; import { SearchService } from '../../../core/shared/search/search.service';
import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service';
import { SearchFilterService } from '../../../core/shared/search/search-filter.service'; import { SearchFilterService } from '../../../core/shared/search/search-filter.service';
@@ -84,12 +89,17 @@ export class AdvancedSearchComponent implements OnInit, OnDestroy {
protected searchService: SearchService, protected searchService: SearchService,
protected searchConfigurationService: SearchConfigurationService, protected searchConfigurationService: SearchConfigurationService,
protected searchFilterService: SearchFilterService, protected searchFilterService: SearchFilterService,
@Inject(APP_CONFIG) protected appConfig: AppConfig,
) { ) {
} }
ngOnInit(): void { ngOnInit(): void {
this.advancedFilters$ = this.searchConfigurationService.getConfigurationSearchConfig(this.configuration).pipe( this.advancedFilters$ = this.searchConfigurationService.getConfigurationSearchConfig(this.configuration).pipe(
map((searchConfiguration: SearchConfig) => searchConfiguration.filters.filter((filter: FilterConfig) => filter.type !== FilterType.range)), 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.subs.push(this.advancedFilters$.subscribe((filters: FilterConfig[]) => { this.subs.push(this.advancedFilters$.subscribe((filters: FilterConfig[]) => {
const filterMap: Map<string, FilterConfig> = new Map(); const filterMap: Map<string, FilterConfig> = new Map();

View File

@@ -1,6 +1,6 @@
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA,
} from '@angular/core'; } from '@angular/core';
import { import {
ComponentFixture, ComponentFixture,
@@ -8,48 +8,41 @@ import {
waitForAsync, waitForAsync,
} from '@angular/core/testing'; } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { RouterTestingModule } from '@angular/router/testing'; import { RouterModule } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { APP_CONFIG } from 'src/config/app-config.interface';
import { environment } from 'src/environments/environment';
import { SearchService } from '../../../core/shared/search/search.service'; import { SearchService } from '../../../core/shared/search/search.service';
import { SearchFilterService } from '../../../core/shared/search/search-filter.service'; import { SearchFilterService } from '../../../core/shared/search/search-filter.service';
import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-configuration.service'; import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-configuration.service';
import { SearchConfigurationServiceStub } from '../../testing/search-configuration-service.stub'; import { SearchConfigurationServiceStub } from '../../testing/search-configuration-service.stub';
import { SearchFilterServiceStub } from '../../testing/search-filter-service.stub';
import { SearchServiceStub } from '../../testing/search-service.stub';
import { SearchFiltersComponent } from './search-filters.component'; import { SearchFiltersComponent } from './search-filters.component';
describe('SearchFiltersComponent', () => { describe('SearchFiltersComponent', () => {
let comp: SearchFiltersComponent; let comp: SearchFiltersComponent;
let fixture: ComponentFixture<SearchFiltersComponent>; let fixture: ComponentFixture<SearchFiltersComponent>;
let searchService: SearchService;
const searchServiceStub = { let searchService: SearchServiceStub;
/* eslint-disable no-empty,@typescript-eslint/no-empty-function */ let searchFilters: SearchFilterServiceStub;
getClearFiltersQueryParams: () => {
},
getSearchLink: () => {
},
getConfigurationSearchConfig: () => { },
/* eslint-enable no-empty, @typescript-eslint/no-empty-function */
};
const searchFiltersStub = {
getSelectedValuesForFilter: (filter) =>
[],
};
beforeEach(waitForAsync(() => { beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({ searchService = new SearchServiceStub();
imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([]), NoopAnimationsModule, SearchFiltersComponent], searchFilters = new SearchFilterServiceStub();
providers: [
{ provide: SearchService, useValue: searchServiceStub },
{ provide: SEARCH_CONFIG_SERVICE, useValue: new SearchConfigurationServiceStub() },
{ provide: SearchFilterService, useValue: searchFiltersStub },
{ provide: APP_CONFIG, useValue: environment },
TestBed.configureTestingModule({
imports: [
TranslateModule.forRoot(),
RouterModule.forRoot([]),
NoopAnimationsModule,
SearchFiltersComponent,
], ],
schemas: [NO_ERRORS_SCHEMA], providers: [
{ provide: SearchService, useValue: searchService },
{ provide: SEARCH_CONFIG_SERVICE, useValue: new SearchConfigurationServiceStub() },
{ provide: SearchFilterService, useValue: searchFilters },
],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
}).overrideComponent(SearchFiltersComponent, { }).overrideComponent(SearchFiltersComponent, {
set: { changeDetection: ChangeDetectionStrategy.Default }, set: { changeDetection: ChangeDetectionStrategy.Default },
}).compileComponents(); }).compileComponents();
@@ -59,13 +52,12 @@ describe('SearchFiltersComponent', () => {
fixture = TestBed.createComponent(SearchFiltersComponent); fixture = TestBed.createComponent(SearchFiltersComponent);
comp = fixture.componentInstance; // SearchFiltersComponent test instance comp = fixture.componentInstance; // SearchFiltersComponent test instance
fixture.detectChanges(); fixture.detectChanges();
searchService = (comp as any).searchService;
}); });
describe('when the getSearchLink method is called', () => { describe('when the getSearchLink method is called', () => {
beforeEach(() => { beforeEach(() => {
spyOn(searchService, 'getSearchLink'); spyOn(searchService, 'getSearchLink');
(comp as any).getSearchLink(); comp.getSearchLink();
}); });
it('should call getSearchLink on the searchService', () => { it('should call getSearchLink on the searchService', () => {

View File

@@ -19,10 +19,6 @@ import {
Observable, Observable,
} from 'rxjs'; } from 'rxjs';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import {
APP_CONFIG,
AppConfig,
} from 'src/config/app-config.interface';
import { RemoteData } from '../../../core/data/remote-data'; import { RemoteData } from '../../../core/data/remote-data';
import { SearchService } from '../../../core/shared/search/search.service'; import { SearchService } from '../../../core/shared/search/search.service';
@@ -32,7 +28,6 @@ import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-configu
import { currentPath } from '../../utils/route.utils'; import { currentPath } from '../../utils/route.utils';
import { AdvancedSearchComponent } from '../advanced-search/advanced-search.component'; import { AdvancedSearchComponent } from '../advanced-search/advanced-search.component';
import { AppliedFilter } from '../models/applied-filter.model'; import { AppliedFilter } from '../models/applied-filter.model';
import { PaginatedSearchOptions } from '../models/paginated-search-options.model';
import { SearchFilterConfig } from '../models/search-filter-config.model'; import { SearchFilterConfig } from '../models/search-filter-config.model';
import { SearchFilterComponent } from './search-filter/search-filter.component'; import { SearchFilterComponent } from './search-filter/search-filter.component';
@@ -52,7 +47,7 @@ export class SearchFiltersComponent implements OnInit {
* An observable containing configuration about which filters are shown and how they are shown * An observable containing configuration about which filters are shown and how they are shown
*/ */
@Input() filters: Observable<RemoteData<SearchFilterConfig[]>>; @Input() filters: Observable<RemoteData<SearchFilterConfig[]>>;
@Input() searchOptions: PaginatedSearchOptions;
/** /**
* List of all filters that are currently active with their value set to null. * List of all filters that are currently active with their value set to null.
* Used to reset all filters at once * Used to reset all filters at once
@@ -90,7 +85,6 @@ export class SearchFiltersComponent implements OnInit {
filterLabel = 'search'; filterLabel = 'search';
constructor( constructor(
@Inject(APP_CONFIG) protected appConfig: AppConfig,
protected searchService: SearchService, protected searchService: SearchService,
protected searchFilterService: SearchFilterService, protected searchFilterService: SearchFilterService,
protected router: Router, protected router: Router,

View File

@@ -4,7 +4,7 @@
[queryParams]="(removeParameters$ | async)" [queryParams]="(removeParameters$ | async)"
(click)="searchFilterService.minimizeAll()"> (click)="searchFilterService.minimizeAll()">
<span class="d-flex"> <span class="d-flex">
<span class="flex-grow-1 text-left">{{ ('search.filters.applied.f.' + appliedFilter.filter) | translate}}: {{'search.filters.' + appliedFilter.filter + '.' + appliedFilter.label | translate: { default: appliedFilter.label } }}</span> <span class="flex-grow-1 text-left">{{ ('search.filters.applied.f.' + appliedFilter.filter) | translate}}{{'search.filters.applied.operator.' + appliedFilter.operator | translate}}: {{'search.filters.' + appliedFilter.filter + '.' + appliedFilter.label | translate: { default: appliedFilter.label } }}</span>
<span class="pl-1" aria-hidden="true">×</span> <span class="pl-1" aria-hidden="true">×</span>
</span> </span>
</a> </a>

View File

@@ -24,7 +24,8 @@
[refreshFilters]="refreshFilters" [refreshFilters]="refreshFilters"
[inPlaceSearch]="inPlaceSearch"> [inPlaceSearch]="inPlaceSearch">
</ds-themed-search-filters> </ds-themed-search-filters>
<ds-advanced-search [configuration]="configuration" <ds-advanced-search *ngIf="appConfig.search.advancedFilters.enabled"
[configuration]="configuration"
[filtersConfig]="(filters | async)?.payload"> [filtersConfig]="(filters | async)?.payload">
</ds-advanced-search> </ds-advanced-search>
<ds-themed-search-settings *ngIf="inPlaceSearch" <ds-themed-search-settings *ngIf="inPlaceSearch"

View File

@@ -11,6 +11,8 @@ import { By } from '@angular/platform-browser';
import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { APP_CONFIG } from '../../../../config/app-config.interface';
import { environment } from '../../../../environments/environment.test';
import { AdvancedSearchComponent } from '../advanced-search/advanced-search.component'; import { AdvancedSearchComponent } from '../advanced-search/advanced-search.component';
import { ThemedSearchFiltersComponent } from '../search-filters/themed-search-filters.component'; import { ThemedSearchFiltersComponent } from '../search-filters/themed-search-filters.component';
import { ThemedSearchSettingsComponent } from '../search-settings/themed-search-settings.component'; import { ThemedSearchSettingsComponent } from '../search-settings/themed-search-settings.component';
@@ -27,6 +29,9 @@ describe('SearchSidebarComponent', () => {
NgbCollapseModule, NgbCollapseModule,
SearchSidebarComponent, SearchSidebarComponent,
], ],
providers: [
{ provide: APP_CONFIG, useValue: environment },
],
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
}) })
.overrideComponent(SearchSidebarComponent, { .overrideComponent(SearchSidebarComponent, {

View File

@@ -5,6 +5,7 @@ import {
import { import {
Component, Component,
EventEmitter, EventEmitter,
Inject,
Input, Input,
Output, Output,
} from '@angular/core'; } from '@angular/core';
@@ -14,6 +15,10 @@ import {
Observable, Observable,
} from 'rxjs'; } from 'rxjs';
import {
APP_CONFIG,
AppConfig,
} from '../../../../config/app-config.interface';
import { SortOptions } from '../../../core/cache/models/sort-options.model'; import { SortOptions } from '../../../core/cache/models/sort-options.model';
import { RemoteData } from '../../../core/data/remote-data'; import { RemoteData } from '../../../core/data/remote-data';
import { ViewMode } from '../../../core/shared/view-mode.model'; import { ViewMode } from '../../../core/shared/view-mode.model';
@@ -120,4 +125,9 @@ export class SearchSidebarComponent {
*/ */
@Output() changeViewMode: EventEmitter<ViewMode> = new EventEmitter<ViewMode>(); @Output() changeViewMode: EventEmitter<ViewMode> = new EventEmitter<ViewMode>();
constructor(
@Inject(APP_CONFIG) protected appConfig: AppConfig,
) {
}
} }

View File

@@ -6058,24 +6058,6 @@
"admin.notifications.publicationclaim.page.title": "Publication Claim", "admin.notifications.publicationclaim.page.title": "Publication Claim",
"filter.search.operator.placeholder": "Operator",
"search.filters.filter.entityType.text": "Item Type",
"search.filters.operator.equals.text": "Equals",
"search.filters.operator.notequals.text": "Not Equals",
"search.filters.operator.notcontains.text": "Not Contains",
"search.filters.operator.contains.text": "Contains",
"search.filters.filter.title.text": "Title",
"search.filters.applied.f.title": "Title",
"search.filters.filter.author.text": "Author",
"coar-notify-support.title": "COAR Notify Protocol", "coar-notify-support.title": "COAR Notify Protocol",
"coar-notify-support-title.content": "Here, we fully support the COAR Notify protocol, which is designed to enhance the communication between repositories. To learn more about the COAR Notify protocol, visit the <a href=\\\"https://notify.coar-repositories.org/\\\">COAR Notify website</a>.", "coar-notify-support-title.content": "Here, we fully support the COAR Notify protocol, which is designed to enhance the communication between repositories. To learn more about the COAR Notify protocol, visit the <a href=\\\"https://notify.coar-repositories.org/\\\">COAR Notify website</a>.",
@@ -6370,14 +6352,6 @@
"type-equals-journal-article_condition.label": "Type equals Journal Article", "type-equals-journal-article_condition.label": "Type equals Journal Article",
"search.filters.filter.subject.text": "Subject",
"search.advanced.filters.head": "Advanced Search",
"filter.search.text.placeholder": "Search text",
"advancesearch.form.submit": "Add",
"ldn.no-filter.label": "None", "ldn.no-filter.label": "None",
"admin.notify.dashboard": "Dashboard", "admin.notify.dashboard": "Dashboard",