From b9fa4795192e375253e27ba84a65482ea29e5cc7 Mon Sep 17 00:00:00 2001 From: Alexandre Vryghem Date: Fri, 12 Apr 2024 11:54:45 +0200 Subject: [PATCH] 111731: Created new advanced search component --- .../advanced-search.component.html | 14 ++++++ .../advanced-search.component.scss | 0 .../advanced-search.component.spec.ts | 36 ++++++++++++++ .../advanced-search.component.ts | 47 +++++++++++++++++++ .../search-sidebar.component.html | 2 + src/app/shared/search/search.module.ts | 2 + .../search-configuration-service.stub.ts | 5 ++ src/assets/i18n/en.json5 | 42 +++++++++++++++++ src/themes/dspace/styles/_global-styles.scss | 2 +- 9 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 src/app/shared/search/advanced-search/advanced-search.component.html create mode 100644 src/app/shared/search/advanced-search/advanced-search.component.scss create mode 100644 src/app/shared/search/advanced-search/advanced-search.component.spec.ts create mode 100644 src/app/shared/search/advanced-search/advanced-search.component.ts diff --git a/src/app/shared/search/advanced-search/advanced-search.component.html b/src/app/shared/search/advanced-search/advanced-search.component.html new file mode 100644 index 0000000000..d9633c7eda --- /dev/null +++ b/src/app/shared/search/advanced-search/advanced-search.component.html @@ -0,0 +1,14 @@ +

{{ 'search.sidebar.advanced-search.title' | translate }}

