diff --git a/src/app/shared/menu/providers/helper-providers/dso.menu.spec.ts b/src/app/shared/menu/providers/helper-providers/dso.menu.spec.ts index c4ac65d852..38f59a430c 100644 --- a/src/app/shared/menu/providers/helper-providers/dso.menu.spec.ts +++ b/src/app/shared/menu/providers/helper-providers/dso.menu.spec.ts @@ -14,7 +14,7 @@ describe('DSpaceObjectPageMenuProvider', () => { const item: Item = Object.assign(new Item(), { uuid: 'test-item-uuid', type: ITEM.value, - _links: { self: { href: 'self-link' } }, + _links: {self: {href: 'self-link'}}, metadata: { 'dc.title': [{ 'value': 'Untyped Item', @@ -25,7 +25,7 @@ describe('DSpaceObjectPageMenuProvider', () => { const item2: Item = Object.assign(new Item(), { uuid: 'test-item2-uuid', type: ITEM.value, - _links: { self: { href: 'self-link' } }, + _links: {self: {href: 'self-link'}}, metadata: { 'dc.title': [{ 'value': 'Untyped Item 2', @@ -36,7 +36,7 @@ describe('DSpaceObjectPageMenuProvider', () => { const person: Item = Object.assign(new Item(), { uuid: 'test-uuid', type: ITEM.value, - _links: { self: { href: 'self-link' } }, + _links: {self: {href: 'self-link'}}, metadata: { 'dc.title': [{ 'value': 'Person Entity', @@ -50,7 +50,7 @@ describe('DSpaceObjectPageMenuProvider', () => { const collection: Collection = Object.assign(new Collection(), { uuid: 'test-collection-uuid', type: COLLECTION.value, - _links: { self: { href: 'self-link' } }, + _links: {self: {href: 'self-link'}}, metadata: { 'dc.title': [{ 'value': 'Collection', @@ -75,7 +75,7 @@ describe('DSpaceObjectPageMenuProvider', () => { describe('getRouteContext', () => { it('should get the dso from the route', (done) => { - const route = { data: { dso: createSuccessfulRemoteDataObject(item) } } as any; + const route = {data: {dso: createSuccessfulRemoteDataObject(item)}} as any; provider.getRouteContext(route, undefined).subscribe((dso) => { expect(dso).toEqual(item); @@ -83,25 +83,25 @@ describe('DSpaceObjectPageMenuProvider', () => { }); }); - it('return undefined when no DSO is present on the current route', (done) => { + it('return the first parent DSO when no DSO is present on the current route', (done) => { const route = { data: {}, parent: { data: {}, parent: { - data: { dso: createSuccessfulRemoteDataObject(item) }, - parent: { data: { dso: createSuccessfulRemoteDataObject(item2) } }, + data: {dso: createSuccessfulRemoteDataObject(item)}, + parent: {data: {dso: createSuccessfulRemoteDataObject(item2)}}, }, }, } as any; provider.getRouteContext(route, undefined).subscribe((dso) => { - expect(dso).toBeUndefined(); + expect(dso).toEqual(item); done(); }); }); it('should return undefined when no dso is found in the route', (done) => { - const route = { data: {}, parent: { data: {}, parent: { data: {}, parent: { data: {} } } } } as any; + const route = {data: {}, parent: {data: {}, parent: {data: {}, parent: {data: {}}}}} as any; provider.getRouteContext(route, undefined).subscribe((dso) => { expect(dso).toBeUndefined(); diff --git a/src/app/shared/menu/providers/helper-providers/dso.menu.ts b/src/app/shared/menu/providers/helper-providers/dso.menu.ts index 4cef6dbbcc..f19b1cbe53 100644 --- a/src/app/shared/menu/providers/helper-providers/dso.menu.ts +++ b/src/app/shared/menu/providers/helper-providers/dso.menu.ts @@ -16,7 +16,7 @@ import { import { RemoteData } from '../../../../core/data/remote-data'; import { DSpaceObject } from '../../../../core/shared/dspace-object.model'; -import { hasValue } from '../../../empty.util'; +import { hasNoValue, hasValue } from '../../../empty.util'; import { AbstractRouteContextMenuProvider } from './route-context.menu'; /** @@ -28,7 +28,13 @@ export abstract class DSpaceObjectPageMenuProvider extends AbstractRouteContextM * Retrieve the dso from the current route data */ public getRouteContext(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - const dsoRD: RemoteData = route.data.dso; + let dsoRD: RemoteData = route.data.dso; + // Check if one of the parent routes has a DSO + while (hasValue(route.parent) && hasNoValue(dsoRD)) { + route = route.parent; + dsoRD = route.data.dso; + } + if (hasValue(dsoRD) && dsoRD.hasSucceeded && hasValue(dsoRD.payload)) { return of(dsoRD.payload); } else { diff --git a/src/app/shared/menu/providers/statistics.menu.ts b/src/app/shared/menu/providers/statistics.menu.ts index f2ac73b708..bf7cb2c3a1 100644 --- a/src/app/shared/menu/providers/statistics.menu.ts +++ b/src/app/shared/menu/providers/statistics.menu.ts @@ -7,29 +7,16 @@ */ import { Injectable } from '@angular/core'; -import { - ActivatedRouteSnapshot, - RouterStateSnapshot, -} from '@angular/router'; -import { - combineLatest, - map, - Observable, - of, -} from 'rxjs'; +import { combineLatest, map, Observable, } from 'rxjs'; -import { getDSORoute } from '../../../app-routing-paths'; import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; -import { RemoteData } from '../../../core/data/remote-data'; -import { DSpaceObject } from '../../../core/shared/dspace-object.model'; -import { - hasNoValue, - hasValue, -} from '../../empty.util'; +import { hasValue, } from '../../empty.util'; import { MenuItemType } from '../menu-item-type.model'; import { PartialMenuSection } from '../menu-provider.model'; -import { AbstractRouteContextMenuProvider } from './helper-providers/route-context.menu'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { getDSORoute } from '../../../app-routing-paths'; +import { DSpaceObjectPageMenuProvider } from './helper-providers/dso.menu'; /** * Menu provider to create the statistics menu section depending on the page it is on @@ -37,28 +24,14 @@ import { AbstractRouteContextMenuProvider } from './helper-providers/route-conte * In all other cases the menu section will contain a link to the repository wide statistics */ @Injectable() -export class StatisticsMenuProvider extends AbstractRouteContextMenuProvider { +export class StatisticsMenuProvider extends DSpaceObjectPageMenuProvider { + constructor( protected authorizationService: AuthorizationDataService, ) { super(); } - public getRouteContext(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - let dsoRD: RemoteData = route.data.dso; - // Check if one of the parent routes has a DSO - while (hasValue(route.parent) && hasNoValue(dsoRD)) { - route = route.parent; - dsoRD = route.data.dso; - } - - if (hasValue(dsoRD) && dsoRD.hasSucceeded && hasValue(dsoRD.payload)) { - return of(dsoRD.payload); - } else { - return of(undefined); - } - } - public getSectionsForContext(dso: DSpaceObject): Observable { return combineLatest([ this.authorizationService.isAuthorized(FeatureID.CanViewUsageStatistics, dso?._links.self.href), @@ -88,4 +61,9 @@ export class StatisticsMenuProvider extends AbstractRouteContextMenuProvider