[CST-6174] Set maxStartDate/maxEndDate when building form models

This commit is contained in:
Giuseppe Digilio
2022-06-23 12:24:16 +02:00
parent 2a20b0c989
commit 0aa14bcddd
3 changed files with 71 additions and 65 deletions

View File

@@ -1,10 +1,9 @@
import { ChangeDetectorRef, Component, NO_ERRORS_SCHEMA } from '@angular/core'; import { ChangeDetectorRef, Component, NO_ERRORS_SCHEMA } from '@angular/core';
import { waitForAsync, ComponentFixture, inject, TestBed, fakeAsync, tick } from '@angular/core/testing'; import { ComponentFixture, fakeAsync, inject, TestBed, tick, waitForAsync } from '@angular/core/testing';
import { BrowserModule } from '@angular/platform-browser'; import { BrowserModule } from '@angular/platform-browser';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { import {
DynamicFormArrayGroupModel,
DynamicFormArrayModel, DynamicFormArrayModel,
DynamicFormControlEvent, DynamicFormControlEvent,
DynamicFormGroupModel, DynamicFormGroupModel,
@@ -17,13 +16,13 @@ import { SubmissionService } from '../../../../submission.service';
import { SubmissionSectionUploadFileEditComponent } from './section-upload-file-edit.component'; import { SubmissionSectionUploadFileEditComponent } from './section-upload-file-edit.component';
import { POLICY_DEFAULT_WITH_LIST } from '../../section-upload.component'; import { POLICY_DEFAULT_WITH_LIST } from '../../section-upload.component';
import { import {
mockFileFormData,
mockSubmissionCollectionId, mockSubmissionCollectionId,
mockSubmissionId, mockSubmissionId,
mockSubmissionObject,
mockUploadConfigResponse, mockUploadConfigResponse,
mockUploadConfigResponseMetadata, mockUploadConfigResponseMetadata,
mockUploadFiles, mockUploadFiles,
mockFileFormData,
mockSubmissionObject,
} from '../../../../../shared/mocks/submission.mock'; } from '../../../../../shared/mocks/submission.mock';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { FormComponent } from '../../../../../shared/form/form.component'; import { FormComponent } from '../../../../../shared/form/form.component';
@@ -32,12 +31,20 @@ import { getMockFormService } from '../../../../../shared/mocks/form-service.moc
import { createTestComponent } from '../../../../../shared/testing/utils.test'; import { createTestComponent } from '../../../../../shared/testing/utils.test';
import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { JsonPatchOperationsBuilder } from '../../../../../core/json-patch/builder/json-patch-operations-builder'; import { JsonPatchOperationsBuilder } from '../../../../../core/json-patch/builder/json-patch-operations-builder';
import { SubmissionJsonPatchOperationsServiceStub } from '../../../../../shared/testing/submission-json-patch-operations-service.stub'; import {
import { SubmissionJsonPatchOperationsService } from '../../../../../core/submission/submission-json-patch-operations.service'; SubmissionJsonPatchOperationsServiceStub
} from '../../../../../shared/testing/submission-json-patch-operations-service.stub';
import {
SubmissionJsonPatchOperationsService
} from '../../../../../core/submission/submission-json-patch-operations.service';
import { SectionUploadService } from '../../section-upload.service'; import { SectionUploadService } from '../../section-upload.service';
import { getMockSectionUploadService } from '../../../../../shared/mocks/section-upload.service.mock'; import { getMockSectionUploadService } from '../../../../../shared/mocks/section-upload.service.mock';
import { FormFieldMetadataValueObject } from '../../../../../shared/form/builder/models/form-field-metadata-value.model'; import {
import { JsonPatchOperationPathCombiner } from '../../../../../core/json-patch/builder/json-patch-operation-path-combiner'; FormFieldMetadataValueObject
} from '../../../../../shared/form/builder/models/form-field-metadata-value.model';
import {
JsonPatchOperationPathCombiner
} from '../../../../../core/json-patch/builder/json-patch-operation-path-combiner';
import { dateToISOFormat } from '../../../../../shared/date.util'; import { dateToISOFormat } from '../../../../../shared/date.util';
import { of } from 'rxjs'; import { of } from 'rxjs';
@@ -171,6 +178,8 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => {
it('should init form model properly', () => { it('should init form model properly', () => {
comp.fileData = fileData; comp.fileData = fileData;
comp.formId = 'testFileForm'; comp.formId = 'testFileForm';
const maxStartDate = {year: 2022, month: 1, day: 12};
const maxEndDate = {year: 2019, month: 7, day: 12};
comp.ngOnInit(); comp.ngOnInit();
@@ -179,6 +188,10 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => {
expect(comp.formModel[0] instanceof DynamicFormGroupModel).toBeTruthy(); expect(comp.formModel[0] instanceof DynamicFormGroupModel).toBeTruthy();
expect(comp.formModel[1] instanceof DynamicFormArrayModel).toBeTruthy(); expect(comp.formModel[1] instanceof DynamicFormArrayModel).toBeTruthy();
expect((comp.formModel[1] as DynamicFormArrayModel).groups.length).toBe(2); expect((comp.formModel[1] as DynamicFormArrayModel).groups.length).toBe(2);
const startDateModel = formbuilderService.findById('startDate', comp.formModel);
expect(startDateModel.max).toEqual(maxStartDate);
const endDateModel = formbuilderService.findById('endDate', comp.formModel);
expect(endDateModel.max).toEqual(maxEndDate);
}); });
it('should call setOptions method onChange', () => { it('should call setOptions method onChange', () => {
@@ -208,20 +221,19 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => {
const formGroup = formbuilderService.createFormGroup(comp.formModel); const formGroup = formbuilderService.createFormGroup(comp.formModel);
const control = formbuilderService.getFormControlById('name', formGroup, comp.formModel, 0); const control = formbuilderService.getFormControlById('name', formGroup, comp.formModel, 0);
spyOn(formbuilderService, 'findById').and.callThrough(); spyOn(control.parent, 'markAsDirty').and.callThrough();
control.value = 'openaccess'; control.value = 'openaccess';
comp.setOptions(model, control); comp.setOptions(model, control);
expect(formbuilderService.findById).not.toHaveBeenCalledWith('endDate', (model.parent as DynamicFormArrayGroupModel).group); expect(control.parent.markAsDirty).toHaveBeenCalled();
expect(formbuilderService.findById).not.toHaveBeenCalledWith('startDate', (model.parent as DynamicFormArrayGroupModel).group);
control.value = 'lease'; control.value = 'lease';
comp.setOptions(model, control); comp.setOptions(model, control);
expect(formbuilderService.findById).toHaveBeenCalledWith('endDate', (model.parent as DynamicFormArrayGroupModel).group); expect(control.parent.markAsDirty).toHaveBeenCalled();
control.value = 'embargo'; control.value = 'embargo';
comp.setOptions(model, control); comp.setOptions(model, control);
expect(formbuilderService.findById).toHaveBeenCalledWith('startDate', (model.parent as DynamicFormArrayGroupModel).group); expect(control.parent.markAsDirty).toHaveBeenCalled();
}); });
it('should retrieve Value From Field properly', () => { it('should retrieve Value From Field properly', () => {

View File

@@ -3,9 +3,7 @@ import { FormControl } from '@angular/forms';
import { import {
DYNAMIC_FORM_CONTROL_TYPE_DATEPICKER, DYNAMIC_FORM_CONTROL_TYPE_DATEPICKER,
DynamicDateControlModel,
DynamicDatePickerModel, DynamicDatePickerModel,
DynamicFormArrayGroupModel,
DynamicFormArrayModel, DynamicFormArrayModel,
DynamicFormControlEvent, DynamicFormControlEvent,
DynamicFormControlModel, DynamicFormControlModel,
@@ -57,6 +55,8 @@ import {
} from '../../../../../core/json-patch/builder/json-patch-operation-path-combiner'; } from '../../../../../core/json-patch/builder/json-patch-operation-path-combiner';
import { SectionUploadService } from '../../section-upload.service'; import { SectionUploadService } from '../../section-upload.service';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
import { DynamicFormControlCondition } from '@ng-dynamic-forms/core/lib/model/misc/dynamic-form-control-relation.model';
import { DynamicDateControlValue } from '@ng-dynamic-forms/core/lib/model/dynamic-date-control.model';
/** /**
* This component represents the edit form for bitstream * This component represents the edit form for bitstream
@@ -245,8 +245,6 @@ export class SubmissionSectionUploadFileEditComponent implements OnInit {
this.availableAccessConditionOptions.filter((element) => element.name === control.value) this.availableAccessConditionOptions.filter((element) => element.name === control.value)
.forEach((element) => accessCondition = element ); .forEach((element) => accessCondition = element );
if (isNotEmpty(accessCondition)) { if (isNotEmpty(accessCondition)) {
const showGroups: boolean = accessCondition.hasStartDate === true || accessCondition.hasEndDate === true;
const startDateControl: FormControl = control.parent.get('startDate') as FormControl; const startDateControl: FormControl = control.parent.get('startDate') as FormControl;
const endDateControl: FormControl = control.parent.get('endDate') as FormControl; const endDateControl: FormControl = control.parent.get('endDate') as FormControl;
@@ -257,34 +255,6 @@ export class SubmissionSectionUploadFileEditComponent implements OnInit {
startDateControl?.setValue(null); startDateControl?.setValue(null);
control.parent.markAsDirty(); control.parent.markAsDirty();
endDateControl?.setValue(null); endDateControl?.setValue(null);
if (showGroups) {
if (accessCondition.hasStartDate && accessCondition.maxStartDate) {
const startDateModel = this.formBuilderService.findById(
'startDate',
(model.parent as DynamicFormArrayGroupModel).group) as DynamicDateControlModel;
const min = new Date(accessCondition.maxStartDate);
startDateModel.max = {
year: min.getUTCFullYear(),
month: min.getUTCMonth() + 1,
day: min.getUTCDate()
};
}
if (accessCondition.hasEndDate && accessCondition.maxEndDate) {
const endDateModel = this.formBuilderService.findById(
'endDate',
(model.parent as DynamicFormArrayGroupModel).group) as DynamicDateControlModel;
const max = new Date(accessCondition.maxEndDate);
endDateModel.max = {
year: max.getUTCFullYear(),
month: max.getUTCMonth() + 1,
day: max.getUTCDate()
};
}
}
} }
} }
@@ -344,38 +314,63 @@ export class SubmissionSectionUploadFileEditComponent implements OnInit {
} }
accessConditionTypeModelConfig.options = accessConditionTypeOptions; accessConditionTypeModelConfig.options = accessConditionTypeOptions;
// Dynamically assign of relation in config. For startdate, endDate, groups. // Dynamically assign of relation in config. For startDate and endDate.
const hasStart = []; const startDateCondition: DynamicFormControlCondition[] = [];
const hasEnd = []; const endDateCondition: DynamicFormControlCondition[] = [];
const hasGroups = []; let maxStartDate: DynamicDateControlValue;
let maxEndDate: DynamicDateControlValue;
this.availableAccessConditionOptions.forEach((condition) => { this.availableAccessConditionOptions.forEach((condition) => {
const showStart: boolean = condition.hasStartDate === true;
const showEnd: boolean = condition.hasEndDate === true; if (condition.hasStartDate) {
const showGroups: boolean = showStart || showEnd; startDateCondition.push({ id: 'name', value: condition.name });
if (showStart) { if (condition.maxStartDate) {
hasStart.push({id: 'name', value: condition.name}); const min = new Date(condition.maxStartDate);
maxStartDate = {
year: min.getUTCFullYear(),
month: min.getUTCMonth() + 1,
day: min.getUTCDate()
};
}
} }
if (showEnd) { if (condition.hasEndDate) {
hasEnd.push({id: 'name', value: condition.name}); endDateCondition.push({ id: 'name', value: condition.name });
} if (condition.maxEndDate) {
if (showGroups) { const max = new Date(condition.maxEndDate);
hasGroups.push({id: 'name', value: condition.name}); maxEndDate = {
year: max.getUTCFullYear(),
month: max.getUTCMonth() + 1,
day: max.getUTCDate()
};
}
} }
}); });
const confStart = {relations: [{match: MATCH_ENABLED, operator: OR_OPERATOR, when: hasStart}]}; const confStart = { relations: [{ match: MATCH_ENABLED, operator: OR_OPERATOR, when: startDateCondition }] };
const confEnd = {relations: [{match: MATCH_ENABLED, operator: OR_OPERATOR, when: hasEnd}]}; const confEnd = { relations: [{ match: MATCH_ENABLED, operator: OR_OPERATOR, when: endDateCondition }] };
const hasStartDate = startDateCondition.length > 0;
const hasEndDate = endDateCondition.length > 0;
accessConditionsArrayConfig.groupFactory = () => { accessConditionsArrayConfig.groupFactory = () => {
const type = new DynamicSelectModel(accessConditionTypeModelConfig, BITSTREAM_FORM_ACCESS_CONDITION_TYPE_LAYOUT); const type = new DynamicSelectModel(accessConditionTypeModelConfig, BITSTREAM_FORM_ACCESS_CONDITION_TYPE_LAYOUT);
const startDateConfig = Object.assign({}, BITSTREAM_FORM_ACCESS_CONDITION_START_DATE_CONFIG, confStart); const startDateConfig = Object.assign({}, BITSTREAM_FORM_ACCESS_CONDITION_START_DATE_CONFIG, confStart);
if (maxStartDate) {
startDateConfig.max = maxStartDate;
}
const endDateConfig = Object.assign({}, BITSTREAM_FORM_ACCESS_CONDITION_END_DATE_CONFIG, confEnd); const endDateConfig = Object.assign({}, BITSTREAM_FORM_ACCESS_CONDITION_END_DATE_CONFIG, confEnd);
if (maxEndDate) {
endDateConfig.max = maxEndDate;
}
const startDate = new DynamicDatePickerModel(startDateConfig, BITSTREAM_FORM_ACCESS_CONDITION_START_DATE_LAYOUT); const startDate = new DynamicDatePickerModel(startDateConfig, BITSTREAM_FORM_ACCESS_CONDITION_START_DATE_LAYOUT);
const endDate = new DynamicDatePickerModel(endDateConfig, BITSTREAM_FORM_ACCESS_CONDITION_END_DATE_LAYOUT); const endDate = new DynamicDatePickerModel(endDateConfig, BITSTREAM_FORM_ACCESS_CONDITION_END_DATE_LAYOUT);
const accessConditionGroupConfig = Object.assign({}, BITSTREAM_ACCESS_CONDITION_GROUP_CONFIG); const accessConditionGroupConfig = Object.assign({}, BITSTREAM_ACCESS_CONDITION_GROUP_CONFIG);
accessConditionGroupConfig.group = [type]; accessConditionGroupConfig.group = [type];
if (hasStart.length > 0) { accessConditionGroupConfig.group.push(startDate); } if (hasStartDate) {
if (hasEnd.length > 0) { accessConditionGroupConfig.group.push(endDate); } accessConditionGroupConfig.group.push(startDate);
}
if (hasEndDate) {
accessConditionGroupConfig.group.push(endDate);
}
return [new DynamicFormGroupModel(accessConditionGroupConfig, BITSTREAM_ACCESS_CONDITION_GROUP_LAYOUT)]; return [new DynamicFormGroupModel(accessConditionGroupConfig, BITSTREAM_ACCESS_CONDITION_GROUP_LAYOUT)];
}; };

View File

@@ -50,7 +50,7 @@ import { ThemedSubmissionEditComponent } from './edit/themed-submission-edit.com
import { ThemedSubmissionSubmitComponent } from './submit/themed-submission-submit.component'; import { ThemedSubmissionSubmitComponent } from './submit/themed-submission-submit.component';
import { ThemedSubmissionImportExternalComponent } from './import-external/themed-submission-import-external.component'; import { ThemedSubmissionImportExternalComponent } from './import-external/themed-submission-import-external.component';
import { FormModule } from '../shared/form/form.module'; import { FormModule } from '../shared/form/form.module';
import { NgbCollapseModule, NgbModalModule, NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbAccordionModule, NgbCollapseModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap';
import { SubmissionSectionAccessesComponent } from './sections/accesses/section-accesses.component'; import { SubmissionSectionAccessesComponent } from './sections/accesses/section-accesses.component';
import { SubmissionAccessesConfigService } from '../core/config/submission-accesses-config.service'; import { SubmissionAccessesConfigService } from '../core/config/submission-accesses-config.service';
import { SectionAccessesService } from './sections/accesses/section-accesses.service'; import { SectionAccessesService } from './sections/accesses/section-accesses.service';
@@ -71,7 +71,6 @@ const ENTRY_COMPONENTS = [
SubmissionSectionLicenseComponent, SubmissionSectionLicenseComponent,
SubmissionSectionCcLicensesComponent, SubmissionSectionCcLicensesComponent,
SubmissionSectionAccessesComponent, SubmissionSectionAccessesComponent,
SubmissionSectionUploadFileEditComponent,
SubmissionSectionSherpaPoliciesComponent, SubmissionSectionSherpaPoliciesComponent,
]; ];