+ diff --git a/src/app/shared/search/advanced-search/advanced-search.component.scss b/src/app/shared/search/advanced-search/advanced-search.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/search/advanced-search/advanced-search.component.spec.ts b/src/app/shared/search/advanced-search/advanced-search.component.spec.ts new file mode 100644 index 0000000000..a8f4811d28 --- /dev/null +++ b/src/app/shared/search/advanced-search/advanced-search.component.spec.ts @@ -0,0 +1,36 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdvancedSearchComponent } from './advanced-search.component'; +import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; +import { SearchConfigurationServiceStub } from '../../testing/search-configuration-service.stub'; +import { TranslateModule } from '@ngx-translate/core'; + +describe('AdvancedSearchComponent', () => { + let component: AdvancedSearchComponent; + let fixture: ComponentFixture; + + let searchConfigurationService: SearchConfigurationServiceStub; + + beforeEach(async () => { + searchConfigurationService = new SearchConfigurationServiceStub(); + + await TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot(), + ], + declarations: [ + AdvancedSearchComponent, + ], + providers: [ + { provide: SearchConfigurationService, useValue: searchConfigurationService }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(AdvancedSearchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/search/advanced-search/advanced-search.component.ts b/src/app/shared/search/advanced-search/advanced-search.component.ts new file mode 100644 index 0000000000..6607cef6e4 --- /dev/null +++ b/src/app/shared/search/advanced-search/advanced-search.component.ts @@ -0,0 +1,47 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { map, Observable } from 'rxjs'; +import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; +import { FilterConfig, SearchConfig } from '../../../core/shared/search/search-filters/search-config.model'; + +@Component({ + selector: 'ds-advanced-search', + templateUrl: './advanced-search.component.html', + styleUrls: ['./advanced-search.component.scss'], +}) +export class AdvancedSearchComponent implements OnInit { + + @Input() configuration: string; + + advancedFilters$: Observable; + + advancedFilterMap$: Observable>; + + currentFilter: string; + + currentOperator: string; + + constructor( + protected searchConfigurationService: SearchConfigurationService, + ) { + } + + ngOnInit(): void { + this.advancedFilters$ = this.searchConfigurationService.getConfigurationSearchConfig(this.configuration).pipe( + map((searchConfiguration: SearchConfig) => searchConfiguration.filters), + ); + this.advancedFilterMap$ = this.advancedFilters$.pipe( + map((filters: FilterConfig[]) => { + const filterMap: Map = new Map(); + if (filters.length > 0) { + this.currentFilter = filters[0].filter; + this.currentOperator = filters[0].operators[0].operator; + for (const filter of filters) { + filterMap.set(filter.filter, filter); + } + } + return filterMap; + }), + ); + } + +} 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 c59617bafb..4a9c810a6f 100644 --- a/src/app/shared/search/search-sidebar/search-sidebar.component.html +++ b/src/app/shared/search/search-sidebar/search-sidebar.component.html @@ -24,6 +24,8 @@ [inPlaceSearch]="inPlaceSearch" (changeAppliedFilters)="changeAppliedFilters.emit($event)"> + + diff --git a/src/app/shared/search/search.module.ts b/src/app/shared/search/search.module.ts index 261d16774d..131c59bc5d 100644 --- a/src/app/shared/search/search.module.ts +++ b/src/app/shared/search/search.module.ts @@ -37,6 +37,7 @@ import { ThemedSearchSettingsComponent } from './search-settings/themed-search-s import { NouisliderModule } from 'ng2-nouislider'; import { ThemedSearchFiltersComponent } from './search-filters/themed-search-filters.component'; import { ThemedSearchSidebarComponent } from './search-sidebar/themed-search-sidebar.component'; +import { AdvancedSearchComponent } from './advanced-search/advanced-search.component'; const ENTRY_COMPONENTS = [ SearchFacetFilterComponent, @@ -66,6 +67,7 @@ const COMPONENTS = [ SearchFacetFilterWrapperComponent, SearchSwitchConfigurationComponent, ConfigurationSearchPageComponent, + AdvancedSearchComponent, ThemedConfigurationSearchPageComponent, ThemedSearchResultsComponent, ThemedSearchSettingsComponent, diff --git a/src/app/shared/testing/search-configuration-service.stub.ts b/src/app/shared/testing/search-configuration-service.stub.ts index fb72310417..fff5fff701 100644 --- a/src/app/shared/testing/search-configuration-service.stub.ts +++ b/src/app/shared/testing/search-configuration-service.stub.ts @@ -1,5 +1,6 @@ import { BehaviorSubject, of as observableOf, Observable } from 'rxjs'; import { Params } from '@angular/router'; +import { SearchConfig } from '../../core/shared/search/search-filters/search-config.model'; export class SearchConfigurationServiceStub { @@ -28,6 +29,10 @@ export class SearchConfigurationServiceStub { return observableOf({ hasSucceeded: true, payload: [] }); } + getConfigurationSearchConfig(_configuration: string, _scope?: string): Observable { + return observableOf(new SearchConfig()); + } + getAvailableConfigurationOptions() { return observableOf([{value: 'test', label: 'test'}]); } diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 6c91bae4c1..83feee8f83 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -3620,6 +3620,8 @@ "search.search-form.placeholder": "Search the repository ...", + "search.filters.applied.f.title": "Title", + "search.filters.applied.f.author": "Author", "search.filters.applied.f.dateIssued.max": "End date", @@ -3634,6 +3636,10 @@ "search.filters.applied.f.has_content_in_original_bundle": "Has files", + "search.filters.applied.f.original_bundle_filenames": "File name", + + "search.filters.applied.f.original_bundle_descriptions": "File description", + "search.filters.applied.f.itemtype": "Type", "search.filters.applied.f.namedresourcetype": "Status", @@ -3652,6 +3658,12 @@ "search.filters.applied.f.withdrawn": "Withdrawn", + "search.filters.filter.title.head": "Title", + + "search.filters.filter.title.placeholder": "Title", + + "search.filters.filter.title.label": "Search Title", + "search.filters.filter.author.head": "Author", "search.filters.filter.author.placeholder": "Author name", @@ -3720,6 +3732,18 @@ "search.filters.filter.has_content_in_original_bundle.head": "Has files", + "search.filters.filter.original_bundle_filenames.head": "File name", + + "search.filters.filter.original_bundle_filenames.placeholder": "File name", + + "search.filters.filter.original_bundle_filenames.label": "Search File name", + + "search.filters.filter.original_bundle_descriptions.head": "File description", + + "search.filters.filter.original_bundle_descriptions.placeholder": "File description", + + "search.filters.filter.original_bundle_descriptions.label": "Search File description", + "search.filters.filter.itemtype.head": "Type", "search.filters.filter.itemtype.placeholder": "Type", @@ -3822,6 +3846,20 @@ "search.filters.search.submit": "Submit", + "search.filters.operator.equals.text": "Equals", + + "search.filters.operator.notequals.text": "Not Equals", + + "search.filters.operator.authority.text": "Authority", + + "search.filters.operator.notauthority.text": "Not Authority", + + "search.filters.operator.contains.text": "Contains", + + "search.filters.operator.notcontains.text": "Not Contains", + + "search.filters.operator.query.text": "Query", + "search.form.search": "Search", "search.form.search_dspace": "All repository", @@ -3856,6 +3894,10 @@ "search.sidebar.settings.sort-by": "Sort By", + "search.sidebar.advanced-search.title": "Advanced Search", + + "search.sidebar.advanced-search.filter-by": "Filter by", + "search.sidebar.settings.title": "Settings", "search.view-switch.show-detail": "Show detail", diff --git a/src/themes/dspace/styles/_global-styles.scss b/src/themes/dspace/styles/_global-styles.scss index e41dae0e3f..5e3b95b5e3 100644 --- a/src/themes/dspace/styles/_global-styles.scss +++ b/src/themes/dspace/styles/_global-styles.scss @@ -3,7 +3,7 @@ // imports the base global style @import '../../../styles/_global-styles.scss'; -.facet-filter, .setting-option { +.facet-filter, .setting-option, .advanced-search { background-color: var(--bs-light); border-radius: var(--bs-border-radius);