From 48c3cb4e46316faddff8b53c1111f0cbe06ae465 Mon Sep 17 00:00:00 2001 From: Christian Scheible Date: Fri, 9 Jun 2017 15:04:48 +0200 Subject: [PATCH 1/9] #89 added community home page --- .../community-page-routing.module.ts | 13 +++++++ .../community-page.component.html | 17 +++++++++ .../community-page.component.scss | 1 + .../community-page.component.ts | 35 ++++++++++++++++++ .../community-page/community-page.module.ts | 37 +++++++++++++++++++ .../community-page-copyright.component.html | 3 ++ .../community-page-copyright.component.scss | 1 + .../community-page-copyright.component.ts | 11 ++++++ .../field-wrapper.component.html | 3 ++ .../field-wrapper.component.scss | 1 + .../field-wrapper/field-wrapper.component.ts | 11 ++++++ ...nity-page-introductory-text.component.html | 3 ++ ...nity-page-introductory-text.component.scss | 1 + ...munity-page-introductory-text.component.ts | 11 ++++++ .../community-page-license.component.html | 4 ++ .../community-page-license.component.scss | 1 + .../community-page-license.component.ts | 11 ++++++ .../logo/community-page-logo.component.html | 3 ++ .../logo/community-page-logo.component.scss | 1 + .../logo/community-page-logo.component.ts | 13 +++++++ .../name/community-page-name.component.html | 1 + .../name/community-page-name.component.scss | 1 + .../name/community-page-name.component.ts | 11 ++++++ .../news/community-page-news.component.html | 4 ++ .../news/community-page-news.component.scss | 1 + .../news/community-page-news.component.ts | 11 ++++++ ...ty-page-sub-collection-list.component.html | 11 ++++++ ...ty-page-sub-collection-list.component.scss | 1 + ...nity-page-sub-collection-list.component.ts | 28 ++++++++++++++ 29 files changed, 250 insertions(+) create mode 100644 src/app/community-page/community-page-routing.module.ts create mode 100644 src/app/community-page/community-page.component.html create mode 100644 src/app/community-page/community-page.component.scss create mode 100644 src/app/community-page/community-page.component.ts create mode 100644 src/app/community-page/community-page.module.ts create mode 100644 src/app/community-page/copyright/community-page-copyright.component.html create mode 100644 src/app/community-page/copyright/community-page-copyright.component.scss create mode 100644 src/app/community-page/copyright/community-page-copyright.component.ts create mode 100644 src/app/community-page/field-wrapper/field-wrapper.component.html create mode 100644 src/app/community-page/field-wrapper/field-wrapper.component.scss create mode 100644 src/app/community-page/field-wrapper/field-wrapper.component.ts create mode 100644 src/app/community-page/introductory-text/community-page-introductory-text.component.html create mode 100644 src/app/community-page/introductory-text/community-page-introductory-text.component.scss create mode 100644 src/app/community-page/introductory-text/community-page-introductory-text.component.ts create mode 100644 src/app/community-page/license/community-page-license.component.html create mode 100644 src/app/community-page/license/community-page-license.component.scss create mode 100644 src/app/community-page/license/community-page-license.component.ts create mode 100644 src/app/community-page/logo/community-page-logo.component.html create mode 100644 src/app/community-page/logo/community-page-logo.component.scss create mode 100644 src/app/community-page/logo/community-page-logo.component.ts create mode 100644 src/app/community-page/name/community-page-name.component.html create mode 100644 src/app/community-page/name/community-page-name.component.scss create mode 100644 src/app/community-page/name/community-page-name.component.ts create mode 100644 src/app/community-page/news/community-page-news.component.html create mode 100644 src/app/community-page/news/community-page-news.component.scss create mode 100644 src/app/community-page/news/community-page-news.component.ts create mode 100644 src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.html create mode 100644 src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.scss create mode 100644 src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.ts diff --git a/src/app/community-page/community-page-routing.module.ts b/src/app/community-page/community-page-routing.module.ts new file mode 100644 index 0000000000..40585617f6 --- /dev/null +++ b/src/app/community-page/community-page-routing.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { CommunityPageComponent } from './community-page.component'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: 'communities/:id', component: CommunityPageComponent } + ]) + ] +}) +export class CommunityPageRoutingModule { } diff --git a/src/app/community-page/community-page.component.html b/src/app/community-page/community-page.component.html new file mode 100644 index 0000000000..28425e48fe --- /dev/null +++ b/src/app/community-page/community-page.component.html @@ -0,0 +1,17 @@ +
+ + + + + + + + + + + +
diff --git a/src/app/community-page/community-page.component.scss b/src/app/community-page/community-page.component.scss new file mode 100644 index 0000000000..da97dd7a62 --- /dev/null +++ b/src/app/community-page/community-page.component.scss @@ -0,0 +1 @@ +@import '../../styles/variables.scss'; diff --git a/src/app/community-page/community-page.component.ts b/src/app/community-page/community-page.component.ts new file mode 100644 index 0000000000..cfca9659ba --- /dev/null +++ b/src/app/community-page/community-page.component.ts @@ -0,0 +1,35 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Params } from '@angular/router'; + +import { Community } from "../core/shared/community.model"; +import { Bitstream } from "../core/shared/bitstream.model"; +import { RemoteData } from "../core/data/remote-data"; +import { CommunityDataService } from "../core/data/community-data.service"; + +@Component({ + selector: 'ds-community-page', + styleUrls: ['./community-page.component.css'], + templateUrl: './community-page.component.html', +}) +export class CommunityPageComponent implements OnInit { + communityData: RemoteData; + logoData: RemoteData; + + constructor( + private communityDataService: CommunityDataService, + private route: ActivatedRoute + ) { + this.universalInit(); + } + + ngOnInit(): void { + this.route.params.subscribe((params: Params) => { + this.communityData = this.communityDataService.findById(params['id']) + this.communityData.payload + .subscribe(community => this.logoData = community.logo); + }); + } + + universalInit() { + } +} diff --git a/src/app/community-page/community-page.module.ts b/src/app/community-page/community-page.module.ts new file mode 100644 index 0000000000..f8fb2c57b3 --- /dev/null +++ b/src/app/community-page/community-page.module.ts @@ -0,0 +1,37 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from "@angular/router"; + +import { TranslateModule } from "@ngx-translate/core"; + +import { CommunityPageComponent } from './community-page.component'; +import { FieldWrapperComponent } from './field-wrapper/field-wrapper.component'; +import { CommunityPageNameComponent } from './name/community-page-name.component'; +import { CommunityPageLogoComponent } from './logo/community-page-logo.component'; +import { CommunityPageIntroductoryTextComponent } from './introductory-text/community-page-introductory-text.component'; +import { CommunityPageNewsComponent } from './news/community-page-news.component'; +import { CommunityPageCopyrightComponent } from './copyright/community-page-copyright.component'; +import { CommunityPageLicenseComponent } from './license/community-page-license.component'; +import { CommunityPageSubCollectionListComponent } from './sub-collection-list/community-page-sub-collection-list.component'; +import { CommunityPageRoutingModule } from './community-page-routing.module'; + +@NgModule({ + imports: [ + CommunityPageRoutingModule, + CommonModule, + TranslateModule, + RouterModule, + ], + declarations: [ + CommunityPageComponent, + FieldWrapperComponent, + CommunityPageNameComponent, + CommunityPageLogoComponent, + CommunityPageIntroductoryTextComponent, + CommunityPageNewsComponent, + CommunityPageCopyrightComponent, + CommunityPageLicenseComponent, + CommunityPageSubCollectionListComponent, + ] +}) +export class CommunityPageModule { } diff --git a/src/app/community-page/copyright/community-page-copyright.component.html b/src/app/community-page/copyright/community-page-copyright.component.html new file mode 100644 index 0000000000..987f3cb64a --- /dev/null +++ b/src/app/community-page/copyright/community-page-copyright.component.html @@ -0,0 +1,3 @@ + +

+
\ No newline at end of file diff --git a/src/app/community-page/copyright/community-page-copyright.component.scss b/src/app/community-page/copyright/community-page-copyright.component.scss new file mode 100644 index 0000000000..ad84b72f8c --- /dev/null +++ b/src/app/community-page/copyright/community-page-copyright.component.scss @@ -0,0 +1 @@ +@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/copyright/community-page-copyright.component.ts b/src/app/community-page/copyright/community-page-copyright.component.ts new file mode 100644 index 0000000000..1639f57db2 --- /dev/null +++ b/src/app/community-page/copyright/community-page-copyright.component.ts @@ -0,0 +1,11 @@ +import { Component, Input } from '@angular/core'; + + +@Component({ + selector: 'ds-community-page-copyright', + styleUrls: ['./community-page-copyright.component.css'], + templateUrl: './community-page-copyright.component.html', +}) +export class CommunityPageCopyrightComponent { + @Input() copyrightText: String; +} diff --git a/src/app/community-page/field-wrapper/field-wrapper.component.html b/src/app/community-page/field-wrapper/field-wrapper.component.html new file mode 100644 index 0000000000..67e482efa0 --- /dev/null +++ b/src/app/community-page/field-wrapper/field-wrapper.component.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/src/app/community-page/field-wrapper/field-wrapper.component.scss b/src/app/community-page/field-wrapper/field-wrapper.component.scss new file mode 100644 index 0000000000..ad84b72f8c --- /dev/null +++ b/src/app/community-page/field-wrapper/field-wrapper.component.scss @@ -0,0 +1 @@ +@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/field-wrapper/field-wrapper.component.ts b/src/app/community-page/field-wrapper/field-wrapper.component.ts new file mode 100644 index 0000000000..c8420661ea --- /dev/null +++ b/src/app/community-page/field-wrapper/field-wrapper.component.ts @@ -0,0 +1,11 @@ +import { Component, Input } from '@angular/core'; + + +@Component({ + selector: 'ds-field-wrapper', + styleUrls: ['./field-wrapper.component.css'], + templateUrl: './field-wrapper.component.html', +}) +export class FieldWrapperComponent { + @Input() name: String; +} diff --git a/src/app/community-page/introductory-text/community-page-introductory-text.component.html b/src/app/community-page/introductory-text/community-page-introductory-text.component.html new file mode 100644 index 0000000000..8c1f89544a --- /dev/null +++ b/src/app/community-page/introductory-text/community-page-introductory-text.component.html @@ -0,0 +1,3 @@ + +

+
\ No newline at end of file diff --git a/src/app/community-page/introductory-text/community-page-introductory-text.component.scss b/src/app/community-page/introductory-text/community-page-introductory-text.component.scss new file mode 100644 index 0000000000..ad84b72f8c --- /dev/null +++ b/src/app/community-page/introductory-text/community-page-introductory-text.component.scss @@ -0,0 +1 @@ +@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/introductory-text/community-page-introductory-text.component.ts b/src/app/community-page/introductory-text/community-page-introductory-text.component.ts new file mode 100644 index 0000000000..beee2df466 --- /dev/null +++ b/src/app/community-page/introductory-text/community-page-introductory-text.component.ts @@ -0,0 +1,11 @@ +import { Component, Input } from '@angular/core'; + + +@Component({ + selector: 'ds-community-page-introductory-text', + styleUrls: ['./community-page-introductory-text.component.css'], + templateUrl: './community-page-introductory-text.component.html', +}) +export class CommunityPageIntroductoryTextComponent { + @Input() introductoryText: String; +} diff --git a/src/app/community-page/license/community-page-license.component.html b/src/app/community-page/license/community-page-license.component.html new file mode 100644 index 0000000000..7bea146194 --- /dev/null +++ b/src/app/community-page/license/community-page-license.component.html @@ -0,0 +1,4 @@ + +

{{ 'community.page.license' | translate }}

+

{{ license }}

+
\ No newline at end of file diff --git a/src/app/community-page/license/community-page-license.component.scss b/src/app/community-page/license/community-page-license.component.scss new file mode 100644 index 0000000000..ad84b72f8c --- /dev/null +++ b/src/app/community-page/license/community-page-license.component.scss @@ -0,0 +1 @@ +@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/license/community-page-license.component.ts b/src/app/community-page/license/community-page-license.component.ts new file mode 100644 index 0000000000..cf3e8e0661 --- /dev/null +++ b/src/app/community-page/license/community-page-license.component.ts @@ -0,0 +1,11 @@ +import { Component, Input } from '@angular/core'; + + +@Component({ + selector: 'ds-community-page-license', + styleUrls: ['./community-page-license.component.css'], + templateUrl: './community-page-license.component.html', +}) +export class CommunityPageLicenseComponent { + @Input() license: String; +} diff --git a/src/app/community-page/logo/community-page-logo.component.html b/src/app/community-page/logo/community-page-logo.component.html new file mode 100644 index 0000000000..d5ef5d6311 --- /dev/null +++ b/src/app/community-page/logo/community-page-logo.component.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/app/community-page/logo/community-page-logo.component.scss b/src/app/community-page/logo/community-page-logo.component.scss new file mode 100644 index 0000000000..ad84b72f8c --- /dev/null +++ b/src/app/community-page/logo/community-page-logo.component.scss @@ -0,0 +1 @@ +@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/logo/community-page-logo.component.ts b/src/app/community-page/logo/community-page-logo.component.ts new file mode 100644 index 0000000000..3610932745 --- /dev/null +++ b/src/app/community-page/logo/community-page-logo.component.ts @@ -0,0 +1,13 @@ +import { Component, Input } from '@angular/core'; + +import { Bitstream } from "../../core/shared/bitstream.model"; + + +@Component({ + selector: 'ds-community-page-logo', + styleUrls: ['./community-page-logo.component.css'], + templateUrl: './community-page-logo.component.html', +}) +export class CommunityPageLogoComponent { + @Input() logo: Bitstream; +} diff --git a/src/app/community-page/name/community-page-name.component.html b/src/app/community-page/name/community-page-name.component.html new file mode 100644 index 0000000000..21f1f65331 --- /dev/null +++ b/src/app/community-page/name/community-page-name.component.html @@ -0,0 +1 @@ +

{{ name }}

\ No newline at end of file diff --git a/src/app/community-page/name/community-page-name.component.scss b/src/app/community-page/name/community-page-name.component.scss new file mode 100644 index 0000000000..ad84b72f8c --- /dev/null +++ b/src/app/community-page/name/community-page-name.component.scss @@ -0,0 +1 @@ +@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/name/community-page-name.component.ts b/src/app/community-page/name/community-page-name.component.ts new file mode 100644 index 0000000000..f2cbded07c --- /dev/null +++ b/src/app/community-page/name/community-page-name.component.ts @@ -0,0 +1,11 @@ +import { Component, Input } from '@angular/core'; + + +@Component({ + selector: 'ds-community-page-name', + styleUrls: ['./community-page-name.component.css'], + templateUrl: './community-page-name.component.html', +}) +export class CommunityPageNameComponent { + @Input() name: String; +} diff --git a/src/app/community-page/news/community-page-news.component.html b/src/app/community-page/news/community-page-news.component.html new file mode 100644 index 0000000000..bce01dd378 --- /dev/null +++ b/src/app/community-page/news/community-page-news.component.html @@ -0,0 +1,4 @@ + +

{{ 'community.page.news' | translate }}

+

+
\ No newline at end of file diff --git a/src/app/community-page/news/community-page-news.component.scss b/src/app/community-page/news/community-page-news.component.scss new file mode 100644 index 0000000000..ad84b72f8c --- /dev/null +++ b/src/app/community-page/news/community-page-news.component.scss @@ -0,0 +1 @@ +@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/news/community-page-news.component.ts b/src/app/community-page/news/community-page-news.component.ts new file mode 100644 index 0000000000..b978d41a55 --- /dev/null +++ b/src/app/community-page/news/community-page-news.component.ts @@ -0,0 +1,11 @@ +import { Component, Input } from '@angular/core'; + + +@Component({ + selector: 'ds-community-page-news', + styleUrls: ['./community-page-news.component.css'], + templateUrl: './community-page-news.component.html', +}) +export class CommunityPageNewsComponent { + @Input() sidebarText: String; +} diff --git a/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.html b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.html new file mode 100644 index 0000000000..f1f05a0467 --- /dev/null +++ b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.html @@ -0,0 +1,11 @@ +
+

{{'community.sub-collection-list.head' | translate}}

+ +
diff --git a/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.scss b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.scss new file mode 100644 index 0000000000..ad84b72f8c --- /dev/null +++ b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.scss @@ -0,0 +1 @@ +@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.ts b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.ts new file mode 100644 index 0000000000..f3c39914ee --- /dev/null +++ b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.ts @@ -0,0 +1,28 @@ +import { Component, OnInit } from '@angular/core'; +import { CollectionDataService } from "../../core/data/collection-data.service"; +import { RemoteData } from "../../core/data/remote-data"; +import { Collection } from "../../core/shared/collection.model"; + + +@Component({ + selector: 'ds-community-page-sub-collection-list', + styleUrls: ['./community-page-sub-collection-list.component.css'], + templateUrl: './community-page-sub-collection-list.component.html', +}) +export class CommunityPageSubCollectionListComponent implements OnInit { + subCollections: RemoteData; + + constructor( + private cds: CollectionDataService + ) { + this.universalInit(); + } + + universalInit() { + + } + + ngOnInit(): void { + this.subCollections = this.cds.findAll(); + } +} From 3ad3df75689333b29b6969e6a5f296d7410c3c08 Mon Sep 17 00:00:00 2001 From: Christian Scheible Date: Tue, 13 Jun 2017 10:02:49 +0200 Subject: [PATCH 2/9] =?UTF-8?q?Refactored=20community=20and=20collection?= =?UTF-8?q?=20pages=20to=20use=20a=20shared=20component=20for=20most=20of?= =?UTF-8?q?=20the=20content.=20This=20PR=20connect=E2=80=99s=20to=20#89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/i18n/en.json | 9 +++++ src/app/app.module.ts | 2 + .../collection-page.component.html | 33 +++++++++++------ .../collection-page/collection-page.module.ts | 10 +---- .../collection-page-copyright.component.html | 3 -- .../collection-page-copyright.component.ts | 11 ------ ...tion-page-introductory-text.component.html | 3 -- ...tion-page-introductory-text.component.scss | 1 - ...ection-page-introductory-text.component.ts | 11 ------ .../collection-page-license.component.html | 4 -- .../collection-page-license.component.scss | 1 - .../collection-page-license.component.ts | 11 ------ .../news/collection-page-news.component.html | 4 -- .../news/collection-page-news.component.scss | 1 - .../news/collection-page-news.component.ts | 11 ------ .../community-page.component.html | 33 +++++++++++------ .../community-page/community-page.module.ts | 10 +---- .../community-page-copyright.component.html | 3 -- .../community-page-copyright.component.scss | 1 - .../community-page-copyright.component.ts | 11 ------ ...nity-page-introductory-text.component.html | 3 -- ...nity-page-introductory-text.component.scss | 1 - ...munity-page-introductory-text.component.ts | 11 ------ .../community-page-license.component.html | 4 -- .../community-page-license.component.scss | 1 - .../community-page-license.component.ts | 11 ------ .../news/community-page-news.component.html | 4 -- .../news/community-page-news.component.scss | 1 - .../news/community-page-news.component.ts | 11 ------ .../models/normalized-community.model.ts | 2 + ...content-with-optional-title.component.html | 5 +++ ...ontent-with-optional-title.component.scss} | 0 .../content-with-optional-title.component.ts | 37 +++++++++++++++++++ src/app/shared/shared.module.ts | 4 +- src/backend/communities.ts | 3 +- src/server.routes.ts | 2 +- 36 files changed, 107 insertions(+), 166 deletions(-) delete mode 100644 src/app/collection-page/copyright/collection-page-copyright.component.html delete mode 100644 src/app/collection-page/copyright/collection-page-copyright.component.ts delete mode 100644 src/app/collection-page/introductory-text/collection-page-introductory-text.component.html delete mode 100644 src/app/collection-page/introductory-text/collection-page-introductory-text.component.scss delete mode 100644 src/app/collection-page/introductory-text/collection-page-introductory-text.component.ts delete mode 100644 src/app/collection-page/license/collection-page-license.component.html delete mode 100644 src/app/collection-page/license/collection-page-license.component.scss delete mode 100644 src/app/collection-page/license/collection-page-license.component.ts delete mode 100644 src/app/collection-page/news/collection-page-news.component.html delete mode 100644 src/app/collection-page/news/collection-page-news.component.scss delete mode 100644 src/app/collection-page/news/collection-page-news.component.ts delete mode 100644 src/app/community-page/copyright/community-page-copyright.component.html delete mode 100644 src/app/community-page/copyright/community-page-copyright.component.scss delete mode 100644 src/app/community-page/copyright/community-page-copyright.component.ts delete mode 100644 src/app/community-page/introductory-text/community-page-introductory-text.component.html delete mode 100644 src/app/community-page/introductory-text/community-page-introductory-text.component.scss delete mode 100644 src/app/community-page/introductory-text/community-page-introductory-text.component.ts delete mode 100644 src/app/community-page/license/community-page-license.component.html delete mode 100644 src/app/community-page/license/community-page-license.component.scss delete mode 100644 src/app/community-page/license/community-page-license.component.ts delete mode 100644 src/app/community-page/news/community-page-news.component.html delete mode 100644 src/app/community-page/news/community-page-news.component.scss delete mode 100644 src/app/community-page/news/community-page-news.component.ts create mode 100644 src/app/shared/content-with-optional-title/content-with-optional-title.component.html rename src/app/{collection-page/copyright/collection-page-copyright.component.scss => shared/content-with-optional-title/content-with-optional-title.component.scss} (100%) create mode 100644 src/app/shared/content-with-optional-title/content-with-optional-title.component.ts diff --git a/resources/i18n/en.json b/resources/i18n/en.json index 7489228eb5..82a51f2ebd 100644 --- a/resources/i18n/en.json +++ b/resources/i18n/en.json @@ -10,6 +10,15 @@ "license": "License" } }, + "community": { + "page": { + "news": "News", + "license": "License" + }, + "sub-collection-list": { + "head": "Collections of this Community" + } + }, "item": { "page": { "author": "Author", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 95bfc73517..8a20dee66d 100755 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -10,6 +10,7 @@ import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { HeaderComponent } from './header/header.component'; import { CollectionPageModule } from './collection-page/collection-page.module'; +import { CommunityPageModule } from './community-page/community-page.module'; import { PageNotFoundComponent } from './pagenotfound/pagenotfound.component'; @@ -24,6 +25,7 @@ import { PageNotFoundComponent } from './pagenotfound/pagenotfound.component'; HomeModule, ItemPageModule, CollectionPageModule, + CommunityPageModule, CoreModule.forRoot(), AppRoutingModule ], diff --git a/src/app/collection-page/collection-page.component.html b/src/app/collection-page/collection-page.component.html index e9a4ab9916..cfa4ef4dee 100644 --- a/src/app/collection-page/collection-page.component.html +++ b/src/app/collection-page/collection-page.component.html @@ -1,16 +1,25 @@
- - - - - - - - + + + + + + + + > + + + > +
diff --git a/src/app/collection-page/collection-page.module.ts b/src/app/collection-page/collection-page.module.ts index 9b204cb0bb..1065d237df 100644 --- a/src/app/collection-page/collection-page.module.ts +++ b/src/app/collection-page/collection-page.module.ts @@ -3,14 +3,11 @@ import { CommonModule } from '@angular/common'; import { TranslateModule } from "@ngx-translate/core"; +import { SharedModule } from '../shared/shared.module'; import { CollectionPageComponent } from './collection-page.component'; import { FieldWrapperComponent } from './field-wrapper/field-wrapper.component'; import { CollectionPageNameComponent } from './name/collection-page-name.component'; import { CollectionPageLogoComponent } from './logo/collection-page-logo.component'; -import { CollectionPageIntroductoryTextComponent } from './introductory-text/collection-page-introductory-text.component'; -import { CollectionPageNewsComponent } from './news/collection-page-news.component'; -import { CollectionPageCopyrightComponent } from './copyright/collection-page-copyright.component'; -import { CollectionPageLicenseComponent } from './license/collection-page-license.component'; import { CollectionPageRoutingModule } from './collection-page-routing.module'; @NgModule({ @@ -18,16 +15,13 @@ import { CollectionPageRoutingModule } from './collection-page-routing.module'; CollectionPageRoutingModule, CommonModule, TranslateModule, + SharedModule, ], declarations: [ CollectionPageComponent, FieldWrapperComponent, CollectionPageNameComponent, CollectionPageLogoComponent, - CollectionPageIntroductoryTextComponent, - CollectionPageNewsComponent, - CollectionPageCopyrightComponent, - CollectionPageLicenseComponent, ] }) export class CollectionPageModule { } diff --git a/src/app/collection-page/copyright/collection-page-copyright.component.html b/src/app/collection-page/copyright/collection-page-copyright.component.html deleted file mode 100644 index db7b77d614..0000000000 --- a/src/app/collection-page/copyright/collection-page-copyright.component.html +++ /dev/null @@ -1,3 +0,0 @@ - -

-
\ No newline at end of file diff --git a/src/app/collection-page/copyright/collection-page-copyright.component.ts b/src/app/collection-page/copyright/collection-page-copyright.component.ts deleted file mode 100644 index e4bc21553f..0000000000 --- a/src/app/collection-page/copyright/collection-page-copyright.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-collection-page-copyright', - styleUrls: ['./collection-page-copyright.component.css'], - templateUrl: './collection-page-copyright.component.html', -}) -export class CollectionPageCopyrightComponent { - @Input() copyrightText: String; -} diff --git a/src/app/collection-page/introductory-text/collection-page-introductory-text.component.html b/src/app/collection-page/introductory-text/collection-page-introductory-text.component.html deleted file mode 100644 index 904a6d7f21..0000000000 --- a/src/app/collection-page/introductory-text/collection-page-introductory-text.component.html +++ /dev/null @@ -1,3 +0,0 @@ - -

-
\ No newline at end of file diff --git a/src/app/collection-page/introductory-text/collection-page-introductory-text.component.scss b/src/app/collection-page/introductory-text/collection-page-introductory-text.component.scss deleted file mode 100644 index ad84b72f8c..0000000000 --- a/src/app/collection-page/introductory-text/collection-page-introductory-text.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/collection-page/introductory-text/collection-page-introductory-text.component.ts b/src/app/collection-page/introductory-text/collection-page-introductory-text.component.ts deleted file mode 100644 index f6526c9943..0000000000 --- a/src/app/collection-page/introductory-text/collection-page-introductory-text.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-collection-page-introductory-text', - styleUrls: ['./collection-page-introductory-text.component.css'], - templateUrl: './collection-page-introductory-text.component.html', -}) -export class CollectionPageIntroductoryTextComponent { - @Input() introductoryText: String; -} diff --git a/src/app/collection-page/license/collection-page-license.component.html b/src/app/collection-page/license/collection-page-license.component.html deleted file mode 100644 index af0a6e4261..0000000000 --- a/src/app/collection-page/license/collection-page-license.component.html +++ /dev/null @@ -1,4 +0,0 @@ - -

