-
+
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 9f2eb32d99..c1aef2739f 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
@@ -1,20 +1,34 @@
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
-import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
-import { MockTranslateLoader } from '../../../../shared/mocks/mock-translate-loader';
-import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component';
-import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
-import { ItemDataService } from '../../../../core/data/item-data.service';
-import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
+import { HttpClient } from '@angular/common/http';
import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
-import { Item } from '../../../../core/shared/item.model';
-import { PaginatedList } from '../../../../core/data/paginated-list';
-import { PageInfo } from '../../../../core/shared/page-info.model';
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
+import { Store } from '@ngrx/store';
+import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
+import { Observable } from 'rxjs/internal/Observable';
+import { RemoteDataBuildService } from '../../../../core/cache/builders/remote-data-build.service';
+import { ObjectCacheService } from '../../../../core/cache/object-cache.service';
+import { BitstreamDataService } from '../../../../core/data/bitstream-data.service';
+import { CommunityDataService } from '../../../../core/data/community-data.service';
+import { DefaultChangeAnalyzer } from '../../../../core/data/default-change-analyzer.service';
+import { DSOChangeAnalyzer } from '../../../../core/data/dso-change-analyzer.service';
+import { ItemDataService } from '../../../../core/data/item-data.service';
+import { PaginatedList } from '../../../../core/data/paginated-list';
+import { RelationshipService } from '../../../../core/data/relationship.service';
+import { RemoteData } from '../../../../core/data/remote-data';
+import { Bitstream } from '../../../../core/shared/bitstream.model';
+import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service';
+import { Item } from '../../../../core/shared/item.model';
+import { MetadataMap } from '../../../../core/shared/metadata.models';
+import { PageInfo } from '../../../../core/shared/page-info.model';
+import { UUIDService } from '../../../../core/shared/uuid.service';
+import { MockTranslateLoader } from '../../../../shared/mocks/mock-translate-loader';
+import { NotificationsService } from '../../../../shared/notifications/notifications.service';
+import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
+import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
+import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
+import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component';
import { createRelationshipsObservable } from '../shared/item.component.spec';
import { PublicationComponent } from './publication.component';
-import { MetadataMap } from '../../../../core/shared/metadata.models';
-import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
-import { RelationshipService } from '../../../../core/data/relationship.service';
const mockItem: Item = Object.assign(new Item(), {
bundles: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])),
@@ -27,6 +41,11 @@ describe('PublicationComponent', () => {
let fixture: ComponentFixture
;
beforeEach(async(() => {
+ const mockBitstreamDataService = {
+ getThumbnailFor(item: Item): Observable> {
+ return createSuccessfulRemoteDataObject$(new Bitstream());
+ }
+ };
TestBed.configureTestingModule({
imports: [TranslateModule.forRoot({
loader: {
@@ -36,14 +55,25 @@ describe('PublicationComponent', () => {
})],
declarations: [PublicationComponent, GenericItemPageFieldComponent, TruncatePipe],
providers: [
- {provide: ItemDataService, useValue: {}},
- {provide: TruncatableService, useValue: {}},
- {provide: RelationshipService, useValue: {}}
+ { provide: ItemDataService, useValue: {} },
+ { provide: TruncatableService, useValue: {} },
+ { provide: RelationshipService, useValue: {} },
+ { provide: ObjectCacheService, useValue: {} },
+ { provide: UUIDService, useValue: {} },
+ { provide: Store, useValue: {} },
+ { provide: RemoteDataBuildService, useValue: {} },
+ { provide: CommunityDataService, useValue: {} },
+ { provide: HALEndpointService, useValue: {} },
+ { provide: NotificationsService, useValue: {} },
+ { provide: HttpClient, useValue: {} },
+ { provide: DSOChangeAnalyzer, useValue: {} },
+ { provide: DefaultChangeAnalyzer, useValue: {} },
+ { provide: BitstreamDataService, useValue: mockBitstreamDataService },
],
schemas: [NO_ERRORS_SCHEMA]
}).overrideComponent(PublicationComponent, {
- set: {changeDetection: ChangeDetectionStrategy.Default}
+ set: { changeDetection: ChangeDetectionStrategy.Default }
}).compileComponents();
}));
diff --git a/src/app/+item-page/simple/item-types/publication/publication.component.ts b/src/app/+item-page/simple/item-types/publication/publication.component.ts
index d926e1efdb..f01d0f72d3 100644
--- a/src/app/+item-page/simple/item-types/publication/publication.component.ts
+++ b/src/app/+item-page/simple/item-types/publication/publication.component.ts
@@ -17,4 +17,5 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class PublicationComponent extends ItemComponent {
+
}
diff --git a/src/app/+item-page/simple/item-types/shared/item-relationships-utils.ts b/src/app/+item-page/simple/item-types/shared/item-relationships-utils.ts
index 7baf260c61..73e02ca29d 100644
--- a/src/app/+item-page/simple/item-types/shared/item-relationships-utils.ts
+++ b/src/app/+item-page/simple/item-types/shared/item-relationships-utils.ts
@@ -1,12 +1,12 @@
-import { getSucceededRemoteData } from '../../../../core/shared/operators';
-import { hasValue } from '../../../../shared/empty.util';
-import { Observable } from 'rxjs/internal/Observable';
-import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
-import { distinctUntilChanged, flatMap, map, switchMap } from 'rxjs/operators';
import { combineLatest as observableCombineLatest, zip as observableZip } from 'rxjs';
-import { Item } from '../../../../core/shared/item.model';
+import { Observable } from 'rxjs/internal/Observable';
+import { distinctUntilChanged, flatMap, map, switchMap } from 'rxjs/operators';
import { PaginatedList } from '../../../../core/data/paginated-list';
import { RemoteData } from '../../../../core/data/remote-data';
+import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
+import { Item } from '../../../../core/shared/item.model';
+import { getFinishedRemoteData, getSucceededRemoteData } from '../../../../core/shared/operators';
+import { hasValue } from '../../../../shared/empty.util';
/**
* Operator for comparing arrays using a mapping function
@@ -74,8 +74,8 @@ export const paginatedRelationsToItems = (thisId: string) =>
source.pipe(
getSucceededRemoteData(),
switchMap((relationshipsRD: RemoteData>) => {
- return observableZip(
- ...relationshipsRD.payload.page.map((rel: Relationship) => observableCombineLatest(rel.leftItem, rel.rightItem))
+ return observableCombineLatest(
+ ...relationshipsRD.payload.page.map((rel: Relationship) => observableCombineLatest(rel.leftItem.pipe(getFinishedRemoteData()), rel.rightItem.pipe(getFinishedRemoteData())))
).pipe(
map((arr) =>
arr
diff --git a/src/app/+item-page/simple/item-types/shared/item.component.spec.ts b/src/app/+item-page/simple/item-types/shared/item.component.spec.ts
index 5a9f1c509d..24a2f028a5 100644
--- a/src/app/+item-page/simple/item-types/shared/item.component.spec.ts
+++ b/src/app/+item-page/simple/item-types/shared/item.component.spec.ts
@@ -1,29 +1,36 @@
-import { Item } from '../../../../core/shared/item.model';
+import { HttpClient } from '@angular/common/http';
+import { ChangeDetectionStrategy, DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
-import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component';
-import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
-import { ItemDataService } from '../../../../core/data/item-data.service';
+import { Store } from '@ngrx/store';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
-import { MockTranslateLoader } from '../../../../shared/mocks/mock-translate-loader';
-import { ChangeDetectionStrategy, DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
-import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
-import { isNotEmpty } from '../../../../shared/empty.util';
-import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model';
-import { PaginatedList } from '../../../../core/data/paginated-list';
-import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
-import { PageInfo } from '../../../../core/shared/page-info.model';
-import { ItemComponent } from './item.component';
-import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
-import { VarDirective } from '../../../../shared/utils/var.directive';
import { Observable } from 'rxjs/internal/Observable';
-import { MetadataRepresentation } from '../../../../core/shared/metadata-representation/metadata-representation.model';
-import { MetadatumRepresentation } from '../../../../core/shared/metadata-representation/metadatum/metadatum-representation.model';
-import { ItemMetadataRepresentation } from '../../../../core/shared/metadata-representation/item/item-metadata-representation.model';
-import { MetadataMap, MetadataValue } from '../../../../core/shared/metadata.models';
-import { compareArraysUsing, compareArraysUsingIds } from './item-relationships-utils';
-import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
+import { RemoteDataBuildService } from '../../../../core/cache/builders/remote-data-build.service';
+import { ObjectCacheService } from '../../../../core/cache/object-cache.service';
+import { BitstreamDataService } from '../../../../core/data/bitstream-data.service';
+import { CommunityDataService } from '../../../../core/data/community-data.service';
+import { DefaultChangeAnalyzer } from '../../../../core/data/default-change-analyzer.service';
+import { DSOChangeAnalyzer } from '../../../../core/data/dso-change-analyzer.service';
+import { ItemDataService } from '../../../../core/data/item-data.service';
+import { PaginatedList } from '../../../../core/data/paginated-list';
import { RelationshipService } from '../../../../core/data/relationship.service';
+import { RemoteData } from '../../../../core/data/remote-data';
+import { Bitstream } from '../../../../core/shared/bitstream.model';
+import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service';
+import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model';
+import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
+import { Item } from '../../../../core/shared/item.model';
+import { PageInfo } from '../../../../core/shared/page-info.model';
+import { UUIDService } from '../../../../core/shared/uuid.service';
+import { isNotEmpty } from '../../../../shared/empty.util';
+import { MockTranslateLoader } from '../../../../shared/mocks/mock-translate-loader';
+import { NotificationsService } from '../../../../shared/notifications/notifications.service';
+import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils';
+import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
+import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
+import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component';
+import { compareArraysUsing, compareArraysUsingIds } from './item-relationships-utils';
+import { ItemComponent } from './item.component';
/**
* Create a generic test for an item-page-fields component using a mockItem and the type of component
@@ -38,6 +45,11 @@ export function getItemPageFieldsTest(mockItem: Item, component) {
let fixture: ComponentFixture;
beforeEach(async(() => {
+ const mockBitstreamDataService = {
+ getThumbnailFor(item: Item): Observable> {
+ return createSuccessfulRemoteDataObject$(new Bitstream());
+ }
+ };
TestBed.configureTestingModule({
imports: [TranslateModule.forRoot({
loader: {
@@ -47,14 +59,25 @@ export function getItemPageFieldsTest(mockItem: Item, component) {
})],
declarations: [component, GenericItemPageFieldComponent, TruncatePipe],
providers: [
- {provide: ItemDataService, useValue: {}},
- {provide: TruncatableService, useValue: {}},
- {provide: RelationshipService, useValue: {}}
+ { provide: ItemDataService, useValue: {} },
+ { provide: TruncatableService, useValue: {} },
+ { provide: RelationshipService, useValue: {} },
+ { provide: ObjectCacheService, useValue: {} },
+ { provide: UUIDService, useValue: {} },
+ { provide: Store, useValue: {} },
+ { provide: RemoteDataBuildService, useValue: {} },
+ { provide: CommunityDataService, useValue: {} },
+ { provide: HALEndpointService, useValue: {} },
+ { provide: HttpClient, useValue: {} },
+ { provide: DSOChangeAnalyzer, useValue: {} },
+ { provide: NotificationsService, useValue: {} },
+ { provide: DefaultChangeAnalyzer, useValue: {} },
+ { provide: BitstreamDataService, useValue: mockBitstreamDataService },
],
schemas: [NO_ERRORS_SCHEMA]
}).overrideComponent(component, {
- set: {changeDetection: ChangeDetectionStrategy.Default}
+ set: { changeDetection: ChangeDetectionStrategy.Default }
}).compileComponents();
}));
@@ -102,6 +125,7 @@ export function createRelationshipsObservable() {
})
]));
}
+
describe('ItemComponent', () => {
const arr1 = [
{
diff --git a/src/app/+item-page/simple/item-types/shared/item.component.ts b/src/app/+item-page/simple/item-types/shared/item.component.ts
index 64a96fdd52..abfcd24346 100644
--- a/src/app/+item-page/simple/item-types/shared/item.component.ts
+++ b/src/app/+item-page/simple/item-types/shared/item.component.ts
@@ -1,5 +1,9 @@
import { Component, Input } from '@angular/core';
+import { Observable } from 'rxjs/internal/Observable';
+import { BitstreamDataService } from '../../../../core/data/bitstream-data.service';
+import { Bitstream } from '../../../../core/shared/bitstream.model';
import { Item } from '../../../../core/shared/item.model';
+import { getFirstSucceededRemoteDataPayload } from '../../../../core/shared/operators';
@Component({
selector: 'ds-item',
@@ -10,4 +14,14 @@ import { Item } from '../../../../core/shared/item.model';
*/
export class ItemComponent {
@Input() object: Item;
+
+ constructor(protected bitstreamDataService: BitstreamDataService) {
+ }
+
+ // TODO refactor to return RemoteData, and thumbnail template to deal with loading
+ getThumbnail(): Observable {
+ return this.bitstreamDataService.getThumbnailFor(this.object).pipe(
+ getFirstSucceededRemoteDataPayload()
+ );
+ }
}
diff --git a/src/app/+item-page/simple/metadata-representation-list/metadata-representation-list.component.ts b/src/app/+item-page/simple/metadata-representation-list/metadata-representation-list.component.ts
index 23484f22e0..fc696482d0 100644
--- a/src/app/+item-page/simple/metadata-representation-list/metadata-representation-list.component.ts
+++ b/src/app/+item-page/simple/metadata-representation-list/metadata-representation-list.component.ts
@@ -10,6 +10,7 @@ import { Relationship } from '../../../core/shared/item-relationships/relationsh
import { Item } from '../../../core/shared/item.model';
import { MetadatumRepresentation } from '../../../core/shared/metadata-representation/metadatum/metadatum-representation.model';
import { ItemMetadataRepresentation } from '../../../core/shared/metadata-representation/item/item-metadata-representation.model';
+import { followLink } from '../../../shared/utils/follow-link-config.model';
import { AbstractIncrementalListComponent } from '../abstract-incremental-list/abstract-incremental-list.component';
@Component({
@@ -81,7 +82,7 @@ export class MetadataRepresentationListComponent extends AbstractIncrementalList
.map((metadatum: any) => Object.assign(new MetadataValue(), metadatum))
.map((metadatum: MetadataValue) => {
if (metadatum.isVirtual) {
- return this.relationshipService.findById(metadatum.virtualValue).pipe(
+ return this.relationshipService.findById(metadatum.virtualValue, followLink('leftItem'), followLink('rightItem')).pipe(
getSucceededRemoteData(),
switchMap((relRD: RemoteData) =>
observableCombineLatest(relRD.payload.leftItem, relRD.payload.rightItem).pipe(
diff --git a/src/app/+item-page/simple/related-entities/tabbed-related-entities-search/tabbed-related-entities-search.component.spec.ts b/src/app/+item-page/simple/related-entities/tabbed-related-entities-search/tabbed-related-entities-search.component.spec.ts
index 2d2e682196..be4e1c1e24 100644
--- a/src/app/+item-page/simple/related-entities/tabbed-related-entities-search/tabbed-related-entities-search.component.spec.ts
+++ b/src/app/+item-page/simple/related-entities/tabbed-related-entities-search/tabbed-related-entities-search.component.spec.ts
@@ -29,7 +29,7 @@ describe('TabbedRelatedEntitiesSearchComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
- imports: [TranslateModule.forRoot(), NoopAnimationsModule, NgbModule.forRoot()],
+ imports: [TranslateModule.forRoot(), NoopAnimationsModule, NgbModule],
declarations: [TabbedRelatedEntitiesSearchComponent, VarDirective],
providers: [
{
diff --git a/src/app/+login-page/login-page-routing.module.ts b/src/app/+login-page/login-page-routing.module.ts
index d3c6425dd3..cd023da55c 100644
--- a/src/app/+login-page/login-page-routing.module.ts
+++ b/src/app/+login-page/login-page-routing.module.ts
@@ -2,12 +2,14 @@ import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { LoginPageComponent } from './login-page.component';
+import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver';
@NgModule({
imports: [
RouterModule.forChild([
- { path: '', pathMatch: 'full', component: LoginPageComponent, data: { title: 'login.title' } }
+ { path: '', pathMatch: 'full', component: LoginPageComponent, resolve: { breadcrumb: I18nBreadcrumbResolver }, data: { breadcrumbKey: 'login', title: 'login.title' } }
])
]
})
-export class LoginPageRoutingModule { }
+export class LoginPageRoutingModule {
+}
diff --git a/src/app/+lookup-by-id/lookup-guard.spec.ts b/src/app/+lookup-by-id/lookup-guard.spec.ts
index dce039eff3..dec5b57afe 100644
--- a/src/app/+lookup-by-id/lookup-guard.spec.ts
+++ b/src/app/+lookup-by-id/lookup-guard.spec.ts
@@ -1,6 +1,6 @@
-import { LookupGuard } from './lookup-guard';
import { of as observableOf } from 'rxjs';
import { IdentifierType } from '../core/data/request.models';
+import { LookupGuard } from './lookup-guard';
describe('LookupGuard', () => {
let dsoService: any;
@@ -8,13 +8,13 @@ describe('LookupGuard', () => {
beforeEach(() => {
dsoService = {
- findById: jasmine.createSpy('findById').and.returnValue(observableOf({ hasFailed: false,
+ findByIdAndIDType: jasmine.createSpy('findByIdAndIDType').and.returnValue(observableOf({ hasFailed: false,
hasSucceeded: true }))
};
guard = new LookupGuard(dsoService);
});
- it('should call findById with handle params', () => {
+ it('should call findByIdAndIDType with handle params', () => {
const scopedRoute = {
params: {
id: '1234',
@@ -22,10 +22,10 @@ describe('LookupGuard', () => {
}
};
guard.canActivate(scopedRoute as any, undefined);
- expect(dsoService.findById).toHaveBeenCalledWith('123456789/1234', IdentifierType.HANDLE)
+ expect(dsoService.findByIdAndIDType).toHaveBeenCalledWith('123456789/1234', IdentifierType.HANDLE)
});
- it('should call findById with handle params', () => {
+ it('should call findByIdAndIDType with handle params', () => {
const scopedRoute = {
params: {
id: '123456789%2F1234',
@@ -33,10 +33,10 @@ describe('LookupGuard', () => {
}
};
guard.canActivate(scopedRoute as any, undefined);
- expect(dsoService.findById).toHaveBeenCalledWith('123456789%2F1234', IdentifierType.HANDLE)
+ expect(dsoService.findByIdAndIDType).toHaveBeenCalledWith('123456789%2F1234', IdentifierType.HANDLE)
});
- it('should call findById with UUID params', () => {
+ it('should call findByIdAndIDType with UUID params', () => {
const scopedRoute = {
params: {
id: '34cfed7c-f597-49ef-9cbe-ea351f0023c2',
@@ -44,7 +44,7 @@ describe('LookupGuard', () => {
}
};
guard.canActivate(scopedRoute as any, undefined);
- expect(dsoService.findById).toHaveBeenCalledWith('34cfed7c-f597-49ef-9cbe-ea351f0023c2', IdentifierType.UUID)
+ expect(dsoService.findByIdAndIDType).toHaveBeenCalledWith('34cfed7c-f597-49ef-9cbe-ea351f0023c2', IdentifierType.UUID)
});
});
diff --git a/src/app/+lookup-by-id/lookup-guard.ts b/src/app/+lookup-by-id/lookup-guard.ts
index a7ddffcd4e..800332422c 100644
--- a/src/app/+lookup-by-id/lookup-guard.ts
+++ b/src/app/+lookup-by-id/lookup-guard.ts
@@ -20,7 +20,7 @@ export class LookupGuard implements CanActivate {
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {
const params = this.getLookupParams(route);
- return this.dsoService.findById(params.id, params.type).pipe(
+ return this.dsoService.findByIdAndIDType(params.id, params.type).pipe(
map((response: RemoteData) => response.hasFailed)
);
}
diff --git a/src/app/+my-dspace-page/my-dspace-page.component.html b/src/app/+my-dspace-page/my-dspace-page.component.html
index e6d1a5c80d..21ef4e9de7 100644
--- a/src/app/+my-dspace-page/my-dspace-page.component.html
+++ b/src/app/+my-dspace-page/my-dspace-page.component.html
@@ -19,7 +19,7 @@