diff --git a/src/app/search-page/search-page.component.html b/src/app/search-page/search-page.component.html
index 8d310607833..83ca9e536cc 100644
--- a/src/app/search-page/search-page.component.html
+++ b/src/app/search-page/search-page.component.html
@@ -1 +1 @@
-
+
diff --git a/src/app/search-page/search-page.component.ts b/src/app/search-page/search-page.component.ts
index d5df0ec65c6..615c1d6f857 100644
--- a/src/app/search-page/search-page.component.ts
+++ b/src/app/search-page/search-page.component.ts
@@ -1,5 +1,6 @@
import { Component } from '@angular/core';
+import { DSpaceObjectType } from '../core/shared/dspace-object-type.model';
import { SearchConfigurationService } from '../core/shared/search/search-configuration.service';
import { SEARCH_CONFIG_SERVICE } from '../my-dspace-page/my-dspace-configuration.service';
import { ThemedSearchComponent } from '../shared/search/themed-search.component';
@@ -22,4 +23,6 @@ import { ThemedSearchComponent } from '../shared/search/themed-search.component'
* It renders search results depending on the current search options
*/
export class SearchPageComponent {
+ /** Restrict the search page to items only (hides community/collection results); empty = all types. */
+ forcedDsoTypes: DSpaceObjectType[] = [DSpaceObjectType.ITEM];
}
diff --git a/src/app/shared/search/search.component.spec.ts b/src/app/shared/search/search.component.spec.ts
index 0a8d63f1ab7..c60a0c95c7a 100644
--- a/src/app/shared/search/search.component.spec.ts
+++ b/src/app/shared/search/search.component.spec.ts
@@ -39,6 +39,7 @@ import { CommunityDataService } from '../../core/data/community-data.service';
import { RemoteData } from '../../core/data/remote-data';
import { RouteService } from '../../core/services/route.service';
import { DSpaceObject } from '../../core/shared/dspace-object.model';
+import { DSpaceObjectType } from '../../core/shared/dspace-object-type.model';
import { Item } from '../../core/shared/item.model';
import { SearchService } from '../../core/shared/search/search.service';
import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service';
@@ -316,6 +317,16 @@ describe('SearchComponent', () => {
expect((comp as any).retrieveSearchResults).toHaveBeenCalledWith(expectedSearchOptions);
}));
+ it('should force the configured dsoTypes onto the search options when forcedDsoTypes is set', fakeAsync(() => {
+ const retrieveSpy = spyOn((comp as any), 'retrieveSearchResults').and.callThrough();
+ comp.forcedDsoTypes = [DSpaceObjectType.ITEM];
+ fixture.detectChanges();
+ tick(100);
+
+ const usedOptions = retrieveSpy.calls.mostRecent().args[0] as PaginatedSearchOptions;
+ expect(usedOptions.dsoTypes).toEqual([DSpaceObjectType.ITEM]);
+ }));
+
it('should retrieve SearchResults', fakeAsync(() => {
fixture.detectChanges();
tick(100);
diff --git a/src/app/shared/search/search.component.ts b/src/app/shared/search/search.component.ts
index 701ce463769..8efeb1c3201 100644
--- a/src/app/shared/search/search.component.ts
+++ b/src/app/shared/search/search.component.ts
@@ -47,6 +47,7 @@ import { RemoteData } from '../../core/data/remote-data';
import { RouteService } from '../../core/services/route.service';
import { Context } from '../../core/shared/context.model';
import { DSpaceObject } from '../../core/shared/dspace-object.model';
+import { DSpaceObjectType } from '../../core/shared/dspace-object-type.model';
import { Item } from '../../core/shared/item.model';
import { getFirstCompletedRemoteData } from '../../core/shared/operators';
import { SearchService } from '../../core/shared/search/search.service';
@@ -242,6 +243,9 @@ export class SearchComponent implements OnDestroy, OnInit {
*/
@Input() renderOnServerSide: boolean;
+ /** Restrict results to these DSpaceObject types (e.g. items only); empty = all types. */
+ @Input() forcedDsoTypes: DSpaceObjectType[] = [];
+
/**
* The current configuration used during the search
*/
@@ -431,6 +435,10 @@ export class SearchComponent implements OnDestroy, OnInit {
if (isEmpty(combinedOptions.scope)) {
combinedOptions.scope = scope;
}
+ // Force the configured result types (e.g. items only) when no explicit dsoTypes are set.
+ if (isNotEmpty(this.forcedDsoTypes) && isEmpty(combinedOptions.dsoTypes)) {
+ combinedOptions.dsoTypes = [...this.forcedDsoTypes];
+ }
const newSearchOptions = new PaginatedSearchOptions(combinedOptions);
// check if search options are changed
// if so retrieve new related results otherwise skip it
diff --git a/src/app/shared/search/themed-search.component.ts b/src/app/shared/search/themed-search.component.ts
index f60f8652f3c..f84f84c04f0 100644
--- a/src/app/shared/search/themed-search.component.ts
+++ b/src/app/shared/search/themed-search.component.ts
@@ -7,6 +7,7 @@ import {
import { Context } from '../../core/shared/context.model';
import { DSpaceObject } from '../../core/shared/dspace-object.model';
+import { DSpaceObjectType } from '../../core/shared/dspace-object-type.model';
import { ViewMode } from '../../core/shared/view-mode.model';
import { CollectionElementLinkType } from '../object-collection/collection-element-link.type';
import { ListableObject } from '../object-collection/shared/listable-object.model';
@@ -51,6 +52,7 @@ export class ThemedSearchComponent extends ThemedComponent {
'query',
'scope',
'hideScopeInUrl',
+ 'forcedDsoTypes',
'resultFound',
'deselectObject',
'selectObject',
@@ -106,6 +108,8 @@ export class ThemedSearchComponent extends ThemedComponent {
@Input() hideScopeInUrl: boolean;
+ @Input() forcedDsoTypes: DSpaceObjectType[];
+
@Output() resultFound: EventEmitter> = new EventEmitter();
@Output() deselectObject: EventEmitter = new EventEmitter();