{{ 'collection.page.license' | translate }}

-

{{ license }}

-
\ No newline at end of file diff --git a/src/app/collection-page/license/collection-page-license.component.scss b/src/app/collection-page/license/collection-page-license.component.scss deleted file mode 100644 index ad84b72f8c..0000000000 --- a/src/app/collection-page/license/collection-page-license.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/collection-page/license/collection-page-license.component.ts b/src/app/collection-page/license/collection-page-license.component.ts deleted file mode 100644 index 8f269cca8c..0000000000 --- a/src/app/collection-page/license/collection-page-license.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-collection-page-license', - styleUrls: ['./collection-page-license.component.css'], - templateUrl: './collection-page-license.component.html', -}) -export class CollectionPageLicenseComponent { - @Input() license: String; -} diff --git a/src/app/collection-page/news/collection-page-news.component.html b/src/app/collection-page/news/collection-page-news.component.html deleted file mode 100644 index bd17c7ea77..0000000000 --- a/src/app/collection-page/news/collection-page-news.component.html +++ /dev/null @@ -1,4 +0,0 @@ - -

{{ 'collection.page.news' | translate }}

-

-
\ No newline at end of file diff --git a/src/app/collection-page/news/collection-page-news.component.scss b/src/app/collection-page/news/collection-page-news.component.scss deleted file mode 100644 index ad84b72f8c..0000000000 --- a/src/app/collection-page/news/collection-page-news.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/collection-page/news/collection-page-news.component.ts b/src/app/collection-page/news/collection-page-news.component.ts deleted file mode 100644 index 479c37a7c6..0000000000 --- a/src/app/collection-page/news/collection-page-news.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-collection-page-news', - styleUrls: ['./collection-page-news.component.css'], - templateUrl: './collection-page-news.component.html', -}) -export class CollectionPageNewsComponent { - @Input() sidebarText: String; -} diff --git a/src/app/community-page/community-page.component.html b/src/app/community-page/community-page.component.html index 28425e48fe..d01130a006 100644 --- a/src/app/community-page/community-page.component.html +++ b/src/app/community-page/community-page.component.html @@ -1,17 +1,26 @@
- - - - - - - - + + + + + + + + + + + +
diff --git a/src/app/community-page/community-page.module.ts b/src/app/community-page/community-page.module.ts index f8fb2c57b3..043b5ca47a 100644 --- a/src/app/community-page/community-page.module.ts +++ b/src/app/community-page/community-page.module.ts @@ -4,14 +4,11 @@ import { RouterModule } from "@angular/router"; import { TranslateModule } from "@ngx-translate/core"; +import { SharedModule } from '../shared/shared.module'; import { CommunityPageComponent } from './community-page.component'; import { FieldWrapperComponent } from './field-wrapper/field-wrapper.component'; import { CommunityPageNameComponent } from './name/community-page-name.component'; import { CommunityPageLogoComponent } from './logo/community-page-logo.component'; -import { CommunityPageIntroductoryTextComponent } from './introductory-text/community-page-introductory-text.component'; -import { CommunityPageNewsComponent } from './news/community-page-news.component'; -import { CommunityPageCopyrightComponent } from './copyright/community-page-copyright.component'; -import { CommunityPageLicenseComponent } from './license/community-page-license.component'; import { CommunityPageSubCollectionListComponent } from './sub-collection-list/community-page-sub-collection-list.component'; import { CommunityPageRoutingModule } from './community-page-routing.module'; @@ -21,16 +18,13 @@ import { CommunityPageRoutingModule } from './community-page-routing.module'; CommonModule, TranslateModule, RouterModule, + SharedModule, ], declarations: [ CommunityPageComponent, FieldWrapperComponent, CommunityPageNameComponent, CommunityPageLogoComponent, - CommunityPageIntroductoryTextComponent, - CommunityPageNewsComponent, - CommunityPageCopyrightComponent, - CommunityPageLicenseComponent, CommunityPageSubCollectionListComponent, ] }) diff --git a/src/app/community-page/copyright/community-page-copyright.component.html b/src/app/community-page/copyright/community-page-copyright.component.html deleted file mode 100644 index 987f3cb64a..0000000000 --- a/src/app/community-page/copyright/community-page-copyright.component.html +++ /dev/null @@ -1,3 +0,0 @@ - -

-
\ No newline at end of file diff --git a/src/app/community-page/copyright/community-page-copyright.component.scss b/src/app/community-page/copyright/community-page-copyright.component.scss deleted file mode 100644 index ad84b72f8c..0000000000 --- a/src/app/community-page/copyright/community-page-copyright.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/copyright/community-page-copyright.component.ts b/src/app/community-page/copyright/community-page-copyright.component.ts deleted file mode 100644 index 1639f57db2..0000000000 --- a/src/app/community-page/copyright/community-page-copyright.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-community-page-copyright', - styleUrls: ['./community-page-copyright.component.css'], - templateUrl: './community-page-copyright.component.html', -}) -export class CommunityPageCopyrightComponent { - @Input() copyrightText: String; -} diff --git a/src/app/community-page/introductory-text/community-page-introductory-text.component.html b/src/app/community-page/introductory-text/community-page-introductory-text.component.html deleted file mode 100644 index 8c1f89544a..0000000000 --- a/src/app/community-page/introductory-text/community-page-introductory-text.component.html +++ /dev/null @@ -1,3 +0,0 @@ - -

-
\ No newline at end of file diff --git a/src/app/community-page/introductory-text/community-page-introductory-text.component.scss b/src/app/community-page/introductory-text/community-page-introductory-text.component.scss deleted file mode 100644 index ad84b72f8c..0000000000 --- a/src/app/community-page/introductory-text/community-page-introductory-text.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/introductory-text/community-page-introductory-text.component.ts b/src/app/community-page/introductory-text/community-page-introductory-text.component.ts deleted file mode 100644 index beee2df466..0000000000 --- a/src/app/community-page/introductory-text/community-page-introductory-text.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-community-page-introductory-text', - styleUrls: ['./community-page-introductory-text.component.css'], - templateUrl: './community-page-introductory-text.component.html', -}) -export class CommunityPageIntroductoryTextComponent { - @Input() introductoryText: String; -} diff --git a/src/app/community-page/license/community-page-license.component.html b/src/app/community-page/license/community-page-license.component.html deleted file mode 100644 index 7bea146194..0000000000 --- a/src/app/community-page/license/community-page-license.component.html +++ /dev/null @@ -1,4 +0,0 @@ - -

{{ 'community.page.license' | translate }}

-

{{ license }}

-
\ No newline at end of file diff --git a/src/app/community-page/license/community-page-license.component.scss b/src/app/community-page/license/community-page-license.component.scss deleted file mode 100644 index ad84b72f8c..0000000000 --- a/src/app/community-page/license/community-page-license.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/license/community-page-license.component.ts b/src/app/community-page/license/community-page-license.component.ts deleted file mode 100644 index cf3e8e0661..0000000000 --- a/src/app/community-page/license/community-page-license.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-community-page-license', - styleUrls: ['./community-page-license.component.css'], - templateUrl: './community-page-license.component.html', -}) -export class CommunityPageLicenseComponent { - @Input() license: String; -} diff --git a/src/app/community-page/news/community-page-news.component.html b/src/app/community-page/news/community-page-news.component.html deleted file mode 100644 index bce01dd378..0000000000 --- a/src/app/community-page/news/community-page-news.component.html +++ /dev/null @@ -1,4 +0,0 @@ - -

{{ 'community.page.news' | translate }}

-

-
\ No newline at end of file diff --git a/src/app/community-page/news/community-page-news.component.scss b/src/app/community-page/news/community-page-news.component.scss deleted file mode 100644 index ad84b72f8c..0000000000 --- a/src/app/community-page/news/community-page-news.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/news/community-page-news.component.ts b/src/app/community-page/news/community-page-news.component.ts deleted file mode 100644 index b978d41a55..0000000000 --- a/src/app/community-page/news/community-page-news.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-community-page-news', - styleUrls: ['./community-page-news.component.css'], - templateUrl: './community-page-news.component.html', -}) -export class CommunityPageNewsComponent { - @Input() sidebarText: String; -} diff --git a/src/app/core/cache/models/normalized-community.model.ts b/src/app/core/cache/models/normalized-community.model.ts index 774abcc979..e691f30fec 100644 --- a/src/app/core/cache/models/normalized-community.model.ts +++ b/src/app/core/cache/models/normalized-community.model.ts @@ -17,6 +17,8 @@ export class NormalizedCommunity extends NormalizedDSpaceObject { /** * The Bitstream that represents the logo of this Community */ + @autoserialize + @relationship(NormalizedDSOType.NormalizedBitstream) logo: string; /** diff --git a/src/app/shared/content-with-optional-title/content-with-optional-title.component.html b/src/app/shared/content-with-optional-title/content-with-optional-title.component.html new file mode 100644 index 0000000000..67c49496ae --- /dev/null +++ b/src/app/shared/content-with-optional-title/content-with-optional-title.component.html @@ -0,0 +1,5 @@ +
+

{{ title | translate }}

+

+

{{content}}

