From 4a9357b6cff12806b7cc4131ff21c72a9d3ebeb5 Mon Sep 17 00:00:00 2001 From: Denys Vuika Date: Wed, 14 Sep 2016 12:37:31 +0100 Subject: [PATCH] #726 min/max value validators, validation improvements --- .../widgets/core/form-field-validator.ts | 102 +++++++++++++++--- .../widgets/core/form-field.model.ts | 10 +- .../widgets/number/number.widget.css | 17 +++ .../widgets/number/number.widget.html | 6 +- 4 files changed, 114 insertions(+), 21 deletions(-) diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/core/form-field-validator.ts b/ng2-components/ng2-activiti-form/src/components/widgets/core/form-field-validator.ts index 99dcffb218..c1b45953f7 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/core/form-field-validator.ts +++ b/ng2-components/ng2-activiti-form/src/components/widgets/core/form-field-validator.ts @@ -35,8 +35,8 @@ export class RequiredFieldValidator implements FormFieldValidator { isSupported(field: FormFieldModel): boolean { return field && - field.required && - this.supportedTypes.indexOf(field.type) > -1; + this.supportedTypes.indexOf(field.type) > -1 && + field.required; } validate(field: FormFieldModel): boolean { @@ -56,7 +56,13 @@ export class NumberFieldValidator implements FormFieldValidator { FormFieldTypes.NUMBER ]; - private pattern: string = '-?[0-9]*(\.[0-9]+)?'; + static isNumber(value: any): boolean { + if (value === null || value === undefined || value === '') { + return false; + } + + return !isNaN(+value); + } isSupported(field: FormFieldModel): boolean { return field && this.supportedTypes.indexOf(field.type) > -1; @@ -64,11 +70,17 @@ export class NumberFieldValidator implements FormFieldValidator { validate(field: FormFieldModel): boolean { if (this.isSupported(field)) { - return !(this.pattern && field.value && (field.value.length > 0) && !field.value.match(new RegExp('^' + this.pattern + '$'))); + if (field.value === null || + field.value === undefined || + field.value === '' || + NumberFieldValidator.isNumber(field.value)) { + return true; + } + field.validationSummary = 'Input must be a number'; + return false; } return true; } - } export class MinLengthFieldValidator implements FormFieldValidator { @@ -80,17 +92,17 @@ export class MinLengthFieldValidator implements FormFieldValidator { isSupported(field: FormFieldModel): boolean { return field && - field.minLength > 0 && - this.supportedTypes.indexOf(field.type) > -1; + this.supportedTypes.indexOf(field.type) > -1 && + field.minLength > 0; } validate(field: FormFieldModel): boolean { if (this.isSupported(field) && field.value) { - let result = field.value.length >= field.minLength; - if (!result) { - field.validationSummary = `Should be at least ${field.minLength} characters long.`; + if (field.value.length >= field.minLength) { + return true; } - return result; + field.validationSummary = `Should be at least ${field.minLength} characters long.`; + return false; } return true; } @@ -105,18 +117,74 @@ export class MaxLengthFieldValidator implements FormFieldValidator { isSupported(field: FormFieldModel): boolean { return field && - field.maxLength > 0 && - this.supportedTypes.indexOf(field.type) > -1; + this.supportedTypes.indexOf(field.type) > -1 && + field.maxLength > 0; } validate(field: FormFieldModel): boolean { if (this.isSupported(field) && field.value) { - let result = field.value.length <= field.maxLength; - if (!result) { - field.validationSummary = `Should be ${field.maxLength} characters maximum.`; + if (field.value.length <= field.maxLength) { + return true; } - return result; + field.validationSummary = `Should be ${field.maxLength} characters maximum.`; + return false; } return true; } } + +export class MinValueFieldValidator implements FormFieldValidator { + + private supportedTypes = [ + FormFieldTypes.NUMBER + ]; + + isSupported(field: FormFieldModel): boolean { + return field && + this.supportedTypes.indexOf(field.type) > -1 && + NumberFieldValidator.isNumber(field.minValue); + } + + validate(field: FormFieldModel): boolean { + if (this.isSupported(field) && field.value) { + let value: number = +field.value; + let minValue: number = +field.minValue; + + if (value >= minValue) { + return true; + } + field.validationSummary = `Should not be less than ${field.minValue}`; + return false; + } + + return true; + } +} + +export class MaxValueFieldValidator implements FormFieldValidator { + + private supportedTypes = [ + FormFieldTypes.NUMBER + ]; + + isSupported(field: FormFieldModel): boolean { + return field && + this.supportedTypes.indexOf(field.type) > -1 && + NumberFieldValidator.isNumber(field.maxValue); + } + + validate(field: FormFieldModel): boolean { + if (this.isSupported(field) && field.value) { + let value: number = +field.value; + let maxValue: number = +field.maxValue; + + if (value <= maxValue) { + return true; + } + field.validationSummary = `Should not be greater than ${field.maxValue}`; + return false; + } + + return true; + } +} diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/core/form-field.model.ts b/ng2-components/ng2-activiti-form/src/components/widgets/core/form-field.model.ts index 1260454722..10185c7894 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/core/form-field.model.ts +++ b/ng2-components/ng2-activiti-form/src/components/widgets/core/form-field.model.ts @@ -26,7 +26,9 @@ import { RequiredFieldValidator, NumberFieldValidator, MinLengthFieldValidator, - MaxLengthFieldValidator + MaxLengthFieldValidator, + MinValueFieldValidator, + MaxValueFieldValidator } from './form-field-validator'; @@ -88,6 +90,8 @@ export class FormFieldModel extends FormWidgetModel { } validate(): boolean { + this.validationSummary = null; + // TODO: consider doing that on value setter and caching result if (this.validators && this.validators.length > 0) { for (let i = 0; i < this.validators.length; i++) { @@ -141,7 +145,9 @@ export class FormFieldModel extends FormWidgetModel { new RequiredFieldValidator(), new NumberFieldValidator(), new MinLengthFieldValidator(), - new MaxLengthFieldValidator() + new MaxLengthFieldValidator(), + new MinValueFieldValidator(), + new MaxValueFieldValidator() ]; } diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/number/number.widget.css b/ng2-components/ng2-activiti-form/src/components/widgets/number/number.widget.css index 6249c666e8..798e231ed5 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/number/number.widget.css +++ b/ng2-components/ng2-activiti-form/src/components/widgets/number/number.widget.css @@ -1,3 +1,20 @@ .number-widget { width: 100%; } + +.number-widget__invalid .mdl-textfield__input { + border-color: #d50000; +} + +.number-widget__invalid .mdl-textfield__label { + color: #d50000; +} + +.number-widget__invalid .mdl-textfield__label:after { + background-color: #d50000; +} + +.number-widget__invalid .mdl-textfield__error { + visibility: visible !important; +} + diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/number/number.widget.html b/ng2-components/ng2-activiti-form/src/components/widgets/number/number.widget.html index 147c0b72bf..b5b880f7d1 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/number/number.widget.html +++ b/ng2-components/ng2-activiti-form/src/components/widgets/number/number.widget.html @@ -1,4 +1,5 @@ -
+
- Input is not a number! + + {{field.validationSummary}}