From 61d757493a5ed086b0e723bd2a50e27a5aaa0510 Mon Sep 17 00:00:00 2001 From: Kristof De Langhe Date: Mon, 14 Oct 2019 13:39:29 +0200 Subject: [PATCH] 65572: Support for bundles on items --- .../simple/item-page.component.spec.ts | 2 +- .../publication/publication.component.spec.ts | 2 +- .../cache/models/normalized-bundle.model.ts | 7 + .../cache/models/normalized-item.model.ts | 10 +- src/app/core/data/bundle-data.service.ts | 46 +++++ src/app/core/shared/bundle.model.ts | 11 +- src/app/core/shared/item.model.spec.ts | 16 +- src/app/core/shared/item.model.ts | 28 +-- ...urnal-issue-grid-element.component.spec.ts | 4 +- ...rnal-volume-grid-element.component.spec.ts | 4 +- .../journal-grid-element.component.spec.ts | 4 +- ...urnal-issue-list-element.component.spec.ts | 4 +- ...rnal-volume-list-element.component.spec.ts | 4 +- .../journal-list-element.component.spec.ts | 4 +- .../journal-issue.component.spec.ts | 2 +- .../journal-volume.component.spec.ts | 2 +- .../journal/journal.component.spec.ts | 2 +- .../orgunit-grid-element.component.spec.ts | 4 +- .../person-grid-element.component.spec.ts | 4 +- .../project-grid-element.component.spec.ts | 4 +- .../orgunit-list-element.component.spec.ts | 4 +- .../person-list-element.component.spec.ts | 4 +- .../project-list-element.component.spec.ts | 4 +- .../orgunit/orgunit.component.spec.ts | 2 +- .../person/person.component.spec.ts | 2 +- .../project/project.component.spec.ts | 2 +- src/app/shared/mocks/mock-item.ts | 190 +++++++++--------- .../item-detail-preview.component.spec.ts | 4 +- .../item-grid-element.component.spec.ts | 4 +- ...publication-grid-element.component.spec.ts | 4 +- ...publication-list-element.component.spec.ts | 4 +- src/app/shared/testing/utils.ts | 10 + 32 files changed, 239 insertions(+), 159 deletions(-) create mode 100644 src/app/core/data/bundle-data.service.ts diff --git a/src/app/+item-page/simple/item-page.component.spec.ts b/src/app/+item-page/simple/item-page.component.spec.ts index cd5c385671..11fd46757d 100644 --- a/src/app/+item-page/simple/item-page.component.spec.ts +++ b/src/app/+item-page/simple/item-page.component.spec.ts @@ -22,7 +22,7 @@ import { } from '../../shared/testing/utils'; const mockItem: Item = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: [], relationships: createRelationshipsObservable() }); diff --git a/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts b/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts index eac23a9748..59400fa2b9 100644 --- a/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts +++ b/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts @@ -20,7 +20,7 @@ import { MetadataMap } from '../../../../core/shared/metadata.models'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; const mockItem: Item = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: new MetadataMap(), relationships: createRelationshipsObservable() }); diff --git a/src/app/core/cache/models/normalized-bundle.model.ts b/src/app/core/cache/models/normalized-bundle.model.ts index 3f4e28bca5..9582643efb 100644 --- a/src/app/core/cache/models/normalized-bundle.model.ts +++ b/src/app/core/cache/models/normalized-bundle.model.ts @@ -11,6 +11,13 @@ import { Bitstream } from '../../shared/bitstream.model'; @mapsTo(Bundle) @inheritSerialization(NormalizedDSpaceObject) export class NormalizedBundle extends NormalizedDSpaceObject { + + /** + * The bundle's name + */ + @autoserialize + name: string; + /** * The primary bitstream of this Bundle */ diff --git a/src/app/core/cache/models/normalized-item.model.ts b/src/app/core/cache/models/normalized-item.model.ts index 4afceb7612..c613c59a0c 100644 --- a/src/app/core/cache/models/normalized-item.model.ts +++ b/src/app/core/cache/models/normalized-item.model.ts @@ -3,13 +3,9 @@ import { inheritSerialization, deserialize, autoserialize, autoserializeAs } fro import { NormalizedDSpaceObject } from './normalized-dspace-object.model'; import { Item } from '../../shared/item.model'; import { mapsTo, relationship } from '../builders/build-decorators'; -import { ResourceType } from '../../shared/resource-type'; -import { NormalizedCollection } from './normalized-collection.model'; -import { NormalizedBitstream } from './normalized-bitstream.model'; -import { NormalizedRelationship } from './items/normalized-relationship.model'; import { Collection } from '../../shared/collection.model'; -import { Bitstream } from '../../shared/bitstream.model'; import { Relationship } from '../../shared/item-relationships/relationship.model'; +import { Bundle } from '../../shared/bundle.model'; /** * Normalized model class for a DSpace Item @@ -66,8 +62,8 @@ export class NormalizedItem extends NormalizedDSpaceObject { * List of Bitstreams that are owned by this Item */ @deserialize - @relationship(Bitstream, true) - bitstreams: string[]; + @relationship(Bundle, true) + bundles: string[]; @autoserialize @relationship(Relationship, true) diff --git a/src/app/core/data/bundle-data.service.ts b/src/app/core/data/bundle-data.service.ts new file mode 100644 index 0000000000..5962488c4f --- /dev/null +++ b/src/app/core/data/bundle-data.service.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@angular/core'; +import { DataService } from './data.service'; +import { Bundle } from '../shared/bundle.model'; +import { RequestService } from './request.service'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service'; +import { Store } from '@ngrx/store'; +import { CoreState } from '../core.reducers'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { HttpClient } from '@angular/common/http'; +import { DefaultChangeAnalyzer } from './default-change-analyzer.service'; +import { FindAllOptions } from './request.models'; +import { Observable } from 'rxjs/internal/Observable'; + +/** + * A service responsible for fetching/sending data from/to the REST API on the bundles endpoint + */ +@Injectable() +export class BundleDataService extends DataService { + protected linkPath = 'bundles'; + protected forceBypassCache = false; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected dataBuildService: NormalizedObjectBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: DefaultChangeAnalyzer) { + super(); + } + + /** + * Get the endpoint for browsing bundles + * @param {FindAllOptions} options + * @returns {Observable} + */ + getBrowseEndpoint(options: FindAllOptions = {}, linkPath?: string): Observable { + return this.halService.getEndpoint(this.linkPath); + } +} diff --git a/src/app/core/shared/bundle.model.ts b/src/app/core/shared/bundle.model.ts index 9b00f6efa0..dade7d12be 100644 --- a/src/app/core/shared/bundle.model.ts +++ b/src/app/core/shared/bundle.model.ts @@ -4,10 +4,16 @@ import { Item } from './item.model'; import { RemoteData } from '../data/remote-data'; import { Observable } from 'rxjs'; import { ResourceType } from './resource-type'; +import { PaginatedList } from '../data/paginated-list'; export class Bundle extends DSpaceObject { static type = new ResourceType('bundle'); + /** + * The bundle's name + */ + name: string; + /** * The primary bitstream of this Bundle */ @@ -23,6 +29,9 @@ export class Bundle extends DSpaceObject { */ owner: Observable>; - bitstreams: Observable> + /** + * List of Bitstreams that are part of this Bundle + */ + bitstreams: Observable>>; } diff --git a/src/app/core/shared/item.model.spec.ts b/src/app/core/shared/item.model.spec.ts index f20fb3299a..1cffcf568a 100644 --- a/src/app/core/shared/item.model.spec.ts +++ b/src/app/core/shared/item.model.spec.ts @@ -4,7 +4,7 @@ import { Item } from './item.model'; import { Bitstream } from './bitstream.model'; import { isEmpty } from '../../shared/empty.util'; import { first, map } from 'rxjs/operators'; -import { createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils'; +import { createPaginatedList, createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils'; describe('Item', () => { @@ -18,8 +18,9 @@ describe('Item', () => { const nonExistingBundleName = 'c1e568f7-d14e-496b-bdd7-07026998cc00'; let bitstreams; let remoteDataThumbnail; + let remoteDataThumbnailList; let remoteDataFiles; - let remoteDataAll; + let remoteDataBundles; beforeEach(() => { const thumbnail = { @@ -33,15 +34,16 @@ describe('Item', () => { }]; remoteDataThumbnail = createSuccessfulRemoteDataObject$(thumbnail); - remoteDataFiles = createSuccessfulRemoteDataObject$(bitstreams); - remoteDataAll = createSuccessfulRemoteDataObject$([...bitstreams, thumbnail]); + remoteDataThumbnailList = createSuccessfulRemoteDataObject$(createPaginatedList([thumbnail])); + remoteDataFiles = createSuccessfulRemoteDataObject$(createPaginatedList(bitstreams)); // Create Bundles const bundles = [ { name: thumbnailBundleName, - primaryBitstream: remoteDataThumbnail + primaryBitstream: remoteDataThumbnail, + bitstreams: remoteDataThumbnailList }, { @@ -49,7 +51,9 @@ describe('Item', () => { bitstreams: remoteDataFiles }]; - item = Object.assign(new Item(), { bitstreams: remoteDataAll }); + remoteDataBundles = createSuccessfulRemoteDataObject$(createPaginatedList(bundles)); + + item = Object.assign(new Item(), { bundles: remoteDataBundles }); }); it('should return the bitstreams related to this item with the specified bundle name', () => { diff --git a/src/app/core/shared/item.model.ts b/src/app/core/shared/item.model.ts index a3e625c022..f92d079dde 100644 --- a/src/app/core/shared/item.model.ts +++ b/src/app/core/shared/item.model.ts @@ -1,15 +1,16 @@ -import { map, startWith, filter, take } from 'rxjs/operators'; +import { map, startWith, filter, switchMap } from 'rxjs/operators'; import { Observable } from 'rxjs'; import { DSpaceObject } from './dspace-object.model'; import { Collection } from './collection.model'; import { RemoteData } from '../data/remote-data'; import { Bitstream } from './bitstream.model'; -import { hasValue, isNotEmpty } from '../../shared/empty.util'; +import { hasValueOperator, isNotEmpty } from '../../shared/empty.util'; import { PaginatedList } from '../data/paginated-list'; import { Relationship } from './item-relationships/relationship.model'; import { ResourceType } from './resource-type'; -import { getSucceededRemoteData } from './operators'; +import { getAllSucceededRemoteData, getSucceededRemoteData } from './operators'; +import { Bundle } from './bundle.model'; export class Item extends DSpaceObject { static type = new ResourceType('item'); @@ -53,7 +54,10 @@ export class Item extends DSpaceObject { return this.owningCollection; } - bitstreams: Observable>>; + /** + * Bitstream bundles within this item + */ + bundles: Observable>>; relationships: Observable>>; @@ -97,17 +101,15 @@ export class Item extends DSpaceObject { * see https://github.com/DSpace/dspace-angular/issues/332 */ getBitstreamsByBundleName(bundleName: string): Observable { - return this.bitstreams.pipe( + return this.bundles.pipe( getSucceededRemoteData(), + map((rd: RemoteData>) => rd.payload.page.find((bundle: Bundle) => bundle.name === bundleName)), + hasValueOperator(), + switchMap((bundle: Bundle) => bundle.bitstreams), + getAllSucceededRemoteData(), map((rd: RemoteData>) => rd.payload.page), - filter((bitstreams: Bitstream[]) => hasValue(bitstreams)), - take(1), - startWith([]), - map((bitstreams) => { - return bitstreams - .filter((bitstream) => hasValue(bitstream)) - .filter((bitstream) => bitstream.bundleName === bundleName) - })); + startWith([]) + ); } } diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.spec.ts index d13feda406..de16a05e5e 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.spec.ts @@ -10,7 +10,7 @@ import { PageInfo } from '../../../../core/shared/page-info.model'; const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithMetadata.hitHighlights = {}; mockItemWithMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { @@ -36,7 +36,7 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithoutMetadata.hitHighlights = {}; mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.spec.ts index 8c854aeb77..80479f597d 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.spec.ts @@ -10,7 +10,7 @@ import { PageInfo } from '../../../../core/shared/page-info.model'; const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithMetadata.hitHighlights = {}; mockItemWithMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { @@ -36,7 +36,7 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithoutMetadata.hitHighlights = {}; mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.spec.ts index 0d0f77842a..7376b571bd 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.spec.ts @@ -10,7 +10,7 @@ import { PageInfo } from '../../../../core/shared/page-info.model'; const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithMetadata.hitHighlights = {}; mockItemWithMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { @@ -42,7 +42,7 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithoutMetadata.hitHighlights = {}; mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts index 24498088cb..a2df725fae 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts @@ -12,7 +12,7 @@ let journalIssueListElementComponent: JournalIssueListElementComponent; let fixture: ComponentFixture; const mockItemWithMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { @@ -35,7 +35,7 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { } }); const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.spec.ts index 15f5424960..c2220b155c 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.spec.ts @@ -12,7 +12,7 @@ let journalVolumeListElementComponent: JournalVolumeListElementComponent; let fixture: ComponentFixture; const mockItemWithMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { @@ -35,7 +35,7 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { } }); const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.spec.ts index 204672dfe9..4f07bb2d07 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.spec.ts @@ -12,7 +12,7 @@ let journalListElementComponent: JournalListElementComponent; let fixture: ComponentFixture; const mockItemWithMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { @@ -29,7 +29,7 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { } }); const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.spec.ts b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.spec.ts index 00403473a7..897fc9dc72 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.spec.ts @@ -11,7 +11,7 @@ import { import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; const mockItem: Item = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'publicationissue.issueNumber': [ { diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.spec.ts b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.spec.ts index d2b3420b2a..f679d80ce7 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.spec.ts @@ -11,7 +11,7 @@ import { import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; const mockItem: Item = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'publicationvolume.volumeNumber': [ { diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts index c66c3a2462..1a2c7f7ca7 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts @@ -21,7 +21,7 @@ let comp: JournalComponent; let fixture: ComponentFixture; const mockItem: Item = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'creativeworkseries.issn': [ { diff --git a/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.spec.ts index 15c7b75bf5..522e16b5b9 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.spec.ts @@ -10,7 +10,7 @@ import { PageInfo } from '../../../../core/shared/page-info.model'; const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithMetadata.hitHighlights = {}; mockItemWithMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { @@ -42,7 +42,7 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithoutMetadata.hitHighlights = {}; mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { diff --git a/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.spec.ts index 25268261e1..bdbd32d980 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.spec.ts @@ -10,7 +10,7 @@ import { PageInfo } from '../../../../core/shared/page-info.model'; const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithMetadata.hitHighlights = {}; mockItemWithMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { @@ -36,7 +36,7 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithoutMetadata.hitHighlights = {}; mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { diff --git a/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.spec.ts index 969912976c..b6877f62aa 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.spec.ts @@ -10,7 +10,7 @@ import { PageInfo } from '../../../../core/shared/page-info.model'; const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithMetadata.hitHighlights = {}; mockItemWithMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { @@ -30,7 +30,7 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithoutMetadata.hitHighlights = {}; mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { diff --git a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.spec.ts index dd2b138abb..fb5d0aedec 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.spec.ts @@ -12,7 +12,7 @@ let orgUnitListElementComponent: OrgUnitListElementComponent; let fixture: ComponentFixture; const mockItemWithMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { @@ -29,7 +29,7 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { } }); const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { diff --git a/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.spec.ts index 3b6aeae45b..cc2b85c4b8 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.spec.ts @@ -12,7 +12,7 @@ let personListElementComponent: PersonListElementComponent; let fixture: ComponentFixture; const mockItemWithMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { @@ -29,7 +29,7 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { } }); const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { diff --git a/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.spec.ts index 02dc3f6d73..ba929ee33e 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.spec.ts @@ -12,7 +12,7 @@ let projectListElementComponent: ProjectListElementComponent; let fixture: ComponentFixture; const mockItemWithMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { @@ -29,7 +29,7 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { } }); const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { diff --git a/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.spec.ts b/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.spec.ts index a49105b2e3..f1b5b7e08f 100644 --- a/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.spec.ts @@ -11,7 +11,7 @@ import { import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; const mockItem: Item = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'organization.foundingDate': [ { diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.spec.ts b/src/app/entity-groups/research-entities/item-pages/person/person.component.spec.ts index 4c523b81cb..302b6f1f60 100644 --- a/src/app/entity-groups/research-entities/item-pages/person/person.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.spec.ts @@ -11,7 +11,7 @@ import { import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; const mockItem: Item = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'person.email': [ { diff --git a/src/app/entity-groups/research-entities/item-pages/project/project.component.spec.ts b/src/app/entity-groups/research-entities/item-pages/project/project.component.spec.ts index 5185857494..6792000fd0 100644 --- a/src/app/entity-groups/research-entities/item-pages/project/project.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-pages/project/project.component.spec.ts @@ -11,7 +11,7 @@ import { import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; const mockItem: Item = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { // 'project.identifier.status': [ // { diff --git a/src/app/shared/mocks/mock-item.ts b/src/app/shared/mocks/mock-item.ts index 6ad064cd27..3b77b630c5 100644 --- a/src/app/shared/mocks/mock-item.ts +++ b/src/app/shared/mocks/mock-item.ts @@ -4,6 +4,7 @@ import { Item } from '../../core/shared/item.model'; import { RemoteData } from '../../core/data/remote-data'; import { Bitstream } from '../../core/shared/bitstream.model'; import { PaginatedList } from '../../core/data/paginated-list'; +import { createPaginatedList, createSuccessfulRemoteDataObject$ } from '../testing/utils'; /* tslint:disable:no-shadowed-variable */ export const MockItem: Item = Object.assign(new Item(), { @@ -12,102 +13,107 @@ export const MockItem: Item = Object.assign(new Item(), { isArchived: true, isDiscoverable: true, isWithdrawn: false, - bitstreams: observableOf(Object.assign({ - self: 'dspace-angular://aggregated/object/1507836003548', - requestPending: false, - responsePending: false, - isSuccessful: true, - errorMessage: '', - state: '', - error: undefined, - isRequestPending: false, - isResponsePending: false, - isLoading: false, - hasFailed: false, - hasSucceeded: true, - statusCode: '202', - pageInfo: {}, - payload: { - pageInfo: { - elementsPerPage: 20, - totalElements: 3, - totalPages: 1, - currentPage: 2 - }, - page: [ - { - sizeBytes: 10201, - content: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/cf9b0c8e-a1eb-4b65-afd0-567366448713/content', - format: observableOf({ - self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreamformats/10', - requestPending: false, - responsePending: false, - isSuccessful: true, - errorMessage: '', - statusCode: '202', - pageInfo: {}, - payload: { - shortDescription: 'Microsoft Word XML', - description: 'Microsoft Word XML', - mimetype: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - supportLevel: 0, - internal: false, - extensions: null, - self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreamformats/10' - } - }), - bundleName: 'ORIGINAL', - self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/cf9b0c8e-a1eb-4b65-afd0-567366448713', - id: 'cf9b0c8e-a1eb-4b65-afd0-567366448713', - uuid: 'cf9b0c8e-a1eb-4b65-afd0-567366448713', - type: 'bitstream', - metadata: { - 'dc.title': [ - { - language: null, - value: 'test_word.docx' + bundles: createSuccessfulRemoteDataObject$(createPaginatedList([ + { + name: 'ORIGINAL', + bitstreams: observableOf(Object.assign({ + self: 'dspace-angular://aggregated/object/1507836003548', + requestPending: false, + responsePending: false, + isSuccessful: true, + errorMessage: '', + state: '', + error: undefined, + isRequestPending: false, + isResponsePending: false, + isLoading: false, + hasFailed: false, + hasSucceeded: true, + statusCode: '202', + pageInfo: {}, + payload: { + pageInfo: { + elementsPerPage: 20, + totalElements: 3, + totalPages: 1, + currentPage: 2 + }, + page: [ + { + sizeBytes: 10201, + content: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/cf9b0c8e-a1eb-4b65-afd0-567366448713/content', + format: observableOf({ + self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreamformats/10', + requestPending: false, + responsePending: false, + isSuccessful: true, + errorMessage: '', + statusCode: '202', + pageInfo: {}, + payload: { + shortDescription: 'Microsoft Word XML', + description: 'Microsoft Word XML', + mimetype: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + supportLevel: 0, + internal: false, + extensions: null, + self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreamformats/10' + } + }), + bundleName: 'ORIGINAL', + self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/cf9b0c8e-a1eb-4b65-afd0-567366448713', + id: 'cf9b0c8e-a1eb-4b65-afd0-567366448713', + uuid: 'cf9b0c8e-a1eb-4b65-afd0-567366448713', + type: 'bitstream', + metadata: { + 'dc.title': [ + { + language: null, + value: 'test_word.docx' + } + ] } - ] - } - }, - { - sizeBytes: 31302, - content: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/99b00f3c-1cc6-4689-8158-91965bee6b28/content', - format: observableOf({ - self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreamformats/4', - requestPending: false, - responsePending: false, - isSuccessful: true, - errorMessage: '', - statusCode: '202', - pageInfo: {}, - payload: { - shortDescription: 'Adobe PDF', - description: 'Adobe Portable Document Format', - mimetype: 'application/pdf', - supportLevel: 0, - internal: false, - extensions: null, - self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreamformats/4' - } - }), - bundleName: 'ORIGINAL', - self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/99b00f3c-1cc6-4689-8158-91965bee6b28', - id: '99b00f3c-1cc6-4689-8158-91965bee6b28', - uuid: '99b00f3c-1cc6-4689-8158-91965bee6b28', - type: 'bitstream', - metadata: { - 'dc.title': [ - { - language: null, - value: 'test_pdf.pdf' + }, + { + sizeBytes: 31302, + content: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/99b00f3c-1cc6-4689-8158-91965bee6b28/content', + format: observableOf({ + self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreamformats/4', + requestPending: false, + responsePending: false, + isSuccessful: true, + errorMessage: '', + statusCode: '202', + pageInfo: {}, + payload: { + shortDescription: 'Adobe PDF', + description: 'Adobe Portable Document Format', + mimetype: 'application/pdf', + supportLevel: 0, + internal: false, + extensions: null, + self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreamformats/4' + } + }), + bundleName: 'ORIGINAL', + self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/99b00f3c-1cc6-4689-8158-91965bee6b28', + id: '99b00f3c-1cc6-4689-8158-91965bee6b28', + uuid: '99b00f3c-1cc6-4689-8158-91965bee6b28', + type: 'bitstream', + metadata: { + 'dc.title': [ + { + language: null, + value: 'test_pdf.pdf' + } + ] } - ] - } + } + ] } - ] + })) } - }) as RemoteData>), + ])), self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357', id: '0ec7ff22-f211-40ab-a69e-c819b0b1f357', uuid: '0ec7ff22-f211-40ab-a69e-c819b0b1f357', diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts index 7c9e861c7e..53ff5ef403 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts @@ -30,7 +30,7 @@ let component: ItemDetailPreviewComponent; let fixture: ComponentFixture; const mockItem: Item = Object.assign(new Item(), { - bitstreams: observableOf(new RemoteData(false, false, true, undefined, new PaginatedList(new PageInfo(), []))), + bundles: observableOf(new RemoteData(false, false, true, undefined, new PaginatedList(new PageInfo(), []))), metadata: { 'dc.contributor.author': [ { @@ -88,7 +88,7 @@ describe('ItemDetailPreviewComponent', () => { component.object = { hitHighlights: {} } as any; component.item = mockItem; component.separator = ', '; - spyOn(component.item, 'getFiles').and.returnValue(mockItem.bitstreams); + spyOn(component.item, 'getFiles').and.returnValue(mockItem.bundles); fixture.detectChanges(); })); diff --git a/src/app/shared/object-grid/item-grid-element/item-grid-element.component.spec.ts b/src/app/shared/object-grid/item-grid-element/item-grid-element.component.spec.ts index 7b286cc415..bc6850d019 100644 --- a/src/app/shared/object-grid/item-grid-element/item-grid-element.component.spec.ts +++ b/src/app/shared/object-grid/item-grid-element/item-grid-element.component.spec.ts @@ -10,7 +10,7 @@ let itemGridElementComponent: ItemGridElementComponent; let fixture: ComponentFixture; const mockItemWithAuthorAndDate: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.contributor.author': [ { @@ -27,7 +27,7 @@ const mockItemWithAuthorAndDate: Item = Object.assign(new Item(), { } }); const mockItemWithoutAuthorAndDate: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { diff --git a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec.ts b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec.ts index e0ba26fcfc..eb3e0c589c 100644 --- a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec.ts +++ b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec.ts @@ -16,7 +16,7 @@ import { PageInfo } from '../../../../../core/shared/page-info.model'; const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithMetadata.hitHighlights = {}; mockItemWithMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { @@ -48,7 +48,7 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); mockItemWithoutMetadata.hitHighlights = {}; mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), + bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ { diff --git a/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.spec.ts b/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.spec.ts index 732fd0d4e4..0913d2231c 100644 --- a/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.spec.ts +++ b/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.spec.ts @@ -12,7 +12,7 @@ let publicationListElementComponent: PublicationListElementComponent; let fixture: ComponentFixture; const mockItemWithMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { @@ -47,7 +47,7 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { } }); const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), + bundles: observableOf({}), metadata: { 'dc.title': [ { diff --git a/src/app/shared/testing/utils.ts b/src/app/shared/testing/utils.ts index 4a551582ee..7033f79472 100644 --- a/src/app/shared/testing/utils.ts +++ b/src/app/shared/testing/utils.ts @@ -2,6 +2,8 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { RemoteData } from '../../core/data/remote-data'; import { Observable, of as observableOf } from 'rxjs'; import { RemoteDataError } from '../../core/data/remote-data-error'; +import { PaginatedList } from '../../core/data/paginated-list'; +import { PageInfo } from '../../core/shared/page-info.model'; /** * Returns true if a Native Element has a specified css class. @@ -121,3 +123,11 @@ export function createPendingRemoteDataObject(object?: T): RemoteData { export function createPendingRemoteDataObject$(object?: T): Observable> { return observableOf(createPendingRemoteDataObject(object)); } + +/** + * Method to create a paginated list for an array of objects + * @param objects An array representing the paginated list's page + */ +export function createPaginatedList(objects?: T[]): PaginatedList { + return new PaginatedList(new PageInfo(), objects); +}