From 3d1e93f5ef2d38e07c2929891ec33332086560bb Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 27 Feb 2020 16:53:47 +0100 Subject: [PATCH] feedback --- resources/i18n/en.json5 | 9 +++- .../browse-by-metadata-page.component.spec.ts | 1 - .../browse-by-dso-breadcrumb.resolver.ts | 41 +++++++++++++++++++ src/app/+browse-by/browse-by-guard.ts | 10 ++--- .../browse-by-i18n-breadcrumb.resolver.ts | 28 +++++++++++++ .../+browse-by/browse-by-routing.module.ts | 21 +++++++++- .../edit-collection-page.routing.module.ts | 9 ++-- .../edit-community-page.routing.module.ts | 7 ++-- .../edit-item-page.routing.module.ts | 12 +++--- src/app/+item-page/item-page.resolver.ts | 2 +- src/app/app-routing.module.ts | 3 +- .../breadcrumb/breadcrumb-config.model.ts | 14 +++++++ .../breadcrumb/breadcrumb.model.ts | 9 ++++ src/app/breadcrumbs/breadcrumbs.component.ts | 10 +++-- .../collection-breadcrumb.resolver.ts | 14 +++++++ .../community-breadcrumb.resolver.ts | 12 ++++++ .../dso-breadcrumb.resolver.spec.ts | 3 +- .../breadcrumbs/dso-breadcrumb.resolver.ts | 13 ++++-- .../breadcrumbs/i18n-breadcrumb.resolver.ts | 4 +- .../breadcrumbs/item-breadcrumb.resolver.ts | 17 ++++++++ .../core/shared/child-hal-resource.model.ts | 7 ++++ 21 files changed, 213 insertions(+), 33 deletions(-) create mode 100644 src/app/+browse-by/browse-by-dso-breadcrumb.resolver.ts create mode 100644 src/app/+browse-by/browse-by-i18n-breadcrumb.resolver.ts diff --git a/resources/i18n/en.json5 b/resources/i18n/en.json5 index 044cf216b8..cfa202fe4a 100644 --- a/resources/i18n/en.json5 +++ b/resources/i18n/en.json5 @@ -196,6 +196,14 @@ "browse.metadata.title": "Title", + "browse.metadata.author.breadcrumbs": "Browse by Author", + + "browse.metadata.dateissued.breadcrumbs": "Browse by Date", + + "browse.metadata.subject.breadcrumbs": "Browse by Subject", + + "browse.metadata.title.breadcrumbs": "Browse by Title", + "browse.startsWith.choose_start": "(Choose start)", "browse.startsWith.choose_year": "(Choose year)", @@ -237,7 +245,6 @@ "browse.title": "Browsing {{ collection }} by {{ field }} {{ value }}", - "chips.remove": "Remove chip", diff --git a/src/app/+browse-by/+browse-by-metadata-page/browse-by-metadata-page.component.spec.ts b/src/app/+browse-by/+browse-by-metadata-page/browse-by-metadata-page.component.spec.ts index 21e7e9ad99..601e7153e9 100644 --- a/src/app/+browse-by/+browse-by-metadata-page/browse-by-metadata-page.component.spec.ts +++ b/src/app/+browse-by/+browse-by-metadata-page/browse-by-metadata-page.component.spec.ts @@ -20,7 +20,6 @@ import { Item } from '../../core/shared/item.model'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; import { Community } from '../../core/shared/community.model'; import { MockRouter } from '../../shared/mocks/mock-router'; -import { ResourceType } from '../../core/shared/resource-type'; import { createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils'; import { BrowseEntry } from '../../core/shared/browse-entry.model'; import { VarDirective } from '../../shared/utils/var.directive'; diff --git a/src/app/+browse-by/browse-by-dso-breadcrumb.resolver.ts b/src/app/+browse-by/browse-by-dso-breadcrumb.resolver.ts new file mode 100644 index 0000000000..5759e28754 --- /dev/null +++ b/src/app/+browse-by/browse-by-dso-breadcrumb.resolver.ts @@ -0,0 +1,41 @@ +import { Injectable } from '@angular/core'; +import { Community } from '../core/shared/community.model'; +import { DSpaceObjectDataService } from '../core/data/dspace-object-data.service'; +import { DSOBreadcrumbsService } from '../core/breadcrumbs/dso-breadcrumbs.service'; +import { Collection } from '../core/shared/collection.model'; +import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { BreadcrumbConfig } from '../breadcrumbs/breadcrumb/breadcrumb-config.model'; +import { Observable } from 'rxjs'; +import { getRemoteDataPayload, getSucceededRemoteData } from '../core/shared/operators'; +import { map } from 'rxjs/operators'; +import { hasValue } from '../shared/empty.util'; +import { getDSOPath } from '../app-routing.module'; + +/** + * The class that resolves the BreadcrumbConfig object for a DSpaceObject on a browse by page + */ +@Injectable() +export class BrowseByDSOBreadcrumbResolver { + constructor(protected breadcrumbService: DSOBreadcrumbsService, protected dataService: DSpaceObjectDataService) { + } + + /** + * Method for resolving a breadcrumb config object + * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot + * @param {RouterStateSnapshot} state The current RouterStateSnapshot + * @returns BreadcrumbConfig object + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable> { + const uuid = route.queryParams.scope; + if (hasValue(uuid)) { + return this.dataService.findById(uuid).pipe( + getSucceededRemoteData(), + getRemoteDataPayload(), + map((object: Community | Collection) => { + return { provider: this.breadcrumbService, key: object, url: getDSOPath(object) }; + }) + ); + } + return undefined; + } +} diff --git a/src/app/+browse-by/browse-by-guard.ts b/src/app/+browse-by/browse-by-guard.ts index 3813f7e656..9659a8c7b4 100644 --- a/src/app/+browse-by/browse-by-guard.ts +++ b/src/app/+browse-by/browse-by-guard.ts @@ -37,24 +37,24 @@ export class BrowseByGuard implements CanActivate { return dsoAndMetadata$.pipe( map((dsoRD) => { const name = dsoRD.payload.name; - route.data = this.createData(title, id, metadataField, name, metadataTranslated, value); + route.data = this.createData(title, id, metadataField, name, metadataTranslated, value, route); return true; }) ); } else { - route.data = this.createData(title, id, metadataField, '', metadataTranslated, value); + route.data = this.createData(title, id, metadataField, '', metadataTranslated, value, route); return observableOf(true); } } - private createData(title, id, metadataField, collection, field, value) { - return { + private createData(title, id, metadataField, collection, field, value, route) { + return Object.assign({}, route.data, { title: title, id: id, metadataField: metadataField, collection: collection, field: field, value: hasValue(value) ? `"${value}"` : '' - } + }); } } diff --git a/src/app/+browse-by/browse-by-i18n-breadcrumb.resolver.ts b/src/app/+browse-by/browse-by-i18n-breadcrumb.resolver.ts new file mode 100644 index 0000000000..c173bd414e --- /dev/null +++ b/src/app/+browse-by/browse-by-i18n-breadcrumb.resolver.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.service'; +import { BreadcrumbConfig } from '../breadcrumbs/breadcrumb/breadcrumb-config.model'; +import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; + +/** + * This class resolves a BreadcrumbConfig object with an i18n key string for a route + * It adds the metadata field of the current browse-by page + */ +@Injectable() +export class BrowseByI18nBreadcrumbResolver extends I18nBreadcrumbResolver { + constructor(protected breadcrumbService: I18nBreadcrumbsService) { + super(breadcrumbService); + } + + /** + * Method for resolving a browse-by i18n breadcrumb configuration object + * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot + * @param {RouterStateSnapshot} state The current RouterStateSnapshot + * @returns BreadcrumbConfig object for a browse-by page + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): BreadcrumbConfig { + const extendedBreadcrumbKey = route.data.breadcrumbKey + '.' + route.params.id; + route.data = Object.assign({}, route.data, { breadcrumbKey: extendedBreadcrumbKey }); + return super.resolve(route, state); + } +} diff --git a/src/app/+browse-by/browse-by-routing.module.ts b/src/app/+browse-by/browse-by-routing.module.ts index e549c0f4e6..a686e7007e 100644 --- a/src/app/+browse-by/browse-by-routing.module.ts +++ b/src/app/+browse-by/browse-by-routing.module.ts @@ -2,12 +2,29 @@ import { RouterModule } from '@angular/router'; import { NgModule } from '@angular/core'; import { BrowseByGuard } from './browse-by-guard'; import { BrowseBySwitcherComponent } from './+browse-by-switcher/browse-by-switcher.component'; +import { BrowseByDSOBreadcrumbResolver } from './browse-by-dso-breadcrumb.resolver'; +import { BrowseByI18nBreadcrumbResolver } from './browse-by-i18n-breadcrumb.resolver'; @NgModule({ imports: [ RouterModule.forChild([ - { path: ':id', component: BrowseBySwitcherComponent, canActivate: [BrowseByGuard], data: { title: 'browse.title' } } - ]) + { + path: '', + resolve: { breadcrumb: BrowseByDSOBreadcrumbResolver }, + children: [ + { + path: ':id', + component: BrowseBySwitcherComponent, + canActivate: [BrowseByGuard], + resolve: { breadcrumb: BrowseByI18nBreadcrumbResolver }, + data: { title: 'browse.title', breadcrumbKey: 'browse.metadata' } + } + ] + }]) + ], + providers: [ + BrowseByI18nBreadcrumbResolver, + BrowseByDSOBreadcrumbResolver ] }) export class BrowseByRoutingModule { diff --git a/src/app/+collection-page/edit-collection-page/edit-collection-page.routing.module.ts b/src/app/+collection-page/edit-collection-page/edit-collection-page.routing.module.ts index e3d5749472..0569de9cd9 100644 --- a/src/app/+collection-page/edit-collection-page/edit-collection-page.routing.module.ts +++ b/src/app/+collection-page/edit-collection-page/edit-collection-page.routing.module.ts @@ -31,23 +31,24 @@ import { I18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.r component: CollectionMetadataComponent, data: { title: 'collection.edit.tabs.metadata.title', - hideReturnButton: true + hideReturnButton: true, + showBreadcrumbs: true } }, { path: 'roles', component: CollectionRolesComponent, - data: { title: 'collection.edit.tabs.roles.title' } + data: { title: 'collection.edit.tabs.roles.title', showBreadcrumbs: true } }, { path: 'source', component: CollectionSourceComponent, - data: { title: 'collection.edit.tabs.source.title' } + data: { title: 'collection.edit.tabs.source.title', showBreadcrumbs: true } }, { path: 'curate', component: CollectionCurateComponent, - data: { title: 'collection.edit.tabs.curate.title' } + data: { title: 'collection.edit.tabs.curate.title', showBreadcrumbs: true } } ] } diff --git a/src/app/+community-page/edit-community-page/edit-community-page.routing.module.ts b/src/app/+community-page/edit-community-page/edit-community-page.routing.module.ts index f0a7813bac..3197e00829 100644 --- a/src/app/+community-page/edit-community-page/edit-community-page.routing.module.ts +++ b/src/app/+community-page/edit-community-page/edit-community-page.routing.module.ts @@ -31,18 +31,19 @@ import { I18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.r component: CommunityMetadataComponent, data: { title: 'community.edit.tabs.metadata.title', - hideReturnButton: true + hideReturnButton: true, + showBreadcrumbs: true } }, { path: 'roles', component: CommunityRolesComponent, - data: { title: 'community.edit.tabs.roles.title' } + data: { title: 'community.edit.tabs.roles.title', showBreadcrumbs: true } }, { path: 'curate', component: CommunityCurateComponent, - data: { title: 'community.edit.tabs.curate.title' } + data: { title: 'community.edit.tabs.curate.title', showBreadcrumbs: true } } ] } diff --git a/src/app/+item-page/edit-item-page/edit-item-page.routing.module.ts b/src/app/+item-page/edit-item-page/edit-item-page.routing.module.ts index af78eeea6f..da667847f7 100644 --- a/src/app/+item-page/edit-item-page/edit-item-page.routing.module.ts +++ b/src/app/+item-page/edit-item-page/edit-item-page.routing.module.ts @@ -47,34 +47,34 @@ const ITEM_EDIT_MOVE_PATH = 'move'; { path: 'status', component: ItemStatusComponent, - data: { title: 'item.edit.tabs.status.title' } + data: { title: 'item.edit.tabs.status.title', showBreadcrumbs: true } }, { path: 'bitstreams', component: ItemBitstreamsComponent, - data: { title: 'item.edit.tabs.bitstreams.title' } + data: { title: 'item.edit.tabs.bitstreams.title', showBreadcrumbs: true } }, { path: 'metadata', component: ItemMetadataComponent, - data: { title: 'item.edit.tabs.metadata.title' } + data: { title: 'item.edit.tabs.metadata.title', showBreadcrumbs: true } }, { path: 'relationships', component: ItemRelationshipsComponent, - data: { title: 'item.edit.tabs.relationships.title' } + data: { title: 'item.edit.tabs.relationships.title', showBreadcrumbs: true } }, { path: 'view', /* TODO - change when view page exists */ component: ItemBitstreamsComponent, - data: { title: 'item.edit.tabs.view.title' } + data: { title: 'item.edit.tabs.view.title', showBreadcrumbs: true } }, { path: 'curate', /* TODO - change when curate page exists */ component: ItemBitstreamsComponent, - data: { title: 'item.edit.tabs.curate.title' } + data: { title: 'item.edit.tabs.curate.title', showBreadcrumbs: true } } ] }, diff --git a/src/app/+item-page/item-page.resolver.ts b/src/app/+item-page/item-page.resolver.ts index 2645f0228c..0f73dc6170 100644 --- a/src/app/+item-page/item-page.resolver.ts +++ b/src/app/+item-page/item-page.resolver.ts @@ -27,7 +27,7 @@ export class ItemPageResolver implements Resolve> { return this.itemService.findById(route.params.id, followLink('owningCollection'), followLink('bundles'), - followLink('relationships') + followLink('relationships'), ).pipe( find((RD) => hasValue(RD.error) || RD.hasSucceeded), ); diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index ede1879894..4cf5efae41 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -11,6 +11,7 @@ import { Collection } from './core/shared/collection.model'; import { Item } from './core/shared/item.model'; import { getItemPageRoute } from './+item-page/item-page-routing.module'; import { getCollectionPageRoute } from './+collection-page/collection-page-routing.module'; +import { BrowseByDSOBreadcrumbResolver } from './+browse-by/browse-by-dso-breadcrumb.resolver'; const ITEM_MODULE_PATH = 'items'; @@ -60,7 +61,7 @@ export function getDSOPath(dso: DSpaceObject): string { { path: ITEM_MODULE_PATH, loadChildren: './+item-page/item-page.module#ItemPageModule' }, { path: 'mydspace', loadChildren: './+my-dspace-page/my-dspace-page.module#MyDSpacePageModule', canActivate: [AuthenticatedGuard] }, { path: 'search', loadChildren: './+search-page/search-page.module#SearchPageModule' }, - { path: 'browse', loadChildren: './+browse-by/browse-by.module#BrowseByModule' }, + { path: 'browse', loadChildren: './+browse-by/browse-by.module#BrowseByModule'}, { path: ADMIN_MODULE_PATH, loadChildren: './+admin/admin.module#AdminModule', canActivate: [AuthenticatedGuard] }, { path: 'login', loadChildren: './+login-page/login-page.module#LoginPageModule' }, { path: 'logout', loadChildren: './+logout-page/logout-page.module#LogoutPageModule' }, diff --git a/src/app/breadcrumbs/breadcrumb/breadcrumb-config.model.ts b/src/app/breadcrumbs/breadcrumb/breadcrumb-config.model.ts index 17ec96e2bd..0ff8fc5033 100644 --- a/src/app/breadcrumbs/breadcrumb/breadcrumb-config.model.ts +++ b/src/app/breadcrumbs/breadcrumb/breadcrumb-config.model.ts @@ -1,7 +1,21 @@ import { BreadcrumbsService } from '../../core/breadcrumbs/breadcrumbs.service'; +/** + * Interface for breadcrumb configuration objects + */ export interface BreadcrumbConfig { + /** + * The service used to calculate the breadcrumb object + */ provider: BreadcrumbsService; + + /** + * The key that is used to calculate the breadcrumb display value + */ key: T; + + /** + * The url of the breadcrumb + */ url?: string; } diff --git a/src/app/breadcrumbs/breadcrumb/breadcrumb.model.ts b/src/app/breadcrumbs/breadcrumb/breadcrumb.model.ts index 99cf66533a..c6ab8491b4 100644 --- a/src/app/breadcrumbs/breadcrumb/breadcrumb.model.ts +++ b/src/app/breadcrumbs/breadcrumb/breadcrumb.model.ts @@ -1,6 +1,15 @@ +/** + * Class representing a single breadcrumb + */ export class Breadcrumb { constructor( + /** + * The display value of the breadcrumb + */ public text: string, + /** + * The optional url of the breadcrumb + */ public url?: string) { } } diff --git a/src/app/breadcrumbs/breadcrumbs.component.ts b/src/app/breadcrumbs/breadcrumbs.component.ts index 861fda844b..2bba3c76b6 100644 --- a/src/app/breadcrumbs/breadcrumbs.component.ts +++ b/src/app/breadcrumbs/breadcrumbs.component.ts @@ -1,7 +1,7 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { Breadcrumb } from './breadcrumb/breadcrumb.model'; -import { hasNoValue, hasValue, isNotUndefined } from '../shared/empty.util'; +import { hasNoValue, hasValue, isNotUndefined, isUndefined } from '../shared/empty.util'; import { filter, map, switchMap, tap } from 'rxjs/operators'; import { combineLatest, Observable, Subscription, of as observableOf } from 'rxjs'; @@ -58,8 +58,12 @@ export class BreadcrumbsComponent implements OnInit, OnDestroy { const routeConfig = route.snapshot.routeConfig; const last: boolean = hasNoValue(route.firstChild); - if (last && isNotUndefined(data.showBreadcrumbs)) { - this.showBreadcrumbs = data.showBreadcrumbs; + if (last) { + if (hasValue(data.showBreadcrumbs)) { + this.showBreadcrumbs = data.showBreadcrumbs; + } else if (isUndefined(data.breadcrumb)) { + this.showBreadcrumbs = false; + } } if ( diff --git a/src/app/core/breadcrumbs/collection-breadcrumb.resolver.ts b/src/app/core/breadcrumbs/collection-breadcrumb.resolver.ts index c662ead129..d9df7cd767 100644 --- a/src/app/core/breadcrumbs/collection-breadcrumb.resolver.ts +++ b/src/app/core/breadcrumbs/collection-breadcrumb.resolver.ts @@ -3,6 +3,7 @@ import { DSOBreadcrumbsService } from './dso-breadcrumbs.service'; import { DSOBreadcrumbResolver } from './dso-breadcrumb.resolver'; import { Collection } from '../shared/collection.model'; import { CollectionDataService } from '../data/collection-data.service'; +import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; /** * The class that resolves the BreadcrumbConfig object for a Collection @@ -12,4 +13,17 @@ export class CollectionBreadcrumbResolver extends DSOBreadcrumbResolver> { + return [ + followLink('parentCommunity', undefined, + followLink('parentCommunity') + ) + ]; + } } diff --git a/src/app/core/breadcrumbs/community-breadcrumb.resolver.ts b/src/app/core/breadcrumbs/community-breadcrumb.resolver.ts index 1e4959f9e5..d1f21455f2 100644 --- a/src/app/core/breadcrumbs/community-breadcrumb.resolver.ts +++ b/src/app/core/breadcrumbs/community-breadcrumb.resolver.ts @@ -3,6 +3,7 @@ import { DSOBreadcrumbsService } from './dso-breadcrumbs.service'; import { DSOBreadcrumbResolver } from './dso-breadcrumb.resolver'; import { CommunityDataService } from '../data/community-data.service'; import { Community } from '../shared/community.model'; +import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; /** * The class that resolves the BreadcrumbConfig object for a Community @@ -12,4 +13,15 @@ export class CommunityBreadcrumbResolver extends DSOBreadcrumbResolver> { + return [ + followLink('parentCommunity') + ]; + } } diff --git a/src/app/core/breadcrumbs/dso-breadcrumb.resolver.spec.ts b/src/app/core/breadcrumbs/dso-breadcrumb.resolver.spec.ts index 774fcd04d5..2a0005f548 100644 --- a/src/app/core/breadcrumbs/dso-breadcrumb.resolver.spec.ts +++ b/src/app/core/breadcrumbs/dso-breadcrumb.resolver.spec.ts @@ -2,6 +2,7 @@ import { DSOBreadcrumbResolver } from './dso-breadcrumb.resolver'; import { Collection } from '../shared/collection.model'; import { createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils'; import { getTestScheduler } from 'jasmine-marbles'; +import { CollectionBreadcrumbResolver } from './collection-breadcrumb.resolver'; describe('DSOBreadcrumbResolver', () => { describe('resolve', () => { @@ -22,7 +23,7 @@ describe('DSOBreadcrumbResolver', () => { collectionService = { findById: (id: string) => createSuccessfulRemoteDataObject$(testCollection) }; - resolver = new DSOBreadcrumbResolver(dsoBreadcrumbService, collectionService); + resolver = new CollectionBreadcrumbResolver(dsoBreadcrumbService, collectionService); }); it('should resolve a breadcrumb config for the correct DSO', () => { diff --git a/src/app/core/breadcrumbs/dso-breadcrumb.resolver.ts b/src/app/core/breadcrumbs/dso-breadcrumb.resolver.ts index 78ba349a5c..80e68a16f5 100644 --- a/src/app/core/breadcrumbs/dso-breadcrumb.resolver.ts +++ b/src/app/core/breadcrumbs/dso-breadcrumb.resolver.ts @@ -8,12 +8,13 @@ import { map } from 'rxjs/operators'; import { Observable } from 'rxjs'; import { DSpaceObject } from '../shared/dspace-object.model'; import { ChildHALResource } from '../shared/child-hal-resource.model'; +import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; /** * The class that resolves the BreadcrumbConfig object for a DSpaceObject */ @Injectable() -export class DSOBreadcrumbResolver implements Resolve> { +export abstract class DSOBreadcrumbResolver implements Resolve> { constructor(protected breadcrumbService: DSOBreadcrumbsService, protected dataService: DataService) { } @@ -25,7 +26,7 @@ export class DSOBreadcrumbResolver im */ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable> { const uuid = route.params.id; - return this.dataService.findById(uuid).pipe( + return this.dataService.findById(uuid, ...this.followLinks).pipe( getSucceededRemoteData(), getRemoteDataPayload(), map((object: T) => { @@ -34,6 +35,12 @@ export class DSOBreadcrumbResolver im return { provider: this.breadcrumbService, key: object, url: url }; }) ); - } + + /** + * Method that returns the follow links to already resolve + * The self links defined in this list are expected to be requested somewhere in the near future + * Requesting them as embeds will limit the number of requests + */ + abstract get followLinks(): Array>; } diff --git a/src/app/core/breadcrumbs/i18n-breadcrumb.resolver.ts b/src/app/core/breadcrumbs/i18n-breadcrumb.resolver.ts index 0978648ba3..de7d061a3f 100644 --- a/src/app/core/breadcrumbs/i18n-breadcrumb.resolver.ts +++ b/src/app/core/breadcrumbs/i18n-breadcrumb.resolver.ts @@ -9,11 +9,11 @@ import { hasNoValue } from '../../shared/empty.util'; */ @Injectable() export class I18nBreadcrumbResolver implements Resolve> { - constructor(private breadcrumbService: I18nBreadcrumbsService) { + constructor(protected breadcrumbService: I18nBreadcrumbsService) { } /** - * Method for resolving a site object + * Method for resolving an I18n breadcrumb configuration object * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot * @param {RouterStateSnapshot} state The current RouterStateSnapshot * @returns BreadcrumbConfig object diff --git a/src/app/core/breadcrumbs/item-breadcrumb.resolver.ts b/src/app/core/breadcrumbs/item-breadcrumb.resolver.ts index c447f7de2a..8390c0e001 100644 --- a/src/app/core/breadcrumbs/item-breadcrumb.resolver.ts +++ b/src/app/core/breadcrumbs/item-breadcrumb.resolver.ts @@ -3,6 +3,7 @@ import { DSOBreadcrumbsService } from './dso-breadcrumbs.service'; import { ItemDataService } from '../data/item-data.service'; import { Item } from '../shared/item.model'; import { DSOBreadcrumbResolver } from './dso-breadcrumb.resolver'; +import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; /** * The class that resolves the BreadcrumbConfig object for an Item @@ -12,4 +13,20 @@ export class ItemBreadcrumbResolver extends DSOBreadcrumbResolver { constructor(protected breadcrumbService: DSOBreadcrumbsService, protected dataService: ItemDataService) { super(breadcrumbService, dataService); } + + /** + * Method that returns the follow links to already resolve + * The self links defined in this list are expected to be requested somewhere in the near future + * Requesting them as embeds will limit the number of requests + */ + get followLinks(): Array> { + return [ + followLink('owningCollection', undefined, + followLink('parentCommunity', undefined, + followLink('parentCommunity')) + ), + followLink('bundles'), + followLink('relationships') + ]; + } } diff --git a/src/app/core/shared/child-hal-resource.model.ts b/src/app/core/shared/child-hal-resource.model.ts index b7682e2631..ee022942bb 100644 --- a/src/app/core/shared/child-hal-resource.model.ts +++ b/src/app/core/shared/child-hal-resource.model.ts @@ -1,5 +1,12 @@ import { HALResource } from './hal-resource.model'; +/** + * Interface for HALResources with a parent object link + */ export interface ChildHALResource extends HALResource { + + /** + * Returns the key of the parent link + */ getParentLinkKey(): keyof this['_links']; }