Cleanup access-control components

- Use the same methods to retrieve the access-control urls
- Fix EPersonDataService.startEditingNewEPerson returning the incorrect link
This commit is contained in:
Alexandre Vryghem
2023-07-21 15:11:01 +02:00
parent 2a35180a1b
commit 9ac19d40fc
9 changed files with 32 additions and 32 deletions

View File

@@ -11,12 +11,12 @@ export function getEPersonEditRoute(id: string): string {
return new URLCombiner(getEPersonsRoute(), id).toString(); return new URLCombiner(getEPersonsRoute(), id).toString();
} }
export const GROUP_EDIT_PATH = 'groups'; export const GROUP_PATH = 'groups';
export function getGroupsRoute() { export function getGroupsRoute() {
return new URLCombiner(getAccessControlModuleRoute(), GROUP_EDIT_PATH).toString(); return new URLCombiner(getAccessControlModuleRoute(), GROUP_PATH).toString();
} }
export function getGroupEditRoute(id: string) { export function getGroupEditRoute(id: string) {
return new URLCombiner(getAccessControlModuleRoute(), GROUP_EDIT_PATH, id).toString(); return new URLCombiner(getGroupsRoute(), id).toString();
} }

View File

@@ -3,7 +3,7 @@ import { RouterModule } from '@angular/router';
import { EPeopleRegistryComponent } from './epeople-registry/epeople-registry.component'; import { EPeopleRegistryComponent } from './epeople-registry/epeople-registry.component';
import { GroupFormComponent } from './group-registry/group-form/group-form.component'; import { GroupFormComponent } from './group-registry/group-form/group-form.component';
import { GroupsRegistryComponent } from './group-registry/groups-registry.component'; import { GroupsRegistryComponent } from './group-registry/groups-registry.component';
import { EPERSON_PATH, GROUP_EDIT_PATH } from './access-control-routing-paths'; import { EPERSON_PATH, GROUP_PATH } from './access-control-routing-paths';
import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver';
import { GroupPageGuard } from './group-registry/group-page.guard'; import { GroupPageGuard } from './group-registry/group-page.guard';
import { import {
@@ -48,7 +48,7 @@ import { EPersonResolver } from './epeople-registry/eperson-resolver.service';
canActivate: [SiteAdministratorGuard], canActivate: [SiteAdministratorGuard],
}, },
{ {
path: GROUP_EDIT_PATH, path: GROUP_PATH,
component: GroupsRegistryComponent, component: GroupsRegistryComponent,
resolve: { resolve: {
breadcrumb: I18nBreadcrumbResolver breadcrumb: I18nBreadcrumbResolver
@@ -57,7 +57,7 @@ import { EPersonResolver } from './epeople-registry/eperson-resolver.service';
canActivate: [GroupAdministratorGuard] canActivate: [GroupAdministratorGuard]
}, },
{ {
path: `${GROUP_EDIT_PATH}/newGroup`, path: `${GROUP_PATH}/create`,
component: GroupFormComponent, component: GroupFormComponent,
resolve: { resolve: {
breadcrumb: I18nBreadcrumbResolver breadcrumb: I18nBreadcrumbResolver
@@ -66,7 +66,7 @@ import { EPersonResolver } from './epeople-registry/eperson-resolver.service';
canActivate: [GroupAdministratorGuard] canActivate: [GroupAdministratorGuard]
}, },
{ {
path: `${GROUP_EDIT_PATH}/:groupId`, path: `${GROUP_PATH}/:groupId`,
component: GroupFormComponent, component: GroupFormComponent,
resolve: { resolve: {
breadcrumb: I18nBreadcrumbResolver breadcrumb: I18nBreadcrumbResolver

View File

@@ -215,7 +215,7 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy {
if (restResponse.hasSucceeded) { if (restResponse.hasSucceeded) {
this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', {name: this.dsoNameService.getName(ePerson)})); this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', {name: this.dsoNameService.getName(ePerson)}));
} else { } else {
this.notificationsService.error('Error occured when trying to delete EPerson with id: ' + ePerson.id + ' with code: ' + restResponse.statusCode + ' and message: ' + restResponse.errorMessage); this.notificationsService.error(`Error occurred when trying to delete EPerson with id: ${ePerson.id} with code: ${restResponse.statusCode} and message: ${restResponse.errorMessage}`);
} }
}); });
} }

View File

@@ -2,13 +2,13 @@
<div class="group-form row"> <div class="group-form row">
<div class="col-12"> <div class="col-12">
<div *ngIf="groupDataService.getActiveGroup() | async; then editheader; else createHeader"></div> <div *ngIf="groupDataService.getActiveGroup() | async; then editHeader; else createHeader"></div>
<ng-template #createHeader> <ng-template #createHeader>
<h2 class="border-bottom pb-2">{{messagePrefix + '.head.create' | translate}}</h2> <h2 class="border-bottom pb-2">{{messagePrefix + '.head.create' | translate}}</h2>
</ng-template> </ng-template>
<ng-template #editheader> <ng-template #editHeader>
<h2 class="border-bottom pb-2"> <h2 class="border-bottom pb-2">
<span <span
*dsContextHelp="{ *dsContextHelp="{

View File

@@ -10,7 +10,6 @@ import {
} from '@ng-dynamic-forms/core'; } from '@ng-dynamic-forms/core';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { import {
ObservedValueOf,
combineLatest as observableCombineLatest, combineLatest as observableCombineLatest,
Observable, Observable,
of as observableOf, of as observableOf,
@@ -48,6 +47,7 @@ import { Operation } from 'fast-json-patch';
import { ValidateGroupExists } from './validators/group-exists.validator'; import { ValidateGroupExists } from './validators/group-exists.validator';
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
import { environment } from '../../../../environments/environment'; import { environment } from '../../../../environments/environment';
import { getGroupEditRoute, getGroupsRoute } from '../../access-control-routing-paths';
@Component({ @Component({
selector: 'ds-group-form', selector: 'ds-group-form',
@@ -165,19 +165,19 @@ export class GroupFormComponent implements OnInit, OnDestroy {
this.canEdit$ = this.groupDataService.getActiveGroup().pipe( this.canEdit$ = this.groupDataService.getActiveGroup().pipe(
hasValueOperator(), hasValueOperator(),
switchMap((group: Group) => { switchMap((group: Group) => {
return observableCombineLatest( return observableCombineLatest([
this.authorizationService.isAuthorized(FeatureID.CanDelete, isNotEmpty(group) ? group.self : undefined), this.authorizationService.isAuthorized(FeatureID.CanDelete, isNotEmpty(group) ? group.self : undefined),
this.hasLinkedDSO(group), this.hasLinkedDSO(group),
(isAuthorized: ObservedValueOf<Observable<boolean>>, hasLinkedDSO: ObservedValueOf<Observable<boolean>>) => { ]).pipe(
return isAuthorized && !hasLinkedDSO; map(([isAuthorized, hasLinkedDSO]: [boolean, boolean]) => isAuthorized && !hasLinkedDSO),
});
})
); );
observableCombineLatest( }),
);
observableCombineLatest([
this.translateService.get(`${this.messagePrefix}.groupName`), this.translateService.get(`${this.messagePrefix}.groupName`),
this.translateService.get(`${this.messagePrefix}.groupCommunity`), this.translateService.get(`${this.messagePrefix}.groupCommunity`),
this.translateService.get(`${this.messagePrefix}.groupDescription`) this.translateService.get(`${this.messagePrefix}.groupDescription`)
).subscribe(([groupName, groupCommunity, groupDescription]) => { ]).subscribe(([groupName, groupCommunity, groupDescription]) => {
this.groupName = new DynamicInputModel({ this.groupName = new DynamicInputModel({
id: 'groupName', id: 'groupName',
label: groupName, label: groupName,
@@ -215,12 +215,12 @@ export class GroupFormComponent implements OnInit, OnDestroy {
} }
this.subs.push( this.subs.push(
observableCombineLatest( observableCombineLatest([
this.groupDataService.getActiveGroup(), this.groupDataService.getActiveGroup(),
this.canEdit$, this.canEdit$,
this.groupDataService.getActiveGroup() this.groupDataService.getActiveGroup()
.pipe(filter((activeGroup) => hasValue(activeGroup)),switchMap((activeGroup) => this.getLinkedDSO(activeGroup).pipe(getFirstSucceededRemoteDataPayload()))) .pipe(filter((activeGroup) => hasValue(activeGroup)),switchMap((activeGroup) => this.getLinkedDSO(activeGroup).pipe(getFirstSucceededRemoteDataPayload())))
).subscribe(([activeGroup, canEdit, linkedObject]) => { ]).subscribe(([activeGroup, canEdit, linkedObject]) => {
if (activeGroup != null) { if (activeGroup != null) {
@@ -263,7 +263,7 @@ export class GroupFormComponent implements OnInit, OnDestroy {
onCancel() { onCancel() {
this.groupDataService.cancelEditGroup(); this.groupDataService.cancelEditGroup();
this.cancelForm.emit(); this.cancelForm.emit();
this.router.navigate([this.groupDataService.getGroupRegistryRouterLink()]); void this.router.navigate([getGroupsRoute()]);
} }
/** /**
@@ -310,7 +310,7 @@ export class GroupFormComponent implements OnInit, OnDestroy {
const groupSelfLink = rd.payload._links.self.href; const groupSelfLink = rd.payload._links.self.href;
this.setActiveGroupWithLink(groupSelfLink); this.setActiveGroupWithLink(groupSelfLink);
this.groupDataService.clearGroupsRequests(); this.groupDataService.clearGroupsRequests();
this.router.navigateByUrl(this.groupDataService.getGroupEditPageRouterLinkWithID(rd.payload.uuid)); void this.router.navigateByUrl(getGroupEditRoute(rd.payload.uuid));
} }
} else { } else {
this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.created.failure', { name: groupToCreate.name })); this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.created.failure', { name: groupToCreate.name }));

View File

@@ -5,7 +5,7 @@
<h2 id="header" class="pb-2">{{messagePrefix + 'head' | translate}}</h2> <h2 id="header" class="pb-2">{{messagePrefix + 'head' | translate}}</h2>
<div> <div>
<button class="mr-auto btn btn-success" <button class="mr-auto btn btn-success"
[routerLink]="['newGroup']"> [routerLink]="'create'">
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>
<span class="d-none d-sm-inline ml-1">{{messagePrefix + 'button.add' | translate}}</span> <span class="d-none d-sm-inline ml-1">{{messagePrefix + 'button.add' | translate}}</span>
</button> </button>

View File

@@ -34,6 +34,7 @@ import { PatchData, PatchDataImpl } from '../data/base/patch-data';
import { DeleteData, DeleteDataImpl } from '../data/base/delete-data'; import { DeleteData, DeleteDataImpl } from '../data/base/delete-data';
import { RestRequestMethod } from '../data/rest-request-method'; import { RestRequestMethod } from '../data/rest-request-method';
import { dataService } from '../data/base/data-service.decorator'; import { dataService } from '../data/base/data-service.decorator';
import { getEPersonEditRoute, getEPersonsRoute } from '../../access-control/access-control-routing-paths';
const ePeopleRegistryStateSelector = (state: AppState) => state.epeopleRegistry; const ePeopleRegistryStateSelector = (state: AppState) => state.epeopleRegistry;
const editEPersonSelector = createSelector(ePeopleRegistryStateSelector, (ePeopleRegistryState: EPeopleRegistryState) => ePeopleRegistryState.editEPerson); const editEPersonSelector = createSelector(ePeopleRegistryStateSelector, (ePeopleRegistryState: EPeopleRegistryState) => ePeopleRegistryState.editEPerson);
@@ -281,15 +282,14 @@ export class EPersonDataService extends IdentifiableDataService<EPerson> impleme
this.editEPerson(ePerson); this.editEPerson(ePerson);
} }
}); });
return '/access-control/epeople'; return getEPersonEditRoute(ePerson.id);
} }
/** /**
* Get EPeople admin page * Get EPeople admin page
* @param ePerson New EPerson to edit
*/ */
public getEPeoplePageRouterLink(): string { public getEPeoplePageRouterLink(): string {
return '/access-control/epeople'; return getEPersonsRoute();
} }
/** /**

View File

@@ -40,6 +40,7 @@ import { DeleteData, DeleteDataImpl } from '../data/base/delete-data';
import { Operation } from 'fast-json-patch'; import { Operation } from 'fast-json-patch';
import { RestRequestMethod } from '../data/rest-request-method'; import { RestRequestMethod } from '../data/rest-request-method';
import { dataService } from '../data/base/data-service.decorator'; import { dataService } from '../data/base/data-service.decorator';
import { getGroupEditRoute } from '../../access-control/access-control-routing-paths';
const groupRegistryStateSelector = (state: AppState) => state.groupRegistry; const groupRegistryStateSelector = (state: AppState) => state.groupRegistry;
const editGroupSelector = createSelector(groupRegistryStateSelector, (groupRegistryState: GroupRegistryState) => groupRegistryState.editGroup); const editGroupSelector = createSelector(groupRegistryStateSelector, (groupRegistryState: GroupRegistryState) => groupRegistryState.editGroup);
@@ -264,15 +265,15 @@ export class GroupDataService extends IdentifiableDataService<Group> implements
* @param group Group we want edit page for * @param group Group we want edit page for
*/ */
public getGroupEditPageRouterLink(group: Group): string { public getGroupEditPageRouterLink(group: Group): string {
return this.getGroupEditPageRouterLinkWithID(group.id); return getGroupEditRoute(group.id);
} }
/** /**
* Get Edit page of group * Get Edit page of group
* @param groupID Group ID we want edit page for * @param groupID Group ID we want edit page for
*/ */
public getGroupEditPageRouterLinkWithID(groupId: string): string { public getGroupEditPageRouterLinkWithID(groupID: string): string {
return '/access-control/groups/' + groupId; return getGroupEditRoute(groupID);
} }
/** /**

View File

@@ -17,8 +17,7 @@ import { RemoteData } from '../../../core/data/remote-data';
import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { Group } from '../../../core/eperson/models/group.model'; import { Group } from '../../../core/eperson/models/group.model';
import { ACCESS_CONTROL_MODULE_PATH } from '../../../app-routing-paths'; import { getGroupEditRoute } from '../../../access-control/access-control-routing-paths';
import { GROUP_EDIT_PATH } from '../../../access-control/access-control-routing-paths';
import { GroupDataService } from '../../../core/eperson/group-data.service'; import { GroupDataService } from '../../../core/eperson/group-data.service';
export interface ResourcePolicyCheckboxEntry { export interface ResourcePolicyCheckboxEntry {
@@ -97,7 +96,7 @@ export class ResourcePolicyEntryComponent implements OnInit {
getFirstSucceededRemoteDataPayload(), getFirstSucceededRemoteDataPayload(),
map((group: Group) => group.id), map((group: Group) => group.id),
).subscribe((groupUUID) => { ).subscribe((groupUUID) => {
this.router.navigate([ACCESS_CONTROL_MODULE_PATH, GROUP_EDIT_PATH, groupUUID]); void this.router.navigate([getGroupEditRoute(groupUUID)]);
}); });
} }
} }