Skip to content

Commit f4c6284

Browse files
authored
Merge pull request DSpace#1698 from 4Science/CST-6174-access-conditions-fix
Submission item/bitstream access conditions fixes
2 parents f589b2f + 0aa14bc commit f4c6284

5 files changed

Lines changed: 150 additions & 93 deletions

File tree

src/app/submission/sections/accesses/section-accesses.component.spec.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,15 @@ import { SectionAccessesService } from './section-accesses.service';
1616
import { SectionFormOperationsService } from '../form/section-form-operations.service';
1717
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
1818
import { TranslateModule, TranslateService } from '@ngx-translate/core';
19-
import { SubmissionJsonPatchOperationsService } from '../../../core/submission/submission-json-patch-operations.service';
19+
import {
20+
SubmissionJsonPatchOperationsService
21+
} from '../../../core/submission/submission-json-patch-operations.service';
2022
import { getSectionAccessesService } from '../../../shared/mocks/section-accesses.service.mock';
2123
import { getMockFormOperationsService } from '../../../shared/mocks/form-operations-service.mock';
2224
import { getMockTranslateService } from '../../../shared/mocks/translate.service.mock';
23-
import { SubmissionJsonPatchOperationsServiceStub } from '../../../shared/testing/submission-json-patch-operations-service.stub';
25+
import {
26+
SubmissionJsonPatchOperationsServiceStub
27+
} from '../../../shared/testing/submission-json-patch-operations-service.stub';
2428
import { BrowserModule } from '@angular/platform-browser';
2529

