From 5d130156e8633ef8b661871bcd526703c82fd71b Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 22 Jun 2022 15:43:23 +0200 Subject: [PATCH 1/4] [CST-6174] Fix issue with bitstream access condition edit form when maxStartDate/maxEndDate are missing --- .../section-upload-file-edit.component.ts | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts index 3a43e718a0..293835c848 100644 --- a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts +++ b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts @@ -15,7 +15,9 @@ import { OR_OPERATOR } from '@ng-dynamic-forms/core'; -import { WorkspaceitemSectionUploadFileObject } from '../../../../../core/submission/models/workspaceitem-section-upload-file.model'; +import { + WorkspaceitemSectionUploadFileObject +} from '../../../../../core/submission/models/workspaceitem-section-upload-file.model'; import { FormBuilderService } from '../../../../../shared/form/builder/form-builder.service'; import { BITSTREAM_ACCESS_CONDITION_GROUP_CONFIG, @@ -43,10 +45,16 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { filter, mergeMap, take } from 'rxjs/operators'; import { dateToISOFormat } from '../../../../../shared/date.util'; import { SubmissionObject } from '../../../../../core/submission/models/submission-object.model'; -import { WorkspaceitemSectionUploadObject } from '../../../../../core/submission/models/workspaceitem-section-upload.model'; +import { + WorkspaceitemSectionUploadObject +} from '../../../../../core/submission/models/workspaceitem-section-upload.model'; import { JsonPatchOperationsBuilder } from '../../../../../core/json-patch/builder/json-patch-operations-builder'; -import { SubmissionJsonPatchOperationsService } from '../../../../../core/submission/submission-json-patch-operations.service'; -import { JsonPatchOperationPathCombiner } from '../../../../../core/json-patch/builder/json-patch-operation-path-combiner'; +import { + SubmissionJsonPatchOperationsService +} from '../../../../../core/submission/submission-json-patch-operations.service'; +import { + JsonPatchOperationPathCombiner +} from '../../../../../core/json-patch/builder/json-patch-operation-path-combiner'; import { SectionUploadService } from '../../section-upload.service'; import { Subscription } from 'rxjs'; @@ -251,7 +259,7 @@ export class SubmissionSectionUploadFileEditComponent implements OnInit { endDateControl?.setValue(null); if (showGroups) { - if (accessCondition.hasStartDate) { + if (accessCondition.hasStartDate && accessCondition.maxStartDate) { const startDateModel = this.formBuilderService.findById( 'startDate', (model.parent as DynamicFormArrayGroupModel).group) as DynamicDateControlModel; @@ -263,7 +271,7 @@ export class SubmissionSectionUploadFileEditComponent implements OnInit { day: min.getUTCDate() }; } - if (accessCondition.hasEndDate) { + if (accessCondition.hasEndDate && accessCondition.maxEndDate) { const endDateModel = this.formBuilderService.findById( 'endDate', (model.parent as DynamicFormArrayGroupModel).group) as DynamicDateControlModel; @@ -274,6 +282,7 @@ export class SubmissionSectionUploadFileEditComponent implements OnInit { month: max.getUTCMonth() + 1, day: max.getUTCDate() }; + } } } From 8c14822eefe119b093e4034fd6b51d35ae2899eb Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 22 Jun 2022 15:46:30 +0200 Subject: [PATCH 2/4] [CST-6174] Fix issue with item access condition which doesn't consider the maxStartDate/maxEndDate --- .../accesses/section-accesses.component.ts | 67 +++++++++++++------ 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/src/app/submission/sections/accesses/section-accesses.component.ts b/src/app/submission/sections/accesses/section-accesses.component.ts index 40863e7ef9..c59f9af2d0 100644 --- a/src/app/submission/sections/accesses/section-accesses.component.ts +++ b/src/app/submission/sections/accesses/section-accesses.component.ts @@ -41,7 +41,9 @@ import { FORM_ACCESS_CONDITION_TYPE_LAYOUT } from './section-accesses.model'; import { hasValue, isNotEmpty, isNotNull } from '../../../shared/empty.util'; -import { WorkspaceitemSectionAccessesObject } from '../../../core/submission/models/workspaceitem-section-accesses.model'; +import { + WorkspaceitemSectionAccessesObject +} from '../../../core/submission/models/workspaceitem-section-accesses.model'; import { SubmissionAccessesConfigService } from '../../../core/config/submission-accesses-config.service'; import { getFirstSucceededRemoteData } from '../../../core/shared/operators'; import { FormComponent } from '../../../shared/form/form.component'; @@ -50,8 +52,12 @@ import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder import { SectionFormOperationsService } from '../form/section-form-operations.service'; import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; import { AccessesConditionOption } from '../../../core/config/models/config-accesses-conditions-options.model'; -import { SubmissionJsonPatchOperationsService } from '../../../core/submission/submission-json-patch-operations.service'; +import { + SubmissionJsonPatchOperationsService +} from '../../../core/submission/submission-json-patch-operations.service'; import { dateToISOFormat } from '../../../shared/date.util'; +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 a section for managing item's access conditions. @@ -322,40 +328,61 @@ export class SubmissionSectionAccessesComponent extends SectionModelComponent { } accessConditionTypeModelConfig.options = accessConditionTypeOptions; - // Dynamically assign of relation in config. For startdate, endDate, groups. - const hasStart = []; - const hasEnd = []; - const hasGroups = []; + // Dynamically assign of relation in config. For startDate and endDate. + const startDateCondition: DynamicFormControlCondition[] = []; + const endDateCondition: DynamicFormControlCondition[] = []; + let maxStartDate: DynamicDateControlValue; + let maxEndDate: DynamicDateControlValue; this.availableAccessConditionOptions.forEach((condition) => { - const showStart: boolean = condition.hasStartDate === true; - const showEnd: boolean = condition.hasEndDate === true; - const showGroups: boolean = showStart || showEnd; - if (showStart) { - hasStart.push({ id: 'name', value: condition.name }); + + if (condition.hasStartDate) { + startDateCondition.push({ id: 'name', value: condition.name }); + if (condition.maxStartDate) { + const min = new Date(condition.maxStartDate); + maxStartDate = { + year: min.getUTCFullYear(), + month: min.getUTCMonth() + 1, + day: min.getUTCDate() + }; + } } - if (showEnd) { - hasEnd.push({ id: 'name', value: condition.name }); - } - if (showGroups) { - hasGroups.push({ id: 'name', value: condition.name }); + if (condition.hasEndDate) { + endDateCondition.push({ id: 'name', value: condition.name }); + if (condition.maxEndDate) { + const max = new Date(condition.maxEndDate); + maxEndDate = { + year: max.getUTCFullYear(), + month: max.getUTCMonth() + 1, + day: max.getUTCDate() + }; + } } }); - const confStart = { relations: [{ match: MATCH_ENABLED, operator: OR_OPERATOR, when: hasStart }] }; - const confEnd = { relations: [{ match: MATCH_ENABLED, operator: OR_OPERATOR, when: hasEnd }] }; + const confStart = { relations: [{ match: MATCH_ENABLED, operator: OR_OPERATOR, when: startDateCondition }] }; + const confEnd = { relations: [{ match: MATCH_ENABLED, operator: OR_OPERATOR, when: endDateCondition }] }; + const hasStartDate = startDateCondition.length > 0; + const hasEndDate = endDateCondition.length > 0; accessConditionsArrayConfig.groupFactory = () => { const type = new DynamicSelectModel(accessConditionTypeModelConfig, FORM_ACCESS_CONDITION_TYPE_LAYOUT); const startDateConfig = Object.assign({}, FORM_ACCESS_CONDITION_START_DATE_CONFIG, confStart); + if (maxStartDate) { + startDateConfig.max = maxStartDate; + } + const endDateConfig = Object.assign({}, FORM_ACCESS_CONDITION_END_DATE_CONFIG, confEnd); + if (maxEndDate) { + endDateConfig.max = maxEndDate; + } const startDate = new DynamicDatePickerModel(startDateConfig, FORM_ACCESS_CONDITION_START_DATE_LAYOUT); const endDate = new DynamicDatePickerModel(endDateConfig, FORM_ACCESS_CONDITION_END_DATE_LAYOUT); const accessConditionGroupConfig = Object.assign({}, ACCESS_CONDITION_GROUP_CONFIG); accessConditionGroupConfig.group = [type]; - if (hasStart.length > 0) { + if (hasStartDate) { accessConditionGroupConfig.group.push(startDate); } - if (hasEnd.length > 0) { + if (hasEndDate) { accessConditionGroupConfig.group.push(endDate); } return [new DynamicFormGroupModel(accessConditionGroupConfig, ACCESS_CONDITION_GROUP_LAYOUT)]; From 2a20b0c989e2c09750a2457480bf202c2a05e36e Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 23 Jun 2022 12:04:33 +0200 Subject: [PATCH 3/4] [CST-6174] Add test to check maxStartDate and maxEndDate --- .../section-accesses.component.spec.ts | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/app/submission/sections/accesses/section-accesses.component.spec.ts b/src/app/submission/sections/accesses/section-accesses.component.spec.ts index 5509cab4bb..65123db533 100644 --- a/src/app/submission/sections/accesses/section-accesses.component.spec.ts +++ b/src/app/submission/sections/accesses/section-accesses.component.spec.ts @@ -16,11 +16,15 @@ import { SectionAccessesService } from './section-accesses.service'; import { SectionFormOperationsService } from '../form/section-form-operations.service'; import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { SubmissionJsonPatchOperationsService } from '../../../core/submission/submission-json-patch-operations.service'; +import { + SubmissionJsonPatchOperationsService +} from '../../../core/submission/submission-json-patch-operations.service'; import { getSectionAccessesService } from '../../../shared/mocks/section-accesses.service.mock'; import { getMockFormOperationsService } from '../../../shared/mocks/form-operations-service.mock'; import { getMockTranslateService } from '../../../shared/mocks/translate.service.mock'; -import { SubmissionJsonPatchOperationsServiceStub } from '../../../shared/testing/submission-json-patch-operations-service.stub'; +import { + SubmissionJsonPatchOperationsServiceStub +} from '../../../shared/testing/submission-json-patch-operations-service.stub'; import { BrowserModule } from '@angular/platform-browser'; import { of as observableOf } from 'rxjs'; @@ -42,8 +46,6 @@ describe('SubmissionSectionAccessesComponent', () => { let fixture: ComponentFixture; const sectionsServiceStub = new SectionsServiceStub(); - // const pathCombiner = new JsonPatchOperationPathCombiner('sections', sectionId, 'files', fileIndex); - const builderService: FormBuilderService = getMockFormBuilderService(); const submissionAccessesConfigService = getSubmissionAccessesConfigService(); const sectionAccessesService = getSectionAccessesService(); @@ -55,6 +57,7 @@ describe('SubmissionSectionAccessesComponent', () => { }); let formService: any; + let formbuilderService: any; const storeStub = jasmine.createSpyObj('store', ['dispatch']); @@ -86,7 +89,6 @@ describe('SubmissionSectionAccessesComponent', () => { declarations: [SubmissionSectionAccessesComponent, FormComponent], providers: [ { provide: SectionsService, useValue: sectionsServiceStub }, - { provide: FormBuilderService, useValue: builderService }, { provide: SubmissionAccessesConfigService, useValue: submissionAccessesConfigService }, { provide: SectionAccessesService, useValue: sectionAccessesService }, { provide: SectionFormOperationsService, useValue: sectionFormOperationsService }, @@ -97,6 +99,7 @@ describe('SubmissionSectionAccessesComponent', () => { { provide: SubmissionJsonPatchOperationsService, useValue: SubmissionJsonPatchOperationsServiceStub }, { provide: 'sectionDataProvider', useValue: sectionData }, { provide: 'submissionIdProvider', useValue: '1508' }, + FormBuilderService ] }) .compileComponents(); @@ -106,6 +109,7 @@ describe('SubmissionSectionAccessesComponent', () => { fixture = TestBed.createComponent(SubmissionSectionAccessesComponent); component = fixture.componentInstance; formService = TestBed.inject(FormService); + formbuilderService = TestBed.inject(FormBuilderService); formService.validateAllFormFields.and.callFake(() => null); formService.isValid.and.returnValue(observableOf(true)); formService.getFormData.and.returnValue(observableOf(mockAccessesFormData)); @@ -133,11 +137,22 @@ describe('SubmissionSectionAccessesComponent', () => { it('formModel type array should have formgroup with 1 input and 2 datepickers', () => { const formModel: any = component.formModel[1]; const formGroup = formModel.groupFactory()[0].group; + expect(formGroup[0] instanceof DynamicSelectModel).toBeTrue(); expect(formGroup[1] instanceof DynamicDatePickerModel).toBeTrue(); expect(formGroup[2] instanceof DynamicDatePickerModel).toBeTrue(); }); + it('should have set maxStartDate and maxEndDate properly', () => { + const maxStartDate = {year: 2024, month: 12, day: 20}; + const maxEndDate = {year: 2022, month: 6, day: 20}; + + const startDateModel = formbuilderService.findById('startDate', component.formModel); + expect(startDateModel.max).toEqual(maxStartDate); + const endDateModel = formbuilderService.findById('endDate', component.formModel); + expect(endDateModel.max).toEqual(maxEndDate); + }); + it('when checkbox changed it should call operationsBuilder replace function', () => { component.onChange(checkboxChangeEvent); fixture.detectChanges(); From 0aa14bcddd460478f212c7428086314aa39c35ef Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 23 Jun 2022 12:24:16 +0200 Subject: [PATCH 4/4] [CST-6174] Set maxStartDate/maxEndDate when building form models --- ...section-upload-file-edit.component.spec.ts | 38 +++++--- .../section-upload-file-edit.component.ts | 95 +++++++++---------- src/app/submission/submission.module.ts | 3 +- 3 files changed, 71 insertions(+), 65 deletions(-) diff --git a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.spec.ts b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.spec.ts index aa03d37eb2..d008bf61f1 100644 --- a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.spec.ts +++ b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.spec.ts @@ -1,10 +1,9 @@ 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 { CommonModule } from '@angular/common'; import { TranslateModule } from '@ngx-translate/core'; import { - DynamicFormArrayGroupModel, DynamicFormArrayModel, DynamicFormControlEvent, DynamicFormGroupModel, @@ -17,13 +16,13 @@ import { SubmissionService } from '../../../../submission.service'; import { SubmissionSectionUploadFileEditComponent } from './section-upload-file-edit.component'; import { POLICY_DEFAULT_WITH_LIST } from '../../section-upload.component'; import { + mockFileFormData, mockSubmissionCollectionId, mockSubmissionId, + mockSubmissionObject, mockUploadConfigResponse, mockUploadConfigResponseMetadata, mockUploadFiles, - mockFileFormData, - mockSubmissionObject, } from '../../../../../shared/mocks/submission.mock'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 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 { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { JsonPatchOperationsBuilder } from '../../../../../core/json-patch/builder/json-patch-operations-builder'; -import { SubmissionJsonPatchOperationsServiceStub } from '../../../../../shared/testing/submission-json-patch-operations-service.stub'; -import { SubmissionJsonPatchOperationsService } from '../../../../../core/submission/submission-json-patch-operations.service'; +import { + 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 { getMockSectionUploadService } from '../../../../../shared/mocks/section-upload.service.mock'; -import { FormFieldMetadataValueObject } from '../../../../../shared/form/builder/models/form-field-metadata-value.model'; -import { JsonPatchOperationPathCombiner } from '../../../../../core/json-patch/builder/json-patch-operation-path-combiner'; +import { + 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 { of } from 'rxjs'; @@ -171,6 +178,8 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => { it('should init form model properly', () => { comp.fileData = fileData; comp.formId = 'testFileForm'; + const maxStartDate = {year: 2022, month: 1, day: 12}; + const maxEndDate = {year: 2019, month: 7, day: 12}; comp.ngOnInit(); @@ -179,6 +188,10 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => { expect(comp.formModel[0] instanceof DynamicFormGroupModel).toBeTruthy(); expect(comp.formModel[1] instanceof DynamicFormArrayModel).toBeTruthy(); 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', () => { @@ -208,20 +221,19 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => { const formGroup = formbuilderService.createFormGroup(comp.formModel); const control = formbuilderService.getFormControlById('name', formGroup, comp.formModel, 0); - spyOn(formbuilderService, 'findById').and.callThrough(); + spyOn(control.parent, 'markAsDirty').and.callThrough(); control.value = 'openaccess'; comp.setOptions(model, control); - expect(formbuilderService.findById).not.toHaveBeenCalledWith('endDate', (model.parent as DynamicFormArrayGroupModel).group); - expect(formbuilderService.findById).not.toHaveBeenCalledWith('startDate', (model.parent as DynamicFormArrayGroupModel).group); + expect(control.parent.markAsDirty).toHaveBeenCalled(); control.value = 'lease'; comp.setOptions(model, control); - expect(formbuilderService.findById).toHaveBeenCalledWith('endDate', (model.parent as DynamicFormArrayGroupModel).group); + expect(control.parent.markAsDirty).toHaveBeenCalled(); control.value = 'embargo'; 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', () => { diff --git a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts index 293835c848..195d291530 100644 --- a/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts +++ b/src/app/submission/sections/upload/file/edit/section-upload-file-edit.component.ts @@ -3,9 +3,7 @@ import { FormControl } from '@angular/forms'; import { DYNAMIC_FORM_CONTROL_TYPE_DATEPICKER, - DynamicDateControlModel, DynamicDatePickerModel, - DynamicFormArrayGroupModel, DynamicFormArrayModel, DynamicFormControlEvent, DynamicFormControlModel, @@ -57,6 +55,8 @@ import { } from '../../../../../core/json-patch/builder/json-patch-operation-path-combiner'; import { SectionUploadService } from '../../section-upload.service'; 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 @@ -245,8 +245,6 @@ export class SubmissionSectionUploadFileEditComponent implements OnInit { this.availableAccessConditionOptions.filter((element) => element.name === control.value) .forEach((element) => accessCondition = element ); if (isNotEmpty(accessCondition)) { - const showGroups: boolean = accessCondition.hasStartDate === true || accessCondition.hasEndDate === true; - const startDateControl: FormControl = control.parent.get('startDate') as FormControl; const endDateControl: FormControl = control.parent.get('endDate') as FormControl; @@ -257,34 +255,6 @@ export class SubmissionSectionUploadFileEditComponent implements OnInit { startDateControl?.setValue(null); control.parent.markAsDirty(); 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; - // Dynamically assign of relation in config. For startdate, endDate, groups. - const hasStart = []; - const hasEnd = []; - const hasGroups = []; + // Dynamically assign of relation in config. For startDate and endDate. + const startDateCondition: DynamicFormControlCondition[] = []; + const endDateCondition: DynamicFormControlCondition[] = []; + let maxStartDate: DynamicDateControlValue; + let maxEndDate: DynamicDateControlValue; this.availableAccessConditionOptions.forEach((condition) => { - const showStart: boolean = condition.hasStartDate === true; - const showEnd: boolean = condition.hasEndDate === true; - const showGroups: boolean = showStart || showEnd; - if (showStart) { - hasStart.push({id: 'name', value: condition.name}); + + if (condition.hasStartDate) { + startDateCondition.push({ id: 'name', value: condition.name }); + if (condition.maxStartDate) { + const min = new Date(condition.maxStartDate); + maxStartDate = { + year: min.getUTCFullYear(), + month: min.getUTCMonth() + 1, + day: min.getUTCDate() + }; + } } - if (showEnd) { - hasEnd.push({id: 'name', value: condition.name}); - } - if (showGroups) { - hasGroups.push({id: 'name', value: condition.name}); + if (condition.hasEndDate) { + endDateCondition.push({ id: 'name', value: condition.name }); + if (condition.maxEndDate) { + const max = new Date(condition.maxEndDate); + maxEndDate = { + year: max.getUTCFullYear(), + month: max.getUTCMonth() + 1, + day: max.getUTCDate() + }; + } } }); - const confStart = {relations: [{match: MATCH_ENABLED, operator: OR_OPERATOR, when: hasStart}]}; - const confEnd = {relations: [{match: MATCH_ENABLED, operator: OR_OPERATOR, when: hasEnd}]}; + const confStart = { relations: [{ match: MATCH_ENABLED, operator: OR_OPERATOR, when: startDateCondition }] }; + const confEnd = { relations: [{ match: MATCH_ENABLED, operator: OR_OPERATOR, when: endDateCondition }] }; + const hasStartDate = startDateCondition.length > 0; + const hasEndDate = endDateCondition.length > 0; accessConditionsArrayConfig.groupFactory = () => { const type = new DynamicSelectModel(accessConditionTypeModelConfig, BITSTREAM_FORM_ACCESS_CONDITION_TYPE_LAYOUT); 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); + if (maxEndDate) { + endDateConfig.max = maxEndDate; + } 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 accessConditionGroupConfig = Object.assign({}, BITSTREAM_ACCESS_CONDITION_GROUP_CONFIG); accessConditionGroupConfig.group = [type]; - if (hasStart.length > 0) { accessConditionGroupConfig.group.push(startDate); } - if (hasEnd.length > 0) { accessConditionGroupConfig.group.push(endDate); } + if (hasStartDate) { + accessConditionGroupConfig.group.push(startDate); + } + if (hasEndDate) { + accessConditionGroupConfig.group.push(endDate); + } return [new DynamicFormGroupModel(accessConditionGroupConfig, BITSTREAM_ACCESS_CONDITION_GROUP_LAYOUT)]; }; diff --git a/src/app/submission/submission.module.ts b/src/app/submission/submission.module.ts index eb6bde35ad..97ffb7ffcd 100644 --- a/src/app/submission/submission.module.ts +++ b/src/app/submission/submission.module.ts @@ -50,7 +50,7 @@ import { ThemedSubmissionEditComponent } from './edit/themed-submission-edit.com import { ThemedSubmissionSubmitComponent } from './submit/themed-submission-submit.component'; import { ThemedSubmissionImportExternalComponent } from './import-external/themed-submission-import-external.component'; 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 { SubmissionAccessesConfigService } from '../core/config/submission-accesses-config.service'; import { SectionAccessesService } from './sections/accesses/section-accesses.service'; @@ -71,7 +71,6 @@ const ENTRY_COMPONENTS = [ SubmissionSectionLicenseComponent, SubmissionSectionCcLicensesComponent, SubmissionSectionAccessesComponent, - SubmissionSectionUploadFileEditComponent, SubmissionSectionSherpaPoliciesComponent, ];