diff --git a/src/app/+browse-by/browse-by-guard.ts b/src/app/+browse-by/browse-by-guard.ts new file mode 100644 index 0000000000..30f5d69ffc --- /dev/null +++ b/src/app/+browse-by/browse-by-guard.ts @@ -0,0 +1,58 @@ +import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router'; +import { Injectable } from '@angular/core'; +import { DSpaceObjectDataService } from '../core/data/dspace-object-data.service'; +import { hasValue } from '../shared/empty.util'; +import { combineLatest as observableCombineLatest } from 'rxjs'; +import { map, take } from 'rxjs/operators'; +import { getSucceededRemoteData } from '../core/shared/operators'; +import { TranslateService } from '@ngx-translate/core'; + +@Injectable() +/** + * A guard taking care of the correct route.data being set for the Browse-By components + */ +export class BrowseByGuard implements CanActivate { + + constructor(protected dsoService: DSpaceObjectDataService, + protected translate: TranslateService) { + } + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + const title = route.data.title; + const metadata = route.params.metadata || route.queryParams.metadata || route.data.metadata; + const metadataField = route.data.metadataField; + const scope = route.queryParams.scope; + const value = route.queryParams.value; + + const metadataTranslated$ = this.translate.get('browse.metadata.' + metadata).pipe(take(1)); + + if (hasValue(scope)) { + const dsoAndMetadata$ = observableCombineLatest(metadataTranslated$, this.dsoService.findById(scope).pipe(getSucceededRemoteData())); + return dsoAndMetadata$.pipe( + map(([metadataTranslated, dsoRD]) => { + const name = dsoRD.payload.name; + route.data = this.createData(title, metadata, metadataField, name, metadataTranslated, value);; + return true; + }) + ); + } else { + return metadataTranslated$.pipe( + map((metadataTranslated: string) => { + route.data = this.createData(title, metadata, metadataField, '', metadataTranslated, value); + return true; + }) + ) + } + } + + private createData(title, metadata, metadataField, collection, field, value) { + return { + title: title, + metadata: metadata, + metadataField: metadataField, + collection: collection, + field: field, + value: hasValue(value) ? `"${value}"` : '' + } + } +} diff --git a/src/app/+browse-by/browse-by-routing.module.ts b/src/app/+browse-by/browse-by-routing.module.ts index 51acd19645..9ba15ecfe9 100644 --- a/src/app/+browse-by/browse-by-routing.module.ts +++ b/src/app/+browse-by/browse-by-routing.module.ts @@ -3,13 +3,14 @@ import { NgModule } from '@angular/core'; import { BrowseByTitlePageComponent } from './+browse-by-title-page/browse-by-title-page.component'; import { BrowseByMetadataPageComponent } from './+browse-by-metadata-page/browse-by-metadata-page.component'; import { BrowseByDatePageComponent } from './+browse-by-date-page/browse-by-date-page.component'; +import { BrowseByGuard } from './browse-by-guard'; @NgModule({ imports: [ RouterModule.forChild([ - { path: 'title', component: BrowseByTitlePageComponent, data: { metadata: 'title' } }, - { path: 'dateissued', component: BrowseByDatePageComponent, data: { metadata: 'dateissued', metadataField: 'dc.date.issued' } }, - { path: ':metadata', component: BrowseByMetadataPageComponent } + { path: 'title', component: BrowseByTitlePageComponent, canActivate: [BrowseByGuard], data: { metadata: 'title', title: 'browse.title' } }, + { path: 'dateissued', component: BrowseByDatePageComponent, canActivate: [BrowseByGuard], data: { metadata: 'dateissued', metadataField: 'dc.date.issued', title: 'browse.title' } }, + { path: ':metadata', component: BrowseByMetadataPageComponent, canActivate: [BrowseByGuard], data: { title: 'browse.title' } } ]) ] }) diff --git a/src/app/+browse-by/browse-by.module.ts b/src/app/+browse-by/browse-by.module.ts index 706d20d12e..30d4617c16 100644 --- a/src/app/+browse-by/browse-by.module.ts +++ b/src/app/+browse-by/browse-by.module.ts @@ -7,6 +7,7 @@ import { BrowseByRoutingModule } from './browse-by-routing.module'; import { BrowseService } from '../core/browse/browse.service'; import { BrowseByMetadataPageComponent } from './+browse-by-metadata-page/browse-by-metadata-page.component'; import { BrowseByDatePageComponent } from './+browse-by-date-page/browse-by-date-page.component'; +import { BrowseByGuard } from './browse-by-guard'; @NgModule({ imports: [ @@ -21,7 +22,8 @@ import { BrowseByDatePageComponent } from './+browse-by-date-page/browse-by-date ], providers: [ ItemDataService, - BrowseService + BrowseService, + BrowseByGuard ] }) export class BrowseByModule { diff --git a/src/app/core/metadata/metadata.service.ts b/src/app/core/metadata/metadata.service.ts index 3a63be3f55..a0c07cdd02 100644 --- a/src/app/core/metadata/metadata.service.ts +++ b/src/app/core/metadata/metadata.service.ts @@ -73,7 +73,7 @@ export class MetadataService { this.clearMetaTags(); } if (routeInfo.data.value.title) { - this.translate.get(routeInfo.data.value.title).pipe(take(1)).subscribe((translatedTitle: string) => { + this.translate.get(routeInfo.data.value.title, routeInfo.data.value).pipe(take(1)).subscribe((translatedTitle: string) => { this.addMetaTag('title', translatedTitle); this.title.setTitle(translatedTitle); });