diff --git a/lib/core/form/components/widgets/core/form-field.model.ts b/lib/core/form/components/widgets/core/form-field.model.ts index befdaad0f4..d2c1396584 100644 --- a/lib/core/form/components/widgets/core/form-field.model.ts +++ b/lib/core/form/components/widgets/core/form-field.model.ts @@ -54,6 +54,9 @@ export class FormFieldModel extends FormWidgetModel { maxLength: number = 0; minValue: string; maxValue: string; + maxDateRangeValue: number = 0; + minDateRangeValue: number = 0; + dynamicDateRangeSelection: boolean; regexPattern: string; options: FormFieldOption[] = []; restUrl: string; @@ -167,6 +170,9 @@ export class FormFieldModel extends FormWidgetModel { this.maxLength = json.maxLength || 0; this.minValue = json.minValue; this.maxValue = json.maxValue; + this.minDateRangeValue = json.minDateRangeValue; + this.maxDateRangeValue = json.maxDateRangeValue; + this.dynamicDateRangeSelection = json.dynamicDateRangeSelection; this.regexPattern = json.regexPattern; this.options = json.options || []; this.hasEmptyValue = json.hasEmptyValue; diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/date/date-cloud.widget.spec.ts b/lib/process-services-cloud/src/lib/form/components/widgets/date/date-cloud.widget.spec.ts index 4a670ca92e..6679aa8a86 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/date/date-cloud.widget.spec.ts +++ b/lib/process-services-cloud/src/lib/form/components/widgets/date/date-cloud.widget.spec.ts @@ -302,4 +302,72 @@ describe('DateWidgetComponent', () => { }); }); + describe('Set dynamic dates', () => { + it('should min date equal to the today date minus minimum date range value', async () => { + widget.field = new FormFieldModel(null, { + dynamicDateRangeSelection: true, + minDateRangeValue: 4 + }); + + fixture.detectChanges(); + await fixture.whenStable(); + + const todayDate = moment().format(DATE_FORMAT_CLOUD); + const expected = moment(todayDate).subtract(widget.field.minDateRangeValue, 'days'); + expect(widget.minDate).toEqual(expected); + }); + + it('should min date and max date be undefined if dynamic min and max date are not set', async () => { + widget.field = new FormFieldModel(null, { + dynamicDateRangeSelection: true + }); + + fixture.detectChanges(); + await fixture.whenStable(); + + expect(widget.minDate).toBeUndefined(); + expect(widget.maxDate).toBeUndefined(); + }); + + it('should max date be undefined if only minimum date range value is set', async () => { + widget.field = new FormFieldModel(null, { + dynamicDateRangeSelection: true, + minDateRangeValue: 4 + }); + + fixture.detectChanges(); + await fixture.whenStable(); + + expect(widget.maxDate).toBeUndefined(); + }); + + it('should min date be undefined if only maximum date range value is set', async () => { + widget.field = new FormFieldModel(null, { + dynamicDateRangeSelection: true, + maxDateRangeValue: 4 + }); + + fixture.detectChanges(); + await fixture.whenStable(); + + expect(widget.minDate).toBeUndefined(); + }); + + it('should max date equal to the today date plus maximum date range value', async () => { + widget.field = new FormFieldModel(null, { + dynamicDateRangeSelection: true, + maxDateRangeValue: 5 + }); + + fixture.detectChanges(); + await fixture.whenStable(); + + const todayDate = moment().format(DATE_FORMAT_CLOUD); + const expected = moment(todayDate).add(widget.field.maxDateRangeValue, 'days'); + expect(widget.maxDate).toEqual(expected); + }); + + }); + + }); diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/date/date-cloud.widget.ts b/lib/process-services-cloud/src/lib/form/components/widgets/date/date-cloud.widget.ts index c0d3acea79..465678b246 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/date/date-cloud.widget.ts +++ b/lib/process-services-cloud/src/lib/form/components/widgets/date/date-cloud.widget.ts @@ -74,12 +74,22 @@ export class DateCloudWidgetComponent extends WidgetComponent implements OnInit, momentDateAdapter.overrideDisplayFormat = this.field.dateDisplayFormat; if (this.field) { - if (this.field.minValue) { - this.minDate = moment(this.field.minValue, DATE_FORMAT_CLOUD); - } + if (this.field.dynamicDateRangeSelection) { + const today = moment().format(DATE_FORMAT_CLOUD); + if (!isNaN(this.field.minDateRangeValue)) { + this.minDate = moment(today).subtract(this.field.minDateRangeValue, 'days'); + } + if (!isNaN(this.field.maxDateRangeValue)) { + this.maxDate = moment(today).add(this.field.maxDateRangeValue, 'days'); + } + } else { + if (this.field.minValue) { + this.minDate = moment(this.field.minValue, DATE_FORMAT_CLOUD); + } - if (this.field.maxValue) { - this.maxDate = moment(this.field.maxValue, DATE_FORMAT_CLOUD); + if (this.field.maxValue) { + this.maxDate = moment(this.field.maxValue, DATE_FORMAT_CLOUD); + } } } }