40416: small fixes and thumbnails

This commit is contained in:
Lotte Hofstede
2017-05-03 14:28:26 +02:00
parent b6fd84eb38
commit d932b44a77
23 changed files with 302 additions and 216 deletions

View File

@@ -14,80 +14,98 @@ import { NormalizedBitstream } from "./normalized-bitstream.model";
export class BundleBuilder { export class BundleBuilder {
constructor( constructor(protected objectCache: ObjectCacheService,
protected objectCache: ObjectCacheService, protected responseCache: ResponseCacheService,
protected responseCache: ResponseCacheService, protected requestService: RequestService,
protected requestService: RequestService, protected store: Store<CoreState>,
protected store: Store<CoreState>, protected href: string,
protected href: string, protected normalized: NormalizedBundle) {
protected normalized: NormalizedBundle }
) {
} build(): Bundle {
let links: any = {};
build(): Bundle {
let links: any = {}; if (hasValue(this.normalized.bitstreams)) {
//for some reason the dispatches in the forEach don't
if (hasValue(this.normalized.bitstreams)) { //fire without this timeout. A zone issue?
//for some reason the dispatches in the forEach don't setTimeout(() => {
//fire without this timeout. A zone issue? this.normalized.bitstreams.forEach((href: string) => {
setTimeout(() => { const isCached = this.objectCache.hasBySelfLink(href);
this.normalized.bitstreams.forEach((href: string) => { const isPending = this.requestService.isPending(href);
const isCached = this.objectCache.hasBySelfLink(href);
const isPending = this.requestService.isPending(href); if (!(isCached || isPending)) {
const request = new Request(href, NormalizedBitstream);
if (!(isCached || isPending)) { this.store.dispatch(new RequestConfigureAction(request));
const request = new Request(href, NormalizedBitstream); this.store.dispatch(new RequestExecuteAction(href));
this.store.dispatch(new RequestConfigureAction(request)); }
this.store.dispatch(new RequestExecuteAction(href)); });
} }, 0);
});
}, 0); links.bitstreams = this.normalized.bitstreams.map((href: string) => {
return new BitstreamRDBuilder(
links.bitstreams = this.normalized.bitstreams.map((href: string) => { this.objectCache,
return new BitstreamRDBuilder( this.responseCache,
this.objectCache, this.requestService,
this.responseCache, this.store,
this.requestService, href
this.store, ).build();
href });
).build(); }
});
if (hasValue(this.normalized.primaryBitstream)) {
const href = this.normalized.primaryBitstream;
//for some reason the dispatches in the forEach don't
//fire without this timeout. A zone issue?
setTimeout(() => {
const isCached = this.objectCache.hasBySelfLink(href);
const isPending = this.requestService.isPending(href);
if (!(isCached || isPending)) {
const request = new Request(href, NormalizedBitstream);
this.store.dispatch(new RequestConfigureAction(request));
this.store.dispatch(new RequestExecuteAction(href));
}
}, 0);
links.primaryBitstream =
new BitstreamRDBuilder(
this.objectCache,
this.responseCache,
this.requestService,
this.store,
href
).build();
}
return Object.assign(new Bundle(), this.normalized, links);
} }
return Object.assign(new Bundle(), this.normalized, links);
}
} }
export class BundleRDBuilder extends SingleRemoteDataBuilder<Bundle, NormalizedBundle> { export class BundleRDBuilder extends SingleRemoteDataBuilder<Bundle, NormalizedBundle> {
constructor( constructor(objectCache: ObjectCacheService,
objectCache: ObjectCacheService, responseCache: ResponseCacheService,
responseCache: ResponseCacheService, requestService: RequestService,
requestService: RequestService, store: Store<CoreState>,
store: Store<CoreState>, href: string) {
href: string super(objectCache, responseCache, requestService, store, href, NormalizedBundle);
) { }
super(objectCache, responseCache, requestService, store, href, NormalizedBundle);
}
protected normalizedToDomain(normalized: NormalizedBundle): Bundle { protected normalizedToDomain(normalized: NormalizedBundle): Bundle {
return new BundleBuilder(this.objectCache, this.responseCache, this.requestService, this.store, this.href, normalized).build(); return new BundleBuilder(this.objectCache, this.responseCache, this.requestService, this.store, this.href, normalized).build();
} }
} }
export class BundleListRDBuilder extends ListRemoteDataBuilder<Bundle, NormalizedBundle> { export class BundleListRDBuilder extends ListRemoteDataBuilder<Bundle, NormalizedBundle> {
constructor( constructor(objectCache: ObjectCacheService,
objectCache: ObjectCacheService, responseCache: ResponseCacheService,
responseCache: ResponseCacheService, requestService: RequestService,
requestService: RequestService, store: Store<CoreState>,
store: Store<CoreState>, href: string) {
href: string super(objectCache, responseCache, requestService, store, href, NormalizedBundle);
) { }
super(objectCache, responseCache, requestService, store, href, NormalizedBundle);
}
protected normalizedToDomain(normalized: NormalizedBundle): Bundle { protected normalizedToDomain(normalized: NormalizedBundle): Bundle {
return new BundleBuilder(this.objectCache, this.responseCache, this.requestService, this.store, this.href, normalized).build(); return new BundleBuilder(this.objectCache, this.responseCache, this.requestService, this.store, this.href, normalized).build();
} }
} }