+
\ No newline at end of file diff --git a/src/app/collection-page/copyright/collection-page-copyright.component.scss b/src/app/shared/content-with-optional-title/content-with-optional-title.component.scss similarity index 100% rename from src/app/collection-page/copyright/collection-page-copyright.component.scss rename to src/app/shared/content-with-optional-title/content-with-optional-title.component.scss diff --git a/src/app/shared/content-with-optional-title/content-with-optional-title.component.ts b/src/app/shared/content-with-optional-title/content-with-optional-title.component.ts new file mode 100644 index 0000000000..a838f548d8 --- /dev/null +++ b/src/app/shared/content-with-optional-title/content-with-optional-title.component.ts @@ -0,0 +1,37 @@ +import { Component, Input } from '@angular/core'; + +/** + * This component renders any content inside of this component. + * If there is a title set it will render the title. + * If hasInnerHtml is true the content will be handled as html. + * To see how it is used see collection-page or community-page. + */ + +@Component({ + selector: 'ds-content-with-optional-title', + styleUrls: ['./content-with-optional-title.component.css'], + templateUrl: './content-with-optional-title.component.html' +}) +export class ContentWithOptionalTitleComponent { + + // Optional title + @Input() title: string; + + // The content to render. Might be html + @Input() content: string; + + // flag whether the content contains html syntax or not + @Input() hasInnerHtml: boolean; + + + + constructor() { + this.universalInit(); + + } + + universalInit() { + + } + +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 6f93a0b86e..285f1087bd 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -14,6 +14,7 @@ import { ThumbnailComponent } from "../thumbnail/thumbnail.component"; import { SafeUrlPipe } from "./utils/safe-url-pipe"; import { HostWindowService } from "./host-window.service"; import { NativeWindowFactory, NativeWindowService } from "./window.service"; +import { ContentWithOptionalTitleComponent } from "./content-with-optional-title/content-with-optional-title.component"; const MODULES = [ // Do NOT include UniversalModule, HttpModule, or JsonpModule here @@ -35,7 +36,8 @@ const PIPES = [ const COMPONENTS = [ // put shared components here PaginationComponent, - ThumbnailComponent + ThumbnailComponent, + ContentWithOptionalTitleComponent ]; const PROVIDERS = [ diff --git a/src/backend/communities.ts b/src/backend/communities.ts index 940f6c72d5..02f474f66b 100644 --- a/src/backend/communities.ts +++ b/src/backend/communities.ts @@ -38,7 +38,8 @@ export const COMMUNITIES = [ }, "collections": [ { "href": "/collections/5179" } - ] + ], + "logo": { "href": "/bitstreams/4688" } } }, { diff --git a/src/server.routes.ts b/src/server.routes.ts index 19ba0264aa..834923da30 100644 --- a/src/server.routes.ts +++ b/src/server.routes.ts @@ -10,5 +10,5 @@ * ]; **/ export const routes: string[] = [ - 'home', 'items/:id' , 'collections/:id', '**' + 'home', 'items/:id' , 'collections/:id', 'communities/:id', '**' ]; From 90840d949bea45ad8c8e5a879d96d52a89b132e8 Mon Sep 17 00:00:00 2001 From: Christian Scheible Date: Tue, 13 Jun 2017 14:35:57 +0200 Subject: [PATCH 3/9] Refactored collection/community logo and name as shared components. --- .../collection-page.component.html | 9 +++++++-- .../collection-page/collection-page.module.ts | 4 ---- .../logo/collection-page-logo.component.html | 3 --- .../logo/collection-page-logo.component.ts | 13 ------------- .../name/collection-page-name.component.ts | 11 ----------- .../community-page/community-page.component.html | 16 ++++++++-------- src/app/community-page/community-page.module.ts | 4 ---- .../logo/community-page-logo.component.html | 3 --- .../logo/community-page-logo.component.scss | 1 - .../logo/community-page-logo.component.ts | 13 ------------- .../name/community-page-name.component.html | 1 - .../name/community-page-name.component.scss | 1 - .../name/community-page-name.component.ts | 11 ----------- .../content-with-optional-title.component.html | 4 ++-- src/app/shared/dso-logo/dso-logo.component.html | 3 +++ .../dso-logo/dso-logo.component.scss} | 0 src/app/shared/dso-logo/dso-logo.component.ts | 15 +++++++++++++++ .../dso-name/dso-name.component.html} | 0 .../dso-name/dso-name.component.scss} | 0 src/app/shared/dso-name/dso-name.component.ts | 11 +++++++++++ src/app/shared/shared.module.ts | 6 +++++- 21 files changed, 51 insertions(+), 78 deletions(-) delete mode 100644 src/app/collection-page/logo/collection-page-logo.component.html delete mode 100644 src/app/collection-page/logo/collection-page-logo.component.ts delete mode 100644 src/app/collection-page/name/collection-page-name.component.ts delete mode 100644 src/app/community-page/logo/community-page-logo.component.html delete mode 100644 src/app/community-page/logo/community-page-logo.component.scss delete mode 100644 src/app/community-page/logo/community-page-logo.component.ts delete mode 100644 src/app/community-page/name/community-page-name.component.html delete mode 100644 src/app/community-page/name/community-page-name.component.scss delete mode 100644 src/app/community-page/name/community-page-name.component.ts create mode 100644 src/app/shared/dso-logo/dso-logo.component.html rename src/app/{collection-page/logo/collection-page-logo.component.scss => shared/dso-logo/dso-logo.component.scss} (100%) create mode 100644 src/app/shared/dso-logo/dso-logo.component.ts rename src/app/{collection-page/name/collection-page-name.component.html => shared/dso-name/dso-name.component.html} (100%) rename src/app/{collection-page/name/collection-page-name.component.scss => shared/dso-name/dso-name.component.scss} (100%) create mode 100644 src/app/shared/dso-name/dso-name.component.ts diff --git a/src/app/collection-page/collection-page.component.html b/src/app/collection-page/collection-page.component.html index cfa4ef4dee..02fc1fd9b7 100644 --- a/src/app/collection-page/collection-page.component.html +++ b/src/app/collection-page/collection-page.component.html @@ -1,6 +1,11 @@
- - + + + + + - Collection logo - \ No newline at end of file diff --git a/src/app/collection-page/logo/collection-page-logo.component.ts b/src/app/collection-page/logo/collection-page-logo.component.ts deleted file mode 100644 index 22c34422ea..0000000000 --- a/src/app/collection-page/logo/collection-page-logo.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Component, Input } from '@angular/core'; - -import { Bitstream } from "../../core/shared/bitstream.model"; - - -@Component({ - selector: 'ds-collection-page-logo', - styleUrls: ['./collection-page-logo.component.css'], - templateUrl: './collection-page-logo.component.html', -}) -export class CollectionPageLogoComponent { - @Input() logo: Bitstream; -} diff --git a/src/app/collection-page/name/collection-page-name.component.ts b/src/app/collection-page/name/collection-page-name.component.ts deleted file mode 100644 index 30121fd01b..0000000000 --- a/src/app/collection-page/name/collection-page-name.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-collection-page-name', - styleUrls: ['./collection-page-name.component.css'], - templateUrl: './collection-page-name.component.html', -}) -export class CollectionPageNameComponent { - @Input() name: String; -} diff --git a/src/app/community-page/community-page.component.html b/src/app/community-page/community-page.component.html index d01130a006..4fc21b07df 100644 --- a/src/app/community-page/community-page.component.html +++ b/src/app/community-page/community-page.component.html @@ -1,6 +1,11 @@
- - + + + + + - - - - +
diff --git a/src/app/community-page/community-page.module.ts b/src/app/community-page/community-page.module.ts index 043b5ca47a..0d6db23d32 100644 --- a/src/app/community-page/community-page.module.ts +++ b/src/app/community-page/community-page.module.ts @@ -7,8 +7,6 @@ import { TranslateModule } from "@ngx-translate/core"; import { SharedModule } from '../shared/shared.module'; import { CommunityPageComponent } from './community-page.component'; import { FieldWrapperComponent } from './field-wrapper/field-wrapper.component'; -import { CommunityPageNameComponent } from './name/community-page-name.component'; -import { CommunityPageLogoComponent } from './logo/community-page-logo.component'; import { CommunityPageSubCollectionListComponent } from './sub-collection-list/community-page-sub-collection-list.component'; import { CommunityPageRoutingModule } from './community-page-routing.module'; @@ -23,8 +21,6 @@ import { CommunityPageRoutingModule } from './community-page-routing.module'; declarations: [ CommunityPageComponent, FieldWrapperComponent, - CommunityPageNameComponent, - CommunityPageLogoComponent, CommunityPageSubCollectionListComponent, ] }) diff --git a/src/app/community-page/logo/community-page-logo.component.html b/src/app/community-page/logo/community-page-logo.component.html deleted file mode 100644 index d5ef5d6311..0000000000 --- a/src/app/community-page/logo/community-page-logo.component.html +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/src/app/community-page/logo/community-page-logo.component.scss b/src/app/community-page/logo/community-page-logo.component.scss deleted file mode 100644 index ad84b72f8c..0000000000 --- a/src/app/community-page/logo/community-page-logo.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/logo/community-page-logo.component.ts b/src/app/community-page/logo/community-page-logo.component.ts deleted file mode 100644 index 3610932745..0000000000 --- a/src/app/community-page/logo/community-page-logo.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Component, Input } from '@angular/core'; - -import { Bitstream } from "../../core/shared/bitstream.model"; - - -@Component({ - selector: 'ds-community-page-logo', - styleUrls: ['./community-page-logo.component.css'], - templateUrl: './community-page-logo.component.html', -}) -export class CommunityPageLogoComponent { - @Input() logo: Bitstream; -} diff --git a/src/app/community-page/name/community-page-name.component.html b/src/app/community-page/name/community-page-name.component.html deleted file mode 100644 index 21f1f65331..0000000000 --- a/src/app/community-page/name/community-page-name.component.html +++ /dev/null @@ -1 +0,0 @@ -

{{ name }}

\ No newline at end of file diff --git a/src/app/community-page/name/community-page-name.component.scss b/src/app/community-page/name/community-page-name.component.scss deleted file mode 100644 index ad84b72f8c..0000000000 --- a/src/app/community-page/name/community-page-name.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/community-page/name/community-page-name.component.ts b/src/app/community-page/name/community-page-name.component.ts deleted file mode 100644 index f2cbded07c..0000000000 --- a/src/app/community-page/name/community-page-name.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-community-page-name', - styleUrls: ['./community-page-name.component.css'], - templateUrl: './community-page-name.component.html', -}) -export class CommunityPageNameComponent { - @Input() name: String; -} diff --git a/src/app/shared/content-with-optional-title/content-with-optional-title.component.html b/src/app/shared/content-with-optional-title/content-with-optional-title.component.html index 67c49496ae..4a0be8cfc7 100644 --- a/src/app/shared/content-with-optional-title/content-with-optional-title.component.html +++ b/src/app/shared/content-with-optional-title/content-with-optional-title.component.html @@ -1,5 +1,5 @@

{{ title | translate }}

-

-

{{content}}

