diff --git a/src/app/shared/resource-policies/entry/resource-policy-entry.component.html b/src/app/shared/resource-policies/entry/resource-policy-entry.component.html new file mode 100644 index 0000000000..5a9494fe00 --- /dev/null +++ b/src/app/shared/resource-policies/entry/resource-policy-entry.component.html @@ -0,0 +1,39 @@ + +
+ + +
+ + + {{entry.id}} + +{{entry.policy.name}} +{{entry.policy.policyType}} +{{entry.policy.action}} + + {{ epersonName$ | async }} + + + {{ groupName$ | async }} + +{{formatDate(entry.policy.startDate)}} +{{formatDate(entry.policy.endDate)}} + + +
+ + +
+ diff --git a/src/app/shared/resource-policies/entry/resource-policy-entry.component.spec.ts b/src/app/shared/resource-policies/entry/resource-policy-entry.component.spec.ts new file mode 100644 index 0000000000..b5232459f5 --- /dev/null +++ b/src/app/shared/resource-policies/entry/resource-policy-entry.component.spec.ts @@ -0,0 +1,222 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ + +import { of as observableOf } from 'rxjs'; +import { createSuccessfulRemoteDataObject } from '../../remote-data.utils'; +import { GroupMock } from '../../testing/group-mock'; +import { PolicyType } from '../../../core/resource-policy/models/policy-type.model'; +import { ActionType } from '../../../core/resource-policy/models/action-type.model'; +import { EPersonMock } from '../../testing/eperson.mock'; +import { ResourcePolicyEntryComponent } from './resource-policy-entry.component'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { CommonModule } from '@angular/common'; +import { TranslateModule } from '@ngx-translate/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { GroupDataService } from '../../../core/eperson/group-data.service'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; +import { RouterStub } from '../../testing/router.stub'; +import { Item } from '../../../core/shared/item.model'; +import { cold } from 'jasmine-marbles'; +import { By } from '@angular/platform-browser'; +import createSpyObj = jasmine.createSpyObj; + +const groupRP: any = { + id: '1', + name: null, + description: null, + policyType: PolicyType.TYPE_SUBMISSION, + action: ActionType.READ, + startDate: null, + endDate: null, + type: 'resourcepolicy', + uuid: 'resource-policy-1', + _links: { + eperson: { + href: 'https://rest.api/rest/api/resourcepolicies/1/eperson' + }, + group: { + href: 'https://rest.api/rest/api/resourcepolicies/1/group' + }, + self: { + href: 'https://rest.api/rest/api/resourcepolicies/1' + }, + }, + eperson: observableOf(createSuccessfulRemoteDataObject(undefined)), + group: observableOf(createSuccessfulRemoteDataObject(GroupMock)) +}; + +const epersonRP: any = { + id: '1', + name: null, + description: null, + policyType: PolicyType.TYPE_SUBMISSION, + action: ActionType.READ, + startDate: null, + endDate: null, + type: 'resourcepolicy', + uuid: 'resource-policy-1', + _links: { + eperson: { + href: 'https://rest.api/rest/api/resourcepolicies/1/eperson' + }, + group: { + href: 'https://rest.api/rest/api/resourcepolicies/1/group' + }, + self: { + href: 'https://rest.api/rest/api/resourcepolicies/1' + }, + }, + eperson: observableOf(createSuccessfulRemoteDataObject(EPersonMock)), + group: observableOf(createSuccessfulRemoteDataObject(undefined)) +}; + +const item = Object.assign(new Item(), { + uuid: 'itemUUID', + id: 'itemUUID', + _links: { + self: { href: 'item-selflink' } + }, +}); + +describe('ResourcePolicyEntryComponent', () => { + let fixture: ComponentFixture; + let comp: ResourcePolicyEntryComponent; + let compAsAny: any; + + let dsoNameService; + let groupService; + let routeStub; + let routerStub; + + it('should pass', () => { + expect(true).toBe(true); + }); + + beforeEach(() => { + dsoNameService = createSpyObj('dsoNameMock', { + getName: 'NAME' + }); + groupService = jasmine.createSpyObj('groupService', { + findByHref: jasmine.createSpy('findByHref'), + }); + routeStub = { + data: observableOf({ + item: createSuccessfulRemoteDataObject(item) + }) + }; + routerStub = Object.assign(new RouterStub(), { + url: `url/edit` + }); + + + TestBed.configureTestingModule({ + imports: [ + CommonModule, + TranslateModule.forRoot() + ], + declarations: [ + ResourcePolicyEntryComponent, + ], + providers: [ + { provide: ActivatedRoute, useValue: routeStub }, + { provide: Router, useValue: routerStub }, + { provide: GroupDataService, useValue: groupService }, + { provide: DSONameService, useValue: dsoNameService } + ], + // schemas: [ + // NO_ERRORS_SCHEMA + // ] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ResourcePolicyEntryComponent); + comp = fixture.componentInstance; + compAsAny = comp; + }); + + describe('target DSO is an EPerson', () => { + beforeEach(() => { + comp.entry = { + id: 'test', + policy: epersonRP, + checked: false, + }; + comp.ngOnInit(); + }); + + it('should have a valid epersonName$', () => { + expect(compAsAny.epersonName$).toBeObservable(cold('(n|)', { u: undefined, n: 'NAME' })); + }); + + it('should have an undefined groupName$', () => { + expect(compAsAny.groupName$).toBeObservable(cold('(u|)', { u: undefined, n: 'NAME' })); + }); + }); + + describe('target DSO is a Group ', () => { + beforeEach(() => { + comp.entry = { + id: 'test', + policy: groupRP, + checked: false, + }; + comp.ngOnInit(); + }); + + it('should have a valid groupName$', () => { + expect(compAsAny.groupName$).toBeObservable(cold('(n|)', { u: undefined, n: 'NAME' })); + }); + + it('should have an undefined epersonName$', () => { + expect(compAsAny.epersonName$).toBeObservable(cold('(u|)', { u: undefined, n: 'NAME' })); + }); + }); + + describe('', () => { + beforeEach(() => { + comp.entry = { + id: 'test', + policy: groupRP, + checked: false, + }; + comp.ngOnInit(); + }); + + it('should format date properly', () => { + expect(comp.formatDate('2020-04-14T12:00:00Z')).toBe('2020-04-14'); + }); + + it('should redirect to ResourcePolicy edit page', () => { + + comp.redirectToResourcePolicyEditPage(); + expect(compAsAny.router.navigate).toHaveBeenCalled(); + }); + + it('should redirect to Group edit page', () => { + compAsAny.groupService.findByHref.and.returnValue(observableOf(createSuccessfulRemoteDataObject(GroupMock))); + + comp.redirectToGroupEditPage(); + expect(compAsAny.router.navigate).toHaveBeenCalled(); + }); + + it('should emit new state when checkbox is toggled', () => { + spyOn(comp.toggleCheckbox, 'emit'); + + const checkbox = fixture.debugElement.query(By.css('input[type="checkbox"]')); + + comp.entry.checked = false; + checkbox.triggerEventHandler('ngModelChange', true); + expect(comp.toggleCheckbox.emit).toHaveBeenCalledWith(true); + + comp.entry.checked = true; + checkbox.triggerEventHandler('ngModelChange', false); + expect(comp.toggleCheckbox.emit).toHaveBeenCalledWith(false); + }); + }); +}); diff --git a/src/app/shared/resource-policies/entry/resource-policy-entry.component.ts b/src/app/shared/resource-policies/entry/resource-policy-entry.component.ts new file mode 100644 index 0000000000..904a79cbe6 --- /dev/null +++ b/src/app/shared/resource-policies/entry/resource-policy-entry.component.ts @@ -0,0 +1,103 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { ResourcePolicy } from '../../../core/resource-policy/models/resource-policy.model'; +import { hasValue, isNotEmpty } from '../../empty.util'; +import { dateToString, stringToNgbDateStruct } from '../../date.util'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { getAllSucceededRemoteData, getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; +import { RemoteData } from '../../../core/data/remote-data'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { ActivatedRoute, Router } from '@angular/router'; +import { Group } from '../../../core/eperson/models/group.model'; +import { ACCESS_CONTROL_MODULE_PATH } from '../../../app-routing-paths'; +import { GROUP_EDIT_PATH } from '../../../access-control/access-control-routing-paths'; +import { GroupDataService } from '../../../core/eperson/group-data.service'; + +export interface ResourcePolicyCheckboxEntry { + id: string; + policy: ResourcePolicy; + checked: boolean; +} + +@Component({ + /* eslint-disable @angular-eslint/component-selector */ + selector: 'tr[ds-resource-policy-entry]', + templateUrl: './resource-policy-entry.component.html', +}) +export class ResourcePolicyEntryComponent implements OnInit { + @Input() + entry: ResourcePolicyCheckboxEntry; + + @Output() + public toggleCheckbox: EventEmitter = new EventEmitter(); + + epersonName$: Observable; + groupName$: Observable; + + constructor( + protected dsoNameService: DSONameService, + protected groupService: GroupDataService, + protected route: ActivatedRoute, + protected router: Router, + ) { + } + + public ngOnInit(): void { + this.epersonName$ = this.getName$(this.entry.policy.eperson); + this.groupName$ = this.getName$(this.entry.policy.group); + } + + private getName$(dso$: Observable>): Observable { + return dso$.pipe( + getAllSucceededRemoteData(), + map((rd: RemoteData) => { + if (hasValue(rd?.payload)) { + return this.dsoNameService.getName(rd.payload); + } + return undefined; + }), + ); + } + + /** + * Returns a date in simplified format (YYYY-MM-DD). + * + * @param date + * @return a string with formatted date + */ + formatDate(date: string): string { + return isNotEmpty(date) ? dateToString(stringToNgbDateStruct(date)) : ''; + } + + /** + * Redirect to resource policy editing page + */ + redirectToResourcePolicyEditPage(): void { + this.router.navigate([`./edit`], { + relativeTo: this.route, + queryParams: { + policyId: this.entry.policy.id, + }, + }); + } + + /** + * Redirect to group edit page + */ + redirectToGroupEditPage(): void { + this.groupService.findByHref(this.entry.policy._links.group.href, false).pipe( + getFirstSucceededRemoteDataPayload(), + map((group: Group) => group.id), + ).subscribe((groupUUID) => { + this.router.navigate([ACCESS_CONTROL_MODULE_PATH, GROUP_EDIT_PATH, groupUUID]); + }); + } +} diff --git a/src/app/shared/resource-policies/resource-policies.component.html b/src/app/shared/resource-policies/resource-policies.component.html index d1fd9266b1..1db068aa1d 100644 --- a/src/app/shared/resource-policies/resource-policies.component.html +++ b/src/app/shared/resource-policies/resource-policies.component.html @@ -57,49 +57,10 @@ - - -
- - -
- - - {{entry.id}} - - {{entry.policy.name}} - {{entry.policy.policyType}} - {{entry.policy.action}} - - {{getEPersonName(entry.policy) | async}} - - - - {{getGroupName(entry.policy) | async}} - - - {{formatDate(entry.policy.startDate)}} - {{formatDate(entry.policy.endDate)}} - - -
- - -
- - + diff --git a/src/app/shared/resource-policies/resource-policies.component.spec.ts b/src/app/shared/resource-policies/resource-policies.component.spec.ts index fc60229ff4..156810c0f5 100644 --- a/src/app/shared/resource-policies/resource-policies.component.spec.ts +++ b/src/app/shared/resource-policies/resource-policies.component.spec.ts @@ -33,6 +33,8 @@ import { PolicyType } from '../../core/resource-policy/models/policy-type.model' import { ActionType } from '../../core/resource-policy/models/action-type.model'; import { EPersonMock } from '../testing/eperson.mock'; import { GroupMock } from '../testing/group-mock'; +import { ResourcePolicyEntryComponent } from './entry/resource-policy-entry.component'; +import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; describe('ResourcePoliciesComponent test suite', () => { let comp: ResourcePoliciesComponent; @@ -188,6 +190,10 @@ describe('ResourcePoliciesComponent test suite', () => { const paginatedList = buildPaginatedList(pageInfo, array); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + const dsoNameService = jasmine.createSpyObj('dsoNameMock', { + getName: 'NAME' + }); + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ @@ -198,6 +204,7 @@ describe('ResourcePoliciesComponent test suite', () => { ], declarations: [ ResourcePoliciesComponent, + ResourcePolicyEntryComponent, TestComponent ], providers: [ @@ -209,6 +216,7 @@ describe('ResourcePoliciesComponent test suite', () => { { provide: ResourcePolicyService, useValue: resourcePolicyService }, { provide: RequestService, useValue: getMockRequestService() }, { provide: Router, useValue: routerStub }, + { provide: DSONameService, useValue: dsoNameService }, ChangeDetectorRef, ResourcePoliciesComponent ], schemas: [ @@ -260,10 +268,10 @@ describe('ResourcePoliciesComponent test suite', () => { }); it('should init component properly', () => { - spyOn(comp, 'initResourcePolicyLIst'); + spyOn(comp, 'initResourcePolicyList'); fixture.detectChanges(); expect(compAsAny.isActive).toBeTruthy(); - expect(comp.initResourcePolicyLIst).toHaveBeenCalled(); + expect(comp.initResourcePolicyList).toHaveBeenCalled(); }); it('should init resource policies list properly', () => { @@ -274,7 +282,7 @@ describe('ResourcePoliciesComponent test suite', () => { })); scheduler = getTestScheduler(); - scheduler.schedule(() => comp.initResourcePolicyLIst()); + scheduler.schedule(() => comp.initResourcePolicyList()); scheduler.flush(); expect(compAsAny.resourcePoliciesEntries$.value).toEqual(expected); @@ -291,7 +299,7 @@ describe('ResourcePoliciesComponent test suite', () => { const initResourcePolicyEntries = getInitEntries(); compAsAny.resourcePoliciesEntries$.next(initResourcePolicyEntries); resourcePolicyService.searchByResource.and.returnValue(observableOf({})); - spyOn(comp, 'initResourcePolicyLIst').and.callFake(() => ({})); + spyOn(comp, 'initResourcePolicyList').and.callFake(() => ({})); fixture.detectChanges(); }); @@ -361,7 +369,7 @@ describe('ResourcePoliciesComponent test suite', () => { scheduler.flush(); expect(notificationsServiceStub.success).toHaveBeenCalled(); - expect(comp.initResourcePolicyLIst).toHaveBeenCalled(); + expect(comp.initResourcePolicyList).toHaveBeenCalled(); }); it('should notify error when delete is not successful', () => { @@ -372,7 +380,7 @@ describe('ResourcePoliciesComponent test suite', () => { scheduler.flush(); expect(notificationsServiceStub.error).toHaveBeenCalled(); - expect(comp.initResourcePolicyLIst).toHaveBeenCalled(); + expect(comp.initResourcePolicyList).toHaveBeenCalled(); }); }); @@ -384,68 +392,6 @@ describe('ResourcePoliciesComponent test suite', () => { }); - describe('hasEPerson', () => { - it('should true when policy is link to the eperson', () => { - - expect(comp.hasEPerson(anotherResourcePolicy)).toBeObservable(cold('(ab|)', { - a: false, - b: true - })); - - }); - - it('should false when policy is not link to the eperson', () => { - - expect(comp.hasEPerson(resourcePolicy)).toBeObservable(cold('(aa|)', { - a: false - })); - - }); - }); - - describe('hasGroup', () => { - it('should true when policy is link to the group', () => { - - expect(comp.hasGroup(resourcePolicy)).toBeObservable(cold('(ab|)', { - a: false, - b: true - })); - - }); - - it('should false when policy is not link to the group', () => { - - expect(comp.hasGroup(anotherResourcePolicy)).toBeObservable(cold('(aa|)', { - a: false - })); - - }); - }); - - describe('getEPersonName', () => { - it('should return the eperson name', () => { - - expect(comp.getEPersonName(anotherResourcePolicy)).toBeObservable(cold('(ab|)', { - a: '', - b: 'User Test' - })); - }); - }); - - describe('getGroupName', () => { - it('should return the group name', () => { - - expect(comp.getGroupName(resourcePolicy)).toBeObservable(cold('(ab|)', { - a: '', - b: 'testgroupname' - })); - }); - }); - - it('should format date properly', () => { - expect(comp.formatDate('2020-04-14T12:00:00Z')).toBe('2020-04-14'); - }); - it('should select All Checkbox', () => { spyOn(comp, 'selectAllCheckbox').and.callThrough(); const checkbox = fixture.debugElement.query(By.css('table > thead > tr:nth-child(2) input')); @@ -469,19 +415,6 @@ describe('ResourcePoliciesComponent test suite', () => { comp.redirectToResourcePolicyCreatePage(); expect(compAsAny.router.navigate).toHaveBeenCalled(); }); - - it('should redirect to resource policy edit page', () => { - - comp.redirectToResourcePolicyEditPage(resourcePolicy); - expect(compAsAny.router.navigate).toHaveBeenCalled(); - }); - - it('should redirect to resource policy edit page', () => { - compAsAny.groupService.findByHref.and.returnValue(observableOf(createSuccessfulRemoteDataObject(GroupMock))); - - comp.redirectToGroupEditPage(resourcePolicy); - expect(compAsAny.router.navigate).toHaveBeenCalled(); - }); }); }); diff --git a/src/app/shared/resource-policies/resource-policies.component.ts b/src/app/shared/resource-policies/resource-policies.component.ts index cf291977d6..7f38f046a1 100644 --- a/src/app/shared/resource-policies/resource-policies.component.ts +++ b/src/app/shared/resource-policies/resource-policies.component.ts @@ -2,48 +2,25 @@ import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular import { ActivatedRoute, Router } from '@angular/router'; import { BehaviorSubject, from as observableFrom, Observable, Subscription } from 'rxjs'; -import { - concatMap, - distinctUntilChanged, - filter, - map, - reduce, - scan, - startWith, - take -} from 'rxjs/operators'; +import { concatMap, distinctUntilChanged, filter, map, reduce, scan, take } from 'rxjs/operators'; import { TranslateService } from '@ngx-translate/core'; import { ResourcePolicyService } from '../../core/resource-policy/resource-policy.service'; -import { - getFirstSucceededRemoteDataPayload, - getFirstSucceededRemoteDataWithNotEmptyPayload, - getAllSucceededRemoteData -} from '../../core/shared/operators'; +import { getAllSucceededRemoteData } from '../../core/shared/operators'; import { ResourcePolicy } from '../../core/resource-policy/models/resource-policy.model'; import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; -import { Group } from '../../core/eperson/models/group.model'; import { GroupDataService } from '../../core/eperson/group-data.service'; import { hasValue, isEmpty, isNotEmpty } from '../empty.util'; -import { EPerson } from '../../core/eperson/models/eperson.model'; import { EPersonDataService } from '../../core/eperson/eperson-data.service'; import { RequestService } from '../../core/data/request.service'; import { NotificationsService } from '../notifications/notifications.service'; -import { dateToString, stringToNgbDateStruct } from '../date.util'; import { followLink } from '../utils/follow-link-config.model'; -import { ACCESS_CONTROL_MODULE_PATH } from '../../app-routing-paths'; -import { GROUP_EDIT_PATH } from '../../access-control/access-control-routing-paths'; - -interface ResourcePolicyCheckboxEntry { - id: string; - policy: ResourcePolicy; - checked: boolean; -} +import { ResourcePolicyCheckboxEntry } from './entry/resource-policy-entry.component'; @Component({ selector: 'ds-resource-policies', styleUrls: ['./resource-policies.component.scss'], - templateUrl: './resource-policies.component.html' + templateUrl: './resource-policies.component.html', }) /** * Component that shows the policies for given resource @@ -126,7 +103,7 @@ export class ResourcePoliciesComponent implements OnInit, OnDestroy { */ ngOnInit(): void { this.isActive = true; - this.initResourcePolicyLIst(); + this.initResourcePolicyList(); } /** @@ -168,48 +145,6 @@ export class ResourcePoliciesComponent implements OnInit, OnDestroy { ); } - /** - * Returns a date in simplified format (YYYY-MM-DD). - * - * @param date - * @return a string with formatted date - */ - formatDate(date: string): string { - return isNotEmpty(date) ? dateToString(stringToNgbDateStruct(date)) : ''; - } - - /** - * Return the ePerson's name which the given policy is linked to - * - * @param policy The resource policy - */ - getEPersonName(policy: ResourcePolicy): Observable { - // TODO to be reviewed when https://github.com/DSpace/dspace-angular/issues/644 will be resolved - // return this.ePersonService.findByHref(policy._links.eperson.href).pipe( - return policy.eperson.pipe( - filter(() => this.isActive), - getFirstSucceededRemoteDataWithNotEmptyPayload(), - map((eperson: EPerson) => this.dsoNameService.getName(eperson)), - startWith('') - ); - } - - /** - * Return the group's name which the given policy is linked to - * - * @param policy The resource policy - */ - getGroupName(policy: ResourcePolicy): Observable { - // TODO to be reviewed when https://github.com/DSpace/dspace-angular/issues/644 will be resolved - // return this.groupService.findByHref(policy._links.group.href).pipe( - return policy.group.pipe( - filter(() => this.isActive), - getFirstSucceededRemoteDataWithNotEmptyPayload(), - map((group: Group) => this.dsoNameService.getName(group)), - startWith('') - ); - } - /** * Return all resource's policies * @@ -219,46 +154,14 @@ export class ResourcePoliciesComponent implements OnInit, OnDestroy { return this.resourcePoliciesEntries$.asObservable(); } - /** - * Check whether the given policy is linked to a ePerson - * - * @param policy The resource policy - * @return an observable that emits true when the policy is linked to a ePerson, false otherwise - */ - hasEPerson(policy): Observable { - // TODO to be reviewed when https://github.com/DSpace/dspace-angular/issues/644 will be resolved - // return this.ePersonService.findByHref(policy._links.eperson.href).pipe( - return policy.eperson.pipe( - filter(() => this.isActive), - getFirstSucceededRemoteDataPayload(), - map((eperson: EPerson) => isNotEmpty(eperson)), - startWith(false) - ); - } - - /** - * Check whether the given policy is linked to a group - * - * @param policy The resource policy - * @return an observable that emits true when the policy is linked to a group, false otherwise - */ - hasGroup(policy): Observable { - // TODO to be reviewed when https://github.com/DSpace/dspace-angular/issues/644 will be resolved - // return this.groupService.findByHref(policy._links.group.href).pipe( - return policy.group.pipe( - filter(() => this.isActive), - getFirstSucceededRemoteDataPayload(), - map((group: Group) => isNotEmpty(group)), - startWith(false) - ); - } - /** * Initialize the resource's policies list */ - initResourcePolicyLIst() { - this.subs.push(this.resourcePolicyService.searchByResource(this.resourceUUID, null, false, true, - followLink('eperson'), followLink('group')).pipe( + initResourcePolicyList() { + this.subs.push(this.resourcePolicyService.searchByResource( + this.resourceUUID, null, false, true, + followLink('eperson'), followLink('group') + ).pipe( filter(() => this.isActive), getAllSucceededRemoteData() ).subscribe((result) => { @@ -295,37 +198,6 @@ export class ResourcePoliciesComponent implements OnInit, OnDestroy { }); } - /** - * Redirect to resource policy editing page - * - * @param policy The resource policy - */ - redirectToResourcePolicyEditPage(policy: ResourcePolicy): void { - this.router.navigate([`./edit`], { - relativeTo: this.route, - queryParams: { - policyId: policy.id - } - }); - } - - /** - * Redirect to group edit page - * - * @param policy The resource policy - */ - redirectToGroupEditPage(policy: ResourcePolicy): void { - this.subs.push( - this.groupService.findByHref(policy._links.group.href, false).pipe( - filter(() => this.isActive), - getFirstSucceededRemoteDataPayload(), - map((group: Group) => group.id) - ).subscribe((groupUUID) => { - this.router.navigate([ACCESS_CONTROL_MODULE_PATH, GROUP_EDIT_PATH, groupUUID]); - }) - ); - } - /** * Select/unselect all checkbox in the list */ diff --git a/src/app/shared/resource-policies/resource-policies.module.ts b/src/app/shared/resource-policies/resource-policies.module.ts index 6eeaddce36..a7dc19b83e 100644 --- a/src/app/shared/resource-policies/resource-policies.module.ts +++ b/src/app/shared/resource-policies/resource-policies.module.ts @@ -15,9 +15,11 @@ import { GroupSearchBoxComponent } from './form/eperson-group-list/group-search- import { EpersonSearchBoxComponent } from './form/eperson-group-list/eperson-search-box/eperson-search-box.component'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { SharedModule } from '../shared.module'; +import { ResourcePolicyEntryComponent } from './entry/resource-policy-entry.component'; const COMPONENTS = [ ResourcePoliciesComponent, + ResourcePolicyEntryComponent, ResourcePolicyFormComponent, ResourcePolicyEditComponent, ResourcePolicyCreateComponent,