View File

@@ -29,16 +29,18 @@ export class CollectionBuilder {
let links: any = {}; let links: any = {};
if (hasValue(this.normalized.items)) { if (hasValue(this.normalized.items)) {
this.normalized.items.forEach((href: string) => { setTimeout(() => {
const isCached = this.objectCache.hasBySelfLink(href); this.normalized.items.forEach((href: string) => {
const isPending = this.requestService.isPending(href); const isCached = this.objectCache.hasBySelfLink(href);
const isPending = this.requestService.isPending(href);
if (!(isCached || isPending)) { if (!(isCached || isPending)) {
const request = new Request(href, NormalizedItem); const request = new Request(href, NormalizedItem);
this.store.dispatch(new RequestConfigureAction(request)); this.store.dispatch(new RequestConfigureAction(request));
this.store.dispatch(new RequestExecuteAction(href)); this.store.dispatch(new RequestExecuteAction(href));
} }
}); });
}, 0);
links.items = this.normalized.items.map((href: string) => { links.items = this.normalized.items.map((href: string) => {
return new ItemRDBuilder( return new ItemRDBuilder(

View File

@@ -28,16 +28,18 @@ export class ItemBuilder {
let links: any = {}; let links: any = {};
if (hasValue(this.normalized.bundles)) { if (hasValue(this.normalized.bundles)) {
this.normalized.bundles.forEach((href: string) => { setTimeout(() => {
const isCached = this.objectCache.hasBySelfLink(href); this.normalized.bundles.forEach((href: string) => {
const isPending = this.requestService.isPending(href); const isCached = this.objectCache.hasBySelfLink(href);
const isPending = this.requestService.isPending(href);
if (!(isCached || isPending)) { if (!(isCached || isPending)) {
const request = new Request(href, NormalizedBundle); const request = new Request(href, NormalizedBundle);
this.store.dispatch(new RequestConfigureAction(request)); this.store.dispatch(new RequestConfigureAction(request));
this.store.dispatch(new RequestExecuteAction(href)); this.store.dispatch(new RequestExecuteAction(href));
} }
}); });
}, 0);
links.bundles = this.normalized.bundles.map((href: string) => { links.bundles = this.normalized.bundles.map((href: string) => {
return new BundleRDBuilder( return new BundleRDBuilder(

View File

@@ -1,4 +1,4 @@
import { inheritSerialization } from "cerialize"; import { inheritSerialization, autoserialize } from "cerialize";
import { NormalizedDSpaceObject } from "./normalized-dspace-object.model"; import { NormalizedDSpaceObject } from "./normalized-dspace-object.model";
@inheritSerialization(NormalizedDSpaceObject) @inheritSerialization(NormalizedDSpaceObject)
@@ -33,4 +33,7 @@ export class NormalizedBitstream extends NormalizedDSpaceObject {
* The Bundle that owns this Bitstream * The Bundle that owns this Bitstream
*/ */
owner: string; owner: string;
@autoserialize
retrieve: string;
} }

View File

@@ -8,77 +8,87 @@ import { CacheableObject } from "../cache/object-cache.reducer";
*/ */
export abstract class DSpaceObject implements CacheableObject { export abstract class DSpaceObject implements CacheableObject {
@autoserialize @autoserialize
self: string; self: string;
/** /**
* The human-readable identifier of this DSpaceObject * The human-readable identifier of this DSpaceObject
*/ */
@autoserialize @autoserialize
id: string; id: string;
/** /**
* The universally unique identifier of this DSpaceObject * The universally unique identifier of this DSpaceObject
*/ */
@autoserialize @autoserialize
uuid: string; uuid: string;
/** /**
* A string representing the kind of DSpaceObject, e.g. community, item, … * A string representing the kind of DSpaceObject, e.g. community, item, …
*/ */
type: string; type: string;
/** /**
* The name for this DSpaceObject * The name for this DSpaceObject
*/ */
@autoserialize @autoserialize
name: string; name: string;
/** /**
* An array containing all metadata of this DSpaceObject * An array containing all metadata of this DSpaceObject
*/ */
@autoserializeAs(Metadatum) @autoserializeAs(Metadatum)
metadata: Array<Metadatum>; metadata: Array<Metadatum>;
/** /**
* An array of DSpaceObjects that are direct parents of this DSpaceObject * An array of DSpaceObjects that are direct parents of this DSpaceObject
*/ */
parents: Array<DSpaceObject>; parents: Array<DSpaceObject>;
/** /**
* The DSpaceObject that owns this DSpaceObject * The DSpaceObject that owns this DSpaceObject
*/ */
owner: DSpaceObject; owner: DSpaceObject;
/** /**
* Find a metadata field by key and language * Find a metadata field by key and language
* *
* This method returns the value of the first element * This method returns the value of the first element
* in the metadata array that matches the provided * in the metadata array that matches the provided
* key and language * key and language
* *
* @param key * @param key
* @param language * @param language
* @return string * @return string
*/ */
findMetadata(key: string, language?: string): string { findMetadata(key: string, language?: string): string {
const metadatum = this.metadata const metadatum = this.metadata
.find((metadatum: Metadatum) => { .find((metadatum: Metadatum) => {
return metadatum.key === key && return metadatum.key === key &&
(isEmpty(language) || metadatum.language === language) (isEmpty(language) || metadatum.language === language)
}); });
if (isNotEmpty(metadatum)) { if (isNotEmpty(metadatum)) {
return metadatum.value; return metadatum.value;
} }
else { else {
return undefined; return undefined;
} }
} }
filterMetadata(keys: string[]): Array<Metadatum> { /**
return this.metadata * Find metadata by an array of keys
.filter((metadatum: Metadatum) => { *
return keys.some(key => key === metadatum.key); * This method returns the values of the element
}); * in the metadata array that match the provided
} * key(s)
*
* @param key(s)
* @return Array<Metadatum>
*/
filterMetadata(keys: string[]): Array<Metadatum> {
return this.metadata
.filter((metadatum: Metadatum) => {
return keys.some(key => key === metadatum.key);
});
}
} }

View File

@@ -3,42 +3,62 @@ import { DSpaceObject } from "./dspace-object.model";
import { Collection } from "./collection.model"; import { Collection } from "./collection.model";
import { RemoteData } from "../data/remote-data"; import { RemoteData } from "../data/remote-data";
import { Bundle } from "./bundle.model"; import { Bundle } from "./bundle.model";
import { Bitstream } from "./bitstream.model";
import { Observable } from "rxjs";
@inheritSerialization(DSpaceObject) @inheritSerialization(DSpaceObject)
export class Item extends DSpaceObject { export class Item extends DSpaceObject {
/** /**
* A string representing the unique handle of this Item * A string representing the unique handle of this Item
*/ */
@autoserialize @autoserialize
handle: string; handle: string;
/** /**
* The Date of the last modification of this Item * The Date of the last modification of this Item
*/ */
lastModified: Date; lastModified: Date;
/** /**
* A boolean representing if this Item is currently archived or not * A boolean representing if this Item is currently archived or not
*/ */
isArchived: boolean; isArchived: boolean;
/** /**
* A boolean representing if this Item is currently withdrawn or not * A boolean representing if this Item is currently withdrawn or not
*/ */
isWithdrawn: boolean; isWithdrawn: boolean;
/** /**
* An array of Collections that are direct parents of this Item * An array of Collections that are direct parents of this Item
*/ */
@autoserializeAs(Collection) @autoserializeAs(Collection)
parents: Array<Collection>; parents: Array<Collection>;
/** /**
* The Collection that owns this Item * The Collection that owns this Item
*/ */
owner: Collection; owner: Collection;
bundles: Array<RemoteData<Bundle>> bundles: Array<RemoteData<Bundle>>;
getThumbnail(): Observable<Bitstream> {
const bundle: Observable<Bundle> = this.getBundle("THUMBNAIL");
return bundle.flatMap(
b => b.primaryBitstream.payload
);
}
getBundle(name: String): Observable<Bundle> {
return Observable.combineLatest(
...this.bundles.map(b => b.payload),
(...bundles: Array<Bundle>) => bundles)
.map(bundles => {
return bundles.find((bundle: Bundle) => {
return bundle.name === name
});
});
}
} }

View File

@@ -1,8 +1,9 @@
<div class="item-page" *ngIf="item.hasSucceeded | async"> <div class="item-page" *ngIf="item.hasSucceeded | async">
Item page component Item page component
<ds-item-page-title-field [item]="item.payload"></ds-item-page-title-field> <ds-thumbnail [thumbnail]="thumbnail | async"></ds-thumbnail>
<ds-item-page-date-field [item]="item.payload"></ds-item-page-date-field> <ds-item-page-title-field [item]="item.payload | async"></ds-item-page-title-field>
<ds-item-page-author-field [item]="item.payload"></ds-item-page-author-field> <ds-item-page-date-field [item]="item.payload | async"></ds-item-page-date-field>
<ds-item-page-abstract-field [item]="item.payload"></ds-item-page-abstract-field> <ds-item-page-author-field [item]="item.payload | async"></ds-item-page-author-field>
<ds-item-page-uri-field [item]="item.payload"></ds-item-page-uri-field> <ds-item-page-abstract-field [item]="item.payload | async"></ds-item-page-abstract-field>
<ds-item-page-uri-field [item]="item.payload | async"></ds-item-page-uri-field>
</div> </div>

View File

@@ -1,35 +1,41 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { Item } from "../core/shared/item.model"; import { Item } from "../core/shared/item.model";
import { ItemDataService } from "../core/data-services/item-data.service"; import { ItemDataService } from "../core/data/item-data.service";
import { RemoteData } from "../core/data-services/remote-data"; import { RemoteData } from "../core/data/remote-data";
import { Observable } from "rxjs";
import { Bitstream } from "../core/shared/bitstream.model";
@Component({ @Component({
selector: 'ds-item-page', selector: 'ds-item-page',
styleUrls: ['./item-page.component.css'], styleUrls: ['./item-page.component.css'],
templateUrl: './item-page.component.html' templateUrl: './item-page.component.html',
// changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class ItemPageComponent implements OnInit { export class ItemPageComponent implements OnInit {
id: number; id: number;
private sub: any; private sub: any;
item : RemoteData<Item>; item: RemoteData<Item>;
thumbnail: Observable<Bitstream>;
constructor( private route: ActivatedRoute, private items : ItemDataService) { constructor(private route: ActivatedRoute, private items: ItemDataService) {
this.universalInit(); this.universalInit();
} }
universalInit() { universalInit() {
} }
ngOnInit(): void { ngOnInit(): void {
this.sub = this.route.params.subscribe(params => { this.sub = this.route.params.subscribe(params => {
this.id = +params['id']; this.id = +params['id'];
this.item = this.items.findById(params['id']); this.item = this.items.findById(params['id']);
}); this.thumbnail = this.item.payload.flatMap(i => i.getThumbnail());
});
}
}
} }

View File

@@ -12,6 +12,7 @@ import { ItemPageUriFieldComponent } from './specific-field/uri/item-page-uri-fi
import { ItemPageTitleFieldComponent } from './specific-field/title/item-page-title-field.component'; import { ItemPageTitleFieldComponent } from './specific-field/title/item-page-title-field.component';
import { ItemPageSpecificFieldComponent } from './specific-field/item-page-specific-field.component'; import { ItemPageSpecificFieldComponent } from './specific-field/item-page-specific-field.component';
import { SharedModule } from './../shared/shared.module'; import { SharedModule } from './../shared/shared.module';
import { ThumbnailComponent } from "../thumbnail/thumbnail.component";
@NgModule({ @NgModule({
declarations: [ declarations: [
@@ -25,6 +26,7 @@ import { SharedModule } from './../shared/shared.module';
ItemPageUriFieldComponent, ItemPageUriFieldComponent,
ItemPageTitleFieldComponent, ItemPageTitleFieldComponent,
ItemPageSpecificFieldComponent, ItemPageSpecificFieldComponent,
ThumbnailComponent,
], ],
imports: [ imports: [
ItemPageRoutingModule, ItemPageRoutingModule,

View File

@@ -1,6 +1,5 @@
import { Component, OnInit, Input } from '@angular/core'; import { Component, OnInit, Input } from '@angular/core';
import { Item } from "../../../core/shared/item.model"; import { Item } from "../../../core/shared/item.model";
import { Observable } from "rxjs";
import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component"; import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component";
@Component({ @Component({
@@ -9,7 +8,7 @@ import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.comp
}) })
export class ItemPageAbstractFieldComponent extends ItemPageSpecificFieldComponent implements OnInit { export class ItemPageAbstractFieldComponent extends ItemPageSpecificFieldComponent implements OnInit {
@Input() item: Observable<Item>; @Input() item: Item;
fields : string[] = [ fields : string[] = [
"dc.description.abstract" "dc.description.abstract"

View File

@@ -1,6 +1,5 @@
import { Component, OnInit, Input } from '@angular/core'; import { Component, OnInit, Input } from '@angular/core';
import { Item } from "../../../core/shared/item.model"; import { Item } from "../../../core/shared/item.model";
import { Observable } from "rxjs";
import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component"; import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component";
@Component({ @Component({
@@ -9,7 +8,7 @@ import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.comp
}) })
export class ItemPageAuthorFieldComponent extends ItemPageSpecificFieldComponent implements OnInit { export class ItemPageAuthorFieldComponent extends ItemPageSpecificFieldComponent implements OnInit {
@Input() item: Observable<Item>; @Input() item: Item;
fields : string[] = [ fields : string[] = [
"dc.contributor.author", "dc.contributor.author",

View File

@@ -1,6 +1,5 @@
import { Component, OnInit, Input } from '@angular/core'; import { Component, OnInit, Input } from '@angular/core';
import { Item } from "../../../core/shared/item.model"; import { Item } from "../../../core/shared/item.model";
import { Observable } from "rxjs";
import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component"; import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component";
@Component({ @Component({
@@ -9,7 +8,7 @@ import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.comp
}) })
export class ItemPageDateFieldComponent extends ItemPageSpecificFieldComponent implements OnInit { export class ItemPageDateFieldComponent extends ItemPageSpecificFieldComponent implements OnInit {
@Input() item: Observable<Item>; @Input() item: Item;
fields : string[] = [ fields : string[] = [
"dc.date.issued" "dc.date.issued"

View File

@@ -1,3 +1,3 @@
<div class="item-page-specific-field"> <div class="item-page-specific-field">
<ds-metadata-values [values]="(item | async)?.filterMetadata(fields)" [separator]="separator" [label]="label"></ds-metadata-values> <ds-metadata-values [values]="item?.filterMetadata(fields)" [separator]="separator" [label]="label"></ds-metadata-values>
</div> </div>

View File

@@ -1,13 +1,12 @@
import { Component, OnInit, Input } from '@angular/core'; import { Component, OnInit, Input } from '@angular/core';
import { Item } from "../../core/shared/item.model"; import { Item } from "../../core/shared/item.model";
import { Observable } from "rxjs";
@Component({ @Component({
templateUrl: './item-page-specific-field.component.html' templateUrl: './item-page-specific-field.component.html'
}) })
export class ItemPageSpecificFieldComponent implements OnInit { export class ItemPageSpecificFieldComponent implements OnInit {
@Input() item: Observable<Item>; @Input() item: Item;
fields : string[]; fields : string[];
label : string; label : string;

View File

@@ -1,3 +1,3 @@
<h2 class="item-page-title-field"> <h2 class="item-page-title-field">
<ds-metadata-values [values]="(item | async)?.filterMetadata(fields)"></ds-metadata-values> <ds-metadata-values [values]="item?.filterMetadata(fields)"></ds-metadata-values>
</h2> </h2>

View File

@@ -1,6 +1,5 @@
import { Component, OnInit, Input } from '@angular/core'; import { Component, OnInit, Input } from '@angular/core';
import { Item } from "../../../core/shared/item.model"; import { Item } from "../../../core/shared/item.model";
import { Observable } from "rxjs";
import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component"; import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component";
@Component({ @Component({
@@ -9,7 +8,7 @@ import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.comp
}) })
export class ItemPageTitleFieldComponent extends ItemPageSpecificFieldComponent implements OnInit { export class ItemPageTitleFieldComponent extends ItemPageSpecificFieldComponent implements OnInit {
@Input() item: Observable<Item>; @Input() item: Item;
fields : string[] = [ fields : string[] = [
"dc.title" "dc.title"

View File

@@ -1,3 +1,3 @@
<div class="item-page-specific-field"> <div class="item-page-specific-field">
<ds-metadata-uri-values [values]="(item | async)?.filterMetadata(fields)" [separator]="separator" [label]="label"></ds-metadata-uri-values> <ds-metadata-uri-values [values]="item?.filterMetadata(fields)" [separator]="separator" [label]="label"></ds-metadata-uri-values>
</div> </div>

View File

@@ -1,6 +1,5 @@
import { Component, OnInit, Input } from '@angular/core'; import { Component, OnInit, Input } from '@angular/core';
import { Item } from "../../../core/shared/item.model"; import { Item } from "../../../core/shared/item.model";
import { Observable } from "rxjs";
import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component"; import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.component";
@Component({ @Component({
@@ -9,7 +8,7 @@ import { ItemPageSpecificFieldComponent } from "../item-page-specific-field.comp
}) })
export class ItemPageUriFieldComponent extends ItemPageSpecificFieldComponent implements OnInit { export class ItemPageUriFieldComponent extends ItemPageSpecificFieldComponent implements OnInit {
@Input() item: Observable<Item>; @Input() item: Item;
fields : string[] = [ fields : string[] = [
"dc.identifier.uri" "dc.identifier.uri"

View File

@@ -0,0 +1,3 @@
<div class="thumbnail">
<img [src]="thumbnail?.retrieve"/>
</div>

View File

@@ -0,0 +1 @@
@import '../../styles/variables.scss';

View File

@@ -0,0 +1,24 @@
import { Component, Input } from '@angular/core';
import { Bitstream } from "../core/shared/bitstream.model";
import { Observable } from "rxjs";
@Component({
selector: 'ds-thumbnail',
styleUrls: ['./thumbnail.component.css'],
templateUrl: './thumbnail.component.html'
})
export class ThumbnailComponent {
@Input() thumbnail : Observable<Bitstream>;
data: any = {};
constructor() {
this.universalInit();
}
universalInit() {
}
}

View File

@@ -8,7 +8,7 @@ export const BUNDLES = [
"bitstreams": [ "bitstreams": [
{ "href": "/bitstreams/3678" }, { "href": "/bitstreams/3678" },
], ],
"primaryBitstream": { "href": "/bitstreams/43c57c2b-206f-4645-8c8f-5f10c84b09fa" } "primaryBitstream": { "href": "/bitstreams/3678" }
}, },
"id": "2355", "id": "2355",
"uuid": "35e0606d-5e18-4f9c-aa61-74fc751cc3f9", "uuid": "35e0606d-5e18-4f9c-aa61-74fc751cc3f9",
@@ -26,7 +26,7 @@ export const BUNDLES = [
"bitstreams": [ "bitstreams": [
{ "href": "/bitstreams/8842" }, { "href": "/bitstreams/8842" },
], ],
"primaryBitstream": { "href": "/bitstreams/1a013ecc-fb25-4689-a44f-f1383ad26632" } "primaryBitstream": { "href": "/bitstreams/8842" }
}, },
"id": "5687", "id": "5687",
"uuid": "a469c57a-abcf-45c3-83e4-b187ebd708fd", "uuid": "a469c57a-abcf-45c3-83e4-b187ebd708fd",