diff --git a/resources/i18n/en.json b/resources/i18n/en.json index 95358dc446..43b90d7165 100644 --- a/resources/i18n/en.json +++ b/resources/i18n/en.json @@ -4,7 +4,6 @@ "link.dspace": "DSpace software", "link.duraspace": "DuraSpace" }, - "item": { "page": { "author": "Author", @@ -12,24 +11,31 @@ "date": "Date", "uri": "URI", "files": "Files", - "collections": "Collections" + "collections": "Collections", + "filesection": { + "download": "Download", + "name": "Name:", + "format": "Format:", + "size": "Size:", + "description": "Description:" + }, + "link": { + "simple": "Simple item page", + "full": "Full item page" + } } }, - "nav": { "home": "Home" }, - "pagination": { "results-per-page": "Results Per Page", "showing": { - "label" : "Now showing items ", + "label": "Now showing items ", "detail": "{{ range }} of {{ total }}" } }, - "title": "DSpace", - "404": { "help": "We can't find the page you're looking for. The page may have been moved or deleted. You can use the button below to get back to the home page. ", "page-not-found": "page not found", @@ -37,7 +43,6 @@ "home-page": "Take me to the home page" } }, - "home": { "top-level-communities": { "head": "Communities in DSpace", 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 af47b62fe0..2096d47459 100644 --- a/src/app/core/cache/builders/remote-data-build.service.ts +++ b/src/app/core/cache/builders/remote-data-build.service.ts @@ -135,9 +135,12 @@ export class RemoteDataBuildService { }); }, 0); - links[relationship] = normalized[relationship].map((href: string) => { - return this.buildSingle(href, resourceConstructor); + let rdArr = []; + normalized[relationship].forEach((href: string) => { + rdArr.push(this.buildSingle(href, resourceConstructor)); }); + + links[relationship] = this.aggregate(rdArr); } else { // without the setTimeout, the actions inside requestService.configure @@ -154,4 +157,49 @@ export class RemoteDataBuildService { const domainModel = getMapsTo(normalized.constructor); return Object.assign(new domainModel(), normalized, links); } + + aggregate(input: RemoteData[]): RemoteData { + const requestPending = Observable.combineLatest( + ...input.map(rd => rd.isRequestPending), + ).map((...pendingArray) => pendingArray.every(e => e === true)) + .distinctUntilChanged(); + + const responsePending = Observable.combineLatest( + ...input.map(rd => rd.isResponsePending), + ).map((...pendingArray) => pendingArray.every(e => e === true)) + .distinctUntilChanged(); + + const isSuccessFul = Observable.combineLatest( + ...input.map(rd => rd.hasSucceeded), + ).map((...successArray) => successArray.every(e => e === true)) + .distinctUntilChanged(); + + const errorMessage = Observable.combineLatest( + ...input.map(rd => rd.errorMessage), + ).map((...errors) => errors + .map((e, idx) => { + if (hasValue(e)) { + return `[${idx}]: ${e}`; + } + }) + .filter(e => hasValue(e)) + .join(", ") + ); + + const payload = > Observable.combineLatest( + ...input.map(rd => rd.payload) + ); + + return new RemoteData( + // This is an aggregated object, it doesn't necessarily correspond + // to a single REST endpoint, so instead of a self link, use the + // current time in ms for a somewhat unique id + `${new Date().getTime()}`, + requestPending, + responsePending, + isSuccessFul, + errorMessage, + payload + ); + } } diff --git a/src/app/core/cache/models/normalized-bitstream.model.ts b/src/app/core/cache/models/normalized-bitstream.model.ts index 57b4f63346..b6df211c2e 100644 --- a/src/app/core/cache/models/normalized-bitstream.model.ts +++ b/src/app/core/cache/models/normalized-bitstream.model.ts @@ -21,8 +21,14 @@ export class NormalizedBitstream extends NormalizedDSpaceObject { /** * The mime type of this Bitstream */ + @autoserialize mimetype: string; + /** + * The format of this Bitstream + */ + format: string; + /** * The description of this Bitstream */ diff --git a/src/app/core/shared/bitstream.model.ts b/src/app/core/shared/bitstream.model.ts index 5325e395d8..06bdf41f30 100644 --- a/src/app/core/shared/bitstream.model.ts +++ b/src/app/core/shared/bitstream.model.ts @@ -27,7 +27,7 @@ export class Bitstream extends DSpaceObject { /** * An array of Bundles that are direct parents of this Bitstream */ - parents: Array>; + parents: RemoteData; /** * The Bundle that owns this Bitstream diff --git a/src/app/core/shared/bundle.model.ts b/src/app/core/shared/bundle.model.ts index 7c2f6b05d4..8f3a284fb6 100644 --- a/src/app/core/shared/bundle.model.ts +++ b/src/app/core/shared/bundle.model.ts @@ -12,13 +12,13 @@ export class Bundle extends DSpaceObject { /** * An array of Items that are direct parents of this Bundle */ - parents: Array>; + parents: RemoteData; /** * The Item that owns this Bundle */ owner: Item; - bitstreams: Array> + bitstreams: RemoteData } diff --git a/src/app/core/shared/collection.model.ts b/src/app/core/shared/collection.model.ts index 4287eff63c..30814726b8 100644 --- a/src/app/core/shared/collection.model.ts +++ b/src/app/core/shared/collection.model.ts @@ -58,13 +58,13 @@ export class Collection extends DSpaceObject { /** * An array of Collections that are direct parents of this Collection */ - parents: Array>; + parents: RemoteData; /** * The Collection that owns this Collection */ owner: Collection; - items: Array>; + items: RemoteData; } diff --git a/src/app/core/shared/community.model.ts b/src/app/core/shared/community.model.ts index 9639abd258..67c8211fd2 100644 --- a/src/app/core/shared/community.model.ts +++ b/src/app/core/shared/community.model.ts @@ -50,13 +50,13 @@ export class Community extends DSpaceObject { /** * An array of Communities that are direct parents of this Community */ - parents: Array>; + parents: RemoteData; /** * The Community that owns this Community */ owner: Community; - collections: Array>; + collections: RemoteData; } diff --git a/src/app/core/shared/dspace-object.model.ts b/src/app/core/shared/dspace-object.model.ts index 9609782735..ca7c67207a 100644 --- a/src/app/core/shared/dspace-object.model.ts +++ b/src/app/core/shared/dspace-object.model.ts @@ -39,7 +39,7 @@ export abstract class DSpaceObject implements CacheableObject { /** * An array of DSpaceObjects that are direct parents of this DSpaceObject */ - parents: Array>; + parents: RemoteData; /** * The DSpaceObject that owns this DSpaceObject diff --git a/src/app/core/shared/item.model.spec.ts b/src/app/core/shared/item.model.spec.ts index 99ce0271d1..e20bd6e592 100644 --- a/src/app/core/shared/item.model.spec.ts +++ b/src/app/core/shared/item.model.spec.ts @@ -17,8 +17,7 @@ describe('Item', () => { const bitstream2Path = "otherfile.doc"; const nonExistingBundleName = "c1e568f7-d14e-496b-bdd7-07026998cc00"; - let remoteThumbnailBundle; - let remoteOriginalBundle; + let remoteBundles; let thumbnailBundle; let originalBundle; @@ -27,34 +26,33 @@ describe('Item', () => { retrieve: thumbnailPath }; - const bitstream1 = { + const bitstreams = [{ retrieve: bitstream1Path - }; - const bitstream2 = { + }, { retrieve: bitstream2Path - }; + }]; const remoteDataThumbnail = createRemoteDataObject(thumbnail); - const remoteDataFile1 = createRemoteDataObject(bitstream1); - const remoteDataFile2 = createRemoteDataObject(bitstream2); + const remoteDataFiles = createRemoteDataObject(bitstreams); // Create Bundles - thumbnailBundle = { + const bundles = + [ + { name: thumbnailBundleName, primaryBitstream: remoteDataThumbnail - }; + }, - originalBundle = { + { name: originalBundleName, - bitstreams: [remoteDataFile1, remoteDataFile2] - }; + bitstreams: remoteDataFiles + }]; - remoteThumbnailBundle = createRemoteDataObject(thumbnailBundle); - remoteOriginalBundle = createRemoteDataObject(originalBundle); + remoteBundles = createRemoteDataObject(bundles); - item = Object.assign(new Item(), { bundles: [remoteThumbnailBundle, remoteOriginalBundle] }); + item = Object.assign(new Item(), { bundles: remoteBundles }); }); @@ -68,11 +66,10 @@ describe('Item', () => { 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).toBeNull()); + bundle.map(b => expect(b).toBeUndefined()); }); - describe("get thumbnail", () => { beforeEach(() => { spyOn(item, 'getBundle').and.returnValue(Observable.of(thumbnailBundle)); @@ -94,17 +91,15 @@ describe('Item', () => { it('should return all files in the ORIGINAL bundle', () => { let paths = [bitstream1Path, bitstream2Path]; - let files: Observable>> = item.getFiles(); + let files: Observable = item.getFiles(); let index = 0; files.map(f => expect(f.length).toBe(2)); files.subscribe( array => array.forEach( - observableFile => observableFile.subscribe( - file => { - expect(file.retrieve).toBe(paths[index]); - index++; - } - ) + file => { + expect(file.retrieve).toBe(paths[index]); + index++; + } ) ) }); diff --git a/src/app/core/shared/item.model.ts b/src/app/core/shared/item.model.ts index 8a589822d1..a3e098eed9 100644 --- a/src/app/core/shared/item.model.ts +++ b/src/app/core/shared/item.model.ts @@ -31,14 +31,14 @@ export class Item extends DSpaceObject { /** * An array of Collections that are direct parents of this Item */ - parents: Array>; + parents: RemoteData; /** * The Collection that owns this Item */ owner: Collection; - bundles: Array>; + bundles: RemoteData; /** @@ -47,29 +47,40 @@ export class Item extends DSpaceObject { */ getThumbnail(): Observable { const bundle: Observable = this.getBundle("THUMBNAIL"); - return bundle.flatMap( - bundle => { - if (bundle != null) { - return bundle.primaryBitstream.payload; - } - else { - return Observable.of(undefined); - } - } - ); + return bundle + .filter(bundle => hasValue(bundle)) + .flatMap(bundle => bundle.primaryBitstream.payload) + .startWith(undefined); + } + + /** + * Retrieves the thumbnail for the given original of this item + * @returns {Observable} the primaryBitstream of the "THUMBNAIL" bundle + */ + getThumbnailForOriginal(original: Bitstream): Observable { + const bundle: Observable = this.getBundle("THUMBNAIL"); + return bundle + .filter(bundle => hasValue(bundle)) + .flatMap(bundle => bundle + .bitstreams.payload.map(files => files + .find(thumbnail => thumbnail + .name.startsWith(original.name) + ) + ) + ) + .startWith(undefined);; } /** * Retrieves all files that should be displayed on the item page of this item * @returns {Observable>>} an array of all Bitstreams in the "ORIGINAL" bundle */ - getFiles(): Observable>> { - const bundle: Observable = this.getBundle("ORIGINAL"); - return bundle.map(bundle => { - if (hasValue(bundle) && Array.isArray(bundle.bitstreams)) { - return bundle.bitstreams.map(bitstream => bitstream.payload) - } - }); + getFiles(name: String = "ORIGINAL"): Observable { + const bundle: Observable = this.getBundle(name); + return bundle + .filter(bundle => hasValue(bundle)) + .flatMap(bundle => bundle.bitstreams.payload) + .startWith([]); } /** @@ -78,22 +89,14 @@ export class Item extends DSpaceObject { * @returns {Observable} the Bundle that belongs to this item with the given name */ getBundle(name: String): Observable { - return Observable.combineLatest( - ...this.bundles.map(b => b.payload), - (...bundles: Array) => bundles) + return this.bundles.payload + .filter(bundles => hasValue(bundles)) .map(bundles => { return bundles.find((bundle: Bundle) => { return bundle.name === name }); - }); - } - - /** - * Retrieves all direct parent collections of this item - * @returns {Array>} an array of all Collections that contain this item - */ - getCollections(): Array> { - return this.parents.map(collection => collection.payload.map(parent => parent)); + }) + .startWith(undefined); } } diff --git a/src/app/item-page/collections/collections.component.html b/src/app/item-page/collections/collections.component.html deleted file mode 100644 index bf764ae182..0000000000 --- a/src/app/item-page/collections/collections.component.html +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/src/app/item-page/field-components/collections/collections.component.html b/src/app/item-page/field-components/collections/collections.component.html new file mode 100644 index 0000000000..8f184817c2 --- /dev/null +++ b/src/app/item-page/field-components/collections/collections.component.html @@ -0,0 +1,7 @@ + + + diff --git a/src/app/item-page/collections/collections.component.ts b/src/app/item-page/field-components/collections/collections.component.ts similarity index 73% rename from src/app/item-page/collections/collections.component.ts rename to src/app/item-page/field-components/collections/collections.component.ts index 10afd39ae1..199fb2b773 100644 --- a/src/app/item-page/collections/collections.component.ts +++ b/src/app/item-page/field-components/collections/collections.component.ts @@ -1,7 +1,7 @@ import { Component, Input, OnInit } from '@angular/core'; -import { Collection } from "../../core/shared/collection.model"; +import { Collection } from "../../../core/shared/collection.model"; import { Observable } from "rxjs"; -import { Item } from "../../core/shared/item.model"; +import { Item } from "../../../core/shared/item.model"; /** * This component renders the parent collections section of the item @@ -20,7 +20,7 @@ export class CollectionsComponent implements OnInit { separator: string = "
" - collections: Array>; + collections: Observable; constructor() { this.universalInit(); @@ -31,7 +31,7 @@ export class CollectionsComponent implements OnInit { } ngOnInit(): void { - this.collections = this.item.getCollections(); + this.collections = this.item.parents.payload; } diff --git a/src/app/item-page/metadata-field-wrapper/metadata-field-wrapper.component.html b/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.html similarity index 100% rename from src/app/item-page/metadata-field-wrapper/metadata-field-wrapper.component.html rename to src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.html diff --git a/src/app/item-page/metadata-field-wrapper/metadata-field-wrapper.component.scss b/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.scss similarity index 61% rename from src/app/item-page/metadata-field-wrapper/metadata-field-wrapper.component.scss rename to src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.scss index 749382bc9a..26f0f6fa65 100644 --- a/src/app/item-page/metadata-field-wrapper/metadata-field-wrapper.component.scss +++ b/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.scss @@ -1,4 +1,4 @@ -@import '../../../styles/variables.scss'; +@import '../../../../styles/variables.scss'; :host { .simple-view-element { margin-bottom: 15px; diff --git a/src/app/item-page/metadata-field-wrapper/metadata-field-wrapper.component.ts b/src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.ts similarity index 100% rename from src/app/item-page/metadata-field-wrapper/metadata-field-wrapper.component.ts rename to src/app/item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component.ts diff --git a/src/app/item-page/metadata-uri-values/metadata-uri-values.component.html b/src/app/item-page/field-components/metadata-uri-values/metadata-uri-values.component.html similarity index 100% rename from src/app/item-page/metadata-uri-values/metadata-uri-values.component.html rename to src/app/item-page/field-components/metadata-uri-values/metadata-uri-values.component.html diff --git a/src/app/item-page/field-components/metadata-uri-values/metadata-uri-values.component.scss b/src/app/item-page/field-components/metadata-uri-values/metadata-uri-values.component.scss new file mode 100644 index 0000000000..96ce861942 --- /dev/null +++ b/src/app/item-page/field-components/metadata-uri-values/metadata-uri-values.component.scss @@ -0,0 +1 @@ +@import '../../../../styles/variables.scss'; diff --git a/src/app/item-page/metadata-uri-values/metadata-uri-values.component.ts b/src/app/item-page/field-components/metadata-uri-values/metadata-uri-values.component.ts similarity index 100% rename from src/app/item-page/metadata-uri-values/metadata-uri-values.component.ts rename to src/app/item-page/field-components/metadata-uri-values/metadata-uri-values.component.ts diff --git a/src/app/item-page/metadata-values/metadata-values.component.html b/src/app/item-page/field-components/metadata-values/metadata-values.component.html similarity index 100% rename from src/app/item-page/metadata-values/metadata-values.component.html rename to src/app/item-page/field-components/metadata-values/metadata-values.component.html diff --git a/src/app/item-page/field-components/metadata-values/metadata-values.component.scss b/src/app/item-page/field-components/metadata-values/metadata-values.component.scss new file mode 100644 index 0000000000..96ce861942 --- /dev/null +++ b/src/app/item-page/field-components/metadata-values/metadata-values.component.scss @@ -0,0 +1 @@ +@import '../../../../styles/variables.scss'; diff --git a/src/app/item-page/metadata-values/metadata-values.component.ts b/src/app/item-page/field-components/metadata-values/metadata-values.component.ts similarity index 100% rename from src/app/item-page/metadata-values/metadata-values.component.ts rename to src/app/item-page/field-components/metadata-values/metadata-values.component.ts diff --git a/src/app/item-page/full/field-components/file-section/full-file-section.component.html b/src/app/item-page/full/field-components/file-section/full-file-section.component.html new file mode 100644 index 0000000000..d7e1712b7f --- /dev/null +++ b/src/app/item-page/full/field-components/file-section/full-file-section.component.html @@ -0,0 +1,29 @@ + +
+
+ +
+
+
+
{{"item.page.filesection.name" | translate}}
+
{{file.name}}
+ +
{{"item.page.filesection.size" | translate}}
+
{{(file.size) | dsFileSize }}
+ + +
{{"item.page.filesection.format" | translate}}
+
{{(file.mimetype)}}
+ + +
{{"item.page.filesection.description" | translate}}
+
{{file.findMetadata("dc.description")}}
+
+
+ +
+
diff --git a/src/app/item-page/full/field-components/file-section/full-file-section.component.scss b/src/app/item-page/full/field-components/file-section/full-file-section.component.scss new file mode 100644 index 0000000000..4597c711ff --- /dev/null +++ b/src/app/item-page/full/field-components/file-section/full-file-section.component.scss @@ -0,0 +1,7 @@ +@import '../../../../../styles/variables.scss'; +@import '../../../../../../node_modules/bootstrap/scss/_variables.scss'; +@media screen and (min-width: map-get($grid-breakpoints, md)) { + dt { + text-align: right; + } +} \ No newline at end of file diff --git a/src/app/item-page/full/field-components/file-section/full-file-section.component.ts b/src/app/item-page/full/field-components/file-section/full-file-section.component.ts new file mode 100644 index 0000000000..3723bc5450 --- /dev/null +++ b/src/app/item-page/full/field-components/file-section/full-file-section.component.ts @@ -0,0 +1,52 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Bitstream } from "../../../../core/shared/bitstream.model"; +import { Item } from "../../../../core/shared/item.model"; +import { Observable } from "rxjs"; +import { FileSectionComponent } from "../../../simple/field-components/file-section/file-section.component"; +import { hasValue } from "../../../../shared/empty.util"; + +/** + * This component renders the file section of the item + * inside a 'ds-metadata-field-wrapper' component. + */ + +@Component({ + selector: 'ds-item-page-full-file-section', + styleUrls: ['./full-file-section.component.css'], + templateUrl: './full-file-section.component.html' +}) +export class FullFileSectionComponent extends FileSectionComponent implements OnInit { + + @Input() item: Item; + + label : string; + + files: Observable; + + + thumbnails: Map> = new Map(); + + + universalInit() { + } + + ngOnInit(): void { + super.ngOnInit(); + } + + initialize(): void { + const originals = this.item.getFiles("ORIGINAL"); + const licenses = this.item.getFiles("LICENSE"); + this.files = Observable.combineLatest(originals, licenses, (originals, licenses) => [...originals, ...licenses]); + this.files.subscribe( + files => + files.forEach( + original => { + const thumbnail: Observable = this.item.getThumbnailForOriginal(original); + this.thumbnails.set(original.id, thumbnail); + } + ) + ) + } + +} diff --git a/src/app/item-page/full/full-item-page.component.html b/src/app/item-page/full/full-item-page.component.html new file mode 100644 index 0000000000..b0b1f98037 --- /dev/null +++ b/src/app/item-page/full/full-item-page.component.html @@ -0,0 +1,25 @@ +
+ + + + + + + + + + + + +
{{metadatum.key}}{{metadatum.value}}{{metadatum.language}}
+ + + + + + +
diff --git a/src/app/item-page/full/full-item-page.component.scss b/src/app/item-page/full/full-item-page.component.scss new file mode 100644 index 0000000000..65b9262338 --- /dev/null +++ b/src/app/item-page/full/full-item-page.component.scss @@ -0,0 +1,7 @@ +@import '../../../styles/variables.scss'; +:host { + div.simple-view-link { + text-align: center; + margin: 20px; + } +} \ No newline at end of file diff --git a/src/app/item-page/full/full-item-page.component.ts b/src/app/item-page/full/full-item-page.component.ts new file mode 100644 index 0000000000..b19fd93677 --- /dev/null +++ b/src/app/item-page/full/full-item-page.component.ts @@ -0,0 +1,45 @@ +import { Component, OnInit } from '@angular/core'; +import { Observable } from "rxjs"; +import { ItemPageComponent } from "../simple/item-page.component"; +import { Metadatum } from "../../core/shared/metadatum.model"; +import { ItemDataService } from "../../core/data/item-data.service"; +import { ActivatedRoute } from "@angular/router"; +import { RemoteData } from "../../core/data/remote-data"; +import { Item } from "../../core/shared/item.model"; + +/** + * This component renders a simple item page. + * The route parameter 'id' is used to request the item it represents. + * All fields of the item that should be displayed, are defined in its template. + */ + +@Component({ + selector: 'ds-full-item-page', + styleUrls: ['./full-item-page.component.css'], + templateUrl: './full-item-page.component.html', +}) +export class FullItemPageComponent extends ItemPageComponent implements OnInit { + + item: RemoteData; + + metadata: Observable>; + + constructor(route: ActivatedRoute, items: ItemDataService) { + super(route, items); + } + + universalInit() { + + } + + /*** AoT inheritance fix, will hopefully be resolved in the near future **/ + ngOnInit(): void { + super.ngOnInit(); + } + + initialize(params) { + super.initialize(params); + this.metadata = this.item.payload.map(i => i.metadata); + } + +} diff --git a/src/app/item-page/item-page-routing.module.ts b/src/app/item-page/item-page-routing.module.ts index 64c0a607c5..2cd0c200ad 100644 --- a/src/app/item-page/item-page-routing.module.ts +++ b/src/app/item-page/item-page-routing.module.ts @@ -1,12 +1,14 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; -import { ItemPageComponent } from './item-page.component'; +import { ItemPageComponent } from './simple/item-page.component'; +import { FullItemPageComponent } from './full/full-item-page.component'; @NgModule({ imports: [ RouterModule.forChild([ { path: 'items/:id', pathMatch: 'full', component: ItemPageComponent }, + { path: 'items/:id/full', component: FullItemPageComponent }, ]) ] }) diff --git a/src/app/item-page/item-page.component.scss b/src/app/item-page/item-page.component.scss deleted file mode 100644 index da97dd7a62..0000000000 --- a/src/app/item-page/item-page.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../styles/variables.scss'; diff --git a/src/app/item-page/item-page.module.ts b/src/app/item-page/item-page.module.ts index ab0e2809f6..8b7bae4477 100644 --- a/src/app/item-page/item-page.module.ts +++ b/src/app/item-page/item-page.module.ts @@ -1,23 +1,26 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { ItemPageComponent } from './item-page.component'; +import { ItemPageComponent } from './simple/item-page.component'; import { ItemPageRoutingModule } from './item-page-routing.module'; -import { MetadataValuesComponent } from './metadata-values/metadata-values.component'; -import { MetadataUriValuesComponent } from './metadata-uri-values/metadata-uri-values.component'; -import { MetadataFieldWrapperComponent } from './metadata-field-wrapper/metadata-field-wrapper.component'; -import { ItemPageAuthorFieldComponent } from './specific-field/author/item-page-author-field.component'; -import { ItemPageDateFieldComponent } from './specific-field/date/item-page-date-field.component'; -import { ItemPageAbstractFieldComponent } from './specific-field/abstract/item-page-abstract-field.component'; -import { ItemPageUriFieldComponent } from './specific-field/uri/item-page-uri-field.component'; -import { ItemPageTitleFieldComponent } from './specific-field/title/item-page-title-field.component'; -import { ItemPageSpecificFieldComponent } from './specific-field/item-page-specific-field.component'; +import { MetadataValuesComponent } from './field-components/metadata-values/metadata-values.component'; +import { MetadataUriValuesComponent } from './field-components/metadata-uri-values/metadata-uri-values.component'; +import { MetadataFieldWrapperComponent } from './field-components/metadata-field-wrapper/metadata-field-wrapper.component'; +import { ItemPageAuthorFieldComponent } from './simple/field-components/specific-field/author/item-page-author-field.component'; +import { ItemPageDateFieldComponent } from './simple/field-components/specific-field/date/item-page-date-field.component'; +import { ItemPageAbstractFieldComponent } from './simple/field-components/specific-field/abstract/item-page-abstract-field.component'; +import { ItemPageUriFieldComponent } from './simple/field-components/specific-field/uri/item-page-uri-field.component'; +import { ItemPageTitleFieldComponent } from './simple/field-components/specific-field/title/item-page-title-field.component'; +import { ItemPageSpecificFieldComponent } from './simple/field-components/specific-field/item-page-specific-field.component'; import { SharedModule } from './../shared/shared.module'; -import { FileSectionComponent } from "./file-section/file-section.component"; -import { CollectionsComponent } from "./collections/collections.component"; +import { FileSectionComponent } from "./simple/field-components/file-section/file-section.component"; +import { CollectionsComponent } from "./field-components/collections/collections.component"; +import { FullItemPageComponent } from "./full/full-item-page.component"; +import { FullFileSectionComponent } from "./full/field-components/file-section/full-file-section.component"; @NgModule({ declarations: [ ItemPageComponent, + FullItemPageComponent, MetadataValuesComponent, MetadataUriValuesComponent, MetadataFieldWrapperComponent, @@ -28,7 +31,8 @@ import { CollectionsComponent } from "./collections/collections.component"; ItemPageTitleFieldComponent, ItemPageSpecificFieldComponent, FileSectionComponent, - CollectionsComponent + CollectionsComponent, + FullFileSectionComponent ], imports: [ ItemPageRoutingModule, diff --git a/src/app/item-page/metadata-values/metadata-values.component.scss b/src/app/item-page/metadata-values/metadata-values.component.scss deleted file mode 100644 index 50be6f5ad0..0000000000 --- a/src/app/item-page/metadata-values/metadata-values.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../../../styles/variables.scss'; diff --git a/src/app/item-page/file-section/file-section.component.html b/src/app/item-page/simple/field-components/file-section/file-section.component.html similarity index 63% rename from src/app/item-page/file-section/file-section.component.html rename to src/app/item-page/simple/field-components/file-section/file-section.component.html index 0cc15e090e..149a1b2017 100644 --- a/src/app/item-page/file-section/file-section.component.html +++ b/src/app/item-page/simple/field-components/file-section/file-section.component.html @@ -1,8 +1,8 @@ diff --git a/src/app/item-page/file-section/file-section.component.ts b/src/app/item-page/simple/field-components/file-section/file-section.component.ts similarity index 70% rename from src/app/item-page/file-section/file-section.component.ts rename to src/app/item-page/simple/field-components/file-section/file-section.component.ts index fe0defb105..4cd1daf290 100644 --- a/src/app/item-page/file-section/file-section.component.ts +++ b/src/app/item-page/simple/field-components/file-section/file-section.component.ts @@ -1,6 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; -import { Bitstream } from "../../core/shared/bitstream.model"; -import { Item } from "../../core/shared/item.model"; +import { Bitstream } from "../../../../core/shared/bitstream.model"; +import { Item } from "../../../../core/shared/item.model"; import { Observable } from "rxjs"; /** @@ -18,21 +18,23 @@ export class FileSectionComponent implements OnInit { label : string = "item.page.files"; - separator: string = "
" + separator: string = "
"; - files: Observable>>; + files: Observable; constructor() { this.universalInit(); - } universalInit() { } ngOnInit(): void { + this.initialize(); + } + + initialize(): void { this.files = this.item.getFiles(); } - } diff --git a/src/app/item-page/specific-field/abstract/item-page-abstract-field.component.ts b/src/app/item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.ts similarity index 80% rename from src/app/item-page/specific-field/abstract/item-page-abstract-field.component.ts rename to src/app/item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.ts index 3e88117654..f0e410d89e 100644 --- a/src/app/item-page/specific-field/abstract/item-page-abstract-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.ts @@ -1,5 +1,5 @@ -import { Component, OnInit, Input } from '@angular/core'; -import { Item } from "../../../core/shared/item.model"; +import { Component, Input } from '@angular/core'; +import { Item } from "../../../../../core/shared/item.model"; import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component"; @Component({ diff --git a/src/app/item-page/specific-field/author/item-page-author-field.component.ts b/src/app/item-page/simple/field-components/specific-field/author/item-page-author-field.component.ts similarity index 80% rename from src/app/item-page/specific-field/author/item-page-author-field.component.ts rename to src/app/item-page/simple/field-components/specific-field/author/item-page-author-field.component.ts index 2ff76d509a..5b85038e38 100644 --- a/src/app/item-page/specific-field/author/item-page-author-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/author/item-page-author-field.component.ts @@ -1,5 +1,5 @@ -import { Component, OnInit, Input } from '@angular/core'; -import { Item } from "../../../core/shared/item.model"; +import { Component, Input } from '@angular/core'; +import { Item } from "../../../../../core/shared/item.model"; import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component"; @Component({ diff --git a/src/app/item-page/specific-field/date/item-page-date-field.component.ts b/src/app/item-page/simple/field-components/specific-field/date/item-page-date-field.component.ts similarity index 79% rename from src/app/item-page/specific-field/date/item-page-date-field.component.ts rename to src/app/item-page/simple/field-components/specific-field/date/item-page-date-field.component.ts index 16b6aad1f0..2d7b3f7c41 100644 --- a/src/app/item-page/specific-field/date/item-page-date-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/date/item-page-date-field.component.ts @@ -1,5 +1,5 @@ -import { Component, OnInit, Input } from '@angular/core'; -import { Item } from "../../../core/shared/item.model"; +import { Component, Input } from '@angular/core'; +import { Item } from "../../../../../core/shared/item.model"; import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component"; @Component({ diff --git a/src/app/item-page/specific-field/item-page-specific-field.component.html b/src/app/item-page/simple/field-components/specific-field/item-page-specific-field.component.html similarity index 100% rename from src/app/item-page/specific-field/item-page-specific-field.component.html rename to src/app/item-page/simple/field-components/specific-field/item-page-specific-field.component.html diff --git a/src/app/item-page/specific-field/item-page-specific-field.component.ts b/src/app/item-page/simple/field-components/specific-field/item-page-specific-field.component.ts similarity index 87% rename from src/app/item-page/specific-field/item-page-specific-field.component.ts rename to src/app/item-page/simple/field-components/specific-field/item-page-specific-field.component.ts index ebb7a29c6f..20c9528ebe 100644 --- a/src/app/item-page/specific-field/item-page-specific-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/item-page-specific-field.component.ts @@ -1,5 +1,5 @@ -import { Component, OnInit, Input } from '@angular/core'; -import { Item } from "../../core/shared/item.model"; +import { Component, Input } from '@angular/core'; +import { Item } from "../../../../core/shared/item.model"; /** * This component can be used to represent metadata on a simple item page. diff --git a/src/app/item-page/specific-field/title/item-page-title-field.component.html b/src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.html similarity index 100% rename from src/app/item-page/specific-field/title/item-page-title-field.component.html rename to src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.html diff --git a/src/app/item-page/specific-field/title/item-page-title-field.component.ts b/src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts similarity index 77% rename from src/app/item-page/specific-field/title/item-page-title-field.component.ts rename to src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts index 6dc2d159c8..4f926000a4 100644 --- a/src/app/item-page/specific-field/title/item-page-title-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/title/item-page-title-field.component.ts @@ -1,5 +1,5 @@ -import { Component, OnInit, Input } from '@angular/core'; -import { Item } from "../../../core/shared/item.model"; +import { Component, Input } from '@angular/core'; +import { Item } from "../../../../../core/shared/item.model"; import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component"; @Component({ diff --git a/src/app/item-page/specific-field/uri/item-page-uri-field.component.html b/src/app/item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.html similarity index 100% rename from src/app/item-page/specific-field/uri/item-page-uri-field.component.html rename to src/app/item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.html diff --git a/src/app/item-page/specific-field/uri/item-page-uri-field.component.ts b/src/app/item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.ts similarity index 78% rename from src/app/item-page/specific-field/uri/item-page-uri-field.component.ts rename to src/app/item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.ts index 4f7b0bb874..4879fa5aa6 100644 --- a/src/app/item-page/specific-field/uri/item-page-uri-field.component.ts +++ b/src/app/item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.ts @@ -1,5 +1,5 @@ -import { Component, OnInit, Input } from '@angular/core'; -import { Item } from "../../../core/shared/item.model"; +import { Component, Input } from '@angular/core'; +import { Item } from "../../../../../core/shared/item.model"; import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component"; @Component({ diff --git a/src/app/item-page/item-page.component.html b/src/app/item-page/simple/item-page.component.html similarity index 82% rename from src/app/item-page/item-page.component.html rename to src/app/item-page/simple/item-page.component.html index 47e5330ca5..9378c3839b 100644 --- a/src/app/item-page/item-page.component.html +++ b/src/app/item-page/simple/item-page.component.html @@ -8,12 +8,19 @@ + + diff --git a/src/app/item-page/metadata-uri-values/metadata-uri-values.component.scss b/src/app/item-page/simple/item-page.component.scss similarity index 100% rename from src/app/item-page/metadata-uri-values/metadata-uri-values.component.scss rename to src/app/item-page/simple/item-page.component.scss diff --git a/src/app/item-page/item-page.component.ts b/src/app/item-page/simple/item-page.component.ts similarity index 65% rename from src/app/item-page/item-page.component.ts rename to src/app/item-page/simple/item-page.component.ts index 52fb155184..53e57f3ae1 100644 --- a/src/app/item-page/item-page.component.ts +++ b/src/app/item-page/simple/item-page.component.ts @@ -1,10 +1,10 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { Item } from "../core/shared/item.model"; -import { ItemDataService } from "../core/data/item-data.service"; -import { RemoteData } from "../core/data/remote-data"; +import { Item } from "../../core/shared/item.model"; +import { ItemDataService } from "../../core/data/item-data.service"; +import { RemoteData } from "../../core/data/remote-data"; import { Observable } from "rxjs"; -import { Bitstream } from "../core/shared/bitstream.model"; +import { Bitstream } from "../../core/shared/bitstream.model"; /** * This component renders a simple item page. @@ -37,11 +37,16 @@ export class ItemPageComponent implements OnInit { ngOnInit(): void { this.sub = this.route.params.subscribe(params => { - this.id = +params['id']; - this.item = this.items.findById(params['id']); - this.thumbnail = this.item.payload.flatMap(i => i.getThumbnail()); + this.initialize(params); }); } + initialize(params) { + this.id = +params['id']; + this.item = this.items.findById(params['id']); + this.thumbnail = this.item.payload.flatMap(i => i.getThumbnail()); + } + + } diff --git a/src/server.ts b/src/server.ts index 13837821d0..42f8d9bd5e 100644 --- a/src/server.ts +++ b/src/server.ts @@ -82,22 +82,25 @@ function ngApp(req, res) { function onHandleError(parentZoneDelegate, currentZone, targetZone, error) { console.warn('Error in SSR, serving for direct CSR'); res.sendFile('index.html', { root: './src' }); - return false; } - Zone.current.fork({ name: 'CSR fallback', onHandleError }).run(() => { - res.render('index', { - req, - res, - // time: true, // use this to determine what part of your app is slow only in development - async: EnvConfig.universal.async, - preboot: EnvConfig.universal.preboot, - baseUrl: EnvConfig.ui.nameSpace, - requestUrl: req.originalUrl, - originUrl: EnvConfig.ui.baseUrl + if (EnvConfig.universal.preboot) { + Zone.current.fork({ name: 'CSR fallback', onHandleError }).run(() => { + res.render('index', { + req, + res, + // time: true, // use this to determine what part of your app is slow only in development + async: EnvConfig.universal.async, + preboot: EnvConfig.universal.preboot, + baseUrl: EnvConfig.ui.nameSpace, + requestUrl: req.originalUrl, + originUrl: EnvConfig.ui.baseUrl + }); }); - }); - + } + else { + res.sendFile('index.html', { root: './src' }); + } } /** diff --git a/yarn.lock b/yarn.lock index 17ed417d48..c1e67e8572 100644 --- a/yarn.lock +++ b/yarn.lock @@ -301,14 +301,10 @@ alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" -amdefine@1.0.0: +amdefine@1.0.0, amdefine@>=0.0.4: version "1.0.0" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - angular2-express-engine@2.1.0-rc.1: version "2.1.0-rc.1" resolved "https://registry.yarnpkg.com/angular2-express-engine/-/angular2-express-engine-2.1.0-rc.1.tgz#79c8e481cde7ff1253b373cbf98de7c9fab4f215" @@ -3521,11 +3517,7 @@ lowercase-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - -lru-cache@2.2.x: +lru-cache@2, lru-cache@2.2.x: version "2.2.4" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" @@ -4659,14 +4651,10 @@ punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -q@1.4.1: +q@1.4.1, q@^1.1.2, q@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" -q@^1.1.2, q@^1.4.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" - qjobs@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" @@ -5063,13 +5051,13 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.6.0, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.6.0, rimraf@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: glob "^7.0.5" -rimraf@2.5.4, rimraf@^2.4.4: +rimraf@2.5.4: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: