Fixed issue with bitstream edit form that not show access condition groups when were more than one

This commit is contained in:
Giuseppe Digilio
2019-03-17 17:01:47 +01:00
parent 1bdc1d799d
commit c6d16abbbd
7 changed files with 86 additions and 46 deletions

View File

@@ -13,6 +13,11 @@ export class AccessConditionOption {
*/ */
groupUUID: string; groupUUID: string;
/**
* The uuid of the Group that contains set of groups this Resource Policy applies to
*/
selectGroupUUID: string;
/** /**
* A boolean representing if this Access Condition has a start date * A boolean representing if this Access Condition has a start date
*/ */

View File

@@ -180,9 +180,7 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo
if (changes) { if (changes) {
super.ngOnChanges(changes); super.ngOnChanges(changes);
if (this.model && this.model.placeholder) { if (this.model && this.model.placeholder) {
this.translateService.get(this.model.placeholder).subscribe((placeholder) => { this.model.placeholder = this.translateService.instant(this.model.placeholder);
this.model.placeholder = placeholder;
})
} }
} }
} }

View File

@@ -3,6 +3,7 @@ import { SubmissionDefinitionsModel } from '../../core/config/models/config-subm
import { PaginatedList } from '../../core/data/paginated-list'; import { PaginatedList } from '../../core/data/paginated-list';
import { PageInfo } from '../../core/shared/page-info.model'; import { PageInfo } from '../../core/shared/page-info.model';
import { FormFieldMetadataValueObject } from '../form/builder/models/form-field-metadata-value.model'; import { FormFieldMetadataValueObject } from '../form/builder/models/form-field-metadata-value.model';
import { Group } from '../../core/eperson/models/group.model';
export const mockSectionsData = { export const mockSectionsData = {
traditionalpageone:{ traditionalpageone:{
@@ -1364,7 +1365,7 @@ export const mockAccessConditionOptions = [
} }
]; ];
export const mockGroup = { export const mockGroup = Object.assign(new Group(), {
handle: null, handle: null,
permanent: true, permanent: true,
self: 'https://rest.api/dspace-spring-rest/api/eperson/groups/123456-g1', self: 'https://rest.api/dspace-spring-rest/api/eperson/groups/123456-g1',
@@ -1386,7 +1387,7 @@ export const mockGroup = {
}, },
page: [] page: []
} }
}; });
export const mockUploadFiles = [ export const mockUploadFiles = [
{ {

View File

@@ -30,6 +30,7 @@ import { FormService } from '../../../../../shared/form/form.service';
import { GLOBAL_CONFIG } from '../../../../../../config'; import { GLOBAL_CONFIG } from '../../../../../../config';
import { MOCK_SUBMISSION_CONFIG } from '../../../../../shared/testing/mock-submission-config'; import { MOCK_SUBMISSION_CONFIG } from '../../../../../shared/testing/mock-submission-config';
import { getMockFormService } from '../../../../../shared/mocks/mock-form-service'; import { getMockFormService } from '../../../../../shared/mocks/mock-form-service';
import { Group } from '../../../../../core/eperson/models/group.model';
describe('UploadSectionFileEditComponent test suite', () => { describe('UploadSectionFileEditComponent test suite', () => {
@@ -44,7 +45,10 @@ describe('UploadSectionFileEditComponent test suite', () => {
const sectionId = 'upload'; const sectionId = 'upload';
const collectionId = mockSubmissionCollectionId; const collectionId = mockSubmissionCollectionId;
const availableAccessConditionOptions = mockUploadConfigResponse.accessConditionOptions; const availableAccessConditionOptions = mockUploadConfigResponse.accessConditionOptions;
const availableGroupsMap = new Map([[mockGroup.id, { name: mockGroup.name, uuid: mockGroup.uuid }]]); const availableGroupsMap: Map<string, Group[]> = new Map([
[mockUploadConfigResponse.accessConditionOptions[1].name, [mockGroup as any]],
[mockUploadConfigResponse.accessConditionOptions[2].name, [mockGroup as any]],
]);
const collectionPolicyType = POLICY_DEFAULT_WITH_LIST; const collectionPolicyType = POLICY_DEFAULT_WITH_LIST;
const configMetadataForm: any = mockUploadConfigResponse.metadata; const configMetadataForm: any = mockUploadConfigResponse.metadata;
const fileIndex = '0'; const fileIndex = '0';

View File

@@ -1,4 +1,4 @@
import { ChangeDetectorRef, Component, Input, OnChanges } from '@angular/core'; import { ChangeDetectorRef, Component, Input, OnChanges, ViewChild } from '@angular/core';
import { WorkspaceitemSectionUploadFileObject } from '../../../../../core/submission/models/workspaceitem-section-upload-file.model'; import { WorkspaceitemSectionUploadFileObject } from '../../../../../core/submission/models/workspaceitem-section-upload-file.model';
import { import {
@@ -33,6 +33,10 @@ import { SubmissionFormsModel } from '../../../../../core/config/models/config-s
import { FormFieldModel } from '../../../../../shared/form/builder/models/form-field.model'; import { FormFieldModel } from '../../../../../shared/form/builder/models/form-field.model';
import { AccessConditionOption } from '../../../../../core/config/models/config-access-condition-option.model'; import { AccessConditionOption } from '../../../../../core/config/models/config-access-condition-option.model';
import { SubmissionService } from '../../../../submission.service'; import { SubmissionService } from '../../../../submission.service';
import { FormService } from '../../../../../shared/form/form.service';
import { FormComponent } from '../../../../../shared/form/form.component';
import { FormControl } from '@angular/forms';
import { Group } from '../../../../../core/eperson/models/group.model';
@Component({ @Component({
selector: 'ds-submission-upload-section-file-edit', selector: 'ds-submission-upload-section-file-edit',
@@ -41,7 +45,7 @@ import { SubmissionService } from '../../../../submission.service';
export class UploadSectionFileEditComponent implements OnChanges { export class UploadSectionFileEditComponent implements OnChanges {
@Input() availableAccessConditionOptions: any[]; @Input() availableAccessConditionOptions: any[];
@Input() availableAccessConditionGroups: Map<string, any>; @Input() availableAccessConditionGroups: Map<string, Group[]>;
@Input() collectionId; @Input() collectionId;
@Input() collectionPolicyType; @Input() collectionPolicyType;
@Input() configMetadataForm: SubmissionFormsModel; @Input() configMetadataForm: SubmissionFormsModel;
@@ -54,8 +58,11 @@ export class UploadSectionFileEditComponent implements OnChanges {
public formModel: DynamicFormControlModel[]; public formModel: DynamicFormControlModel[];
@ViewChild('formRef') public formRef: FormComponent;
constructor(private cdr: ChangeDetectorRef, constructor(private cdr: ChangeDetectorRef,
private formBuilderService: FormBuilderService, private formBuilderService: FormBuilderService,
private formService: FormService,
private submissionService: SubmissionService) { private submissionService: SubmissionService) {
} }
@@ -153,8 +160,8 @@ export class UploadSectionFileEditComponent implements OnChanges {
.forEach((key) => { .forEach((key) => {
const metadataModel: any = this.formBuilderService.findById(key, formModel, index); const metadataModel: any = this.formBuilderService.findById(key, formModel, index);
if (metadataModel) { if (metadataModel) {
if (key === 'groupUUID') { if (key === 'groupUUID' && this.availableAccessConditionGroups.get(accessCondition.name)) {
this.availableAccessConditionGroups.forEach((group) => { this.availableAccessConditionGroups.get(accessCondition.name).forEach((group) => {
metadataModel.options.push({ metadataModel.options.push({
label: group.name, label: group.name,
value: group.uuid value: group.uuid
@@ -189,14 +196,20 @@ export class UploadSectionFileEditComponent implements OnChanges {
if (isNotEmpty(accessCondition)) { if (isNotEmpty(accessCondition)) {
const showGroups: boolean = accessCondition.hasStartDate === true || accessCondition.hasEndDate === true; const showGroups: boolean = accessCondition.hasStartDate === true || accessCondition.hasEndDate === true;
const groupControl = control.parent.get('groupUUID'); const groupControl: FormControl = control.parent.get('groupUUID');
const startDateControl = control.parent.get('startDate'); const startDateControl: FormControl = control.parent.get('startDate');
const endDateControl = control.parent.get('endDate'); const endDateControl: FormControl = control.parent.get('endDate');
// Clear previous state
groupControl.markAsUntouched();
startDateControl.markAsUntouched();
endDateControl.markAsUntouched();
// Clear previous values // Clear previous values
if (showGroups) { if (showGroups) {
groupControl.setValue(null); groupControl.setValue(null);
} else { } else {
groupControl.clearValidators();
groupControl.setValue(accessCondition.groupUUID); groupControl.setValue(accessCondition.groupUUID);
} }
startDateControl.setValue(null); startDateControl.setValue(null);
@@ -204,15 +217,15 @@ export class UploadSectionFileEditComponent implements OnChanges {
endDateControl.setValue(null); endDateControl.setValue(null);
if (showGroups) { if (showGroups) {
if (isNotUndefined(accessCondition.groupUUID)) { if (isNotUndefined(accessCondition.groupUUID) || isNotUndefined(accessCondition.selectGroupUUID)) {
const groupOptions = []; const groupOptions = [];
if (isNotUndefined(this.availableAccessConditionGroups.get(accessCondition.groupUUID))) { if (isNotUndefined(this.availableAccessConditionGroups.get(accessCondition.name))) {
const groupModel = this.formBuilderService.findById( const groupModel = this.formBuilderService.findById(
'groupUUID', 'groupUUID',
(model.parent as DynamicFormArrayGroupModel).group) as DynamicSelectModel<any>; (model.parent as DynamicFormArrayGroupModel).group) as DynamicSelectModel<any>;
this.availableAccessConditionGroups.forEach((group) => { this.availableAccessConditionGroups.get(accessCondition.name).forEach((group) => {
groupOptions.push({ groupOptions.push({
label: group.name, label: group.name,
value: group.uuid value: group.uuid

View File

@@ -204,15 +204,17 @@ describe('UploadSectionComponent test suite', () => {
comp.onSectionInit(); comp.onSectionInit();
const expectedGroupsMap = new Map(); const expectedGroupsMap = new Map([
expectedGroupsMap.set(mockGroup.id, { name: mockGroup.name, uuid: mockGroup.uuid }); [mockUploadConfigResponse.accessConditionOptions[1].name, [mockGroup as any]],
[mockUploadConfigResponse.accessConditionOptions[2].name, [mockGroup as any]],
]);
expect(comp.collectionId).toBe(collectionId); expect(comp.collectionId).toBe(collectionId);
expect(comp.collectionName).toBe(mockCollection.name); expect(comp.collectionName).toBe(mockCollection.name);
expect(comp.availableAccessConditionOptions.length).toBe(4); expect(comp.availableAccessConditionOptions.length).toBe(4);
expect(comp.availableAccessConditionOptions).toEqual(mockUploadConfigResponse.accessConditionOptions as any); expect(comp.availableAccessConditionOptions).toEqual(mockUploadConfigResponse.accessConditionOptions as any);
expect(compAsAny.subs.length).toBe(2); expect(compAsAny.subs.length).toBe(2);
expect(compAsAny.availableGroups.size).toBe(1); expect(compAsAny.availableGroups.size).toBe(2);
expect(compAsAny.availableGroups).toEqual(expectedGroupsMap); expect(compAsAny.availableGroups).toEqual(expectedGroupsMap);
expect(compAsAny.fileList).toEqual([]); expect(compAsAny.fileList).toEqual([]);
expect(compAsAny.fileIndexes).toEqual([]); expect(compAsAny.fileIndexes).toEqual([]);
@@ -248,15 +250,17 @@ describe('UploadSectionComponent test suite', () => {
comp.onSectionInit(); comp.onSectionInit();
const expectedGroupsMap = new Map(); const expectedGroupsMap = new Map([
expectedGroupsMap.set(mockGroup.id, { name: mockGroup.name, uuid: mockGroup.uuid }); [mockUploadConfigResponse.accessConditionOptions[1].name, [mockGroup as any]],
[mockUploadConfigResponse.accessConditionOptions[2].name, [mockGroup as any]],
]);
expect(comp.collectionId).toBe(collectionId); expect(comp.collectionId).toBe(collectionId);
expect(comp.collectionName).toBe(mockCollection.name); expect(comp.collectionName).toBe(mockCollection.name);
expect(comp.availableAccessConditionOptions.length).toBe(4); expect(comp.availableAccessConditionOptions.length).toBe(4);
expect(comp.availableAccessConditionOptions).toEqual(mockUploadConfigResponse.accessConditionOptions as any); expect(comp.availableAccessConditionOptions).toEqual(mockUploadConfigResponse.accessConditionOptions as any);
expect(compAsAny.subs.length).toBe(2); expect(compAsAny.subs.length).toBe(2);
expect(compAsAny.availableGroups.size).toBe(1); expect(compAsAny.availableGroups.size).toBe(2);
expect(compAsAny.availableGroups).toEqual(expectedGroupsMap); expect(compAsAny.availableGroups).toEqual(expectedGroupsMap);
expect(compAsAny.fileList).toEqual(mockUploadFiles); expect(compAsAny.fileList).toEqual(mockUploadFiles);
expect(compAsAny.fileIndexes).toEqual(['123456-test-upload']); expect(compAsAny.fileIndexes).toEqual(['123456-test-upload']);

View File

@@ -23,10 +23,16 @@ import { SubmissionService } from '../../submission.service';
import { Collection } from '../../../core/shared/collection.model'; import { Collection } from '../../../core/shared/collection.model';
import { ResourcePolicy } from '../../../core/shared/resource-policy.model'; import { ResourcePolicy } from '../../../core/shared/resource-policy.model';
import { AccessConditionOption } from '../../../core/config/models/config-access-condition-option.model'; import { AccessConditionOption } from '../../../core/config/models/config-access-condition-option.model';
import { PaginatedList } from '../../../core/data/paginated-list';
export const POLICY_DEFAULT_NO_LIST = 1; // Banner1 export const POLICY_DEFAULT_NO_LIST = 1; // Banner1
export const POLICY_DEFAULT_WITH_LIST = 2; // Banner2 export const POLICY_DEFAULT_WITH_LIST = 2; // Banner2
export interface AccessConditionGroupsMapEntry {
accessCondition: string;
groups: Group[]
}
@Component({ @Component({
selector: 'ds-submission-section-upload', selector: 'ds-submission-section-upload',
styleUrls: ['./section-upload.component.scss'], styleUrls: ['./section-upload.component.scss'],
@@ -62,7 +68,7 @@ export class UploadSectionComponent extends SectionModelComponent {
/* /*
* List of Groups available for every access condition * List of Groups available for every access condition
*/ */
protected availableGroups: Map<string, any>; // Groups for any policy protected availableGroups: Map<string, Group[]>; // Groups for any policy
protected subs = []; protected subs = [];
@@ -117,38 +123,47 @@ export class UploadSectionComponent extends SectionModelComponent {
: POLICY_DEFAULT_NO_LIST; : POLICY_DEFAULT_NO_LIST;
this.availableGroups = new Map(); this.availableGroups = new Map();
const groups$ = []; const mapGroups$: Array<Observable<AccessConditionGroupsMapEntry>> = [];
// Retrieve Groups for accessConditionPolicies // Retrieve Groups for accessConditionPolicies
this.availableAccessConditionOptions.forEach((accessCondition: AccessConditionOption) => { this.availableAccessConditionOptions.forEach((accessCondition: AccessConditionOption) => {
if (accessCondition.hasEndDate === true || accessCondition.hasStartDate === true) { if (accessCondition.hasEndDate === true || accessCondition.hasStartDate === true) {
groups$.push( if (accessCondition.groupUUID) {
mapGroups$.push(
this.groupService.findById(accessCondition.groupUUID).pipe( this.groupService.findById(accessCondition.groupUUID).pipe(
find((rd: RemoteData<Group>) => !rd.isResponsePending && rd.hasSucceeded)) find((rd: RemoteData<Group>) => !rd.isResponsePending && rd.hasSucceeded),
map((rd: RemoteData<Group>) => ({
accessCondition: accessCondition.name,
groups: [rd.payload]
} as AccessConditionGroupsMapEntry)))
); );
} else if (accessCondition.selectGroupUUID) {
mapGroups$.push(
this.groupService.findById(accessCondition.selectGroupUUID).pipe(
find((rd: RemoteData<Group>) => !rd.isResponsePending && rd.hasSucceeded),
tap((group: RemoteData<Group>) => console.log(group.payload.groups)),
flatMap((group: RemoteData<Group>) => group.payload.groups),
find((rd: RemoteData<PaginatedList<Group>>) => !rd.isResponsePending && rd.hasSucceeded),
tap((group) => console.log(group)),
map((rd: RemoteData<PaginatedList<Group>>) => ({
accessCondition: accessCondition.name,
groups: rd.payload.page
} as AccessConditionGroupsMapEntry))
));
}
} }
}); });
return groups$; return mapGroups$;
}), }),
flatMap((group) => group), flatMap((entry) => entry),
reduce((acc: Group[], group: RemoteData<Group>) => { reduce((acc: any[], entry: AccessConditionGroupsMapEntry) => {
acc.push(group.payload); acc.push(entry);
return acc; return acc;
}, []), }, []),
).subscribe((groups: Group[]) => { ).subscribe((entries: AccessConditionGroupsMapEntry[]) => {
groups.forEach((group: Group) => { console.log(entries);
if (isUndefined(this.availableGroups.get(group.uuid))) { entries.forEach((entry: AccessConditionGroupsMapEntry) => {
if (Array.isArray(group.groups)) { this.availableGroups.set(entry.accessCondition, entry.groups);
const groupArrayData = [];
for (const groupData of group.groups) {
groupArrayData.push({ name: groupData.name, uuid: groupData.uuid });
}
this.availableGroups.set(group.uuid, groupArrayData);
} else {
this.availableGroups.set(group.uuid, { name: group.name, uuid: group.uuid });
}
}
}); });
this.changeDetectorRef.detectChanges(); this.changeDetectorRef.detectChanges();
}) })
, ,