2630
import { of as observableOf } from 'rxjs';
@@ -42,8 +46,6 @@ describe('SubmissionSectionAccessesComponent', () => {
4246
let fixture: ComponentFixture<SubmissionSectionAccessesComponent>;
4347

4448
const sectionsServiceStub = new SectionsServiceStub();
45-
// const pathCombiner = new JsonPatchOperationPathCombiner('sections', sectionId, 'files', fileIndex);
46-
4749
const builderService: FormBuilderService = getMockFormBuilderService();
4850
const submissionAccessesConfigService = getSubmissionAccessesConfigService();
4951
const sectionAccessesService = getSectionAccessesService();
@@ -55,6 +57,7 @@ describe('SubmissionSectionAccessesComponent', () => {
5557
});
5658

5759
let formService: any;
60+
let formbuilderService: any;
5861

5962
const storeStub = jasmine.createSpyObj('store', ['dispatch']);
6063

@@ -86,7 +89,6 @@ describe('SubmissionSectionAccessesComponent', () => {
8689
declarations: [SubmissionSectionAccessesComponent, FormComponent],
8790
providers: [
8891
{ provide: SectionsService, useValue: sectionsServiceStub },
89-
{ provide: FormBuilderService, useValue: builderService },
9092
{ provide: SubmissionAccessesConfigService, useValue: submissionAccessesConfigService },
9193
{ provide: SectionAccessesService, useValue: sectionAccessesService },
9294
{ provide: SectionFormOperationsService, useValue: sectionFormOperationsService },
@@ -97,6 +99,7 @@ describe('SubmissionSectionAccessesComponent', () => {
9799
{ provide: SubmissionJsonPatchOperationsService, useValue: SubmissionJsonPatchOperationsServiceStub },
98100
{ provide: 'sectionDataProvider', useValue: sectionData },
99101
{ provide: 'submissionIdProvider', useValue: '1508' },
102+
FormBuilderService
100103
]
101104
})
102105
.compileComponents();
@@ -106,6 +109,7 @@ describe('SubmissionSectionAccessesComponent', () => {
106109
fixture = TestBed.createComponent(SubmissionSectionAccessesComponent);
107110
component = fixture.componentInstance;
108111
formService = TestBed.inject(FormService);
112+
formbuilderService = TestBed.inject(FormBuilderService);
109113
formService.validateAllFormFields.and.callFake(() => null);
110114
formService.isValid.and.returnValue(observableOf(true));
111115
formService.getFormData.and.returnValue(observableOf(mockAccessesFormData));
@@ -133,11 +137,22 @@ describe('SubmissionSectionAccessesComponent', () => {
133137
it('formModel type array should have formgroup with 1 input and 2 datepickers', () => {
134138
const formModel: any = component.formModel[1];
135139
const formGroup = formModel.groupFactory()[0].group;
140+
136141
expect(formGroup[0] instanceof DynamicSelectModel).toBeTrue();
137142
expect(formGroup[1] instanceof DynamicDatePickerModel).toBeTrue();
138143
expect(formGroup[2] instanceof DynamicDatePickerModel).toBeTrue();
139144
});
140145

146+
it('should have set maxStartDate and maxEndDate properly', () => {
147+
const maxStartDate = {year: 2024, month: 12, day: 20};
148+
const maxEndDate = {year: 2022, month: 6, day: 20};
149+
150+
const startDateModel = formbuilderService.findById('startDate', component.formModel);
151+
expect(startDateModel.max).toEqual(maxStartDate);
152+
const endDateModel = formbuilderService.findById('endDate', component.formModel);
153+
expect(endDateModel.max).toEqual(maxEndDate);
154+
});
155+
141156
it('when checkbox changed it should call operationsBuilder replace function', () => {
142157
component.onChange(checkboxChangeEvent);
143158
fixture.detectChanges();

src/app/submission/sections/accesses/section-accesses.component.ts

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ import {
4141
FORM_ACCESS_CONDITION_TYPE_LAYOUT
4242
} from './section-accesses.model';
4343
import { hasValue, isNotEmpty, isNotNull } from '../../../shared/empty.util';
44-
import { WorkspaceitemSectionAccessesObject } from '../../../core/submission/models/workspaceitem-section-accesses.model';
44+
import {
45+
WorkspaceitemSectionAccessesObject
46+
} from '../../../core/submission/models/workspaceitem-section-accesses.model';
4547
import { SubmissionAccessesConfigService } from '../../../core/config/submission-accesses-config.service';
4648
import { getFirstSucceededRemoteData } from '../../../core/shared/operators';
4749
import { FormComponent } from '../../../shared/form/form.component';
@@ -50,8 +52,12 @@ import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder
5052
import { SectionFormOperationsService } from '../form/section-form-operations.service';
5153
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
5254
import { AccessesConditionOption } from '../../../core/config/models/config-accesses-conditions-options.model';
53-
import { SubmissionJsonPatchOperationsService } from '../../../core/submission/submission-json-patch-operations.service';
55+
import {
56+
SubmissionJsonPatchOperationsService
57+
} from '../../../core/submission/submission-json-patch-operations.service';
5458
import { dateToISOFormat } from '../../../shared/date.util';
59+
import { DynamicFormControlCondition } from '@ng-dynamic-forms/core/lib/model/misc/dynamic-form-control-relation.model';
60+
import { DynamicDateControlValue } from '@ng-dynamic-forms/core/lib/model/dynamic-date-control.model';
5561

5662
/**
5763
* This component represents a section for managing item's access conditions.
@@ -322,40 +328,61 @@ export class SubmissionSectionAccessesComponent extends SectionModelComponent {
322328
}
323329
accessConditionTypeModelConfig.options = accessConditionTypeOptions;
324330

325-
// Dynamically assign of relation in config. For startdate, endDate, groups.
326-
const hasStart = [];
327-
const hasEnd = [];
328-
const hasGroups = [];
331+
// Dynamically assign of relation in config. For startDate and endDate.
332+
const startDateCondition: DynamicFormControlCondition[] = [];
333+
const endDateCondition: DynamicFormControlCondition[] = [];
334+
let maxStartDate: DynamicDateControlValue;
335+
let maxEndDate: DynamicDateControlValue;
329336
this.availableAccessConditionOptions.forEach((condition) => {
330-
const showStart: boolean = condition.hasStartDate === true;
331-
const showEnd: boolean = condition.hasEndDate === true;
332-
const showGroups: boolean = showStart || showEnd;
333-
if (showStart) {
334-
hasStart.push({ id: 'name', value: condition.name });
335-
}
336-
if (showEnd) {
337-
hasEnd.push({ id: 'name', value: condition.name });
337+
338+
if (condition.hasStartDate) {
339+
startDateCondition.push({ id: 'name', value: condition.name });
340+
if (condition.maxStartDate) {
341+
const min = new Date(condition.maxStartDate);
342+
maxStartDate = {
343+
year: min.getUTCFullYear(),
344+
month: min.getUTCMonth() + 1,
345+
day: min.getUTCDate()
346+
};
347+
}
338348
}
339-
if (showGroups) {
340-
hasGroups.push({ id: 'name', value: condition.name });
349+
if (condition.hasEndDate) {
350+
endDateCondition.push({ id: 'name', value: condition.name });
351+
if (condition.maxEndDate) {
352+
const max = new Date(condition.maxEndDate);
353+
maxEndDate = {
354+
year: max.getUTCFullYear(),
355+
month: max.getUTCMonth() + 1,
356+
day: max.getUTCDate()
357+
};
358+
}
341359
}
342360
});
343-
const confStart = { relations: [{ match: MATCH_ENABLED, operator: OR_OPERATOR, when: hasStart }] };
344-
const confEnd = { relations: [{ match: MATCH_ENABLED, operator: OR_OPERATOR, when: hasEnd }] };
361+
const confStart = { relations: [{ match: MATCH_ENABLED, operator: OR_OPERATOR, when: startDateCondition }] };
362+
const confEnd = { relations: [{ match: MATCH_ENABLED, operator: OR_OPERATOR, when: endDateCondition }] };
363+
const hasStartDate = startDateCondition.length > 0;
364+
const hasEndDate = endDateCondition.length > 0;
345365

346366
accessConditionsArrayConfig.groupFactory = () => {
347367
const type = new DynamicSelectModel(accessConditionTypeModelConfig, FORM_ACCESS_CONDITION_TYPE_LAYOUT);
348368
const startDateConfig = Object.assign({}, FORM_ACCESS_CONDITION_START_DATE_CONFIG, confStart);
369+
if (maxStartDate) {
370+
startDateConfig.max = maxStartDate;
371+
}
372+
349373
const endDateConfig = Object.assign({}, FORM_ACCESS_CONDITION_END_DATE_CONFIG, confEnd);
374+
if (maxEndDate) {
375+
endDateConfig.max = maxEndDate;
376+
}
350377

351378
const startDate = new DynamicDatePickerModel(startDateConfig, FORM_ACCESS_CONDITION_START_DATE_LAYOUT);
352379
const endDate = new DynamicDatePickerModel(endDateConfig, FORM_ACCESS_CONDITION_END_DATE_LAYOUT);
353380
const accessConditionGroupConfig = Object.assign({}, ACCESS_CONDITION_GROUP_CONFIG);
354381
accessConditionGroupConfig.group = [type];
355-
if (hasStart.length > 0) {
382+
if (hasStartDate) {
356383
accessConditionGroupConfig.group.push(startDate);
357384
}
358-
if (hasEnd.length > 0) {
385+
if (hasEndDate) {
359386
accessConditionGroupConfig.group.push(endDate);
360387
}
361388
return [new DynamicFormGroupModel(accessConditionGroupConfig, ACCESS_CONDITION_GROUP_LAYOUT)];

src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.spec.ts

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { ChangeDetectorRef, Component, NO_ERRORS_SCHEMA } from '@angular/core';
2-
import { waitForAsync, ComponentFixture, inject, TestBed, fakeAsync, tick } from '@angular/core/testing';
2+
import { ComponentFixture, fakeAsync, inject, TestBed, tick, waitForAsync } from '@angular/core/testing';
33
import { BrowserModule } from '@angular/platform-browser';
44
import { CommonModule } from '@angular/common';
55
import { TranslateModule } from '@ngx-translate/core';
66
import {
7-
DynamicFormArrayGroupModel,
87
DynamicFormArrayModel,
98
DynamicFormControlEvent,
109
DynamicFormGroupModel,
@@ -17,13 +16,13 @@ import { SubmissionService } from '../../../../submission.service';
1716
import { SubmissionSectionUploadFileEditComponent } from './section-upload-file-edit.component';
1817
import { POLICY_DEFAULT_WITH_LIST } from '../../section-upload.component';
1918
import {
19+
mockFileFormData,
2020
mockSubmissionCollectionId,
2121
mockSubmissionId,
22+
mockSubmissionObject,
2223
mockUploadConfigResponse,
2324
mockUploadConfigResponseMetadata,
2425
mockUploadFiles,
25-
mockFileFormData,
26-
mockSubmissionObject,
2726
} from '../../../../../shared/mocks/submission.mock';
2827
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
2928
import { FormComponent } from '../../../../../shared/form/form.component';
@@ -32,12 +31,20 @@ import { getMockFormService } from '../../../../../shared/mocks/form-service.moc
3231
import { createTestComponent } from '../../../../../shared/testing/utils.test';
3332
import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap';
3433
import { JsonPatchOperationsBuilder } from '../../../../../core/json-patch/builder/json-patch-operations-builder';
35-
import { SubmissionJsonPatchOperationsServiceStub } from '../../../../../shared/testing/submission-json-patch-operations-service.stub';
36-
import { SubmissionJsonPatchOperationsService } from '../../../../../core/submission/submission-json-patch-operations.service';
34+
import {
35+
SubmissionJsonPatchOperationsServiceStub
36+
} from '../../../../../shared/testing/submission-json-patch-operations-service.stub';
37+
import {
38+
SubmissionJsonPatchOperationsService
39+
} from '../../../../../core/submission/submission-json-patch-operations.service';
3740
import { SectionUploadService } from '../../section-upload.service';
3841
import { getMockSectionUploadService } from '../../../../../shared/mocks/section-upload.service.mock';
39-
import { FormFieldMetadataValueObject } from '../../../../../shared/form/builder/models/form-field-metadata-value.model';
40-
import { JsonPatchOperationPathCombiner } from '../../../../../core/json-patch/builder/json-patch-operation-path-combiner';
42+
import {
43+
FormFieldMetadataValueObject
44+
} from '../../../../../shared/form/builder/models/form-field-metadata-value.model';
45+
import {
46+
JsonPatchOperationPathCombiner
47+
} from '../../../../../core/json-patch/builder/json-patch-operation-path-combiner';
4148
import { dateToISOFormat } from '../../../../../shared/date.util';
4249
import { of } from 'rxjs';
4350

@@ -171,6 +178,8 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => {
171178
it('should init form model properly', () => {
172179
comp.fileData = fileData;
173180
comp.formId = 'testFileForm';
181+
const maxStartDate = {year: 2022, month: 1, day: 12};
182+
const maxEndDate = {year: 2019, month: 7, day: 12};
174183

175184
comp.ngOnInit();
176185

@@ -179,6 +188,10 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => {
179188
expect(comp.formModel[0] instanceof DynamicFormGroupModel).toBeTruthy();
180189
expect(comp.formModel[1] instanceof DynamicFormArrayModel).toBeTruthy();
181190
expect((comp.formModel[1] as DynamicFormArrayModel).groups.length).toBe(2);
191+
const startDateModel = formbuilderService.findById('startDate', comp.formModel);
192+
expect(startDateModel.max).toEqual(maxStartDate);
193+
const endDateModel = formbuilderService.findById('endDate', comp.formModel);
194+
expect(endDateModel.max).toEqual(maxEndDate);
182195
});
183196

184197
it('should call setOptions method onChange', () => {
@@ -208,20 +221,19 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => {
208221
const formGroup = formbuilderService.createFormGroup(comp.formModel);
209222
const control = formbuilderService.getFormControlById('name', formGroup, comp.formModel, 0);
210223

211-
spyOn(formbuilderService, 'findById').and.callThrough();
224+
spyOn(control.parent, 'markAsDirty').and.callThrough();
212225

213226
control.value = 'openaccess';
214227
comp.setOptions(model, control);
215-
expect(formbuilderService.findById).not.toHaveBeenCalledWith('endDate', (model.parent as DynamicFormArrayGroupModel).group);
216-
expect(formbuilderService.findById).not.toHaveBeenCalledWith('startDate', (model.parent as DynamicFormArrayGroupModel).group);
228+
expect(control.parent.markAsDirty).toHaveBeenCalled();
217229

218230
control.value = 'lease';
219231
comp.setOptions(model, control);
220-
expect(formbuilderService.findById).toHaveBeenCalledWith('endDate', (model.parent as DynamicFormArrayGroupModel).group);
232+
expect(control.parent.markAsDirty).toHaveBeenCalled();
221233

222234
control.value = 'embargo';
223235
comp.setOptions(model, control);
224-
expect(formbuilderService.findById).toHaveBeenCalledWith('startDate', (model.parent as DynamicFormArrayGroupModel).group);
236+
expect(control.parent.markAsDirty).toHaveBeenCalled();
225237
});
226238

227239
it('should retrieve Value From Field properly', () => {

0 commit comments

Comments
 (0)