diff --git a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html index c613cfdcad..45326c1abc 100644 --- a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html +++ b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html @@ -52,15 +52,17 @@ - - + + + - - + +
{{messagePrefix + '.table.id' | translate}}{{messagePrefix + '.table.name' | translate}}{{messagePrefix + '.table.id' | translate}}{{messagePrefix + '.table.name' | translate}}{{messagePrefix + '.table.collectionOrCommunity' | translate}}
{{group.id}}{{group.id}}{{group.name}}{{(group.object | async)?.payload?.name}}
diff --git a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts index 11c117ef55..b1d0c5bed3 100644 --- a/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts +++ b/src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts @@ -32,6 +32,7 @@ import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { RequestService } from '../../../core/data/request.service'; import { NoContent } from '../../../core/shared/NoContent.model'; import { PaginationService } from '../../../core/pagination/pagination.service'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; @Component({ selector: 'ds-eperson-form', @@ -272,7 +273,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy { }), switchMap(([eperson, findListOptions]) => { if (eperson != null) { - return this.groupsDataService.findAllByHref(eperson._links.groups.href, findListOptions); + return this.groupsDataService.findAllByHref(eperson._links.groups.href, findListOptions, true, true, followLink('object')); } return observableOf(undefined); }) diff --git a/src/app/access-control/group-registry/group-form/group-form.component.ts b/src/app/access-control/group-registry/group-form/group-form.component.ts index 7e0329f54f..b2b9fab58d 100644 --- a/src/app/access-control/group-registry/group-form/group-form.component.ts +++ b/src/app/access-control/group-registry/group-form/group-form.component.ts @@ -14,9 +14,9 @@ import { combineLatest as observableCombineLatest, Observable, of as observableOf, - Subscription + Subscription, } from 'rxjs'; -import { catchError, map, switchMap, take } from 'rxjs/operators'; +import { catchError, map, switchMap, take, filter } from 'rxjs/operators'; import { getCollectionEditRolesRoute } from '../../../collection-page/collection-page-routing-paths'; import { getCommunityEditRolesRoute } from '../../../community-page/community-page-routing-paths'; import { DSpaceObjectDataService } from '../../../core/data/dspace-object-data.service'; @@ -34,7 +34,8 @@ import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { getRemoteDataPayload, getFirstSucceededRemoteData, - getFirstCompletedRemoteData + getFirstCompletedRemoteData, + getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; import { AlertType } from '../../../shared/alert/aletr-type'; import { ConfirmationModalComponent } from '../../../shared/confirmation-modal/confirmation-modal.component'; @@ -65,6 +66,7 @@ export class GroupFormComponent implements OnInit, OnDestroy { * Dynamic models for the inputs of form */ groupName: DynamicInputModel; + groupCommunity: DynamicInputModel; groupDescription: DynamicTextAreaModel; /** @@ -125,16 +127,16 @@ export class GroupFormComponent implements OnInit, OnDestroy { public AlertTypeEnum = AlertType; constructor(public groupDataService: GroupDataService, - private ePersonDataService: EPersonDataService, - private dSpaceObjectDataService: DSpaceObjectDataService, - private formBuilderService: FormBuilderService, - private translateService: TranslateService, - private notificationsService: NotificationsService, - private route: ActivatedRoute, - protected router: Router, - private authorizationService: AuthorizationDataService, - private modalService: NgbModal, - public requestService: RequestService) { + private ePersonDataService: EPersonDataService, + private dSpaceObjectDataService: DSpaceObjectDataService, + private formBuilderService: FormBuilderService, + private translateService: TranslateService, + private notificationsService: NotificationsService, + private route: ActivatedRoute, + protected router: Router, + private authorizationService: AuthorizationDataService, + private modalService: NgbModal, + public requestService: RequestService) { } ngOnInit() { @@ -160,8 +162,9 @@ export class GroupFormComponent implements OnInit, OnDestroy { ); observableCombineLatest( this.translateService.get(`${this.messagePrefix}.groupName`), + this.translateService.get(`${this.messagePrefix}.groupCommunity`), this.translateService.get(`${this.messagePrefix}.groupDescription`) - ).subscribe(([groupName, groupDescription]) => { + ).subscribe(([groupName, groupCommunity, groupDescription]) => { this.groupName = new DynamicInputModel({ id: 'groupName', label: groupName, @@ -171,6 +174,13 @@ export class GroupFormComponent implements OnInit, OnDestroy { }, required: true, }); + this.groupCommunity = new DynamicInputModel({ + id: 'groupCommunity', + label: groupCommunity, + name: 'groupCommunity', + required: false, + readOnly: true, + }); this.groupDescription = new DynamicTextAreaModel({ id: 'groupDescription', label: groupDescription, @@ -185,17 +195,36 @@ export class GroupFormComponent implements OnInit, OnDestroy { this.subs.push( observableCombineLatest( this.groupDataService.getActiveGroup(), - this.canEdit$ - ).subscribe(([activeGroup, canEdit]) => { + this.canEdit$, + this.groupDataService.getActiveGroup() + .pipe(filter((activeGroup) => hasValue(activeGroup)),switchMap((activeGroup) => this.getLinkedDSO(activeGroup).pipe(getFirstSucceededRemoteDataPayload()))) + ).subscribe(([activeGroup, canEdit, linkedObject]) => { + if (activeGroup != null) { this.groupBeingEdited = activeGroup; - this.formGroup.patchValue({ - groupName: activeGroup != null ? activeGroup.name : '', - groupDescription: activeGroup != null ? activeGroup.firstMetadataValue('dc.description') : '', - }); - if (!canEdit || activeGroup.permanent) { - this.formGroup.disable(); + + if (linkedObject?.name) { + this.formBuilderService.insertFormGroupControl(1, this.formGroup, this.formModel, this.groupCommunity); + this.formGroup.patchValue({ + groupName: activeGroup.name, + groupCommunity: linkedObject?.name ?? '', + groupDescription: activeGroup.firstMetadataValue('dc.description'), + }); + } else { + this.formModel = [ + this.groupName, + this.groupDescription, + ]; + this.formGroup.patchValue({ + groupName: activeGroup.name, + groupDescription: activeGroup.firstMetadataValue('dc.description'), + }); } + setTimeout(() => { + if (!canEdit || activeGroup.permanent) { + this.formGroup.disable(); + } + }, 200); } }) ); @@ -417,11 +446,7 @@ export class GroupFormComponent implements OnInit, OnDestroy { if (hasValue(group) && hasValue(group._links.object.href)) { return this.getLinkedDSO(group).pipe( map((rd: RemoteData) => { - if (hasValue(rd) && hasValue(rd.payload)) { - return true; - } else { - return false; - } + return hasValue(rd) && hasValue(rd.payload); }), catchError(() => observableOf(false)), ); diff --git a/src/app/access-control/group-registry/group-form/members-list/members-list.component.html b/src/app/access-control/group-registry/group-form/members-list/members-list.component.html index 51282b49c0..e5932edf05 100644 --- a/src/app/access-control/group-registry/group-form/members-list/members-list.component.html +++ b/src/app/access-control/group-registry/group-form/members-list/members-list.component.html @@ -38,17 +38,22 @@ - - - + + + + - - + - + - - - + + + + - - + - + - - - + + + + - - + - + - - + + + - - + - + + @@ -56,6 +57,7 @@ +
{{messagePrefix + '.table.id' | translate}}{{messagePrefix + '.table.name' | translate}}{{messagePrefix + '.table.edit' | translate}}{{messagePrefix + '.table.id' | translate}}{{messagePrefix + '.table.name' | translate}}{{messagePrefix + '.table.identity' | translate}}{{messagePrefix + '.table.edit' | translate}}
{{ePerson.eperson.id}}{{ePerson.eperson.id}}{{ePerson.eperson.name}} + + {{messagePrefix + '.table.email' | translate}}: {{ ePerson.eperson.email ? ePerson.eperson.email : '-' }}
+ {{messagePrefix + '.table.netid' | translate}}: {{ ePerson.eperson.netid ? ePerson.eperson.netid : '-' }} +
{{messagePrefix + '.table.id' | translate}}{{messagePrefix + '.table.name' | translate}}{{messagePrefix + '.table.edit' | translate}}{{messagePrefix + '.table.id' | translate}}{{messagePrefix + '.table.name' | translate}}{{messagePrefix + '.table.identity' | translate}}{{messagePrefix + '.table.edit' | translate}}
{{ePerson.eperson.id}}{{ePerson.eperson.id}}{{ePerson.eperson.name}} + + {{messagePrefix + '.table.email' | translate}}: {{ ePerson.eperson.email ? ePerson.eperson.email : '-' }}
+ {{messagePrefix + '.table.netid' | translate}}: {{ ePerson.eperson.netid ? ePerson.eperson.netid : '-' }} +
{{messagePrefix + '.table.id' | translate}}{{messagePrefix + '.table.name' | translate}}{{messagePrefix + '.table.edit' | translate}}{{messagePrefix + '.table.id' | translate}}{{messagePrefix + '.table.name' | translate}}{{messagePrefix + '.table.collectionOrCommunity' | translate}}{{messagePrefix + '.table.edit' | translate}}
{{group.id}}{{group.id}}{{group.name}} + {{(group.object | async)?.payload?.name}}
{{messagePrefix + '.table.id' | translate}}{{messagePrefix + '.table.name' | translate}}{{messagePrefix + '.table.id' | translate}}{{messagePrefix + '.table.name' | translate}}{{messagePrefix + '.table.collectionOrCommunity' | translate}} {{messagePrefix + '.table.edit' | translate}}
{{group.id}}{{group.id}}{{group.name}} + {{(group.object | async)?.payload?.name}}
{{messagePrefix + 'table.id' | translate}} {{messagePrefix + 'table.name' | translate}}{{messagePrefix + 'table.collectionOrCommunity' | translate}} {{messagePrefix + 'table.members' | translate}} {{messagePrefix + 'table.edit' | translate}}
{{groupDto.group.id}} {{groupDto.group.name}}{{(groupDto.group.object | async)?.payload?.name}} {{groupDto.epersons?.totalElements + groupDto.subgroups?.totalElements}}
diff --git a/src/app/access-control/group-registry/groups-registry.component.spec.ts b/src/app/access-control/group-registry/groups-registry.component.spec.ts index 245044f5c9..0b30a551fd 100644 --- a/src/app/access-control/group-registry/groups-registry.component.spec.ts +++ b/src/app/access-control/group-registry/groups-registry.component.spec.ts @@ -152,6 +152,7 @@ describe('GroupRegistryComponent', () => { return createSuccessfulRemoteDataObject$(undefined); } }; + authorizationService = jasmine.createSpyObj('authorizationService', ['isAuthorized']); setIsAuthorized(true, true); paginationService = new PaginationServiceStub(); @@ -200,6 +201,13 @@ describe('GroupRegistryComponent', () => { }); }); + it('should display community/collection name if present', () => { + const collectionNamesFound = fixture.debugElement.queryAll(By.css('#groups tr td:nth-child(3)')); + expect(collectionNamesFound.length).toEqual(2); + expect(collectionNamesFound[0].nativeElement.textContent).toEqual(''); + expect(collectionNamesFound[1].nativeElement.textContent).toEqual('testgroupid2objectName'); + }); + describe('edit buttons', () => { describe('when the user is a general admin', () => { beforeEach(fakeAsync(() => { @@ -213,7 +221,7 @@ describe('GroupRegistryComponent', () => { })); it('should be active', () => { - const editButtonsFound = fixture.debugElement.queryAll(By.css('#groups tr td:nth-child(4) button.btn-edit')); + const editButtonsFound = fixture.debugElement.queryAll(By.css('#groups tr td:nth-child(5) button.btn-edit')); expect(editButtonsFound.length).toEqual(2); editButtonsFound.forEach((editButtonFound) => { expect(editButtonFound.nativeElement.disabled).toBeFalse(); @@ -247,7 +255,7 @@ describe('GroupRegistryComponent', () => { })); it('should be active', () => { - const editButtonsFound = fixture.debugElement.queryAll(By.css('#groups tr td:nth-child(4) button.btn-edit')); + const editButtonsFound = fixture.debugElement.queryAll(By.css('#groups tr td:nth-child(5) button.btn-edit')); expect(editButtonsFound.length).toEqual(2); editButtonsFound.forEach((editButtonFound) => { expect(editButtonFound.nativeElement.disabled).toBeFalse(); @@ -266,7 +274,7 @@ describe('GroupRegistryComponent', () => { })); it('should not be active', () => { - const editButtonsFound = fixture.debugElement.queryAll(By.css('#groups tr td:nth-child(4) button.btn-edit')); + const editButtonsFound = fixture.debugElement.queryAll(By.css('#groups tr td:nth-child(5) button.btn-edit')); expect(editButtonsFound.length).toEqual(2); editButtonsFound.forEach((editButtonFound) => { expect(editButtonFound.nativeElement.disabled).toBeTrue(); diff --git a/src/app/access-control/group-registry/groups-registry.component.ts b/src/app/access-control/group-registry/groups-registry.component.ts index ce1b7dedd9..da861518da 100644 --- a/src/app/access-control/group-registry/groups-registry.component.ts +++ b/src/app/access-control/group-registry/groups-registry.component.ts @@ -35,6 +35,7 @@ import { NotificationsService } from '../../shared/notifications/notifications.s import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; import { NoContent } from '../../core/shared/NoContent.model'; import { PaginationService } from '../../core/pagination/pagination.service'; +import { followLink } from '../../shared/utils/follow-link-config.model'; @Component({ selector: 'ds-groups-registry', @@ -132,8 +133,8 @@ export class GroupsRegistryComponent implements OnInit, OnDestroy { } return this.groupService.searchGroups(this.currentSearchQuery.trim(), { currentPage: paginationOptions.currentPage, - elementsPerPage: paginationOptions.pageSize - }); + elementsPerPage: paginationOptions.pageSize, + }, true, true, followLink('object')); }), getAllSucceededRemoteData(), getRemoteDataPayload(), diff --git a/src/app/core/eperson/eperson-data.service.spec.ts b/src/app/core/eperson/eperson-data.service.spec.ts index cd7b664379..ac08bda589 100644 --- a/src/app/core/eperson/eperson-data.service.spec.ts +++ b/src/app/core/eperson/eperson-data.service.spec.ts @@ -56,11 +56,11 @@ describe('EPersonDataService', () => { } function init() { - restEndpointURL = 'https://dspace.4science.it/dspace-spring-rest/api/eperson'; + restEndpointURL = 'https://rest.api/dspace-spring-rest/api/eperson'; epersonsEndpoint = `${restEndpointURL}/epersons`; epeople = [EPersonMock, EPersonMock2]; epeople$ = createSuccessfulRemoteDataObject$(createPaginatedList([epeople])); - rdbService = getMockRemoteDataBuildServiceHrefMap(undefined, { 'https://dspace.4science.it/dspace-spring-rest/api/eperson/epersons': epeople$ }); + rdbService = getMockRemoteDataBuildServiceHrefMap(undefined, { 'https://rest.api/dspace-spring-rest/api/eperson/epersons': epeople$ }); halService = new HALEndpointServiceStub(restEndpointURL); TestBed.configureTestingModule({ diff --git a/src/app/item-page/bitstreams/upload/upload-bitstream.component.spec.ts b/src/app/item-page/bitstreams/upload/upload-bitstream.component.spec.ts index 35546a63d6..8fa475a2ce 100644 --- a/src/app/item-page/bitstreams/upload/upload-bitstream.component.spec.ts +++ b/src/app/item-page/bitstreams/upload/upload-bitstream.component.spec.ts @@ -21,6 +21,7 @@ import { createPaginatedList } from '../../../shared/testing/utils.test'; import { RouterStub } from '../../../shared/testing/router.stub'; import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; import { AuthServiceStub } from '../../../shared/testing/auth-service.stub'; +import { getTestScheduler } from 'jasmine-marbles'; describe('UploadBistreamComponent', () => { let comp: UploadBitstreamComponent; @@ -76,7 +77,8 @@ describe('UploadBistreamComponent', () => { const restEndpoint = 'fake-rest-endpoint'; const mockItemDataService = jasmine.createSpyObj('mockItemDataService', { getBitstreamsEndpoint: observableOf(restEndpoint), - createBundle: createSuccessfulRemoteDataObject$(createdBundle) + createBundle: createSuccessfulRemoteDataObject$(createdBundle), + getBundles: createSuccessfulRemoteDataObject$([bundle]) }); const bundleService = jasmine.createSpyObj('bundleService', { getBitstreamsEndpoint: observableOf(restEndpoint), @@ -92,6 +94,22 @@ describe('UploadBistreamComponent', () => { removeByHrefSubstring: {} }); + + describe('on init', () => { + beforeEach(waitForAsync(() => { + createUploadBitstreamTestingModule({ + bundle: bundle.id + }); + })); + beforeEach(() => { + loadFixtureAndComp(); + }); + it('should initialize the bundles', () => { + expect(comp.bundlesRD$).toBeDefined(); + getTestScheduler().expectObservable(comp.bundlesRD$).toBe('(a|)', {a: createSuccessfulRemoteDataObject([bundle])}); + }); + }); + describe('when a file is uploaded', () => { beforeEach(waitForAsync(() => { createUploadBitstreamTestingModule({}); diff --git a/src/app/item-page/bitstreams/upload/upload-bitstream.component.ts b/src/app/item-page/bitstreams/upload/upload-bitstream.component.ts index 7635758463..f68aca2252 100644 --- a/src/app/item-page/bitstreams/upload/upload-bitstream.component.ts +++ b/src/app/item-page/bitstreams/upload/upload-bitstream.component.ts @@ -2,7 +2,7 @@ import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { Observable, Subscription } from 'rxjs'; import { RemoteData } from '../../../core/data/remote-data'; import { Item } from '../../../core/shared/item.model'; -import { map, switchMap, take } from 'rxjs/operators'; +import { map, take } from 'rxjs/operators'; import { ActivatedRoute, Router } from '@angular/router'; import { UploaderOptions } from '../../../shared/uploader/uploader-options.model'; import { hasValue, isEmpty, isNotEmpty } from '../../../shared/empty.util'; @@ -108,9 +108,7 @@ export class UploadBitstreamComponent implements OnInit, OnDestroy { this.itemId = this.route.snapshot.params.id; this.entityType = this.route.snapshot.params['entity-type']; this.itemRD$ = this.route.data.pipe(map((data) => data.dso)); - this.bundlesRD$ = this.itemRD$.pipe( - switchMap((itemRD: RemoteData) => itemRD.payload.bundles) - ); + this.bundlesRD$ = this.itemService.getBundles(this.itemId); this.selectedBundleId = this.route.snapshot.queryParams.bundle; if (isNotEmpty(this.selectedBundleId)) { this.bundleService.findById(this.selectedBundleId).pipe( diff --git a/src/app/shared/testing/eperson.mock.ts b/src/app/shared/testing/eperson.mock.ts index 0ab3fa9ca1..370c2ff1b9 100644 --- a/src/app/shared/testing/eperson.mock.ts +++ b/src/app/shared/testing/eperson.mock.ts @@ -11,9 +11,9 @@ export const EPersonMock: EPerson = Object.assign(new EPerson(), { selfRegistered: false, _links: { self: { - href: 'https://dspace.4science.it/dspace-spring-rest/api/eperson/epersons/testid', + href: 'https://rest.api/dspace-spring-rest/api/eperson/epersons/testid', }, - groups: { href: 'https://dspace.4science.it/dspace-spring-rest/api/eperson/epersons/testid/groups' } + groups: { href: 'https://rest.api/dspace-spring-rest/api/eperson/epersons/testid/groups' } }, id: 'testid', uuid: 'testid', @@ -57,9 +57,9 @@ export const EPersonMock2: EPerson = Object.assign(new EPerson(), { selfRegistered: true, _links: { self: { - href: 'https://dspace.4science.it/dspace-spring-rest/api/eperson/epersons/testid2', + href: 'https://rest.api/dspace-spring-rest/api/eperson/epersons/testid2', }, - groups: { href: 'https://dspace.4science.it/dspace-spring-rest/api/eperson/epersons/testid2/groups' } + groups: { href: 'https://rest.api/dspace-spring-rest/api/eperson/epersons/testid2/groups' } }, id: 'testid2', uuid: 'testid2', diff --git a/src/app/shared/testing/group-mock.ts b/src/app/shared/testing/group-mock.ts index 24a78a58e5..a6db4c922e 100644 --- a/src/app/shared/testing/group-mock.ts +++ b/src/app/shared/testing/group-mock.ts @@ -1,5 +1,7 @@ import { Group } from '../../core/eperson/models/group.model'; import { EPersonMock } from './eperson.mock'; +import { of } from 'rxjs'; +import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; export const GroupMock2: Group = Object.assign(new Group(), { handle: null, @@ -9,16 +11,17 @@ export const GroupMock2: Group = Object.assign(new Group(), { selfRegistered: false, _links: { self: { - href: 'https://dspace.4science.it/dspace-spring-rest/api/eperson/groups/testgroupid2', + href: 'https://rest.api/server/api/eperson/groups/testgroupid2', }, - subgroups: { href: 'https://dspace.4science.it/dspace-spring-rest/api/eperson/groups/testgroupid2/subgroups' }, - object: { href: 'https://dspace.4science.it/dspace-spring-rest/api/eperson/groups/testgroupid2/object' }, - epersons: { href: 'https://dspace.4science.it/dspace-spring-rest/api/eperson/groups/testgroupid2/epersons' } + subgroups: { href: 'https://rest.api/server/api/eperson/groups/testgroupid2/subgroups' }, + object: { href: 'https://rest.api/server/api/eperson/groups/testgroupid2/object' }, + epersons: { href: 'https://rest.api/server/api/eperson/groups/testgroupid2/epersons' } }, _name: 'testgroupname2', id: 'testgroupid2', uuid: 'testgroupid2', type: 'group', + object: createSuccessfulRemoteDataObject$({ name: 'testgroupid2objectName'}) }); export const GroupMock: Group = Object.assign(new Group(), { @@ -29,11 +32,11 @@ export const GroupMock: Group = Object.assign(new Group(), { permanent: false, _links: { self: { - href: 'https://dspace.4science.it/dspace-spring-rest/api/eperson/groups/testgroupid', + href: 'https://rest.api/server/api/eperson/groups/testgroupid', }, - subgroups: { href: 'https://dspace.4science.it/dspace-spring-rest/api/eperson/groups/testgroupid/subgroups' }, - object: { href: 'https://dspace.4science.it/dspace-spring-rest/api/eperson/groups/testgroupid2/object' }, - epersons: { href: 'https://dspace.4science.it/dspace-spring-rest/api/eperson/groups/testgroupid/epersons' } + subgroups: { href: 'https://rest.api/server/api/eperson/groups/testgroupid/subgroups' }, + object: { href: 'https://rest.api/server/api/eperson/groups/testgroupid2/object' }, + epersons: { href: 'https://rest.api/server/api/eperson/groups/testgroupid/epersons' } }, _name: 'testgroupname', id: 'testgroupid', diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 60b9846f0c..75d66e7a3f 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -284,6 +284,8 @@ "admin.access-control.epeople.form.table.name": "Name", + "admin.access-control.epeople.form.table.collectionOrCommunity": "Collection/Community", + "admin.access-control.epeople.form.memberOfNoGroups": "This EPerson is not a member of any groups", "admin.access-control.epeople.form.goToGroups": "Add to groups", @@ -322,6 +324,8 @@ "admin.access-control.groups.table.name": "Name", + "admin.access-control.groups.table.collectionOrCommunity": "Collection/Community", + "admin.access-control.groups.table.members": "Members", "admin.access-control.groups.table.edit": "Edit", @@ -350,6 +354,8 @@ "admin.access-control.groups.form.groupName": "Group name", + "admin.access-control.groups.form.groupCommunity": "Community or Collection", + "admin.access-control.groups.form.groupDescription": "Description", "admin.access-control.groups.form.notification.created.success": "Successfully created Group \"{{name}}\"", @@ -398,6 +404,12 @@ "admin.access-control.groups.form.members-list.table.name": "Name", + "admin.access-control.groups.form.members-list.table.identity": "Identity", + + "admin.access-control.groups.form.members-list.table.email": "Email", + + "admin.access-control.groups.form.members-list.table.netid": "NetID", + "admin.access-control.groups.form.members-list.table.edit": "Remove / Add", "admin.access-control.groups.form.members-list.table.edit.buttons.remove": "Remove member with name \"{{name}}\"", @@ -434,6 +446,8 @@ "admin.access-control.groups.form.subgroups-list.table.name": "Name", + "admin.access-control.groups.form.subgroups-list.table.collectionOrCommunity": "Collection/Community", + "admin.access-control.groups.form.subgroups-list.table.edit": "Remove / Add", "admin.access-control.groups.form.subgroups-list.table.edit.buttons.remove": "Remove subgroup with name \"{{name}}\"",