+
+
{{content}}
\ No newline at end of file diff --git a/src/app/shared/dso-logo/dso-logo.component.html b/src/app/shared/dso-logo/dso-logo.component.html new file mode 100644 index 0000000000..81769c3c0f --- /dev/null +++ b/src/app/shared/dso-logo/dso-logo.component.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/app/collection-page/logo/collection-page-logo.component.scss b/src/app/shared/dso-logo/dso-logo.component.scss similarity index 100% rename from src/app/collection-page/logo/collection-page-logo.component.scss rename to src/app/shared/dso-logo/dso-logo.component.scss diff --git a/src/app/shared/dso-logo/dso-logo.component.ts b/src/app/shared/dso-logo/dso-logo.component.ts new file mode 100644 index 0000000000..fc41315415 --- /dev/null +++ b/src/app/shared/dso-logo/dso-logo.component.ts @@ -0,0 +1,15 @@ +import { Component, Input } from '@angular/core'; + +import { Bitstream } from "../../core/shared/bitstream.model"; + + +@Component({ + selector: 'ds-dso-logo', + styleUrls: ['./dso-logo.component.css'], + templateUrl: './dso-logo.component.html', +}) +export class DsoLogoComponent { + @Input() logo: Bitstream; + + @Input() alternateText: string; +} \ No newline at end of file diff --git a/src/app/collection-page/name/collection-page-name.component.html b/src/app/shared/dso-name/dso-name.component.html similarity index 100% rename from src/app/collection-page/name/collection-page-name.component.html rename to src/app/shared/dso-name/dso-name.component.html diff --git a/src/app/collection-page/name/collection-page-name.component.scss b/src/app/shared/dso-name/dso-name.component.scss similarity index 100% rename from src/app/collection-page/name/collection-page-name.component.scss rename to src/app/shared/dso-name/dso-name.component.scss diff --git a/src/app/shared/dso-name/dso-name.component.ts b/src/app/shared/dso-name/dso-name.component.ts new file mode 100644 index 0000000000..7f88e3189e --- /dev/null +++ b/src/app/shared/dso-name/dso-name.component.ts @@ -0,0 +1,11 @@ +import { Component, Input } from '@angular/core'; + + +@Component({ + selector: 'ds-dso-name', + styleUrls: ['./dso-name.component.css'], + templateUrl: './dso-name.component.html', +}) +export class DsoNameComponent { + @Input() name: String; +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 285f1087bd..338fb5fe5d 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -15,6 +15,8 @@ import { SafeUrlPipe } from "./utils/safe-url-pipe"; import { HostWindowService } from "./host-window.service"; import { NativeWindowFactory, NativeWindowService } from "./window.service"; import { ContentWithOptionalTitleComponent } from "./content-with-optional-title/content-with-optional-title.component"; +import { DsoNameComponent } from "./dso-name/dso-name.component"; +import { DsoLogoComponent } from "./dso-logo/dso-logo.component"; const MODULES = [ // Do NOT include UniversalModule, HttpModule, or JsonpModule here @@ -37,7 +39,9 @@ const COMPONENTS = [ // put shared components here PaginationComponent, ThumbnailComponent, - ContentWithOptionalTitleComponent + ContentWithOptionalTitleComponent, + DsoNameComponent, + DsoLogoComponent ]; const PROVIDERS = [ From ac7b2775e4065e0de99e2f8e0bf481e8124afb1b Mon Sep 17 00:00:00 2001 From: Christian Scheible Date: Tue, 13 Jun 2017 15:41:38 +0200 Subject: [PATCH 4/9] Renamed Collection/Community shared components --- .../collection-page.component.html | 24 ++++++++++--------- .../collection-page/collection-page.module.ts | 2 -- .../field-wrapper.component.html | 3 --- .../field-wrapper/field-wrapper.component.ts | 11 --------- .../community-page.component.html | 18 +++++++------- .../community-page/community-page.module.ts | 2 -- .../field-wrapper.component.html | 3 --- .../field-wrapper/field-wrapper.component.ts | 11 --------- .../comcol-page-content.component.html} | 0 .../comcol-page-content.component.scss} | 0 .../comcol-page-content.component.ts} | 8 +++---- .../comcol-page-header.component.html} | 0 .../comcol-page-header.component.scss} | 0 .../comcol-page-header.component.ts | 11 +++++++++ .../comcol-page-logo.component.html} | 0 .../comcol-page-logo.component.scss} | 0 .../comcol-page-logo.component.ts} | 8 +++---- .../shared/dso-logo/dso-logo.component.scss | 1 - .../shared/dso-name/dso-name.component.scss | 1 - src/app/shared/dso-name/dso-name.component.ts | 11 --------- src/app/shared/shared.module.ts | 12 +++++----- 21 files changed, 47 insertions(+), 79 deletions(-) delete mode 100644 src/app/collection-page/field-wrapper/field-wrapper.component.html delete mode 100644 src/app/collection-page/field-wrapper/field-wrapper.component.ts delete mode 100644 src/app/community-page/field-wrapper/field-wrapper.component.html delete mode 100644 src/app/community-page/field-wrapper/field-wrapper.component.ts rename src/app/shared/{content-with-optional-title/content-with-optional-title.component.html => comcol-page-content/comcol-page-content.component.html} (100%) rename src/app/{collection-page/field-wrapper/field-wrapper.component.scss => shared/comcol-page-content/comcol-page-content.component.scss} (100%) rename src/app/shared/{content-with-optional-title/content-with-optional-title.component.ts => comcol-page-content/comcol-page-content.component.ts} (73%) rename src/app/shared/{dso-name/dso-name.component.html => comcol-page-header/comcol-page-header.component.html} (100%) rename src/app/{community-page/field-wrapper/field-wrapper.component.scss => shared/comcol-page-header/comcol-page-header.component.scss} (100%) create mode 100644 src/app/shared/comcol-page-header/comcol-page-header.component.ts rename src/app/shared/{dso-logo/dso-logo.component.html => comcol-page-logo/comcol-page-logo.component.html} (100%) rename src/app/shared/{content-with-optional-title/content-with-optional-title.component.scss => comcol-page-logo/comcol-page-logo.component.scss} (100%) rename src/app/shared/{dso-logo/dso-logo.component.ts => comcol-page-logo/comcol-page-logo.component.ts} (52%) delete mode 100644 src/app/shared/dso-logo/dso-logo.component.scss delete mode 100644 src/app/shared/dso-name/dso-name.component.scss delete mode 100644 src/app/shared/dso-name/dso-name.component.ts diff --git a/src/app/collection-page/collection-page.component.html b/src/app/collection-page/collection-page.component.html index 02fc1fd9b7..f8bfdbc5de 100644 --- a/src/app/collection-page/collection-page.component.html +++ b/src/app/collection-page/collection-page.component.html @@ -1,30 +1,32 @@
- + + - - + - - + - - + - > - + - > - +
diff --git a/src/app/collection-page/collection-page.module.ts b/src/app/collection-page/collection-page.module.ts index 76e3128871..0dfe33fd5a 100644 --- a/src/app/collection-page/collection-page.module.ts +++ b/src/app/collection-page/collection-page.module.ts @@ -5,7 +5,6 @@ import { TranslateModule } from "@ngx-translate/core"; import { SharedModule } from '../shared/shared.module'; import { CollectionPageComponent } from './collection-page.component'; -import { FieldWrapperComponent } from './field-wrapper/field-wrapper.component'; import { CollectionPageRoutingModule } from './collection-page-routing.module'; @NgModule({ @@ -17,7 +16,6 @@ import { CollectionPageRoutingModule } from './collection-page-routing.module'; ], declarations: [ CollectionPageComponent, - FieldWrapperComponent, ] }) export class CollectionPageModule { } diff --git a/src/app/collection-page/field-wrapper/field-wrapper.component.html b/src/app/collection-page/field-wrapper/field-wrapper.component.html deleted file mode 100644 index 677ff2f918..0000000000 --- a/src/app/collection-page/field-wrapper/field-wrapper.component.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
\ No newline at end of file diff --git a/src/app/collection-page/field-wrapper/field-wrapper.component.ts b/src/app/collection-page/field-wrapper/field-wrapper.component.ts deleted file mode 100644 index c8420661ea..0000000000 --- a/src/app/collection-page/field-wrapper/field-wrapper.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-field-wrapper', - styleUrls: ['./field-wrapper.component.css'], - templateUrl: './field-wrapper.component.html', -}) -export class FieldWrapperComponent { - @Input() name: String; -} diff --git a/src/app/community-page/community-page.component.html b/src/app/community-page/community-page.component.html index 4fc21b07df..83f6a54033 100644 --- a/src/app/community-page/community-page.component.html +++ b/src/app/community-page/community-page.component.html @@ -1,26 +1,26 @@
- + - - + - - + - - + - - +
diff --git a/src/app/community-page/community-page.module.ts b/src/app/community-page/community-page.module.ts index 0d6db23d32..1410e786b7 100644 --- a/src/app/community-page/community-page.module.ts +++ b/src/app/community-page/community-page.module.ts @@ -6,7 +6,6 @@ import { TranslateModule } from "@ngx-translate/core"; import { SharedModule } from '../shared/shared.module'; import { CommunityPageComponent } from './community-page.component'; -import { FieldWrapperComponent } from './field-wrapper/field-wrapper.component'; import { CommunityPageSubCollectionListComponent } from './sub-collection-list/community-page-sub-collection-list.component'; import { CommunityPageRoutingModule } from './community-page-routing.module'; @@ -20,7 +19,6 @@ import { CommunityPageRoutingModule } from './community-page-routing.module'; ], declarations: [ CommunityPageComponent, - FieldWrapperComponent, CommunityPageSubCollectionListComponent, ] }) diff --git a/src/app/community-page/field-wrapper/field-wrapper.component.html b/src/app/community-page/field-wrapper/field-wrapper.component.html deleted file mode 100644 index 67e482efa0..0000000000 --- a/src/app/community-page/field-wrapper/field-wrapper.component.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
\ No newline at end of file diff --git a/src/app/community-page/field-wrapper/field-wrapper.component.ts b/src/app/community-page/field-wrapper/field-wrapper.component.ts deleted file mode 100644 index c8420661ea..0000000000 --- a/src/app/community-page/field-wrapper/field-wrapper.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-field-wrapper', - styleUrls: ['./field-wrapper.component.css'], - templateUrl: './field-wrapper.component.html', -}) -export class FieldWrapperComponent { - @Input() name: String; -} diff --git a/src/app/shared/content-with-optional-title/content-with-optional-title.component.html b/src/app/shared/comcol-page-content/comcol-page-content.component.html similarity index 100% rename from src/app/shared/content-with-optional-title/content-with-optional-title.component.html rename to src/app/shared/comcol-page-content/comcol-page-content.component.html diff --git a/src/app/collection-page/field-wrapper/field-wrapper.component.scss b/src/app/shared/comcol-page-content/comcol-page-content.component.scss similarity index 100% rename from src/app/collection-page/field-wrapper/field-wrapper.component.scss rename to src/app/shared/comcol-page-content/comcol-page-content.component.scss diff --git a/src/app/shared/content-with-optional-title/content-with-optional-title.component.ts b/src/app/shared/comcol-page-content/comcol-page-content.component.ts similarity index 73% rename from src/app/shared/content-with-optional-title/content-with-optional-title.component.ts rename to src/app/shared/comcol-page-content/comcol-page-content.component.ts index a838f548d8..da679d31b2 100644 --- a/src/app/shared/content-with-optional-title/content-with-optional-title.component.ts +++ b/src/app/shared/comcol-page-content/comcol-page-content.component.ts @@ -8,11 +8,11 @@ import { Component, Input } from '@angular/core'; */ @Component({ - selector: 'ds-content-with-optional-title', - styleUrls: ['./content-with-optional-title.component.css'], - templateUrl: './content-with-optional-title.component.html' + selector: 'ds-comcol-page-content', + styleUrls: ['./comcol-page-content.component.css'], + templateUrl: './comcol-page-content.component.html' }) -export class ContentWithOptionalTitleComponent { +export class ComcolPageContentComponent { // Optional title @Input() title: string; diff --git a/src/app/shared/dso-name/dso-name.component.html b/src/app/shared/comcol-page-header/comcol-page-header.component.html similarity index 100% rename from src/app/shared/dso-name/dso-name.component.html rename to src/app/shared/comcol-page-header/comcol-page-header.component.html diff --git a/src/app/community-page/field-wrapper/field-wrapper.component.scss b/src/app/shared/comcol-page-header/comcol-page-header.component.scss similarity index 100% rename from src/app/community-page/field-wrapper/field-wrapper.component.scss rename to src/app/shared/comcol-page-header/comcol-page-header.component.scss diff --git a/src/app/shared/comcol-page-header/comcol-page-header.component.ts b/src/app/shared/comcol-page-header/comcol-page-header.component.ts new file mode 100644 index 0000000000..f6578ace29 --- /dev/null +++ b/src/app/shared/comcol-page-header/comcol-page-header.component.ts @@ -0,0 +1,11 @@ +import { Component, Input } from '@angular/core'; + + +@Component({ + selector: 'ds-comcol-page-header', + styleUrls: ['./comcol-page-header.component.css'], + templateUrl: './comcol-page-header.component.html', +}) +export class ComcolPageHeaderComponent { + @Input() name: String; +} diff --git a/src/app/shared/dso-logo/dso-logo.component.html b/src/app/shared/comcol-page-logo/comcol-page-logo.component.html similarity index 100% rename from src/app/shared/dso-logo/dso-logo.component.html rename to src/app/shared/comcol-page-logo/comcol-page-logo.component.html diff --git a/src/app/shared/content-with-optional-title/content-with-optional-title.component.scss b/src/app/shared/comcol-page-logo/comcol-page-logo.component.scss similarity index 100% rename from src/app/shared/content-with-optional-title/content-with-optional-title.component.scss rename to src/app/shared/comcol-page-logo/comcol-page-logo.component.scss diff --git a/src/app/shared/dso-logo/dso-logo.component.ts b/src/app/shared/comcol-page-logo/comcol-page-logo.component.ts similarity index 52% rename from src/app/shared/dso-logo/dso-logo.component.ts rename to src/app/shared/comcol-page-logo/comcol-page-logo.component.ts index fc41315415..87239e3a11 100644 --- a/src/app/shared/dso-logo/dso-logo.component.ts +++ b/src/app/shared/comcol-page-logo/comcol-page-logo.component.ts @@ -4,11 +4,11 @@ import { Bitstream } from "../../core/shared/bitstream.model"; @Component({ - selector: 'ds-dso-logo', - styleUrls: ['./dso-logo.component.css'], - templateUrl: './dso-logo.component.html', + selector: 'ds-comcol-page-logo', + styleUrls: ['./comcol-page-logo.component.css'], + templateUrl: './comcol-page-logo.component.html', }) -export class DsoLogoComponent { +export class ComcolPageLogoComponent { @Input() logo: Bitstream; @Input() alternateText: string; diff --git a/src/app/shared/dso-logo/dso-logo.component.scss b/src/app/shared/dso-logo/dso-logo.component.scss deleted file mode 100644 index ad84b72f8c..0000000000 --- a/src/app/shared/dso-logo/dso-logo.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/shared/dso-name/dso-name.component.scss b/src/app/shared/dso-name/dso-name.component.scss deleted file mode 100644 index ad84b72f8c..0000000000 --- a/src/app/shared/dso-name/dso-name.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/shared/dso-name/dso-name.component.ts b/src/app/shared/dso-name/dso-name.component.ts deleted file mode 100644 index 7f88e3189e..0000000000 --- a/src/app/shared/dso-name/dso-name.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - - -@Component({ - selector: 'ds-dso-name', - styleUrls: ['./dso-name.component.css'], - templateUrl: './dso-name.component.html', -}) -export class DsoNameComponent { - @Input() name: String; -} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 338fb5fe5d..817ae5f26e 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -14,9 +14,9 @@ import { ThumbnailComponent } from "../thumbnail/thumbnail.component"; import { SafeUrlPipe } from "./utils/safe-url-pipe"; import { HostWindowService } from "./host-window.service"; import { NativeWindowFactory, NativeWindowService } from "./window.service"; -import { ContentWithOptionalTitleComponent } from "./content-with-optional-title/content-with-optional-title.component"; -import { DsoNameComponent } from "./dso-name/dso-name.component"; -import { DsoLogoComponent } from "./dso-logo/dso-logo.component"; +import { ComcolPageContentComponent } from "./comcol-page-content/comcol-page-content.component"; +import { ComcolPageHeaderComponent } from "./comcol-page-header/comcol-page-header.component"; +import { ComcolPageLogoComponent } from "./comcol-page-logo/comcol-page-logo.component"; const MODULES = [ // Do NOT include UniversalModule, HttpModule, or JsonpModule here @@ -39,9 +39,9 @@ const COMPONENTS = [ // put shared components here PaginationComponent, ThumbnailComponent, - ContentWithOptionalTitleComponent, - DsoNameComponent, - DsoLogoComponent + ComcolPageContentComponent, + ComcolPageHeaderComponent, + ComcolPageLogoComponent ]; const PROVIDERS = [ From 4325e569fda2c7477f9d0f3455b209caec545c00 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Fri, 16 Jun 2017 09:19:00 +0200 Subject: [PATCH 5/9] switched to 'retrieve' as the property for a bitstream's file url --- .../logo/collection-page-logo.component.html | 4 ++-- src/app/core/cache/models/normalized-bitstream.model.ts | 2 +- src/app/core/shared/bitstream.model.ts | 7 +------ 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/app/collection-page/logo/collection-page-logo.component.html b/src/app/collection-page/logo/collection-page-logo.component.html index 1c331e2e25..090bbe3bbd 100644 --- a/src/app/collection-page/logo/collection-page-logo.component.html +++ b/src/app/collection-page/logo/collection-page-logo.component.html @@ -1,3 +1,3 @@ \ No newline at end of file + Collection logo + diff --git a/src/app/core/cache/models/normalized-bitstream.model.ts b/src/app/core/cache/models/normalized-bitstream.model.ts index e90a5b1a5f..43a4b9f057 100644 --- a/src/app/core/cache/models/normalized-bitstream.model.ts +++ b/src/app/core/cache/models/normalized-bitstream.model.ts @@ -18,7 +18,7 @@ export class NormalizedBitstream extends NormalizedDSpaceObject { * The relative path to this Bitstream's file */ @autoserialize - url: string; + retrieve: string; /** * The mime type of this Bitstream diff --git a/src/app/core/shared/bitstream.model.ts b/src/app/core/shared/bitstream.model.ts index 3dd134478f..86ff99b3eb 100644 --- a/src/app/core/shared/bitstream.model.ts +++ b/src/app/core/shared/bitstream.model.ts @@ -9,11 +9,6 @@ export class Bitstream extends DSpaceObject { */ size: number; - /** - * The relative path to this Bitstream's file - */ - url: string; - /** * The mime type of this Bitstream */ @@ -40,7 +35,7 @@ export class Bitstream extends DSpaceObject { owner: RemoteData; /** - * The Bundle that owns this Bitstream + * The URL to retrieve this Bitstream's file */ retrieve: string; From c6494d3de3110c4790ffe25ba919a4021168832a Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Fri, 16 Jun 2017 10:44:49 +0200 Subject: [PATCH 6/9] fixed an issue where incomplete mock data caused an error on collection homepages --- .../collection-page.component.ts | 16 +++-- src/backend/items.ts | 70 ++++++++++++++++++- 2 files changed, 79 insertions(+), 7 deletions(-) diff --git a/src/app/collection-page/collection-page.component.ts b/src/app/collection-page/collection-page.component.ts index 42afe78881..a7148cbc74 100644 --- a/src/app/collection-page/collection-page.component.ts +++ b/src/app/collection-page/collection-page.component.ts @@ -1,19 +1,21 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute, Params } from '@angular/router'; import { Collection } from "../core/shared/collection.model"; import { Bitstream } from "../core/shared/bitstream.model"; import { RemoteData } from "../core/data/remote-data"; import { CollectionDataService } from "../core/data/collection-data.service"; +import { Subscription } from "rxjs/Subscription"; @Component({ selector: 'ds-collection-page', styleUrls: ['./collection-page.component.css'], templateUrl: './collection-page.component.html', }) -export class CollectionPageComponent implements OnInit { +export class CollectionPageComponent implements OnInit, OnDestroy { collectionData: RemoteData; logoData: RemoteData; + private subs: Subscription[] = []; constructor( private collectionDataService: CollectionDataService, @@ -24,12 +26,16 @@ export class CollectionPageComponent implements OnInit { ngOnInit(): void { this.route.params.subscribe((params: Params) => { - this.collectionData = this.collectionDataService.findById(params['id']) - this.collectionData.payload - .subscribe(collection => this.logoData = collection.logo); + this.collectionData = this.collectionDataService.findById(params['id']); + this.subs.push(this.collectionData.payload + .subscribe(collection => this.logoData = collection.logo)); }); } + ngOnDestroy(): void { + this.subs.forEach(sub => sub.unsubscribe()); + } + universalInit() { } } diff --git a/src/backend/items.ts b/src/backend/items.ts index 5460cafa81..45d71fa092 100644 --- a/src/backend/items.ts +++ b/src/backend/items.ts @@ -94,7 +94,6 @@ export const ITEMS = { ], "_embedded": { "parents": [ - { "_links": { "self": { "href": "/collections/6547" }, @@ -108,6 +107,28 @@ export const ITEMS = { "type": "collection", "name": "Another Test Collection", "handle": "123456789/6547", + "metadata": [ + { + "key": "dc.rights", + "value": "

© 2005-2016 JOHN DOE SOME RIGHTS RESERVED

", + "language": null + }, + { + "key": "dc.description", + "value": "

Another introductory text dolor sit amet, consectetur adipiscing elit. Duis laoreet lorem erat, eget auctor est ultrices quis. Nullam ac tincidunt quam. In nec nisl odio. In egestas aliquam tincidunt.

\r\n

Integer vitae diam id dolor pharetra dignissim in sed enim. Vivamus pulvinar tristique sem a iaculis. Aenean ultricies dui vel facilisis laoreet. Integer porta erat eu ultrices rhoncus. Sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum.

", + "language": null + }, + { + "key": "dc.description.abstract", + "value": "Another collection for testing purposes", + "language": null + }, + { + "key": "dc.description.tableofcontents", + "value": "

Some more news sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum. Donec sed ultricies erat, nec sollicitudin mauris. Duis varius nulla quis quam vulputate, at hendrerit turpis rutrum. Integer nec facilisis sapien. Fusce fringilla malesuada lectus id pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae

", + "language": null + } + ] } ], "bundles": [ @@ -239,13 +260,36 @@ export const ITEMS = { "items": [ { "href": "/items/8871" }, { "href": "/items/9978" } - ] + ], + "logo": { "href": "/bitstreams/4688" } }, "id": "5179", "uuid": "9e32a2e2-6b91-4236-a361-995ccdc14c60", "type": "collection", "name": "A Test Collection", "handle": "123456789/5179", + "metadata": [ + { + "key": "dc.rights", + "value": "

© 2005-2016 JOHN DOE SOME RIGHTS RESERVED

", + "language": null + }, + { + "key": "dc.description", + "value": "

An introductory text dolor sit amet, consectetur adipiscing elit. Duis laoreet lorem erat, eget auctor est ultrices quis. Nullam ac tincidunt quam. In nec nisl odio. In egestas aliquam tincidunt.

\r\n

Integer vitae diam id dolor pharetra dignissim in sed enim. Vivamus pulvinar tristique sem a iaculis. Aenean ultricies dui vel facilisis laoreet. Integer porta erat eu ultrices rhoncus. Sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum.

", + "language": null + }, + { + "key": "dc.description.abstract", + "value": "A collection for testing purposes", + "language": null + }, + { + "key": "dc.description.tableofcontents", + "value": "

Some news sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum. Donec sed ultricies erat, nec sollicitudin mauris. Duis varius nulla quis quam vulputate, at hendrerit turpis rutrum. Integer nec facilisis sapien. Fusce fringilla malesuada lectus id pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae

", + "language": null + } + ] }, { "_links": { @@ -260,6 +304,28 @@ export const ITEMS = { "type": "collection", "name": "Another Test Collection", "handle": "123456789/6547", + "metadata": [ + { + "key": "dc.rights", + "value": "

© 2005-2016 JOHN DOE SOME RIGHTS RESERVED

", + "language": null + }, + { + "key": "dc.description", + "value": "

Another introductory text dolor sit amet, consectetur adipiscing elit. Duis laoreet lorem erat, eget auctor est ultrices quis. Nullam ac tincidunt quam. In nec nisl odio. In egestas aliquam tincidunt.

\r\n

Integer vitae diam id dolor pharetra dignissim in sed enim. Vivamus pulvinar tristique sem a iaculis. Aenean ultricies dui vel facilisis laoreet. Integer porta erat eu ultrices rhoncus. Sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum.

", + "language": null + }, + { + "key": "dc.description.abstract", + "value": "Another collection for testing purposes", + "language": null + }, + { + "key": "dc.description.tableofcontents", + "value": "

Some more news sed condimentum malesuada ex sit amet ullamcorper. Morbi a ipsum dolor. Vivamus interdum eget lacus ut fermentum. Donec sed ultricies erat, nec sollicitudin mauris. Duis varius nulla quis quam vulputate, at hendrerit turpis rutrum. Integer nec facilisis sapien. Fusce fringilla malesuada lectus id pulvinar. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae

", + "language": null + } + ] } ] } From 8c16918728b3a0f572057b3a4dcf5de218753a9d Mon Sep 17 00:00:00 2001 From: Christian Scheible Date: Fri, 16 Jun 2017 12:34:17 +0200 Subject: [PATCH 7/9] Added unsubscribe to community logo subscription. --- .../collection-page.component.html | 4 +- .../community-page.component.html | 2 +- .../community-page.component.ts | 18 +- src/backend/communities.ts | 168 +++++++++--------- 4 files changed, 100 insertions(+), 92 deletions(-) diff --git a/src/app/collection-page/collection-page.component.html b/src/app/collection-page/collection-page.component.html index f8bfdbc5de..64520d3e84 100644 --- a/src/app/collection-page/collection-page.component.html +++ b/src/app/collection-page/collection-page.component.html @@ -22,11 +22,11 @@ > + [hasInnerHtml]="true"> > + [title]="'collection.page.license'">
diff --git a/src/app/community-page/community-page.component.html b/src/app/community-page/community-page.component.html index 83f6a54033..8a1fbdf18c 100644 --- a/src/app/community-page/community-page.component.html +++ b/src/app/community-page/community-page.component.html @@ -16,7 +16,7 @@ [content]="(communityData.payload | async)?.sidebarText" [hasInnerHtml]="true" [title]="'community.page.news'"> - + ; logoData: RemoteData; + private subs: Subscription[] = []; constructor( private communityDataService: CommunityDataService, @@ -24,12 +26,16 @@ export class CommunityPageComponent implements OnInit { ngOnInit(): void { this.route.params.subscribe((params: Params) => { - this.communityData = this.communityDataService.findById(params['id']) - this.communityData.payload - .subscribe(community => this.logoData = community.logo); + this.communityData = this.communityDataService.findById(params['id']); + this.subs.push(this.communityData.payload + .subscribe(community => this.logoData = community.logo)); }); } + ngOnDestroy(): void { + this.subs.forEach(sub => sub.unsubscribe()); + } + universalInit() { } -} +} \ No newline at end of file diff --git a/src/backend/communities.ts b/src/backend/communities.ts index 02f474f66b..d301936cdf 100644 --- a/src/backend/communities.ts +++ b/src/backend/communities.ts @@ -1,87 +1,89 @@ -export const COMMUNITIES = [ - { - "name": "Community 1", - "handle": "10673/1", - "id": "6631", - "uuid": "83cd3281-f241-48be-9234-d876f8010d14", - "type": "community", - "metadata": [ - { - "key": "dc.description", - "value": "

This is the introductory text for the Sample Community on the DSpace Demonstration Site. It is editable by System or Community Administrators (of this Community).

\r\n

DSpace Communities may contain one or more Sub-Communities or Collections (of Items).

\r\n

This particular Community has its own logo (the DuraSpace logo).

", - "language": null - }, - { - "key": "dc.description.abstract", - "value": "This is a sample top-level community", - "language": null - }, - { - "key": "dc.description.tableofcontents", - "value": "

This is the news section for this Sample Community. System or Community Administrators (of this Community) can edit this News field.

", - "language": null - }, - { - "key": "dc.rights", - "value": "

If this Community had special copyright text to display, it would be displayed here.

", - "language": null - }, - { - "key": "dc.title", - "value": "Sample Community", - "language": null - } - ], - "_links": { - "self": { - "href": "http://dspace7.4science.it/dspace-spring-rest/api/core/community/9076bd16-e69a-48d6-9e41-0238cb40d863" - }, - "collections": [ - { "href": "/collections/5179" } +export const COMMUNITIES = { + "communities": [ + { + "name": "Community 1", + "handle": "10673/1", + "id": "6631", + "uuid": "83cd3281-f241-48be-9234-d876f8010d14", + "type": "community", + "metadata": [ + { + "key": "dc.description", + "value": "

This is the introductory text for the Sample Community on the DSpace Demonstration Site. It is editable by System or Community Administrators (of this Community).

\r\n

DSpace Communities may contain one or more Sub-Communities or Collections (of Items).

\r\n

This particular Community has its own logo (the DuraSpace logo).

", + "language": null + }, + { + "key": "dc.description.abstract", + "value": "This is a sample top-level community", + "language": null + }, + { + "key": "dc.description.tableofcontents", + "value": "

This is the news section for this Sample Community. System or Community Administrators (of this Community) can edit this News field.

", + "language": null + }, + { + "key": "dc.rights", + "value": "

If this Community had special copyright text to display, it would be displayed here.

", + "language": null + }, + { + "key": "dc.title", + "value": "Sample Community", + "language": null + } ], + "_links": { + "self": { + "href": "http://dspace7.4science.it/dspace-spring-rest/api/core/community/9076bd16-e69a-48d6-9e41-0238cb40d863" + }, + "collections": [ + { "href": "/collections/5179" } + ], "logo": { "href": "/bitstreams/4688" } - } - }, - { - "name": "Community 2", - "handle": "10673/2", - "id": "2365", - "uuid": "80eec4c6-70bd-4beb-b3d4-5d46c6343157", - "type": "community", - "metadata": [ - { - "key": "dc.description", - "value": "

This is the introductory text for the Sample Community on the DSpace Demonstration Site. It is editable by System or Community Administrators (of this Community).

\r\n

DSpace Communities may contain one or more Sub-Communities or Collections (of Items).

\r\n

This particular Community has its own logo (the DuraSpace logo).

", - "language": null - }, - { - "key": "dc.description.abstract", - "value": "This is a sample top-level community", - "language": null - }, - { - "key": "dc.description.tableofcontents", - "value": "

This is the news section for this Sample Community. System or Community Administrators (of this Community) can edit this News field.

", - "language": null - }, - { - "key": "dc.rights", - "value": "

If this Community had special copyright text to display, it would be displayed here.

", - "language": null - }, - { - "key": "dc.title", - "value": "Sample Community", - "language": null } - ], - "_links": { - "self": { - "href": "http://dspace7.4science.it/dspace-spring-rest/api/core/community/9076bd16-e69a-48d6-9e41-0238cb40d863" - }, - "collections": [ - { "href": "/collections/6547" } - ] + }, + { + "name": "Community 2", + "handle": "10673/2", + "id": "2365", + "uuid": "80eec4c6-70bd-4beb-b3d4-5d46c6343157", + "type": "community", + "metadata": [ + { + "key": "dc.description", + "value": "

This is the introductory text for the Sample Community on the DSpace Demonstration Site. It is editable by System or Community Administrators (of this Community).

\r\n

DSpace Communities may contain one or more Sub-Communities or Collections (of Items).

\r\n

This particular Community has its own logo (the DuraSpace logo).

", + "language": null + }, + { + "key": "dc.description.abstract", + "value": "This is a sample top-level community", + "language": null + }, + { + "key": "dc.description.tableofcontents", + "value": "

This is the news section for this Sample Community. System or Community Administrators (of this Community) can edit this News field.

", + "language": null + }, + { + "key": "dc.rights", + "value": "

If this Community had special copyright text to display, it would be displayed here.

", + "language": null + }, + { + "key": "dc.title", + "value": "Sample Community", + "language": null + } + ], + "_links": { + "self": { + "href": "http://dspace7.4science.it/dspace-spring-rest/api/core/community/9076bd16-e69a-48d6-9e41-0238cb40d863" + }, + "collections": [ + { "href": "/collections/6547" } + ] + } } - } -]; + ] +}; \ No newline at end of file From 145886e49708072d0ee5eca18a60097508e3715a Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Mon, 19 Jun 2017 18:18:33 +0200 Subject: [PATCH 8/9] Merge branch 'master' into live-rest-backend --- .../builders/remote-data-build.service.ts | 65 ++++++++----------- src/app/core/cache/object-cache.actions.ts | 9 ++- .../core/cache/object-cache.reducer.spec.ts | 15 +++-- src/app/core/cache/object-cache.reducer.ts | 4 +- src/app/core/cache/object-cache.service.ts | 29 +++++++-- src/app/core/data/request.effects.ts | 24 +++---- src/app/core/data/request.service.ts | 17 ++++- src/backend/communities.ts | 6 +- 8 files changed, 103 insertions(+), 66 deletions(-) diff --git a/src/app/core/cache/builders/remote-data-build.service.ts b/src/app/core/cache/builders/remote-data-build.service.ts index 6cf09353a8..7caa48fc07 100644 --- a/src/app/core/cache/builders/remote-data-build.service.ts +++ b/src/app/core/cache/builders/remote-data-build.service.ts @@ -26,53 +26,46 @@ export class RemoteDataBuildService { ) { } - //TODO refactor, nearly identical to buildList, only payload differs buildSingle( href: string, normalizedType: GenericConstructor ): RemoteData { - const requestObs = this.store.select('core', 'data', 'request', href); - const responseCacheObs = this.responseCache.get(href); + const requestHrefObs = this.objectCache.getRequestHrefBySelfLink(href); - const requestPending = requestObs.map((entry: RequestEntry) => hasValue(entry) && entry.requestPending).distinctUntilChanged(); + const requestObs = Observable.race( + this.store.select('core', 'data', 'request', href).filter(entry => hasValue(entry)), + requestHrefObs.flatMap(requestHref => + this.store.select('core', 'data', 'request', requestHref)).filter(entry => hasValue(entry)) + ); - const responsePending = requestObs.map((entry: RequestEntry) => hasValue(entry) && entry.responsePending).distinctUntilChanged(); + const responseCacheObs = Observable.race( + this.responseCache.get(href).filter(entry => hasValue(entry)), + requestHrefObs.flatMap(requestHref => this.responseCache.get(requestHref)).filter(entry => hasValue(entry)) + ); + + const requestPending = requestObs.map((entry: RequestEntry) => entry.requestPending).distinctUntilChanged(); + + const responsePending = requestObs.map((entry: RequestEntry) => entry.responsePending).distinctUntilChanged(); const isSuccessFul = responseCacheObs - .map((entry: ResponseCacheEntry) => hasValue(entry) && entry.response.isSuccessful).distinctUntilChanged(); + .map((entry: ResponseCacheEntry) => entry.response.isSuccessful).distinctUntilChanged(); const errorMessage = responseCacheObs - .filter((entry: ResponseCacheEntry) => hasValue(entry) && !entry.response.isSuccessful) + .filter((entry: ResponseCacheEntry) => !entry.response.isSuccessful) .map((entry: ResponseCacheEntry) => ( entry.response).errorMessage) .distinctUntilChanged(); const statusCode = responseCacheObs - .filter((entry: ResponseCacheEntry) => hasValue(entry)) .map((entry: ResponseCacheEntry) => entry.response.statusCode) .distinctUntilChanged(); const pageInfo = responseCacheObs - .filter((entry: ResponseCacheEntry) => hasValue(entry) - && hasValue(entry.response) && hasValue(entry.response['pageInfo'])) + .filter((entry: ResponseCacheEntry) => hasValue(entry.response) && hasValue(entry.response['pageInfo'])) .map((entry: ResponseCacheEntry) => ( entry.response).pageInfo) .distinctUntilChanged(); - const payload = - Observable.race( - this.objectCache.getBySelfLink(href, normalizedType), - responseCacheObs - .filter((entry: ResponseCacheEntry) => hasValue(entry) && entry.response.isSuccessful) - .map((entry: ResponseCacheEntry) => ( entry.response).resourceUUIDs) - .flatMap((resourceUUIDs: Array) => { - if (isNotEmpty(resourceUUIDs)) { - return this.objectCache.get(resourceUUIDs[0], normalizedType); - } - else { - return Observable.of(undefined); - } - }) - .distinctUntilChanged() - ).map((normalized: TNormalized) => { + const payload = this.objectCache.getBySelfLink(href, normalizedType) + .map((normalized: TNormalized) => { return this.build(normalized); }); @@ -88,39 +81,37 @@ export class RemoteDataBuildService { ); } - //TODO refactor, nearly identical to buildSingle, only payload differs buildList( href: string, normalizedType: GenericConstructor ): RemoteData { - const requestObs = this.store.select('core', 'data', 'request', href); - const responseCacheObs = this.responseCache.get(href); + const requestObs = this.store.select('core', 'data', 'request', href) + .filter(entry => hasValue(entry)); + const responseCacheObs = this.responseCache.get(href).filter(entry => hasValue(entry)); - const requestPending = requestObs.map((entry: RequestEntry) => hasValue(entry) && entry.requestPending).distinctUntilChanged(); + const requestPending = requestObs.map((entry: RequestEntry) => entry.requestPending).distinctUntilChanged(); - const responsePending = requestObs.map((entry: RequestEntry) => hasValue(entry) && entry.responsePending).distinctUntilChanged(); + const responsePending = requestObs.map((entry: RequestEntry) => entry.responsePending).distinctUntilChanged(); const isSuccessFul = responseCacheObs - .map((entry: ResponseCacheEntry) => hasValue(entry) && entry.response.isSuccessful).distinctUntilChanged(); + .map((entry: ResponseCacheEntry) => entry.response.isSuccessful).distinctUntilChanged(); const errorMessage = responseCacheObs - .filter((entry: ResponseCacheEntry) => hasValue(entry) && !entry.response.isSuccessful) + .filter((entry: ResponseCacheEntry) => !entry.response.isSuccessful) .map((entry: ResponseCacheEntry) => ( entry.response).errorMessage) .distinctUntilChanged(); const statusCode = responseCacheObs - .filter((entry: ResponseCacheEntry) => hasValue(entry)) .map((entry: ResponseCacheEntry) => entry.response.statusCode) .distinctUntilChanged(); const pageInfo = responseCacheObs - .filter((entry: ResponseCacheEntry) => hasValue(entry) - && hasValue(entry.response) && hasValue(entry.response['pageInfo'])) + .filter((entry: ResponseCacheEntry) => hasValue(entry.response) && hasValue(entry.response['pageInfo'])) .map((entry: ResponseCacheEntry) => ( entry.response).pageInfo) .distinctUntilChanged(); const payload = responseCacheObs - .filter((entry: ResponseCacheEntry) => hasValue(entry) && entry.response.isSuccessful) + .filter((entry: ResponseCacheEntry) => entry.response.isSuccessful) .map((entry: ResponseCacheEntry) => ( entry.response).resourceUUIDs) .flatMap((resourceUUIDs: Array) => { return this.objectCache.getList(resourceUUIDs, normalizedType) diff --git a/src/app/core/cache/object-cache.actions.ts b/src/app/core/cache/object-cache.actions.ts index cc9e557de4..9d34c01219 100644 --- a/src/app/core/cache/object-cache.actions.ts +++ b/src/app/core/cache/object-cache.actions.ts @@ -20,6 +20,7 @@ export class AddToObjectCacheAction implements Action { objectToCache: CacheableObject; timeAdded: number; msToLive: number; + requestHref: string; }; /** @@ -31,9 +32,13 @@ export class AddToObjectCacheAction implements Action { * the time it was added * @param msToLive * the amount of milliseconds before it should expire + * @param requestHref + * The href of the request that resulted in this object + * This isn't necessarily the same as the object's self + * link, it could have been part of a list for example */ - constructor(objectToCache: CacheableObject, timeAdded: number, msToLive: number) { - this.payload = { objectToCache, timeAdded, msToLive }; + constructor(objectToCache: CacheableObject, timeAdded: number, msToLive: number, requestHref: string) { + this.payload = { objectToCache, timeAdded, msToLive, requestHref }; } } diff --git a/src/app/core/cache/object-cache.reducer.spec.ts b/src/app/core/cache/object-cache.reducer.spec.ts index 4d8e116e4f..3331be569e 100644 --- a/src/app/core/cache/object-cache.reducer.spec.ts +++ b/src/app/core/cache/object-cache.reducer.spec.ts @@ -24,7 +24,8 @@ describe("objectCacheReducer", () => { foo: "bar" }, timeAdded: new Date().getTime(), - msToLive: 900000 + msToLive: 900000, + requestHref: "https://rest.api/endpoint/uuid1" }, [uuid2]: { data: { @@ -32,7 +33,8 @@ describe("objectCacheReducer", () => { foo: "baz" }, timeAdded: new Date().getTime(), - msToLive: 900000 + msToLive: 900000, + requestHref: "https://rest.api/endpoint/uuid2" } }; deepFreeze(testState); @@ -56,7 +58,8 @@ describe("objectCacheReducer", () => { const objectToCache = {uuid: uuid1}; const timeAdded = new Date().getTime(); const msToLive = 900000; - const action = new AddToObjectCacheAction(objectToCache, timeAdded, msToLive); + const requestHref = "https://rest.api/endpoint/uuid1"; + const action = new AddToObjectCacheAction(objectToCache, timeAdded, msToLive, requestHref); const newState = objectCacheReducer(state, action); expect(newState[uuid1].data).toEqual(objectToCache); @@ -68,7 +71,8 @@ describe("objectCacheReducer", () => { const objectToCache = {uuid: uuid1, foo: "baz", somethingElse: true}; const timeAdded = new Date().getTime(); const msToLive = 900000; - const action = new AddToObjectCacheAction(objectToCache, timeAdded, msToLive); + const requestHref = "https://rest.api/endpoint/uuid1"; + const action = new AddToObjectCacheAction(objectToCache, timeAdded, msToLive, requestHref); const newState = objectCacheReducer(testState, action); expect(newState[uuid1].data['foo']).toBe("baz"); @@ -80,7 +84,8 @@ describe("objectCacheReducer", () => { const objectToCache = {uuid: uuid1}; const timeAdded = new Date().getTime(); const msToLive = 900000; - const action = new AddToObjectCacheAction(objectToCache, timeAdded, msToLive); + const requestHref = "https://rest.api/endpoint/uuid1"; + const action = new AddToObjectCacheAction(objectToCache, timeAdded, msToLive, requestHref); deepFreeze(state); objectCacheReducer(state, action); diff --git a/src/app/core/cache/object-cache.reducer.ts b/src/app/core/cache/object-cache.reducer.ts index 85e1fdc2b3..113a06cd06 100644 --- a/src/app/core/cache/object-cache.reducer.ts +++ b/src/app/core/cache/object-cache.reducer.ts @@ -22,6 +22,7 @@ export class ObjectCacheEntry implements CacheEntry { data: CacheableObject; timeAdded: number; msToLive: number; + requestHref: string; } /** @@ -83,7 +84,8 @@ function addToObjectCache(state: ObjectCacheState, action: AddToObjectCacheActio [action.payload.objectToCache.uuid]: { data: action.payload.objectToCache, timeAdded: action.payload.timeAdded, - msToLive: action.payload.msToLive + msToLive: action.payload.msToLive, + requestHref: action.payload.requestHref } }); } diff --git a/src/app/core/cache/object-cache.service.ts b/src/app/core/cache/object-cache.service.ts index ec0bea4a97..63bfd44c82 100644 --- a/src/app/core/cache/object-cache.service.ts +++ b/src/app/core/cache/object-cache.service.ts @@ -22,9 +22,13 @@ export class ObjectCacheService { * The object to add * @param msToLive * The number of milliseconds it should be cached for + * @param requestHref + * The href of the request that resulted in this object + * This isn't necessarily the same as the object's self + * link, it could have been part of a list for example */ - add(objectToCache: CacheableObject, msToLive: number): void { - this.store.dispatch(new AddToObjectCacheAction(objectToCache, new Date().getTime(), msToLive)); + add(objectToCache: CacheableObject, msToLive: number, requestHref: string): void { + this.store.dispatch(new AddToObjectCacheAction(objectToCache, new Date().getTime(), msToLive, requestHref)); } /** @@ -54,9 +58,7 @@ export class ObjectCacheService { * An observable of the requested object */ get(uuid: string, type: GenericConstructor): Observable { - return this.store.select('core', 'cache', 'object', uuid) - .filter(entry => this.isValid(entry)) - .distinctUntilChanged() + return this.getEntry(uuid) .map((entry: ObjectCacheEntry) => Object.assign(new type(), entry.data)); } @@ -65,6 +67,23 @@ export class ObjectCacheService { .flatMap((uuid: string) => this.get(uuid, type)) } + private getEntry(uuid: string): Observable { + return this.store.select('core', 'cache', 'object', uuid) + .filter(entry => this.isValid(entry)) + .distinctUntilChanged(); + } + + getRequestHref(uuid: string): Observable { + return this.getEntry(uuid) + .map((entry: ObjectCacheEntry) => entry.requestHref) + .distinctUntilChanged(); + } + + getRequestHrefBySelfLink(self: string): Observable { + return this.store.select('core', 'index', 'href', self) + .flatMap((uuid: string) => this.getRequestHref(uuid)); + } + /** * Get an observable for an array of objects of the same type * with the specified UUIDs diff --git a/src/app/core/data/request.effects.ts b/src/app/core/data/request.effects.ts index c09bf7b236..8e0de916f8 100644 --- a/src/app/core/data/request.effects.ts +++ b/src/app/core/data/request.effects.ts @@ -49,7 +49,7 @@ export class RequestEffects { }) .flatMap((entry: RequestEntry) => { return this.restApi.get(entry.request.href) - .map((data: DSpaceRESTV2Response) => new SuccessResponse(this.process(data.payload), data.statusCode, this.processPageInfo(data.payload.page))) + .map((data: DSpaceRESTV2Response) => new SuccessResponse(this.process(data.payload, entry.request.href), data.statusCode, this.processPageInfo(data.payload.page))) .do((response: Response) => this.responseCache.add(entry.request.href, response, this.EnvConfig.cache.msToLive)) .map((response: Response) => new RequestCompleteAction(entry.request.href)) .catch((error: RequestError) => Observable.of(new ErrorResponse(error)) @@ -57,14 +57,14 @@ export class RequestEffects { .map((response: Response) => new RequestCompleteAction(entry.request.href))); }); - protected process(data: any): Array { + protected process(data: any, requestHref: string): Array { if (isNotEmpty(data)) { if (isPaginatedResponse(data)) { - return this.process(data._embedded); + return this.process(data._embedded, requestHref); } else if (isObjectLevel(data)) { - return this.deserializeAndCache(data); + return this.deserializeAndCache(data, requestHref); } else { let uuids = []; @@ -72,14 +72,14 @@ export class RequestEffects { .filter(property => data.hasOwnProperty(property)) .filter(property => hasValue(data[property])) .forEach(property => { - uuids = [...uuids, ...this.deserializeAndCache(data[property])]; + uuids = [...uuids, ...this.deserializeAndCache(data[property], requestHref)]; }); return uuids; } } } - protected deserializeAndCache(obj): Array { + protected deserializeAndCache(obj, requestHref: string): Array { let type: ResourceType; const isArray = Array.isArray(obj); @@ -103,19 +103,19 @@ export class RequestEffects { if (isArray) { obj.forEach(o => { if (isNotEmpty(o._embedded)) { - this.process(o._embedded); + this.process(o._embedded, requestHref); } }); const normalizedObjArr = serializer.deserializeArray(obj); - normalizedObjArr.forEach(t => this.addToObjectCache(t)); + normalizedObjArr.forEach(t => this.addToObjectCache(t, requestHref)); return normalizedObjArr.map(t => t.uuid); } else { if (isNotEmpty(obj._embedded)) { - this.process(obj._embedded); + this.process(obj._embedded, requestHref); } const normalizedObj = serializer.deserialize(obj); - this.addToObjectCache(normalizedObj); + this.addToObjectCache(normalizedObj, requestHref); return [normalizedObj.uuid]; } @@ -132,11 +132,11 @@ export class RequestEffects { } } - protected addToObjectCache(co: CacheableObject): void { + protected addToObjectCache(co: CacheableObject, requestHref: string): void { if (hasNoValue(co) || hasNoValue(co.uuid)) { throw new Error('The server returned an invalid object'); } - this.objectCache.add(co, this.EnvConfig.cache.msToLive); + this.objectCache.add(co, this.EnvConfig.cache.msToLive, requestHref); } protected processPageInfo(pageObj: any): PageInfo { diff --git a/src/app/core/data/request.service.ts b/src/app/core/data/request.service.ts index 35ce8ea078..47e4574955 100644 --- a/src/app/core/data/request.service.ts +++ b/src/app/core/data/request.service.ts @@ -8,6 +8,9 @@ import { RequestConfigureAction, RequestExecuteAction } from "./request.actions" import { ResponseCacheService } from "../cache/response-cache.service"; import { ObjectCacheService } from "../cache/object-cache.service"; import { CacheableObject } from "../cache/object-cache.reducer"; +import { ResponseCacheEntry } from "../cache/response-cache.reducer"; +import { request } from "http"; +import { SuccessResponse } from "../cache/response-cache.models"; @Injectable() export class RequestService { @@ -35,7 +38,19 @@ export class RequestService { } configure(request: Request): void { - const isCached = this.objectCache.hasBySelfLink(request.href); + let isCached = this.objectCache.hasBySelfLink(request.href); + + if (!isCached && this.responseCache.has(request.href)) { + //if it isn't cached it may be a list endpoint, if so verify + //every object included in the response is still cached + this.responseCache.get(request.href) + .take(1) + .filter((entry: ResponseCacheEntry) => entry.response.isSuccessful) + .map((entry: ResponseCacheEntry) => ( entry.response).resourceUUIDs) + .map((resourceUUIDs: Array) => resourceUUIDs.every(uuid => this.objectCache.has(uuid))) + .subscribe(c => isCached = c); + } + const isPending = this.isPending(request.href); if (!(isCached || isPending)) { diff --git a/src/backend/communities.ts b/src/backend/communities.ts index d301936cdf..35a86aeaf9 100644 --- a/src/backend/communities.ts +++ b/src/backend/communities.ts @@ -35,7 +35,7 @@ export const COMMUNITIES = { ], "_links": { "self": { - "href": "http://dspace7.4science.it/dspace-spring-rest/api/core/community/9076bd16-e69a-48d6-9e41-0238cb40d863" + "href": "/communities/6631" }, "collections": [ { "href": "/collections/5179" } @@ -78,7 +78,7 @@ export const COMMUNITIES = { ], "_links": { "self": { - "href": "http://dspace7.4science.it/dspace-spring-rest/api/core/community/9076bd16-e69a-48d6-9e41-0238cb40d863" + "href": "/communities/2365" }, "collections": [ { "href": "/collections/6547" } @@ -86,4 +86,4 @@ export const COMMUNITIES = { } } ] -}; \ No newline at end of file +}; From b69f2ff4cb3277e672a94b058ada67fc9e59d220 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Tue, 20 Jun 2017 11:22:26 +0200 Subject: [PATCH 9/9] updating tests --- .../core/cache/object-cache.service.spec.ts | 5 +- .../dspace-rest-v2.serializer.spec.ts | 12 ++-- src/app/core/shared/item.model.spec.ts | 65 ++++++++++++------- 3 files changed, 50 insertions(+), 32 deletions(-) diff --git a/src/app/core/cache/object-cache.service.spec.ts b/src/app/core/cache/object-cache.service.spec.ts index 827e39ab7e..dd77cab110 100644 --- a/src/app/core/cache/object-cache.service.spec.ts +++ b/src/app/core/cache/object-cache.service.spec.ts @@ -20,6 +20,7 @@ describe("ObjectCacheService", () => { let store: Store; const uuid = '1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; + const requestHref = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; const timestamp = new Date().getTime(); const msToLive = 900000; const objectToCache = { @@ -44,8 +45,8 @@ describe("ObjectCacheService", () => { describe("add", () => { it("should dispatch an ADD action with the object to add, the time to live, and the current timestamp", () => { - service.add(objectToCache, msToLive); - expect(store.dispatch).toHaveBeenCalledWith(new AddToObjectCacheAction(objectToCache, timestamp, msToLive)); + service.add(objectToCache, msToLive, requestHref); + expect(store.dispatch).toHaveBeenCalledWith(new AddToObjectCacheAction(objectToCache, timestamp, msToLive, requestHref)); }); }); diff --git a/src/app/core/dspace-rest-v2/dspace-rest-v2.serializer.spec.ts b/src/app/core/dspace-rest-v2/dspace-rest-v2.serializer.spec.ts index 67914c2a92..097717b5e2 100644 --- a/src/app/core/dspace-rest-v2/dspace-rest-v2.serializer.spec.ts +++ b/src/app/core/dspace-rest-v2/dspace-rest-v2.serializer.spec.ts @@ -60,8 +60,8 @@ describe("DSpaceRESTv2Serializer", () => { it("should turn a model in to a valid document", () => { const serializer = new DSpaceRESTv2Serializer(TestModel); const doc = serializer.serialize(testModels[0]); - expect(testModels[0].id).toBe(doc._embedded.id); - expect(testModels[0].name).toBe(doc._embedded.name); + expect(testModels[0].id).toBe(doc.id); + expect(testModels[0].name).toBe(doc.name); }); }); @@ -72,10 +72,10 @@ describe("DSpaceRESTv2Serializer", () => { const serializer = new DSpaceRESTv2Serializer(TestModel); const doc = serializer.serializeArray(testModels); - expect(testModels[0].id).toBe(doc._embedded[0].id); - expect(testModels[0].name).toBe(doc._embedded[0].name); - expect(testModels[1].id).toBe(doc._embedded[1].id); - expect(testModels[1].name).toBe(doc._embedded[1].name); + expect(testModels[0].id).toBe(doc[0].id); + expect(testModels[0].name).toBe(doc[0].name); + expect(testModels[1].id).toBe(doc[1].id); + expect(testModels[1].name).toBe(doc[1].name); }); }); diff --git a/src/app/core/shared/item.model.spec.ts b/src/app/core/shared/item.model.spec.ts index e20bd6e592..d10b7d3046 100644 --- a/src/app/core/shared/item.model.spec.ts +++ b/src/app/core/shared/item.model.spec.ts @@ -1,9 +1,9 @@ -import { TestBed, async } from '@angular/core/testing'; import { Item } from "./item.model"; -import { Bundle } from "./bundle.model"; import { Observable } from "rxjs"; import { RemoteData } from "../data/remote-data"; import { Bitstream } from "./bitstream.model"; +import { isEmpty } from "../../shared/empty.util"; +import { PageInfo } from "./page-info.model"; describe('Item', () => { @@ -17,23 +17,25 @@ describe('Item', () => { const bitstream2Path = "otherfile.doc"; const nonExistingBundleName = "c1e568f7-d14e-496b-bdd7-07026998cc00"; - let remoteBundles; - let thumbnailBundle; - let originalBundle; + let bitstreams; + let remoteDataThumbnail; + let remoteDataFiles; + let remoteDataAll; beforeEach(() => { const thumbnail = { retrieve: thumbnailPath }; - const bitstreams = [{ + bitstreams = [{ retrieve: bitstream1Path }, { retrieve: bitstream2Path }]; - const remoteDataThumbnail = createRemoteDataObject(thumbnail); - const remoteDataFiles = createRemoteDataObject(bitstreams); + remoteDataThumbnail = createRemoteDataObject(thumbnail); + remoteDataFiles = createRemoteDataObject(bitstreams); + remoteDataAll = createRemoteDataObject([...bitstreams, thumbnail]); // Create Bundles @@ -50,32 +52,30 @@ describe('Item', () => { bitstreams: remoteDataFiles }]; - remoteBundles = createRemoteDataObject(bundles); - item = Object.assign(new Item(), { bundles: remoteBundles }); + item = Object.assign(new Item(), { bitstreams: remoteDataAll}); }); - it('should return the bundle with the given name of this item when the bundle exists', () => { - let name: string = thumbnailBundleName; - let bundle: Observable = item.getBundle(name); - bundle.map(b => expect(b.name).toBe(name)); + it('should return the bitstreams related to this item with the specified bundle name', () => { + const bitObs: Observable = item.getBitstreamsByBundleName(thumbnailBundleName); + bitObs.take(1).subscribe(bs => + expect(bs.every(b => b.name === thumbnailBundleName)).toBeTruthy()); }); - it('should return null when no bundle with this name exists for this item', () => { - let name: string = nonExistingBundleName; - let bundle: Observable = item.getBundle(name); - bundle.map(b => expect(b).toBeUndefined()); + it('should return an empty array when no bitstreams with this bundleName exist for this item', () => { + const bitstreams: Observable = item.getBitstreamsByBundleName(nonExistingBundleName); + bitstreams.take(1).subscribe(bs => expect(isEmpty(bs)).toBeTruthy()); }); describe("get thumbnail", () => { beforeEach(() => { - spyOn(item, 'getBundle').and.returnValue(Observable.of(thumbnailBundle)); + spyOn(item, 'getBitstreamsByBundleName').and.returnValue(Observable.of([remoteDataThumbnail])); }); - it('should return the thumbnail (the primaryBitstream in the bundle "THUMBNAIL") of this item', () => { + it('should return the thumbnail of this item', () => { let path: string = thumbnailPath; let bitstream: Observable = item.getThumbnail(); bitstream.map(b => expect(b.retrieve).toBe(path)); @@ -85,10 +85,10 @@ describe('Item', () => { describe("get files", () => { beforeEach(() => { - spyOn(item, 'getBundle').and.returnValue(Observable.of(originalBundle)); + spyOn(item, 'getBitstreamsByBundleName').and.returnValue(Observable.of(bitstreams)); }); - it('should return all files in the ORIGINAL bundle', () => { + it('should return all bitstreams with "ORIGINAL" as bundleName', () => { let paths = [bitstream1Path, bitstream2Path]; let files: Observable = item.getFiles(); @@ -110,6 +110,23 @@ describe('Item', () => { }); function createRemoteDataObject(object: Object) { - return new RemoteData("", Observable.of(false), Observable.of(false), Observable.of(true), Observable.of(undefined), Observable.of(object)); + const self = ""; + const requestPending = Observable.of(false); + const responsePending = Observable.of(false); + const isSuccessful = Observable.of(true); + const errorMessage = Observable.of(undefined); + const statusCode = Observable.of("200"); + const pageInfo = Observable.of(new PageInfo()); + const payload = Observable.of(object); + return new RemoteData( + self, + requestPending, + responsePending, + isSuccessful, + errorMessage, + statusCode, + pageInfo, + payload + ); -} \ No newline at end of file +}