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); + } +}