From 8d6156df37558607cb63061fdde5c1e4d703e3fd Mon Sep 17 00:00:00 2001 From: lotte Date: Tue, 23 Mar 2021 16:30:38 +0100 Subject: [PATCH 1/5] 77818: edit page permission fixes --- .../edit-item-page.component.html | 15 ++++++--- .../edit-item-page.component.ts | 29 ++++++++++++----- .../edit-item-page.routing.module.ts | 25 ++++++++++----- .../item-page-edit-metadata.guard.ts | 31 +++++++++++++++++++ .../+item-page/item-page-routing.module.ts | 4 +-- .../dso-page-feature.guard.ts | 12 ++++++- .../dso-page-edit-button.component.html | 2 +- src/assets/i18n/en.json5 | 2 ++ 8 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 src/app/+item-page/item-page-edit-metadata.guard.ts diff --git a/src/app/+item-page/edit-item-page/edit-item-page.component.html b/src/app/+item-page/edit-item-page/edit-item-page.component.html index ca1c809cd9..6b6f74309c 100644 --- a/src/app/+item-page/edit-item-page/edit-item-page.component.html +++ b/src/app/+item-page/edit-item-page/edit-item-page.component.html @@ -5,11 +5,18 @@
diff --git a/src/app/+item-page/edit-item-page/edit-item-page.component.ts b/src/app/+item-page/edit-item-page/edit-item-page.component.ts index ec7cdb022d..d0b0fe9356 100644 --- a/src/app/+item-page/edit-item-page/edit-item-page.component.ts +++ b/src/app/+item-page/edit-item-page/edit-item-page.component.ts @@ -1,12 +1,13 @@ import { fadeIn, fadeInOut } from '../../shared/animations/fade'; -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ChangeDetectionStrategy, Component, Injector, OnInit } from '@angular/core'; +import { ActivatedRoute, CanActivate, Route, Router } from '@angular/router'; import { RemoteData } from '../../core/data/remote-data'; import { Item } from '../../core/shared/item.model'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; +import { combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs'; +import { map, tap } from 'rxjs/operators'; import { isNotEmpty } from '../../shared/empty.util'; import { getItemPageRoute } from '../item-page-routing-paths'; +import { GenericConstructor } from '../../core/shared/generic-constructor'; @Component({ selector: 'ds-edit-item-page', @@ -35,9 +36,9 @@ export class EditItemPageComponent implements OnInit { /** * All possible page outlet strings */ - pages: string[]; + pages: { page: string, enabled: Observable }[]; - constructor(private route: ActivatedRoute, private router: Router) { + constructor(private route: ActivatedRoute, private router: Router, private injector: Injector) { this.router.events.subscribe(() => { this.currentPage = this.route.snapshot.firstChild.routeConfig.path; }); @@ -45,8 +46,20 @@ export class EditItemPageComponent implements OnInit { ngOnInit(): void { this.pages = this.route.routeConfig.children - .map((child: any) => child.path) - .filter((path: string) => isNotEmpty(path)); // ignore reroutes + .filter((child: Route) => isNotEmpty(child.path)) + .map((child: Route) => { + let enabled = observableOf(true); + if (isNotEmpty(child.canActivate)) { + enabled = observableCombineLatest(child.canActivate.map((guardConstructor: GenericConstructor) => { + const guard: CanActivate = this.injector.get(guardConstructor); + return guard.canActivate(this.route.snapshot, this.router.routerState.snapshot); + }) + ).pipe( + map((canActivateOutcomes: any[]) => canActivateOutcomes.every((e) => e === true)) + ); + } + return { page: child.path, enabled: enabled }; + }); // ignore reroutes this.itemRD$ = this.route.data.pipe(map((data) => data.dso)); } 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 da10d33add..0e36cc9894 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 @@ -31,6 +31,9 @@ import { } from './edit-item-page.routing-paths'; import { ItemPageReinstateGuard } from './item-page-reinstate.guard'; import { ItemPageWithdrawGuard } from './item-page-withdraw.guard'; +import { ItemPageEditMetadataGuard } from '../item-page-edit-metadata.guard'; +import { ItemPageAdministratorGuard } from '../item-page-administrator.guard'; +import { AuthenticatedGuard } from '../../core/auth/authenticated.guard'; /** * Routing module that handles the routing for the Edit Item page administrator functionality @@ -57,22 +60,26 @@ import { ItemPageWithdrawGuard } from './item-page-withdraw.guard'; { path: 'status', component: ItemStatusComponent, - data: { title: 'item.edit.tabs.status.title', showBreadcrumbs: true } + data: { title: 'item.edit.tabs.status.title', showBreadcrumbs: true }, + canActivate: [ItemPageAdministratorGuard] }, { path: 'bitstreams', component: ItemBitstreamsComponent, - data: { title: 'item.edit.tabs.bitstreams.title', showBreadcrumbs: true } + data: { title: 'item.edit.tabs.bitstreams.title', showBreadcrumbs: true }, + canActivate: [ItemPageAdministratorGuard] }, { path: 'metadata', component: ItemMetadataComponent, - data: { title: 'item.edit.tabs.metadata.title', showBreadcrumbs: true } + data: { title: 'item.edit.tabs.metadata.title', showBreadcrumbs: true }, + canActivate: [ItemPageEditMetadataGuard] }, { path: 'relationships', component: ItemRelationshipsComponent, - data: { title: 'item.edit.tabs.relationships.title', showBreadcrumbs: true } + data: { title: 'item.edit.tabs.relationships.title', showBreadcrumbs: true }, + canActivate: [ItemPageEditMetadataGuard] }, /* TODO - uncomment & fix when view page exists { @@ -89,12 +96,14 @@ import { ItemPageWithdrawGuard } from './item-page-withdraw.guard'; { path: 'versionhistory', component: ItemVersionHistoryComponent, - data: { title: 'item.edit.tabs.versionhistory.title', showBreadcrumbs: true } + data: { title: 'item.edit.tabs.versionhistory.title', showBreadcrumbs: true }, + canActivate: [ItemPageAdministratorGuard] }, { path: 'mapper', component: ItemCollectionMapperComponent, - data: { title: 'item.edit.tabs.item-mapper.title', showBreadcrumbs: true } + data: { title: 'item.edit.tabs.item-mapper.title', showBreadcrumbs: true }, + canActivate: [ItemPageAdministratorGuard] } ] }, @@ -165,7 +174,9 @@ import { ItemPageWithdrawGuard } from './item-page-withdraw.guard'; ResourcePolicyResolver, ResourcePolicyTargetResolver, ItemPageReinstateGuard, - ItemPageWithdrawGuard + ItemPageWithdrawGuard, + ItemPageAdministratorGuard, + ItemPageEditMetadataGuard, ] }) export class EditItemPageRoutingModule { diff --git a/src/app/+item-page/item-page-edit-metadata.guard.ts b/src/app/+item-page/item-page-edit-metadata.guard.ts new file mode 100644 index 0000000000..821ca44c30 --- /dev/null +++ b/src/app/+item-page/item-page-edit-metadata.guard.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; +import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; +import { ItemPageResolver } from './item-page.resolver'; +import { Item } from '../core/shared/item.model'; +import { DsoPageFeatureGuard } from '../core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard'; +import { Observable, of as observableOf } from 'rxjs'; +import { FeatureID } from '../core/data/feature-authorization/feature-id'; +import { AuthService } from '../core/auth/auth.service'; + +@Injectable({ + providedIn: 'root' +}) +/** + * Guard for preventing unauthorized access to certain {@link Item} pages requiring edit metadata rights + */ +export class ItemPageEditMetadataGuard extends DsoPageFeatureGuard { + constructor(protected resolver: ItemPageResolver, + protected authorizationService: AuthorizationDataService, + protected router: Router, + protected authService: AuthService) { + super(resolver, authorizationService, router, authService); + } + + /** + * Check administrator authorization rights + */ + getFeatureID(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return observableOf(FeatureID.CanEditMetadata); + } +} diff --git a/src/app/+item-page/item-page-routing.module.ts b/src/app/+item-page/item-page-routing.module.ts index b04a783b2f..80564b5d21 100644 --- a/src/app/+item-page/item-page-routing.module.ts +++ b/src/app/+item-page/item-page-routing.module.ts @@ -13,6 +13,7 @@ import { UPLOAD_BITSTREAM_PATH, ITEM_EDIT_PATH } from './item-page-routing-paths import { ItemPageAdministratorGuard } from './item-page-administrator.guard'; import { MenuItemType } from '../shared/menu/initial-menus-state'; import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; +import { ItemPageEditMetadataGuard } from './item-page-edit-metadata.guard'; @NgModule({ imports: [ @@ -38,7 +39,6 @@ import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; path: ITEM_EDIT_PATH, loadChildren: () => import('./edit-item-page/edit-item-page.module') .then((m) => m.EditItemPageModule), - canActivate: [ItemPageAdministratorGuard] }, { path: UPLOAD_BITSTREAM_PATH, @@ -68,7 +68,7 @@ import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; ItemBreadcrumbResolver, DSOBreadcrumbsService, LinkService, - ItemPageAdministratorGuard + ItemPageAdministratorGuard, ] }) diff --git a/src/app/core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard.ts b/src/app/core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard.ts index c9ac7155d4..c85af60913 100644 --- a/src/app/core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard.ts +++ b/src/app/core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard.ts @@ -7,6 +7,7 @@ import { map } from 'rxjs/operators'; import { DSpaceObject } from '../../../shared/dspace-object.model'; import { FeatureAuthorizationGuard } from './feature-authorization.guard'; import { AuthService } from '../../../auth/auth.service'; +import { hasNoValue, hasValue } from '../../../../shared/empty.util'; /** * Abstract Guard for preventing unauthorized access to {@link DSpaceObject} pages that require rights for a specific feature @@ -24,9 +25,18 @@ export abstract class DsoPageFeatureGuard extends Featur * Check authorization rights for the object resolved using the provided resolver */ getObjectUrl(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - return (this.resolver.resolve(route, state) as Observable>).pipe( + const routeWithObjectID = this.getRouteWithDSOId(route); + return (this.resolver.resolve(routeWithObjectID, state) as Observable>).pipe( getAllSucceededRemoteDataPayload(), map((dso) => dso.self) ); } + + protected getRouteWithDSOId(route: ActivatedRouteSnapshot): ActivatedRouteSnapshot { + let routeWithDSOId = route; + while (hasNoValue(routeWithDSOId.params.id) && hasValue(routeWithDSOId.parent)) { + routeWithDSOId = routeWithDSOId.parent; + } + return routeWithDSOId; + } } diff --git a/src/app/shared/dso-page/dso-page-edit-button/dso-page-edit-button.component.html b/src/app/shared/dso-page/dso-page-edit-button/dso-page-edit-button.component.html index 36661c895a..d845f852c8 100644 --- a/src/app/shared/dso-page/dso-page-edit-button/dso-page-edit-button.component.html +++ b/src/app/shared/dso-page/dso-page-edit-button/dso-page-edit-button.component.html @@ -1,5 +1,5 @@ diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index f60abfb253..e81df2f336 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1471,6 +1471,8 @@ "item.edit.breadcrumbs": "Edit Item", + "item.edit.tabs.disabled.tooltip": "You don't have permission to access this tab", + "item.edit.tabs.mapper.head": "Collection Mapper", From 11f3962326d62ff91344bdb5b9f9a1b5a50f0bee Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 24 Mar 2021 14:33:32 +0100 Subject: [PATCH 2/5] added tests --- .../edit-item-page.component.spec.ts | 107 ++++++++++++++++++ .../dso-page-feature.guard.spec.ts | 21 +++- 2 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 src/app/+item-page/edit-item-page/edit-item-page.component.spec.ts diff --git a/src/app/+item-page/edit-item-page/edit-item-page.component.spec.ts b/src/app/+item-page/edit-item-page/edit-item-page.component.spec.ts new file mode 100644 index 0000000000..6c9f79c36b --- /dev/null +++ b/src/app/+item-page/edit-item-page/edit-item-page.component.spec.ts @@ -0,0 +1,107 @@ +import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; +import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ActivatedRoute, ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; +import { EditItemPageComponent } from './edit-item-page.component'; +import { Observable, of as observableOf } from 'rxjs'; +import { By } from '@angular/platform-browser'; +import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils'; +import { Item } from '../../core/shared/item.model'; + +describe('ItemPageComponent', () => { + let comp: EditItemPageComponent; + let fixture: ComponentFixture; + + class AcceptAllGuard implements CanActivate { + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { + return observableOf(true); + } + } + + // tslint:disable-next-line:max-classes-per-file + class AcceptNoneGuard implements CanActivate { + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { + console.log('BLA'); + return observableOf(false); + } + } + + const accesiblePages = ['accessible']; + const inaccesiblePages = ['inaccessible', 'inaccessibleDoubleGuard']; + const mockRoute = { + snapshot: { + firstChild: { + routeConfig: { + path: accesiblePages[0] + } + }, + routerState: { + snapshot: undefined + } + }, + routeConfig: { + children: [ + { + path: accesiblePages[0], + canActivate: [AcceptAllGuard] + }, { + path: inaccesiblePages[0], + canActivate: [AcceptNoneGuard] + }, { + path: inaccesiblePages[1], + canActivate: [AcceptAllGuard, AcceptNoneGuard] + }, + ] + }, + data: observableOf({dso: createSuccessfulRemoteDataObject(new Item())}) + }; + + const mockRouter = { + routerState: { + snapshot: undefined + }, + events: observableOf(undefined) + }; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + })], + declarations: [EditItemPageComponent], + providers: [ + { provide: ActivatedRoute, useValue: mockRoute }, + { provide: Router, useValue: mockRouter }, + AcceptAllGuard, + AcceptNoneGuard, + ], + + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(EditItemPageComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); + + beforeEach(waitForAsync(() => { + fixture = TestBed.createComponent(EditItemPageComponent); + comp = fixture.componentInstance; + spyOn((comp as any).injector, 'get').and.callFake((a) => new a()); + fixture.detectChanges(); + })); + + describe('ngOnInit', () => { + it('should enable tabs that the user can activate', fakeAsync(() => { + const enabledItems = fixture.debugElement.queryAll(By.css('a.nav-link')); + expect(enabledItems.length).toBe(accesiblePages.length); + })); + + it('should disable tabs that the user can not activate', () => { + const disabledItems = fixture.debugElement.queryAll(By.css('button.nav-link.disabled')); + expect(disabledItems.length).toBe(inaccesiblePages.length); + }); + }); +}); diff --git a/src/app/core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard.spec.ts b/src/app/core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard.spec.ts index 4041e588ed..f98e3f1837 100644 --- a/src/app/core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard.spec.ts +++ b/src/app/core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard.spec.ts @@ -32,6 +32,8 @@ describe('DsoPageAdministratorGuard', () => { let authService: AuthService; let resolver: Resolve>; let object: DSpaceObject; + let route; + let parentRoute; function init() { object = { @@ -50,6 +52,16 @@ describe('DsoPageAdministratorGuard', () => { authService = jasmine.createSpyObj('authService', { isAuthenticated: observableOf(true) }); + parentRoute = { + params: { + id: '3e1a5327-dabb-41ff-af93-e6cab9d032f0' + } + }; + route = { + params: { + }, + parent: parentRoute + }; guard = new DsoPageFeatureGuardImpl(resolver, authorizationService, router, authService, undefined); } @@ -59,10 +71,17 @@ describe('DsoPageAdministratorGuard', () => { describe('getObjectUrl', () => { it('should return the resolved object\'s selflink', (done) => { - guard.getObjectUrl(undefined, undefined).subscribe((selflink) => { + guard.getObjectUrl(route, undefined).subscribe((selflink) => { expect(selflink).toEqual(object.self); done(); }); }); }); + + describe('getRouteWithDSOId', () => { + it('should return the route that has the UUID of the DSO', () => { + const foundRoute = (guard as any).getRouteWithDSOId(route); + expect(foundRoute).toBe(parentRoute); + }); + }); }); From 650f7106c24d30836157fd94a4aec9a1648d9c68 Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 24 Mar 2021 14:36:23 +0100 Subject: [PATCH 3/5] removed unused imports --- .../edit-item-page/edit-item-page.component.spec.ts | 4 ++-- src/app/+item-page/edit-item-page/edit-item-page.component.ts | 2 +- src/app/+item-page/item-page-routing.module.ts | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/app/+item-page/edit-item-page/edit-item-page.component.spec.ts b/src/app/+item-page/edit-item-page/edit-item-page.component.spec.ts index 6c9f79c36b..cff9104c01 100644 --- a/src/app/+item-page/edit-item-page/edit-item-page.component.spec.ts +++ b/src/app/+item-page/edit-item-page/edit-item-page.component.spec.ts @@ -1,7 +1,7 @@ -import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, fakeAsync, TestBed, waitForAsync } from '@angular/core/testing'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; -import { ChangeDetectionStrategy, Injector, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { ActivatedRoute, ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; import { EditItemPageComponent } from './edit-item-page.component'; import { Observable, of as observableOf } from 'rxjs'; diff --git a/src/app/+item-page/edit-item-page/edit-item-page.component.ts b/src/app/+item-page/edit-item-page/edit-item-page.component.ts index d0b0fe9356..5f1889a404 100644 --- a/src/app/+item-page/edit-item-page/edit-item-page.component.ts +++ b/src/app/+item-page/edit-item-page/edit-item-page.component.ts @@ -4,7 +4,7 @@ import { ActivatedRoute, CanActivate, Route, Router } from '@angular/router'; import { RemoteData } from '../../core/data/remote-data'; import { Item } from '../../core/shared/item.model'; import { combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs'; -import { map, tap } from 'rxjs/operators'; +import { map } from 'rxjs/operators'; import { isNotEmpty } from '../../shared/empty.util'; import { getItemPageRoute } from '../item-page-routing-paths'; import { GenericConstructor } from '../../core/shared/generic-constructor'; diff --git a/src/app/+item-page/item-page-routing.module.ts b/src/app/+item-page/item-page-routing.module.ts index 80564b5d21..8d2853735b 100644 --- a/src/app/+item-page/item-page-routing.module.ts +++ b/src/app/+item-page/item-page-routing.module.ts @@ -9,11 +9,10 @@ import { ItemBreadcrumbResolver } from '../core/breadcrumbs/item-breadcrumb.reso import { DSOBreadcrumbsService } from '../core/breadcrumbs/dso-breadcrumbs.service'; import { LinkService } from '../core/cache/builders/link.service'; import { UploadBitstreamComponent } from './bitstreams/upload/upload-bitstream.component'; -import { UPLOAD_BITSTREAM_PATH, ITEM_EDIT_PATH } from './item-page-routing-paths'; +import { ITEM_EDIT_PATH, UPLOAD_BITSTREAM_PATH } from './item-page-routing-paths'; import { ItemPageAdministratorGuard } from './item-page-administrator.guard'; import { MenuItemType } from '../shared/menu/initial-menus-state'; import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; -import { ItemPageEditMetadataGuard } from './item-page-edit-metadata.guard'; @NgModule({ imports: [ From 029308b52fb2c5ee51de8a0a3c7c466c4179610b Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 24 Mar 2021 15:06:27 +0100 Subject: [PATCH 4/5] Added missing typedoc --- src/app/+item-page/item-page-edit-metadata.guard.ts | 2 +- .../feature-authorization-guard/dso-page-feature.guard.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/+item-page/item-page-edit-metadata.guard.ts b/src/app/+item-page/item-page-edit-metadata.guard.ts index 821ca44c30..a9b870b1cd 100644 --- a/src/app/+item-page/item-page-edit-metadata.guard.ts +++ b/src/app/+item-page/item-page-edit-metadata.guard.ts @@ -23,7 +23,7 @@ export class ItemPageEditMetadataGuard extends DsoPageFeatureGuard { } /** - * Check administrator authorization rights + * Check edit metadata authorization rights */ getFeatureID(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { return observableOf(FeatureID.CanEditMetadata); diff --git a/src/app/core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard.ts b/src/app/core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard.ts index c85af60913..c50dd7f95d 100644 --- a/src/app/core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard.ts +++ b/src/app/core/data/feature-authorization/feature-authorization-guard/dso-page-feature.guard.ts @@ -32,6 +32,10 @@ export abstract class DsoPageFeatureGuard extends Featur ); } + /** + * Method to resolve resolve (parent) route that contains the UUID of the DSO + * @param route The current route + */ protected getRouteWithDSOId(route: ActivatedRouteSnapshot): ActivatedRouteSnapshot { let routeWithDSOId = route; while (hasNoValue(routeWithDSOId.params.id) && hasValue(routeWithDSOId.parent)) { From 623688304ddf674420912415dd8a730d6f4acf11 Mon Sep 17 00:00:00 2001 From: lotte Date: Wed, 24 Mar 2021 15:30:54 +0100 Subject: [PATCH 5/5] removed unused import --- .../edit-item-page/edit-item-page.routing.module.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 0e36cc9894..b7d650d8c3 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 @@ -22,10 +22,10 @@ import { ResourcePolicyEditComponent } from '../../shared/resource-policies/edit import { I18nBreadcrumbsService } from '../../core/breadcrumbs/i18n-breadcrumbs.service'; import { ITEM_EDIT_AUTHORIZATIONS_PATH, - ITEM_EDIT_MOVE_PATH, ITEM_EDIT_DELETE_PATH, - ITEM_EDIT_PUBLIC_PATH, + ITEM_EDIT_MOVE_PATH, ITEM_EDIT_PRIVATE_PATH, + ITEM_EDIT_PUBLIC_PATH, ITEM_EDIT_REINSTATE_PATH, ITEM_EDIT_WITHDRAW_PATH } from './edit-item-page.routing-paths'; @@ -33,7 +33,6 @@ import { ItemPageReinstateGuard } from './item-page-reinstate.guard'; import { ItemPageWithdrawGuard } from './item-page-withdraw.guard'; import { ItemPageEditMetadataGuard } from '../item-page-edit-metadata.guard'; import { ItemPageAdministratorGuard } from '../item-page-administrator.guard'; -import { AuthenticatedGuard } from '../../core/auth/authenticated.guard'; /** * Routing module that handles the routing for the Edit Item page administrator functionality