diff --git a/lib/core/form/components/widgets/core/form-field-validator.spec.ts b/lib/core/form/components/widgets/core/form-field-validator.spec.ts index 3fa6815a43..576aa78ea4 100644 --- a/lib/core/form/components/widgets/core/form-field-validator.spec.ts +++ b/lib/core/form/components/widgets/core/form-field-validator.spec.ts @@ -30,7 +30,8 @@ import { MaxDateTimeFieldValidator, MinDateTimeFieldValidator, MaxDateFieldValidator, - MinDateFieldValidator + MinDateFieldValidator, + DateTimeFieldValidator } from './form-field-validator'; import { FormFieldModel } from './form-field.model'; import { FormModel } from './form.model'; @@ -1047,4 +1048,31 @@ describe('FormFieldValidator', () => { expect(field.validationSummary).not.toBeNull(); }); }); + + describe('DateTimeFieldValidator', () => { + + let validator: DateTimeFieldValidator; + + beforeEach(() => { + validator = new DateTimeFieldValidator(); + }); + + it('should validate dateTime format with dateDisplayFormat', () => { + const field = new FormFieldModel(new FormModel(), { + type: FormFieldTypes.DATETIME, + value: '2021-06-09 14:10', + dateDisplayFormay: 'YYYY-MM-DD HH:mm' + }); + + expect(validator.validate(field)).toBeTruthy(); + }); + + it('should validate dateTime format with default format', () => { + const field = new FormFieldModel(new FormModel(), { + type: FormFieldTypes.DATETIME, + value: '2021-06-09 14:10', + }); + expect(validator.validate(field)).toBeTruthy(); + }); + }); }); diff --git a/lib/core/form/components/widgets/core/form-field-validator.ts b/lib/core/form/components/widgets/core/form-field-validator.ts index fe629af6d6..558dc4f020 100644 --- a/lib/core/form/components/widgets/core/form-field-validator.ts +++ b/lib/core/form/components/widgets/core/form-field-validator.ts @@ -165,6 +165,38 @@ export class DateFieldValidator implements FormFieldValidator { } } +export class DateTimeFieldValidator implements FormFieldValidator { + + private supportedTypes = [ + FormFieldTypes.DATETIME + ]; + + // Validates that the input string is a valid date formatted as (default D-M-YYYY) + static isValidDate(inputDate: string, dateFormat: string = 'YYYY-MM-DD HH:mm'): boolean { + if (inputDate) { + const d = moment(inputDate, dateFormat, true); + return d.isValid(); + } + + return false; + } + + isSupported(field: FormFieldModel): boolean { + return field && this.supportedTypes.indexOf(field.type) > -1; + } + + validate(field: FormFieldModel): boolean { + if (this.isSupported(field) && field.value && field.isVisible) { + if (DateFieldValidator.isValidDate(field.value, field.dateDisplayFormat)) { + return true; + } + field.validationSummary.message = field.dateDisplayFormat; + return false; + } + return true; + } +} + export abstract class BoundaryDateFieldValidator implements FormFieldValidator { DATE_FORMAT_CLOUD = 'YYYY-MM-DD'; @@ -539,6 +571,7 @@ export const FORM_FIELD_VALIDATORS = [ new MaxValueFieldValidator(), new RegExFieldValidator(), new DateFieldValidator(), + new DateTimeFieldValidator(), new MinDateFieldValidator(), new MaxDateFieldValidator(), new FixedValueFieldValidator(),