diff --git a/resources/i18n/en.json b/resources/i18n/en.json
index 2239d605cc..812486d64c 100644
--- a/resources/i18n/en.json
+++ b/resources/i18n/en.json
@@ -81,6 +81,10 @@
},
"results": {
"title": "Search Results"
+ },
+ "view-switch": {
+ "show-list": "Show as list",
+ "show-grid": "Show as grid"
}
},
"loading": {
diff --git a/src/app/+search-page/search-options.model.ts b/src/app/+search-page/search-options.model.ts
index fd4a5accf6..7f93c3ace1 100644
--- a/src/app/+search-page/search-options.model.ts
+++ b/src/app/+search-page/search-options.model.ts
@@ -1,7 +1,13 @@
import { SortOptions } from '../core/cache/models/sort-options.model';
import { PaginationComponentOptions } from '../shared/pagination/pagination-component-options.model';
+export enum ViewMode {
+ List = 'list',
+ Grid = 'grid'
+}
+
export class SearchOptions {
pagination?: PaginationComponentOptions;
sort?: SortOptions;
+ view?: ViewMode = ViewMode.List;
}
diff --git a/src/app/+search-page/search-page.component.html b/src/app/+search-page/search-page.component.html
index d5e3a831eb..c651c8a329 100644
--- a/src/app/+search-page/search-page.component.html
+++ b/src/app/+search-page/search-page.component.html
@@ -5,5 +5,6 @@
[currentParams]="currentParams"
[scopes]="scopeList?.payload">
+
diff --git a/src/app/+search-page/search-page.component.ts b/src/app/+search-page/search-page.component.ts
index 639e966a9b..723753fb7a 100644
--- a/src/app/+search-page/search-page.component.ts
+++ b/src/app/+search-page/search-page.component.ts
@@ -6,6 +6,7 @@ import { SearchResult } from './search-result.model';
import { DSpaceObject } from '../core/shared/dspace-object.model';
import { SortOptions } from '../core/cache/models/sort-options.model';
import { PaginationComponentOptions } from '../shared/pagination/pagination-component-options.model';
+import { ViewModeSwitchComponent } from '../shared/view-mode-switch/view-mode-switch.component';
import { SearchOptions } from './search-options.model';
import { CommunityDataService } from '../core/data/community-data.service';
import { isNotEmpty } from '../shared/empty.util';
diff --git a/src/app/+search-page/search-service/search.service.ts b/src/app/+search-page/search-service/search.service.ts
index e2804960ef..5f3ef7ce22 100644
--- a/src/app/+search-page/search-service/search.service.ts
+++ b/src/app/+search-page/search-service/search.service.ts
@@ -13,6 +13,8 @@ import { ItemSearchResult } from '../../object-list/search-result-list-element/i
import { SearchFilterConfig } from './search-filter-config.model';
import { FilterType } from './filter-type.model';
import { FacetValue } from './facet-value.model';
+import { ViewMode } from '../../+search-page/search-options.model';
+import { Router, NavigationExtras } from '@angular/router';
function shuffle(array: any[]) {
let i = 0;
@@ -76,7 +78,9 @@ export class SearchService {
})
];
- constructor(private itemDataService: ItemDataService) {
+ constructor(
+ private itemDataService: ItemDataService,
+ private router: Router) {
}
@@ -192,4 +196,13 @@ export class SearchService {
Observable.of(values)
);
}
+
+ setViewMode(viewMode: ViewMode) {
+ const navigationExtras: NavigationExtras = {
+ queryParams: {view: viewMode},
+ queryParamsHandling: 'merge'
+ };
+
+ this.router.navigate(['/search'], navigationExtras);
+ }
}
diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts
index 99634543eb..5b6146b7a4 100644
--- a/src/app/shared/shared.module.ts
+++ b/src/app/shared/shared.module.ts
@@ -29,6 +29,7 @@ import { ThumbnailComponent } from '../thumbnail/thumbnail.component';
import { SearchResultListElementComponent } from '../object-list/search-result-list-element/search-result-list-element.component';
import { SearchFormComponent } from './search-form/search-form.component';
import { WrapperListElementComponent } from '../object-list/wrapper-list-element/wrapper-list-element.component';
+import { ViewModeSwitchComponent } from './view-mode-switch/view-mode-switch.component';
const MODULES = [
// Do NOT include UniversalModule, HttpModule, or JsonpModule here
@@ -61,7 +62,8 @@ const COMPONENTS = [
PaginationComponent,
SearchFormComponent,
ThumbnailComponent,
- WrapperListElementComponent
+ WrapperListElementComponent,
+ ViewModeSwitchComponent
];
const ENTRY_COMPONENTS = [
diff --git a/src/app/shared/view-mode-switch/view-mode-switch.component.html b/src/app/shared/view-mode-switch/view-mode-switch.component.html
new file mode 100644
index 0000000000..d399ff122c
--- /dev/null
+++ b/src/app/shared/view-mode-switch/view-mode-switch.component.html
@@ -0,0 +1,18 @@
+
\ No newline at end of file
diff --git a/src/app/shared/view-mode-switch/view-mode-switch.component.scss b/src/app/shared/view-mode-switch/view-mode-switch.component.scss
new file mode 100644
index 0000000000..ad84b72f8c
--- /dev/null
+++ b/src/app/shared/view-mode-switch/view-mode-switch.component.scss
@@ -0,0 +1 @@
+@import '../../../styles/variables.scss';
\ No newline at end of file
diff --git a/src/app/shared/view-mode-switch/view-mode-switch.component.ts b/src/app/shared/view-mode-switch/view-mode-switch.component.ts
new file mode 100644
index 0000000000..ab1585bb58
--- /dev/null
+++ b/src/app/shared/view-mode-switch/view-mode-switch.component.ts
@@ -0,0 +1,20 @@
+import { Component } from '@angular/core';
+import { ViewMode } from '../../+search-page/search-options.model';
+import { SearchService } from './../../+search-page/search-service/search.service';
+
+/**
+ * Component to switch between list and grid views.
+ */
+@Component({
+ selector: 'ds-view-mode-switch',
+ styleUrls: ['./view-mode-switch.component.scss'],
+ templateUrl: './view-mode-switch.component.html'
+})
+export class ViewModeSwitchComponent {
+ constructor(private searchService: SearchService) {
+ }
+
+ switchViewTo(viewMode: ViewMode) {
+ this.searchService.setViewMode(viewMode);
+ }
+}