diff --git a/resources/i18n/en.json b/resources/i18n/en.json index 53ae9015f6..06671e0809 100644 --- a/resources/i18n/en.json +++ b/resources/i18n/en.json @@ -45,6 +45,38 @@ } } }, + "person": { + "page": { + "jobtitle": "Job Title", + "lastname": "Last Name", + "firstname": "First Name", + "email": "Email Address", + "orcid": "ORCID", + "birthdate": "Birth Date", + "staffid": "Staff ID", + "link": { + "full": "Show all metadata" + } + } + }, + "project": { + "page": { + "status": "Status", + "id": "ID", + "expectedcompletion": "Expected Completion", + "description": "Description", + "keywords": "Keywords" + } + }, + "orgunit": { + "page": { + "dateestablished": "Date established", + "city": "City", + "country": "Country", + "id": "ID", + "description": "Description" + } + }, "nav": { "home": "Home" }, diff --git a/resources/images/orgunit-placeholder.jpg b/resources/images/orgunit-placeholder.jpg new file mode 100644 index 0000000000..11564bc635 Binary files /dev/null and b/resources/images/orgunit-placeholder.jpg differ diff --git a/resources/images/person-placeholder.png b/resources/images/person-placeholder.png new file mode 100644 index 0000000000..eb6232e00f Binary files /dev/null and b/resources/images/person-placeholder.png differ diff --git a/resources/images/project-placeholder.png b/resources/images/project-placeholder.png new file mode 100644 index 0000000000..df75c8b2db Binary files /dev/null and b/resources/images/project-placeholder.png differ diff --git a/src/app/+item-page/item-page.module.ts b/src/app/+item-page/item-page.module.ts index bd801923e3..d903baf8f7 100644 --- a/src/app/+item-page/item-page.module.ts +++ b/src/app/+item-page/item-page.module.ts @@ -2,6 +2,7 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { SharedModule } from './../shared/shared.module'; +import { GenericItemPageFieldComponent } from './simple/field-components/specific-field/generic/generic-item-page-field.component'; import { ItemPageComponent } from './simple/item-page.component'; import { ItemPageRoutingModule } from './item-page-routing.module'; @@ -13,11 +14,16 @@ import { ItemPageDateFieldComponent } from './simple/field-components/specific-f import { ItemPageAbstractFieldComponent } from './simple/field-components/specific-field/abstract/item-page-abstract-field.component'; import { ItemPageUriFieldComponent } from './simple/field-components/specific-field/uri/item-page-uri-field.component'; import { ItemPageTitleFieldComponent } from './simple/field-components/specific-field/title/item-page-title-field.component'; -import { ItemPageSpecificFieldComponent } from './simple/field-components/specific-field/item-page-specific-field.component'; +import { ItemPageFieldComponent } from './simple/field-components/specific-field/item-page-field.component'; import { FileSectionComponent } from './simple/field-components/file-section/file-section.component'; import { CollectionsComponent } from './field-components/collections/collections.component'; import { FullItemPageComponent } from './full/full-item-page.component'; import { FullFileSectionComponent } from './full/field-components/file-section/full-file-section.component'; +import { ItemPageFieldsComponent } from './simple/relationship-types/item/item-page-fields.component'; +import { OrgUnitPageFieldsComponent } from './simple/relationship-types/orgunit/orgunit-page-fields.component'; +import { PersonPageFieldsComponent } from './simple/relationship-types/person/person-page-fields.component'; +import { ProjectPageFieldsComponent } from './simple/relationship-types/project/project-page-fields.component'; +import { RelationshipTypeSwitcherComponent } from './simple/relationship-types/switcher/relationship-type-switcher.component'; @NgModule({ imports: [ @@ -36,10 +42,22 @@ import { FullFileSectionComponent } from './full/field-components/file-section/f ItemPageAbstractFieldComponent, ItemPageUriFieldComponent, ItemPageTitleFieldComponent, - ItemPageSpecificFieldComponent, + ItemPageFieldComponent, FileSectionComponent, CollectionsComponent, - FullFileSectionComponent + FullFileSectionComponent, + RelationshipTypeSwitcherComponent, + ItemPageFieldsComponent, + ProjectPageFieldsComponent, + OrgUnitPageFieldsComponent, + PersonPageFieldsComponent, + GenericItemPageFieldComponent + ], + entryComponents: [ + ItemPageFieldsComponent, + ProjectPageFieldsComponent, + OrgUnitPageFieldsComponent, + PersonPageFieldsComponent ] }) export class ItemPageModule { diff --git a/src/app/+item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.ts b/src/app/+item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.ts index a8cc309ab6..d7d4c0af0e 100644 --- a/src/app/+item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.ts +++ b/src/app/+item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.ts @@ -1,13 +1,13 @@ import { Component, Input } from '@angular/core'; import { Item } from '../../../../../core/shared/item.model'; -import { ItemPageSpecificFieldComponent } from '../item-page-specific-field.component'; +import { ItemPageFieldComponent } from '../item-page-field.component'; @Component({ selector: 'ds-item-page-abstract-field', - templateUrl: './../item-page-specific-field.component.html' + templateUrl: '../item-page-field.component.html' }) -export class ItemPageAbstractFieldComponent extends ItemPageSpecificFieldComponent { +export class ItemPageAbstractFieldComponent extends ItemPageFieldComponent { @Input() item: Item; diff --git a/src/app/+item-page/simple/field-components/specific-field/author/item-page-author-field.component.ts b/src/app/+item-page/simple/field-components/specific-field/author/item-page-author-field.component.ts index e84a52d1b9..ac566c5e53 100644 --- a/src/app/+item-page/simple/field-components/specific-field/author/item-page-author-field.component.ts +++ b/src/app/+item-page/simple/field-components/specific-field/author/item-page-author-field.component.ts @@ -1,13 +1,13 @@ import { Component, Input } from '@angular/core'; import { Item } from '../../../../../core/shared/item.model'; -import { ItemPageSpecificFieldComponent } from '../item-page-specific-field.component'; +import { ItemPageFieldComponent } from '../item-page-field.component'; @Component({ selector: 'ds-item-page-author-field', - templateUrl: './../item-page-specific-field.component.html' + templateUrl: '../item-page-field.component.html' }) -export class ItemPageAuthorFieldComponent extends ItemPageSpecificFieldComponent { +export class ItemPageAuthorFieldComponent extends ItemPageFieldComponent { @Input() item: Item; diff --git a/src/app/+item-page/simple/field-components/specific-field/date/item-page-date-field.component.ts b/src/app/+item-page/simple/field-components/specific-field/date/item-page-date-field.component.ts index 6950944f87..b0f02bb718 100644 --- a/src/app/+item-page/simple/field-components/specific-field/date/item-page-date-field.component.ts +++ b/src/app/+item-page/simple/field-components/specific-field/date/item-page-date-field.component.ts @@ -1,13 +1,13 @@ import { Component, Input } from '@angular/core'; import { Item } from '../../../../../core/shared/item.model'; -import { ItemPageSpecificFieldComponent } from '../item-page-specific-field.component'; +import { ItemPageFieldComponent } from '../item-page-field.component'; @Component({ selector: 'ds-item-page-date-field', - templateUrl: './../item-page-specific-field.component.html' + templateUrl: '../item-page-field.component.html' }) -export class ItemPageDateFieldComponent extends ItemPageSpecificFieldComponent { +export class ItemPageDateFieldComponent extends ItemPageFieldComponent { @Input() item: Item; diff --git a/src/app/+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component.ts b/src/app/+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component.ts new file mode 100644 index 0000000000..fe1ecec57e --- /dev/null +++ b/src/app/+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component.ts @@ -0,0 +1,20 @@ +import { Component, Input } from '@angular/core'; + +import { Item } from '../../../../../core/shared/item.model'; +import { ItemPageFieldComponent } from '../item-page-field.component'; + +@Component({ + selector: 'ds-generic-item-page-field', + templateUrl: '../item-page-field.component.html' +}) +export class GenericItemPageFieldComponent extends ItemPageFieldComponent { + + @Input() item: Item; + + @Input() separator: string; + + @Input() fields: string[]; + + @Input() label: string; + +} diff --git a/src/app/+item-page/simple/field-components/specific-field/item-page-specific-field.component.html b/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.html similarity index 77% rename from src/app/+item-page/simple/field-components/specific-field/item-page-specific-field.component.html rename to src/app/+item-page/simple/field-components/specific-field/item-page-field.component.html index 4a27848ec6..bf74aca347 100644 --- a/src/app/+item-page/simple/field-components/specific-field/item-page-specific-field.component.html +++ b/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.html @@ -1,3 +1,3 @@ -
+
diff --git a/src/app/+item-page/simple/field-components/specific-field/item-page-specific-field.component.ts b/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.ts similarity index 86% rename from src/app/+item-page/simple/field-components/specific-field/item-page-specific-field.component.ts rename to src/app/+item-page/simple/field-components/specific-field/item-page-field.component.ts index f69671a5b5..525c898c0e 100644 --- a/src/app/+item-page/simple/field-components/specific-field/item-page-specific-field.component.ts +++ b/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.ts @@ -9,9 +9,9 @@ import { Item } from '../../../../core/shared/item.model'; */ @Component({ - templateUrl: './item-page-specific-field.component.html' + templateUrl: './item-page-field.component.html' }) -export class ItemPageSpecificFieldComponent { +export class ItemPageFieldComponent { @Input() item: Item; diff --git a/src/app/+item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts b/src/app/+item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts index be8102359a..3ec11c8e3d 100644 --- a/src/app/+item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts +++ b/src/app/+item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts @@ -1,13 +1,13 @@ import { Component, Input } from '@angular/core'; import { Item } from '../../../../../core/shared/item.model'; -import { ItemPageSpecificFieldComponent } from '../item-page-specific-field.component'; +import { ItemPageFieldComponent } from '../item-page-field.component'; @Component({ selector: 'ds-item-page-title-field', templateUrl: './item-page-title-field.component.html' }) -export class ItemPageTitleFieldComponent extends ItemPageSpecificFieldComponent { +export class ItemPageTitleFieldComponent extends ItemPageFieldComponent { @Input() item: Item; diff --git a/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.html b/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.html index fde79d6a04..fdd60d5f68 100644 --- a/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.html +++ b/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.html @@ -1,3 +1,3 @@ -
+
diff --git a/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.ts b/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.ts index 4f06337032..805fdc160f 100644 --- a/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.ts +++ b/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.ts @@ -1,13 +1,13 @@ import { Component, Input } from '@angular/core'; import { Item } from '../../../../../core/shared/item.model'; -import { ItemPageSpecificFieldComponent } from '../item-page-specific-field.component'; +import { ItemPageFieldComponent } from '../item-page-field.component'; @Component({ selector: 'ds-item-page-uri-field', templateUrl: './item-page-uri-field.component.html' }) -export class ItemPageUriFieldComponent extends ItemPageSpecificFieldComponent { +export class ItemPageUriFieldComponent extends ItemPageFieldComponent { @Input() item: Item; diff --git a/src/app/+item-page/simple/item-page.component.html b/src/app/+item-page/simple/item-page.component.html index 5f938364e2..a6dd4a47a1 100644 --- a/src/app/+item-page/simple/item-page.component.html +++ b/src/app/+item-page/simple/item-page.component.html @@ -1,27 +1,7 @@
- -
-
- - - - - - -
- -
+
diff --git a/src/app/+item-page/simple/item-page.component.ts b/src/app/+item-page/simple/item-page.component.ts index 58a056a5dd..fee7753c82 100644 --- a/src/app/+item-page/simple/item-page.component.ts +++ b/src/app/+item-page/simple/item-page.component.ts @@ -12,6 +12,7 @@ import { MetadataService } from '../../core/metadata/metadata.service'; import { fadeInOut } from '../../shared/animations/fade'; import { hasValue } from '../../shared/empty.util'; +import * as viewMode from '../../shared/view-mode'; /** * This component renders a simple item page. @@ -35,6 +36,8 @@ export class ItemPageComponent implements OnInit { thumbnailObs: Observable; + ElementViewMode = viewMode.ElementViewMode; + constructor( private route: ActivatedRoute, private items: ItemDataService, diff --git a/src/app/+item-page/simple/relationship-types/item/item-page-fields.component.html b/src/app/+item-page/simple/relationship-types/item/item-page-fields.component.html new file mode 100644 index 0000000000..6301bc1bc9 --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/item/item-page-fields.component.html @@ -0,0 +1,21 @@ + +
+
+ + + + + + +
+ +
diff --git a/src/app/+item-page/simple/relationship-types/item/item-page-fields.component.scss b/src/app/+item-page/simple/relationship-types/item/item-page-fields.component.scss new file mode 100644 index 0000000000..3575cae797 --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/item/item-page-fields.component.scss @@ -0,0 +1 @@ +@import '../../../../../styles/variables.scss'; diff --git a/src/app/+item-page/simple/relationship-types/item/item-page-fields.component.ts b/src/app/+item-page/simple/relationship-types/item/item-page-fields.component.ts new file mode 100644 index 0000000000..39333503cb --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/item/item-page-fields.component.ts @@ -0,0 +1,23 @@ +import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; +import { Item } from '../../../../core/shared/item.model'; +import { + DEFAULT_RELATIONSHIP_TYPE, + rendersRelationshipType +} from '../../../../shared/entities/relationship-type-decorator'; +import { ElementViewMode } from '../../../../shared/view-mode'; +import { ITEM } from '../switcher/relationship-type-switcher.component'; + +@rendersRelationshipType('Item', ElementViewMode.Full) +@rendersRelationshipType(DEFAULT_RELATIONSHIP_TYPE, ElementViewMode.Full) +@Component({ + selector: 'ds-item-page-fields', + styleUrls: ['./item-page-fields.component.scss'], + templateUrl: './item-page-fields.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ItemPageFieldsComponent { + + constructor(@Inject(ITEM) public item: Item) { + } + +} diff --git a/src/app/+item-page/simple/relationship-types/orgunit/orgunit-page-fields.component.html b/src/app/+item-page/simple/relationship-types/orgunit/orgunit-page-fields.component.html new file mode 100644 index 0000000000..6307bcc25f --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/orgunit/orgunit-page-fields.component.html @@ -0,0 +1,32 @@ +

+ +

+
+
+ + + + + + + + + + + +
+
+ + +
+
diff --git a/src/app/+item-page/simple/relationship-types/orgunit/orgunit-page-fields.component.scss b/src/app/+item-page/simple/relationship-types/orgunit/orgunit-page-fields.component.scss new file mode 100644 index 0000000000..3575cae797 --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/orgunit/orgunit-page-fields.component.scss @@ -0,0 +1 @@ +@import '../../../../../styles/variables.scss'; diff --git a/src/app/+item-page/simple/relationship-types/orgunit/orgunit-page-fields.component.ts b/src/app/+item-page/simple/relationship-types/orgunit/orgunit-page-fields.component.ts new file mode 100644 index 0000000000..d65b51ad7e --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/orgunit/orgunit-page-fields.component.ts @@ -0,0 +1,18 @@ +import { Component, Inject } from '@angular/core'; +import { Item } from '../../../../core/shared/item.model'; +import { rendersRelationshipType } from '../../../../shared/entities/relationship-type-decorator'; +import { ElementViewMode } from '../../../../shared/view-mode'; +import { ITEM } from '../switcher/relationship-type-switcher.component'; + +@rendersRelationshipType('OrgUnit', ElementViewMode.Full) +@Component({ + selector: 'ds-orgunit-page-fields', + styleUrls: ['./orgunit-page-fields.component.scss'], + templateUrl: './orgunit-page-fields.component.html' +}) +export class OrgUnitPageFieldsComponent { + + constructor(@Inject(ITEM) public item: Item) { + } + +} diff --git a/src/app/+item-page/simple/relationship-types/person/person-page-fields.component.html b/src/app/+item-page/simple/relationship-types/person/person-page-fields.component.html new file mode 100644 index 0000000000..4763670b94 --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/person/person-page-fields.component.html @@ -0,0 +1,40 @@ +

+ +

+
+
+ + + + + + + + + + + +
+
+ + + + + + +
+
diff --git a/src/app/+item-page/simple/relationship-types/person/person-page-fields.component.scss b/src/app/+item-page/simple/relationship-types/person/person-page-fields.component.scss new file mode 100644 index 0000000000..3575cae797 --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/person/person-page-fields.component.scss @@ -0,0 +1 @@ +@import '../../../../../styles/variables.scss'; diff --git a/src/app/+item-page/simple/relationship-types/person/person-page-fields.component.ts b/src/app/+item-page/simple/relationship-types/person/person-page-fields.component.ts new file mode 100644 index 0000000000..fc89cd8644 --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/person/person-page-fields.component.ts @@ -0,0 +1,18 @@ +import { Component, Inject } from '@angular/core'; +import { Item } from '../../../../core/shared/item.model'; +import { rendersRelationshipType } from '../../../../shared/entities/relationship-type-decorator'; +import { ElementViewMode } from '../../../../shared/view-mode'; +import { ITEM } from '../switcher/relationship-type-switcher.component'; + +@rendersRelationshipType('Person', ElementViewMode.Full) +@Component({ + selector: 'ds-person-page-fields', + styleUrls: ['./person-page-fields.component.scss'], + templateUrl: './person-page-fields.component.html' +}) +export class PersonPageFieldsComponent { + + constructor(@Inject(ITEM) public item: Item) { + } + +} diff --git a/src/app/+item-page/simple/relationship-types/project/project-page-fields.component.html b/src/app/+item-page/simple/relationship-types/project/project-page-fields.component.html new file mode 100644 index 0000000000..ccf342c867 --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/project/project-page-fields.component.html @@ -0,0 +1,32 @@ +

+ +

+
+
+ + + + + + + + + +
+
+ + + + +
+
diff --git a/src/app/+item-page/simple/relationship-types/project/project-page-fields.component.scss b/src/app/+item-page/simple/relationship-types/project/project-page-fields.component.scss new file mode 100644 index 0000000000..3575cae797 --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/project/project-page-fields.component.scss @@ -0,0 +1 @@ +@import '../../../../../styles/variables.scss'; diff --git a/src/app/+item-page/simple/relationship-types/project/project-page-fields.component.ts b/src/app/+item-page/simple/relationship-types/project/project-page-fields.component.ts new file mode 100644 index 0000000000..da9a4416b7 --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/project/project-page-fields.component.ts @@ -0,0 +1,18 @@ +import { Component, Inject } from '@angular/core'; +import { Item } from '../../../../core/shared/item.model'; +import { rendersRelationshipType } from '../../../../shared/entities/relationship-type-decorator'; +import { ElementViewMode } from '../../../../shared/view-mode'; +import { ITEM } from '../switcher/relationship-type-switcher.component'; + +@rendersRelationshipType('Project', ElementViewMode.Full) +@Component({ + selector: 'ds-project-page-fields', + styleUrls: ['./project-page-fields.component.scss'], + templateUrl: './project-page-fields.component.html' +}) +export class ProjectPageFieldsComponent { + + constructor(@Inject(ITEM) public item: Item) { + } + +} diff --git a/src/app/+item-page/simple/relationship-types/switcher/relationship-type-switcher.component.html b/src/app/+item-page/simple/relationship-types/switcher/relationship-type-switcher.component.html new file mode 100644 index 0000000000..4965359495 --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/switcher/relationship-type-switcher.component.html @@ -0,0 +1 @@ + diff --git a/src/app/+item-page/simple/relationship-types/switcher/relationship-type-switcher.component.scss b/src/app/+item-page/simple/relationship-types/switcher/relationship-type-switcher.component.scss new file mode 100644 index 0000000000..3575cae797 --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/switcher/relationship-type-switcher.component.scss @@ -0,0 +1 @@ +@import '../../../../../styles/variables.scss'; diff --git a/src/app/+item-page/simple/relationship-types/switcher/relationship-type-switcher.component.ts b/src/app/+item-page/simple/relationship-types/switcher/relationship-type-switcher.component.ts new file mode 100644 index 0000000000..cb7293f514 --- /dev/null +++ b/src/app/+item-page/simple/relationship-types/switcher/relationship-type-switcher.component.ts @@ -0,0 +1,36 @@ +import { Component, InjectionToken, Injector, Input, OnInit } from '@angular/core'; +import { GenericConstructor } from '../../../../core/shared/generic-constructor'; +import { Item } from '../../../../core/shared/item.model'; +import { getComponentByRelationshipType } from '../../../../shared/entities/relationship-type-decorator'; +import { rendersDSOType } from '../../../../shared/object-collection/shared/dso-element-decorator'; +import { ListableObject } from '../../../../shared/object-collection/shared/listable-object.model'; +import { ElementViewMode, SetViewMode } from '../../../../shared/view-mode'; + +export const ITEM: InjectionToken = new InjectionToken('item'); + +@Component({ + selector: 'ds-relationship-type-switcher', + styleUrls: ['./relationship-type-switcher.component.scss'], + templateUrl: './relationship-type-switcher.component.html' +}) +export class RelationshipTypeSwitcherComponent implements OnInit { + @Input() item: Item; + @Input() viewMode: ElementViewMode; + objectInjector: Injector; + + constructor(private injector: Injector) { + } + + ngOnInit(): void { + this.objectInjector = Injector.create({ + providers: [{ provide: ITEM, useFactory: () => this.item, deps:[] }], + parent: this.injector + }); + + } + + getComponent(): string { + const type = this.item.findMetadata('relationship.type'); + return getComponentByRelationshipType(type, this.viewMode); + } +} diff --git a/src/app/+search-page/search-options.model.ts b/src/app/+search-page/search-options.model.ts index df8d8e713a..770d123f92 100644 --- a/src/app/+search-page/search-options.model.ts +++ b/src/app/+search-page/search-options.model.ts @@ -1,14 +1,10 @@ -import { isNotEmpty } from '../shared/empty.util'; -import { URLCombiner } from '../core/url-combiner/url-combiner'; import 'core-js/fn/object/entries'; - -export enum ViewMode { - List = 'list', - Grid = 'grid' -} +import { URLCombiner } from '../core/url-combiner/url-combiner'; +import { isNotEmpty } from '../shared/empty.util'; +import { SetViewMode } from '../shared/view-mode'; export class SearchOptions { - view?: ViewMode = ViewMode.List; + view?: SetViewMode = SetViewMode.List; scope?: string; query?: string; filters?: any; diff --git a/src/app/+search-page/search-results/search-results.component.ts b/src/app/+search-page/search-results/search-results.component.ts index 14ccb5d541..976f422a38 100644 --- a/src/app/+search-page/search-results/search-results.component.ts +++ b/src/app/+search-page/search-results/search-results.component.ts @@ -2,7 +2,8 @@ import { Component, Input } from '@angular/core'; import { RemoteData } from '../../core/data/remote-data'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { fadeIn, fadeInOut } from '../../shared/animations/fade'; -import { SearchOptions, ViewMode } from '../search-options.model'; +import { SetViewMode } from '../../shared/view-mode'; +import { SearchOptions} from '../search-options.model'; import { SortOptions } from '../../core/cache/models/sort-options.model'; import { SearchResult } from '../search-result.model'; import { PaginatedList } from '../../core/data/paginated-list'; @@ -24,5 +25,5 @@ export class SearchResultsComponent { @Input() searchResults: RemoteData>>; @Input() searchConfig: SearchOptions; @Input() sortConfig: SortOptions; - @Input() viewMode: ViewMode; + @Input() viewMode: SetViewMode; } diff --git a/src/app/+search-page/search-service/search.service.spec.ts b/src/app/+search-page/search-service/search.service.spec.ts index 4b558f8726..e8eddc6cdb 100644 --- a/src/app/+search-page/search-service/search.service.spec.ts +++ b/src/app/+search-page/search-service/search.service.spec.ts @@ -6,7 +6,7 @@ import { Component } from '@angular/core'; import { SearchService } from './search.service'; import { ItemDataService } from './../../core/data/item-data.service'; -import { ViewMode } from '../../+search-page/search-options.model'; +import { SetViewMode } from '../../shared/view-mode'; import { RouteService } from '../../shared/route.service'; import { GLOBAL_CONFIG } from '../../../config'; import { RemoteDataBuildService } from '../../core/cache/builders/remote-data-build.service'; @@ -68,7 +68,7 @@ describe('SearchService', () => { it('should return list view mode', () => { searchService.getViewMode().subscribe((viewMode) => { - expect(viewMode).toBe(ViewMode.List); + expect(viewMode).toBe(SetViewMode.List); }); }); }); @@ -124,33 +124,33 @@ describe('SearchService', () => { }); it('should call the navigate method on the Router with view mode list parameter as a parameter when setViewMode is called', () => { - searchService.setViewMode(ViewMode.List); + searchService.setViewMode(SetViewMode.List); expect(router.navigate).toHaveBeenCalledWith(['/search'], { - queryParams: { view: ViewMode.List }, + queryParams: { view: SetViewMode.List }, queryParamsHandling: 'merge' }); }); it('should call the navigate method on the Router with view mode grid parameter as a parameter when setViewMode is called', () => { - searchService.setViewMode(ViewMode.Grid); + searchService.setViewMode(SetViewMode.Grid); expect(router.navigate).toHaveBeenCalledWith(['/search'], { - queryParams: { view: ViewMode.Grid }, + queryParams: { view: SetViewMode.Grid }, queryParamsHandling: 'merge' }); }); it('should return ViewMode.List when the viewMode is set to ViewMode.List in the ActivatedRoute', () => { - let viewMode = ViewMode.Grid; - route.testParams = { view: ViewMode.List }; + let viewMode = SetViewMode.Grid; + route.testParams = { view: SetViewMode.List }; searchService.getViewMode().subscribe((mode) => viewMode = mode); - expect(viewMode).toEqual(ViewMode.List); + expect(viewMode).toEqual(SetViewMode.List); }); it('should return ViewMode.Grid when the viewMode is set to ViewMode.Grid in the ActivatedRoute', () => { - let viewMode = ViewMode.List; - route.testParams = { view: ViewMode.Grid }; + let viewMode = SetViewMode.List; + route.testParams = { view: SetViewMode.Grid }; searchService.getViewMode().subscribe((mode) => viewMode = mode); - expect(viewMode).toEqual(ViewMode.Grid); + expect(viewMode).toEqual(SetViewMode.Grid); }); describe('when search is called', () => { diff --git a/src/app/+search-page/search-service/search.service.ts b/src/app/+search-page/search-service/search.service.ts index 0351a9a54c..f936c4b4ba 100644 --- a/src/app/+search-page/search-service/search.service.ts +++ b/src/app/+search-page/search-service/search.service.ts @@ -5,7 +5,7 @@ import { } from '@angular/router'; import { Observable } from 'rxjs/Observable'; import { flatMap, map, tap } from 'rxjs/operators'; -import { ViewMode } from '../../+search-page/search-options.model'; +import { SetViewMode } from '../../shared/view-mode'; import { RemoteDataBuildService } from '../../core/cache/builders/remote-data-build.service'; import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; import { @@ -217,17 +217,17 @@ export class SearchService implements OnDestroy { return this.rdb.toRemoteDataObservable(requestEntryObs, responseCacheObs, payloadObs); } - getViewMode(): Observable { + getViewMode(): Observable { return this.route.queryParams.map((params) => { if (isNotEmpty(params.view) && hasValue(params.view)) { return params.view; } else { - return ViewMode.List; + return SetViewMode.List; } }); } - setViewMode(viewMode: ViewMode) { + setViewMode(viewMode: SetViewMode) { const navigationExtras: NavigationExtras = { queryParams: { view: viewMode }, queryParamsHandling: 'merge' diff --git a/src/app/+search-page/search-settings/search-settings.component.ts b/src/app/+search-page/search-settings/search-settings.component.ts index 145b58e27b..bd26663583 100644 --- a/src/app/+search-page/search-settings/search-settings.component.ts +++ b/src/app/+search-page/search-settings/search-settings.component.ts @@ -1,6 +1,7 @@ import { Component, Input, OnInit, ChangeDetectionStrategy } from '@angular/core'; +import { SetViewMode } from '../../shared/view-mode'; import { SearchService } from '../search-service/search.service'; -import { SearchOptions, ViewMode } from '../search-options.model'; +import { SearchOptions} from '../search-options.model'; import { SortDirection } from '../../core/cache/models/sort-options.model'; import { ActivatedRoute, NavigationExtras, Router } from '@angular/router'; import { PaginatedSearchOptions } from '../paginated-search-options.model'; @@ -48,7 +49,7 @@ export class SearchSettingsComponent implements OnInit { this.page = +params.page || this.searchOptions.pagination.currentPage; this.pageSize = +params.pageSize || this.searchOptions.pagination.pageSize; this.direction = params.sortDirection || this.searchOptions.sort.direction; - if (params.view === ViewMode.Grid) { + if (params.view === SetViewMode.Grid) { this.pageSizeOptions = this.pageSizeOptions; } else { this.pageSizeOptions = this.pageSizeOptions; diff --git a/src/app/shared/entities/relationship-type-decorator.ts b/src/app/shared/entities/relationship-type-decorator.ts new file mode 100644 index 0000000000..8d510e53b9 --- /dev/null +++ b/src/app/shared/entities/relationship-type-decorator.ts @@ -0,0 +1,22 @@ +import { hasNoValue } from '../empty.util'; +import { ElementViewMode } from '../view-mode'; + +export const DEFAULT_RELATIONSHIP_TYPE = 'Default'; + +const map = new Map(); +export function rendersRelationshipType(type: string, viewMode: ElementViewMode) { + return function decorator(component: any) { + if (hasNoValue(map.get(viewMode))) { + map.set(viewMode, new Map()); + } + map.get(viewMode).set(type, component); + }; +} + +export function getComponentByRelationshipType(type: string, viewMode: ElementViewMode) { + let component = map.get(viewMode).get(type); + if (hasNoValue(component)) { + component = map.get(viewMode).get(DEFAULT_RELATIONSHIP_TYPE); + } + return component; +} diff --git a/src/app/shared/object-collection/object-collection.component.spec.ts b/src/app/shared/object-collection/object-collection.component.spec.ts index b27a342eac..b033d1fe97 100644 --- a/src/app/shared/object-collection/object-collection.component.spec.ts +++ b/src/app/shared/object-collection/object-collection.component.spec.ts @@ -1,5 +1,5 @@ import { ObjectCollectionComponent } from './object-collection.component'; -import { ViewMode } from '../../+search-page/search-options.model'; +import { SetViewMode } from '../view-mode'; import { element } from 'protractor'; import { By } from '@angular/platform-browser'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; @@ -38,14 +38,14 @@ describe('ObjectCollectionComponent', () => { })); it('should only show the grid component when the viewmode is set to grid', () => { - objectCollectionComponent.currentMode = ViewMode.Grid; + objectCollectionComponent.currentMode = SetViewMode.Grid; expect(fixture.debugElement.query(By.css('ds-object-grid'))).toBeDefined(); expect(fixture.debugElement.query(By.css('ds-object-list'))).toBeNull(); }); it('should only show the list component when the viewmode is set to list', () => { - objectCollectionComponent.currentMode = ViewMode.List; + objectCollectionComponent.currentMode = SetViewMode.List; expect(fixture.debugElement.query(By.css('ds-object-list'))).toBeDefined(); expect(fixture.debugElement.query(By.css('ds-object-grid'))).toBeNull(); diff --git a/src/app/shared/object-collection/object-collection.component.ts b/src/app/shared/object-collection/object-collection.component.ts index 3af92443c1..05e22514b7 100644 --- a/src/app/shared/object-collection/object-collection.component.ts +++ b/src/app/shared/object-collection/object-collection.component.ts @@ -14,7 +14,7 @@ import { PaginationComponentOptions } from '../pagination/pagination-component-o import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; import { ListableObject } from './shared/listable-object.model'; -import { ViewMode } from '../../+search-page/search-options.model'; +import { SetViewMode } from '../view-mode'; import { hasValue, isNotEmpty } from '../empty.util'; @Component({ @@ -56,8 +56,8 @@ export class ObjectCollectionComponent implements OnChanges, OnInit { */ @Output() sortFieldChange: EventEmitter = new EventEmitter(); data: any = {}; - currentMode: ViewMode = ViewMode.List; - viewModeEnum = ViewMode; + currentMode: SetViewMode = SetViewMode.List; + viewModeEnum = SetViewMode; ngOnChanges(changes: SimpleChanges) { if (changes.objects && !changes.objects.isFirstChange()) { @@ -87,7 +87,7 @@ export class ObjectCollectionComponent implements OnChanges, OnInit { private router: Router) { } - getViewMode(): ViewMode { + getViewMode(): SetViewMode { this.route.queryParams.map((params) => { if (isNotEmpty(params.view) && hasValue(params.view)) { this.currentMode = params.view; diff --git a/src/app/shared/object-collection/shared/dso-element-decorator.spec.ts b/src/app/shared/object-collection/shared/dso-element-decorator.spec.ts index 9f54bebed9..12da0f5b36 100644 --- a/src/app/shared/object-collection/shared/dso-element-decorator.spec.ts +++ b/src/app/shared/object-collection/shared/dso-element-decorator.spec.ts @@ -1,10 +1,10 @@ -import { ViewMode } from '../../../+search-page/search-options.model'; +import { SetViewMode } from '../../view-mode'; import { renderElementsFor } from './dso-element-decorator'; import { Item } from '../../../core/shared/item.model'; describe('ElementDecorator', () => { - const gridDecorator = renderElementsFor(Item, ViewMode.Grid); - const listDecorator = renderElementsFor(Item, ViewMode.List); + const gridDecorator = renderElementsFor(Item, SetViewMode.Grid); + const listDecorator = renderElementsFor(Item, SetViewMode.List); it('should have a decorator for both list and grid', () => { expect(listDecorator.length).not.toBeNull(); expect(gridDecorator.length).not.toBeNull(); diff --git a/src/app/shared/object-collection/shared/dso-element-decorator.ts b/src/app/shared/object-collection/shared/dso-element-decorator.ts index 51aa57bc50..4e4d37579a 100644 --- a/src/app/shared/object-collection/shared/dso-element-decorator.ts +++ b/src/app/shared/object-collection/shared/dso-element-decorator.ts @@ -1,9 +1,9 @@ import { GenericConstructor } from '../../../core/shared/generic-constructor'; import { ListableObject } from './listable-object.model'; -import { ViewMode } from '../../../+search-page/search-options.model'; +import { SetViewMode } from '../../view-mode'; const dsoElementMap = new Map(); -export function renderElementsFor(listable: GenericConstructor, viewMode: ViewMode) { +export function renderElementsFor(listable: GenericConstructor, viewMode: SetViewMode) { return function decorator(objectElement: any) { if (!objectElement) { return; @@ -15,6 +15,6 @@ export function renderElementsFor(listable: GenericConstructor, }; } -export function rendersDSOType(listable: GenericConstructor, viewMode: ViewMode) { +export function rendersDSOType(listable: GenericConstructor, viewMode: SetViewMode) { return dsoElementMap.get(viewMode).get(listable); } diff --git a/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.ts b/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.ts index f383367e3f..af6027aa1a 100644 --- a/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.ts +++ b/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.ts @@ -2,7 +2,7 @@ import { Component, Inject } from '@angular/core'; import { Collection } from '../../../core/shared/collection.model'; import { renderElementsFor} from '../../object-collection/shared/dso-element-decorator'; -import { ViewMode } from '../../../+search-page/search-options.model'; +import { SetViewMode } from '../../view-mode'; import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; @Component({ @@ -11,5 +11,5 @@ import { AbstractListableElementComponent } from '../../object-collection/shared templateUrl: './collection-grid-element.component.html' }) -@renderElementsFor(Collection, ViewMode.Grid) +@renderElementsFor(Collection, SetViewMode.Grid) export class CollectionGridElementComponent extends AbstractListableElementComponent {} diff --git a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.ts b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.ts index 21d73ff0fa..4f69e3e2c7 100644 --- a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.ts +++ b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.ts @@ -3,7 +3,7 @@ import { Component, Input, Inject } from '@angular/core'; import { Community } from '../../../core/shared/community.model'; import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; import { renderElementsFor} from '../../object-collection/shared/dso-element-decorator'; -import { ViewMode } from '../../../+search-page/search-options.model'; +import { SetViewMode } from '../../view-mode'; @Component({ selector: 'ds-community-grid-element', @@ -11,5 +11,5 @@ import { ViewMode } from '../../../+search-page/search-options.model'; templateUrl: './community-grid-element.component.html' }) -@renderElementsFor(Community, ViewMode.Grid) +@renderElementsFor(Community, SetViewMode.Grid) export class CommunityGridElementComponent extends AbstractListableElementComponent {} diff --git a/src/app/shared/object-grid/item-grid-element/item-grid-element.component.ts b/src/app/shared/object-grid/item-grid-element/item-grid-element.component.ts index 5a8d46f1f2..a4137b3c26 100644 --- a/src/app/shared/object-grid/item-grid-element/item-grid-element.component.ts +++ b/src/app/shared/object-grid/item-grid-element/item-grid-element.component.ts @@ -3,7 +3,7 @@ import { Component, Input, Inject } from '@angular/core'; import { Item } from '../../../core/shared/item.model'; import { renderElementsFor} from '../../object-collection/shared/dso-element-decorator'; import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; -import { ViewMode } from '../../../+search-page/search-options.model'; +import { SetViewMode } from '../../view-mode'; @Component({ selector: 'ds-item-grid-element', @@ -11,5 +11,5 @@ import { ViewMode } from '../../../+search-page/search-options.model'; templateUrl: './item-grid-element.component.html' }) -@renderElementsFor(Item, ViewMode.Grid) +@renderElementsFor(Item, SetViewMode.Grid) export class ItemGridElementComponent extends AbstractListableElementComponent {} diff --git a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.ts b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.ts index 7f8a3bb9fd..61cc5dca1c 100644 --- a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.ts +++ b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.ts @@ -3,7 +3,7 @@ import { Component } from '@angular/core'; import { renderElementsFor} from '../../../object-collection/shared/dso-element-decorator'; import { SearchResultGridElementComponent } from '../search-result-grid-element.component'; import { Collection } from '../../../../core/shared/collection.model'; -import { ViewMode } from '../../../../+search-page/search-options.model'; +import { SetViewMode } from '../../../view-mode'; import { CollectionSearchResult } from '../../../object-collection/shared/collection-search-result.model'; @Component({ @@ -12,5 +12,5 @@ import { CollectionSearchResult } from '../../../object-collection/shared/collec templateUrl: 'collection-search-result-grid-element.component.html' }) -@renderElementsFor(CollectionSearchResult, ViewMode.Grid) +@renderElementsFor(CollectionSearchResult, SetViewMode.Grid) export class CollectionSearchResultGridElementComponent extends SearchResultGridElementComponent {} diff --git a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.ts b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.ts index 7c34207f5e..d445e27ed6 100644 --- a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.ts +++ b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.ts @@ -2,7 +2,7 @@ import { Component } from '@angular/core'; import { Community } from '../../../../core/shared/community.model'; import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator'; import { SearchResultGridElementComponent } from '../search-result-grid-element.component'; -import { ViewMode } from '../../../../+search-page/search-options.model'; +import { SetViewMode } from '../../../view-mode'; import { CommunitySearchResult } from '../../../object-collection/shared/community-search-result.model'; @Component({ @@ -11,7 +11,7 @@ import { CommunitySearchResult } from '../../../object-collection/shared/communi templateUrl: 'community-search-result-grid-element.component.html' }) -@renderElementsFor(CommunitySearchResult, ViewMode.Grid) +@renderElementsFor(CommunitySearchResult, SetViewMode.Grid) export class CommunitySearchResultGridElementComponent extends SearchResultGridElementComponent { } diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item-search-result-grid-element.component.ts b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item-search-result-grid-element.component.ts index 518fc23a44..30c36b3af9 100644 --- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item-search-result-grid-element.component.ts +++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item-search-result-grid-element.component.ts @@ -4,7 +4,7 @@ import { renderElementsFor } from '../../../object-collection/shared/dso-element import { SearchResultGridElementComponent } from '../search-result-grid-element.component'; import { Item } from '../../../../core/shared/item.model'; import { ItemSearchResult } from '../../../object-collection/shared/item-search-result.model'; -import { ViewMode } from '../../../../+search-page/search-options.model'; +import { SetViewMode } from '../../../view-mode'; import { focusShadow } from '../../../../shared/animations/focus'; @Component({ @@ -14,5 +14,5 @@ import { focusShadow } from '../../../../shared/animations/focus'; animations: [focusShadow], }) -@renderElementsFor(ItemSearchResult, ViewMode.Grid) +@renderElementsFor(ItemSearchResult, SetViewMode.Grid) export class ItemSearchResultGridElementComponent extends SearchResultGridElementComponent {} diff --git a/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.ts b/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.ts index f807542e76..84f9357b2d 100644 --- a/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.ts +++ b/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.ts @@ -1,5 +1,5 @@ import { Component, Injector, Input, OnInit } from '@angular/core'; -import { ViewMode } from '../../../+search-page/search-options.model'; +import { SetViewMode } from '../../view-mode'; import { GenericConstructor } from '../../../core/shared/generic-constructor'; import { rendersDSOType } from '../../object-collection/shared/dso-element-decorator'; import { ListableObject } from '../../object-collection/shared/listable-object.model'; @@ -26,6 +26,6 @@ export class WrapperGridElementComponent implements OnInit { getGridElement(): string { const f: GenericConstructor = this.object.constructor as GenericConstructor; - return rendersDSOType(f, ViewMode.Grid); + return rendersDSOType(f, SetViewMode.Grid); } } diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.ts b/src/app/shared/object-list/collection-list-element/collection-list-element.component.ts index f95c087d5c..3fe64f5bb9 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.ts +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.ts @@ -2,7 +2,7 @@ import { Component, Inject } from '@angular/core'; import { Collection } from '../../../core/shared/collection.model'; import { renderElementsFor } from '../../object-collection/shared/dso-element-decorator'; -import { ViewMode } from '../../../+search-page/search-options.model'; +import { SetViewMode } from '../../view-mode'; import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; @Component({ @@ -11,5 +11,5 @@ import { AbstractListableElementComponent } from '../../object-collection/shared templateUrl: './collection-list-element.component.html' }) -@renderElementsFor(Collection, ViewMode.List) +@renderElementsFor(Collection, SetViewMode.List) export class CollectionListElementComponent extends AbstractListableElementComponent {} diff --git a/src/app/shared/object-list/community-list-element/community-list-element.component.ts b/src/app/shared/object-list/community-list-element/community-list-element.component.ts index e92c080a31..5e254cb1ac 100644 --- a/src/app/shared/object-list/community-list-element/community-list-element.component.ts +++ b/src/app/shared/object-list/community-list-element/community-list-element.component.ts @@ -3,7 +3,7 @@ import { Component, Input, Inject } from '@angular/core'; import { Community } from '../../../core/shared/community.model'; import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; import { renderElementsFor } from '../../object-collection/shared/dso-element-decorator'; -import { ViewMode } from '../../../+search-page/search-options.model'; +import { SetViewMode } from '../../view-mode'; @Component({ selector: 'ds-community-list-element', @@ -11,5 +11,5 @@ import { ViewMode } from '../../../+search-page/search-options.model'; templateUrl: './community-list-element.component.html' }) -@renderElementsFor(Community, ViewMode.List) +@renderElementsFor(Community, SetViewMode.List) export class CommunityListElementComponent extends AbstractListableElementComponent {} diff --git a/src/app/shared/object-list/item-list-element/item-list-element.component.ts b/src/app/shared/object-list/item-list-element/item-list-element.component.ts index e4efbd6b08..8dd09f71b9 100644 --- a/src/app/shared/object-list/item-list-element/item-list-element.component.ts +++ b/src/app/shared/object-list/item-list-element/item-list-element.component.ts @@ -3,7 +3,7 @@ import { Component, Input, Inject } from '@angular/core'; import { Item } from '../../../core/shared/item.model'; import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component'; import { renderElementsFor } from '../../object-collection/shared/dso-element-decorator'; -import { ViewMode } from '../../../+search-page/search-options.model'; +import { SetViewMode } from '../../view-mode'; @Component({ selector: 'ds-item-list-element', @@ -11,5 +11,5 @@ import { ViewMode } from '../../../+search-page/search-options.model'; templateUrl: './item-list-element.component.html' }) -@renderElementsFor(Item, ViewMode.List) +@renderElementsFor(Item, SetViewMode.List) export class ItemListElementComponent extends AbstractListableElementComponent {} diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts index 746e700f05..2205155bbd 100644 --- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts +++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts @@ -4,7 +4,7 @@ import { renderElementsFor } from '../../../object-collection/shared/dso-element import { SearchResultListElementComponent } from '../search-result-list-element.component'; import { Collection } from '../../../../core/shared/collection.model'; -import { ViewMode } from '../../../../+search-page/search-options.model'; +import { SetViewMode } from '../../../view-mode'; import { CollectionSearchResult } from '../../../object-collection/shared/collection-search-result.model'; @Component({ @@ -13,5 +13,5 @@ import { CollectionSearchResult } from '../../../object-collection/shared/collec templateUrl: 'collection-search-result-list-element.component.html' }) -@renderElementsFor(CollectionSearchResult, ViewMode.List) +@renderElementsFor(CollectionSearchResult, SetViewMode.List) export class CollectionSearchResultListElementComponent extends SearchResultListElementComponent {} diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts index 2ca89fc9c5..3f7e08d11c 100644 --- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts +++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts @@ -4,7 +4,7 @@ import { renderElementsFor } from '../../../object-collection/shared/dso-element import { SearchResultListElementComponent } from '../search-result-list-element.component'; import { Community } from '../../../../core/shared/community.model'; -import { ViewMode } from '../../../../+search-page/search-options.model'; +import { SetViewMode } from '../../../view-mode'; import { CommunitySearchResult } from '../../../object-collection/shared/community-search-result.model'; @Component({ @@ -13,7 +13,7 @@ import { CommunitySearchResult } from '../../../object-collection/shared/communi templateUrl: 'community-search-result-list-element.component.html' }) -@renderElementsFor(CommunitySearchResult, ViewMode.List) +@renderElementsFor(CommunitySearchResult, SetViewMode.List) export class CommunitySearchResultListElementComponent extends SearchResultListElementComponent { } diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.ts index b776abc214..37dcb907ef 100644 --- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.ts +++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.ts @@ -4,7 +4,7 @@ import { renderElementsFor } from '../../../object-collection/shared/dso-element import { SearchResultListElementComponent } from '../search-result-list-element.component'; import { Item } from '../../../../core/shared/item.model'; import { ItemSearchResult } from '../../../object-collection/shared/item-search-result.model'; -import { ViewMode } from '../../../../+search-page/search-options.model'; +import { SetViewMode } from '../../../view-mode'; import { ListableObject } from '../../../object-collection/shared/listable-object.model'; import { focusBackground } from '../../../animations/focus'; @@ -16,6 +16,6 @@ import { focusBackground } from '../../../animations/focus'; }) -@renderElementsFor(ItemSearchResult, ViewMode.List) +@renderElementsFor(ItemSearchResult, SetViewMode.List) export class ItemSearchResultListElementComponent extends SearchResultListElementComponent { } diff --git a/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.ts b/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.ts index 217c1776c5..c8d3316983 100644 --- a/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.ts +++ b/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.ts @@ -1,5 +1,5 @@ import { Component, Injector, Input, OnInit } from '@angular/core'; -import { ViewMode } from '../../../+search-page/search-options.model'; +import { SetViewMode } from '../../view-mode'; import { GenericConstructor } from '../../../core/shared/generic-constructor'; import { rendersDSOType } from '../../object-collection/shared/dso-element-decorator' import { ListableObject } from '../../object-collection/shared/listable-object.model'; @@ -24,6 +24,6 @@ export class WrapperListElementComponent implements OnInit { getListElement(): string { const f: GenericConstructor = this.object.constructor as GenericConstructor; - return rendersDSOType(f, ViewMode.List); + return rendersDSOType(f, SetViewMode.List); } } diff --git a/src/app/shared/testing/hal-endpoint-service-stub.ts b/src/app/shared/testing/hal-endpoint-service-stub.ts index e7dbe8bea1..3ebe2c1d25 100644 --- a/src/app/shared/testing/hal-endpoint-service-stub.ts +++ b/src/app/shared/testing/hal-endpoint-service-stub.ts @@ -1,5 +1,5 @@ import { Observable } from 'rxjs/Observable'; -import { ViewMode } from '../../+search-page/search-options.model'; +import { SetViewMode } from '../view-mode'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; export class HALEndpointServiceStub { diff --git a/src/app/shared/testing/search-service-stub.ts b/src/app/shared/testing/search-service-stub.ts index 7ad0d871ce..999ab3794b 100644 --- a/src/app/shared/testing/search-service-stub.ts +++ b/src/app/shared/testing/search-service-stub.ts @@ -1,23 +1,23 @@ import { Observable } from 'rxjs/Observable'; -import { ViewMode } from '../../+search-page/search-options.model'; +import { SetViewMode } from '../view-mode'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; export class SearchServiceStub { - private _viewMode: ViewMode; + private _viewMode: SetViewMode; private subject?: BehaviorSubject = new BehaviorSubject(this.testViewMode); viewMode = this.subject.asObservable(); constructor(private searchLink: string = '/search') { - this.setViewMode(ViewMode.List); + this.setViewMode(SetViewMode.List); } - getViewMode(): Observable { + getViewMode(): Observable { return this.viewMode; } - setViewMode(viewMode: ViewMode) { + setViewMode(viewMode: SetViewMode) { this.testViewMode = viewMode; } @@ -25,11 +25,11 @@ export class SearchServiceStub { return null; } - get testViewMode(): ViewMode { + get testViewMode(): SetViewMode { return this._viewMode; } - set testViewMode(viewMode: ViewMode) { + set testViewMode(viewMode: SetViewMode) { this._viewMode = viewMode; this.subject.next(viewMode); } diff --git a/src/app/shared/view-mode-switch/view-mode-switch.component.spec.ts b/src/app/shared/view-mode-switch/view-mode-switch.component.spec.ts index 1b4bf6da46..2fe405de3f 100644 --- a/src/app/shared/view-mode-switch/view-mode-switch.component.spec.ts +++ b/src/app/shared/view-mode-switch/view-mode-switch.component.spec.ts @@ -8,7 +8,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { SearchService } from '../../+search-page/search-service/search.service'; import { ViewModeSwitchComponent } from './view-mode-switch.component'; -import { ViewMode } from '../../+search-page/search-options.model'; +import { SetViewMode } from '../view-mode'; import { SearchServiceStub } from '../testing/search-service-stub'; @Component({ template: '' }) @@ -55,19 +55,19 @@ describe('ViewModeSwitchComponent', () => { }); it('should set list button as active when on list mode', fakeAsync(() => { - searchService.setViewMode(ViewMode.List); + searchService.setViewMode(SetViewMode.List); tick(); fixture.detectChanges(); - expect(comp.currentMode).toBe(ViewMode.List); + expect(comp.currentMode).toBe(SetViewMode.List); expect(listButton.classList).toContain('active'); expect(gridButton.classList).not.toContain('active'); })); it('should set grid button as active when on grid mode', fakeAsync(() => { - searchService.setViewMode(ViewMode.Grid); + searchService.setViewMode(SetViewMode.Grid); tick(); fixture.detectChanges(); - expect(comp.currentMode).toBe(ViewMode.Grid); + expect(comp.currentMode).toBe(SetViewMode.Grid); expect(listButton.classList).not.toContain('active'); expect(gridButton.classList).toContain('active'); })); 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 index f6e04816fb..11db82b3e9 100644 --- a/src/app/shared/view-mode-switch/view-mode-switch.component.ts +++ b/src/app/shared/view-mode-switch/view-mode-switch.component.ts @@ -1,6 +1,6 @@ import { Subscription } from 'rxjs/Subscription'; import { Component, OnInit, OnDestroy } from '@angular/core'; -import { ViewMode } from '../../+search-page/search-options.model'; +import { SetViewMode } from '../view-mode'; import { SearchService } from './../../+search-page/search-service/search.service'; /** @@ -12,20 +12,20 @@ import { SearchService } from './../../+search-page/search-service/search.servic templateUrl: './view-mode-switch.component.html' }) export class ViewModeSwitchComponent implements OnInit, OnDestroy { - currentMode: ViewMode = ViewMode.List; - viewModeEnum = ViewMode; + currentMode: SetViewMode = SetViewMode.List; + viewModeEnum = SetViewMode; private sub: Subscription; constructor(private searchService: SearchService) { } ngOnInit(): void { - this.sub = this.searchService.getViewMode().subscribe((viewMode: ViewMode) => { + this.sub = this.searchService.getViewMode().subscribe((viewMode: SetViewMode) => { this.currentMode = viewMode; }); } - switchViewTo(viewMode: ViewMode) { + switchViewTo(viewMode: SetViewMode) { this.searchService.setViewMode(viewMode); } diff --git a/src/app/shared/view-mode.ts b/src/app/shared/view-mode.ts new file mode 100644 index 0000000000..c12d051943 --- /dev/null +++ b/src/app/shared/view-mode.ts @@ -0,0 +1,11 @@ +export enum SetViewMode { + List, + Grid +} + +export enum ElementViewMode { + Full, + setElement +} + +export type ViewMode = SetViewMode | ElementViewMode; diff --git a/src/app/thumbnail/thumbnail.component.html b/src/app/thumbnail/thumbnail.component.html index 6221cbaba1..dd0d79d094 100644 --- a/src/app/thumbnail/thumbnail.component.html +++ b/src/app/thumbnail/thumbnail.component.html @@ -1,4 +1,4 @@
- +
diff --git a/src/app/thumbnail/thumbnail.component.scss b/src/app/thumbnail/thumbnail.component.scss index da97dd7a62..9388327700 100644 --- a/src/app/thumbnail/thumbnail.component.scss +++ b/src/app/thumbnail/thumbnail.component.scss @@ -1 +1,4 @@ @import '../../styles/variables.scss'; +img { + max-width: 100%; +} diff --git a/src/app/thumbnail/thumbnail.component.spec.ts b/src/app/thumbnail/thumbnail.component.spec.ts index fc145d2397..f2be55d52c 100644 --- a/src/app/thumbnail/thumbnail.component.spec.ts +++ b/src/app/thumbnail/thumbnail.component.spec.ts @@ -36,7 +36,7 @@ describe('ThumbnailComponent', () => { it('should display placeholder', () => { fixture.detectChanges(); const image: HTMLElement = de.query(By.css('img')).nativeElement; - expect(image.getAttribute('src')).toBe(comp.holderSource); + expect(image.getAttribute('src')).toBe(comp.defaultImage); }); }); diff --git a/src/app/thumbnail/thumbnail.component.ts b/src/app/thumbnail/thumbnail.component.ts index cac1909b2b..5e2b713b31 100644 --- a/src/app/thumbnail/thumbnail.component.ts +++ b/src/app/thumbnail/thumbnail.component.ts @@ -21,10 +21,10 @@ export class ThumbnailComponent { /** * The default 'holder.js' image */ - holderSource = 'data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2293%22%20height%3D%22120%22%20viewBox%3D%220%200%2093%20120%22%20preserveAspectRatio%3D%22none%22%3E%3C!--%0ASource%20URL%3A%20holder.js%2F93x120%3Ftext%3DNo%20Thumbnail%0ACreated%20with%20Holder.js%202.8.2.%0ALearn%20more%20at%20http%3A%2F%2Fholderjs.com%0A(c)%202012-2015%20Ivan%20Malopinsky%20-%20http%3A%2F%2Fimsky.co%0A--%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%3C!%5BCDATA%5B%23holder_1543e460b05%20text%20%7B%20fill%3A%23AAAAAA%3Bfont-weight%3Abold%3Bfont-family%3AArial%2C%20Helvetica%2C%20Open%20Sans%2C%20sans-serif%2C%20monospace%3Bfont-size%3A10pt%20%7D%20%5D%5D%3E%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_1543e460b05%22%3E%3Crect%20width%3D%2293%22%20height%3D%22120%22%20fill%3D%22%23EEEEEE%22%2F%3E%3Cg%3E%3Ctext%20x%3D%2235.6171875%22%20y%3D%2257%22%3ENo%3C%2Ftext%3E%3Ctext%20x%3D%2210.8125%22%20y%3D%2272%22%3EThumbnail%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E'; + @Input() defaultImage? = 'data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2293%22%20height%3D%22120%22%20viewBox%3D%220%200%2093%20120%22%20preserveAspectRatio%3D%22none%22%3E%3C!--%0ASource%20URL%3A%20holder.js%2F93x120%3Ftext%3DNo%20Thumbnail%0ACreated%20with%20Holder.js%202.8.2.%0ALearn%20more%20at%20http%3A%2F%2Fholderjs.com%0A(c)%202012-2015%20Ivan%20Malopinsky%20-%20http%3A%2F%2Fimsky.co%0A--%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%3C!%5BCDATA%5B%23holder_1543e460b05%20text%20%7B%20fill%3A%23AAAAAA%3Bfont-weight%3Abold%3Bfont-family%3AArial%2C%20Helvetica%2C%20Open%20Sans%2C%20sans-serif%2C%20monospace%3Bfont-size%3A10pt%20%7D%20%5D%5D%3E%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_1543e460b05%22%3E%3Crect%20width%3D%2293%22%20height%3D%22120%22%20fill%3D%22%23EEEEEE%22%2F%3E%3Cg%3E%3Ctext%20x%3D%2235.6171875%22%20y%3D%2257%22%3ENo%3C%2Ftext%3E%3Ctext%20x%3D%2210.8125%22%20y%3D%2272%22%3EThumbnail%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E'; errorHandler(event) { - event.currentTarget.src = this.holderSource; + event.currentTarget.src = this.defaultImage; } }