From 8b42fd254a0f931f45fca5ab2fa999cf6b117050 Mon Sep 17 00:00:00 2001 From: christianalfoni Date: Mon, 13 Apr 2015 19:15:10 +0200 Subject: [PATCH] Added string returns error for rules --- release/formsy-react.js | 78 ++++++++++++++++++++++++++++++++++-- release/formsy-react.min.js | 2 +- src/main.js | 80 ++++++++++++++++++++++++++++++++++--- 3 files changed, 150 insertions(+), 10 deletions(-) diff --git a/release/formsy-react.js b/release/formsy-react.js index c165736..495991d 100644 --- a/release/formsy-react.js +++ b/release/formsy-react.js @@ -275,6 +275,10 @@ Formsy.Form = React.createClass({displayName: "Form", return ''; } + if (validationResults.errors.length) { + return validationResults.errors[0]; + } + if (this.props.validationErrors && this.props.validationErrors[component.props.name]) { return this.props.validationErrors[component.props.name]; } @@ -295,6 +299,7 @@ Formsy.Form = React.createClass({displayName: "Form", runRules: function (value, currentValues, validations) { var results = { + errors: [], failed: [], success: [] }; @@ -309,10 +314,28 @@ Formsy.Form = React.createClass({displayName: "Form", throw new Error('Formsy does not have the validation rule: ' + validationMethod); } - if (typeof validations[validationMethod] === 'function' && !validations[validationMethod](currentValues, value)) { - return results.failed.push(validationMethod); - } else if (typeof validations[validationMethod] !== 'function' && !validationRules[validationMethod](currentValues, value, validations[validationMethod])) { - return results.failed.push(validationMethod); + if (typeof validations[validationMethod] === 'function') { + var validation = validations[validationMethod](currentValues, value); + if (typeof validation === 'string') { + results.errors.push(validation); + results.failed.push(validationMethod); + } else if (!validation) { + results.failed.push(validationMethod); + } + return; + + } else if (typeof validations[validationMethod] !== 'function') { + var validation = validationRules[validationMethod](currentValues, value, validations[validationMethod]); + if (typeof validation === 'string') { + results.errors.push(validation); + results.failed.push(validationMethod); + } else if (!validation) { + results.failed.push(validationMethod); + } else { + results.success.push(validationMethod); + } + return; + } return results.success.push(validationMethod); @@ -324,6 +347,53 @@ Formsy.Form = React.createClass({displayName: "Form", }, +/* + + var results = { + errors: [], + failed: [], + success: [] + }; + if (Object.keys(validations).length) { + Object.keys(validations).forEach(function (validationMethod) { + + if (validationRules[validationMethod] && typeof validations[validationMethod] === 'function') { + throw new Error('Formsy does not allow you to override default validations: ' + validationMethod); + } + + if (!validationRules[validationMethod] && typeof validations[validationMethod] !== 'function') { + throw new Error('Formsy does not have the validation rule: ' + validationMethod); + } + + if (typeof validations[validationMethod] === 'function') { + var validation = validations[validationMethod](currentValues, value); + if (typeof validation === 'string') { + results.errors.push(validation); + results.failed.push(validationMethod); + } else if (!validation) { + results.failed.push(validationMethod); + } + return; + + } else if (typeof validations[validationMethod] !== 'function') { + var validation = validationRules[validationMethod](currentValues, value, validations[validationMethod]); + if (typeof validation === 'string') { + results.errors.push(validation); + results.failed.push(validationMethod); + } else if (!validation) { + results.failed.push(validationMethod); + } + return; + + } + + return results.success.push(validationMethod); + + }); + } + + return results; +*/ // Validate the form by going through all child input components // and check their state validateForm: function () { diff --git a/release/formsy-react.min.js b/release/formsy-react.min.js index e49db8d..6fd74c2 100644 --- a/release/formsy-react.min.js +++ b/release/formsy-react.min.js @@ -1 +1 @@ -!function t(i,s,n){function e(o,u){if(!s[o]){if(!i[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(r)return r(o,!0);var h=new Error("Cannot find module '"+o+"'");throw h.code="MODULE_NOT_FOUND",h}var d=s[o]={exports:{}};i[o][0].call(d.exports,function(t){var s=i[o][1][t];return e(s?s:t)},d,d.exports,t,i,s,n)}return s[o].exports}for(var r="function"==typeof require&&require,o=0;o1)throw new Error("Formsy does not support multiple args on string validations. Use object format of validations instead.");return t[n]=s[0]||!0,t},{}):t||{}};i.exports={getInitialState:function(){return{_value:this.props.value,_isRequired:!1,_isValid:!0,_isPristine:!0,_pristineValue:this.props.value,_validationError:""}},getDefaultProps:function(){return{validationError:"",validationErrors:{}}},componentWillMount:function(){var t=function(){this.setValidations(this.props.validations,this.props.required),this.props._attachToForm(this)}.bind(this);if(!this.props.name)throw new Error("Form Input requires a name property when used");return this.props._attachToForm?(t(),void 0):setTimeout(function(){if(this.isMounted()){if(!this.props._attachToForm)throw new Error("Form Mixin requires component to be nested in a Form");t()}}.bind(this),0)},componentWillReceiveProps:function(t){t._attachToForm=this.props._attachToForm,t._detachFromForm=this.props._detachFromForm,t._validate=this.props._validate,t._isValidValue=this.props._isValidValue,t._isFormDisabled=this.props._isFormDisabled,this.setValidations(t.validations,t.required)},componentDidUpdate:function(t){var i=function(){return this.props.value!==t.value&&this.state._value===t.value}.bind(this);(t.validations!==this.props.validations||i())&&this.setValue(this.props.value)},componentWillUnmount:function(){this.props._detachFromForm(this)},setValidations:function(t,i){this._validations=s(t)||{},this._requiredValidations=i===!0?{isDefaultRequiredValue:!0}:s(i)},setValue:function(t){this.setState({_value:t,_isPristine:!1},function(){this.props._validate(this)}.bind(this))},resetValue:function(){this.setState({_value:this.state._pristineValue,_isPristine:!0},function(){this.props._validate(this)})},getValue:function(){return this.state._value},hasValue:function(){return""!==this.state._value},getErrorMessage:function(){return!this.isValid()||this.showRequired()?this.state._validationError:null},isFormDisabled:function(){return this.props._isFormDisabled()},isValid:function(){return this.state._isValid},isPristine:function(){return this.state._isPristine},isRequired:function(){return this.state._isRequired},showRequired:function(){return this.isRequired()},showError:function(){return!this.showRequired()&&!this.isValid()},isValidValue:function(t){return this.props._isValidValue.call(null,this,t)}}},{}],3:[function(t,i){i.exports={arraysDiffer:function(t,i){var s=!1;return t.length!==i.length?s=!0:t.forEach(function(t,n){t!==i[n]&&(s=!0)}),s}}},{}],4:[function(t,i){i.exports={isDefaultRequiredValue:function(t,i){return void 0===i||""===i},hasValue:function(t,i){return void 0!==i},matchRegexp:function(t,i,s){return void 0!==i&&!!i.match(s)},isUndefined:function(t,i){return void 0===i},isEmptyString:function(t,i){return""===i},isEmail:function(t,i){return void 0!==i&&i.match(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i)},isTrue:function(t,i){return i===!0},isFalse:function(t,i){return i===!1},isNumeric:function(t,i){if("number"==typeof i)return!0;var s=void 0!==i&&i.match(/[-+]?(\d*[.])?\d+/);return s?s[0]==i:!1},isAlpha:function(t,i){return void 0!==i&&i.match(/^[a-zA-Z]+$/)},isWords:function(t,i){return void 0!==i&&i.match(/^[a-zA-Z\s]+$/)},isSpecialWords:function(t,i){return void 0!==i&&i.match(/^[a-zA-Z\s\u00C0-\u017F]+$/)},isLength:function(t,i,s){return void 0!==i&&i.length===s},equals:function(t,i,s){return i==s},equalsField:function(t,i,s){return i==this[s]},maxLength:function(t,i,s){return void 0!==i&&i.length<=s},minLength:function(t,i,s){return void 0!==i&&i.length>=s}}},{}]},{},[1]); \ No newline at end of file +!function t(i,s,r){function e(o,u){if(!s[o]){if(!i[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(n)return n(o,!0);var h=new Error("Cannot find module '"+o+"'");throw h.code="MODULE_NOT_FOUND",h}var d=s[o]={exports:{}};i[o][0].call(d.exports,function(t){var s=i[o][1][t];return e(s?s:t)},d,d.exports,t,i,s,r)}return s[o].exports}for(var n="function"==typeof require&&require,o=0;o1)throw new Error("Formsy does not support multiple args on string validations. Use object format of validations instead.");return t[r]=s[0]||!0,t},{}):t||{}};i.exports={getInitialState:function(){return{_value:this.props.value,_isRequired:!1,_isValid:!0,_isPristine:!0,_pristineValue:this.props.value,_validationError:""}},getDefaultProps:function(){return{validationError:"",validationErrors:{}}},componentWillMount:function(){var t=function(){this.setValidations(this.props.validations,this.props.required),this.props._attachToForm(this)}.bind(this);if(!this.props.name)throw new Error("Form Input requires a name property when used");return this.props._attachToForm?(t(),void 0):setTimeout(function(){if(this.isMounted()){if(!this.props._attachToForm)throw new Error("Form Mixin requires component to be nested in a Form");t()}}.bind(this),0)},componentWillReceiveProps:function(t){t._attachToForm=this.props._attachToForm,t._detachFromForm=this.props._detachFromForm,t._validate=this.props._validate,t._isValidValue=this.props._isValidValue,t._isFormDisabled=this.props._isFormDisabled,this.setValidations(t.validations,t.required)},componentDidUpdate:function(t){var i=function(){return this.props.value!==t.value&&this.state._value===t.value}.bind(this);(t.validations!==this.props.validations||i())&&this.setValue(this.props.value)},componentWillUnmount:function(){this.props._detachFromForm(this)},setValidations:function(t,i){this._validations=s(t)||{},this._requiredValidations=i===!0?{isDefaultRequiredValue:!0}:s(i)},setValue:function(t){this.setState({_value:t,_isPristine:!1},function(){this.props._validate(this)}.bind(this))},resetValue:function(){this.setState({_value:this.state._pristineValue,_isPristine:!0},function(){this.props._validate(this)})},getValue:function(){return this.state._value},hasValue:function(){return""!==this.state._value},getErrorMessage:function(){return!this.isValid()||this.showRequired()?this.state._validationError:null},isFormDisabled:function(){return this.props._isFormDisabled()},isValid:function(){return this.state._isValid},isPristine:function(){return this.state._isPristine},isRequired:function(){return this.state._isRequired},showRequired:function(){return this.isRequired()},showError:function(){return!this.showRequired()&&!this.isValid()},isValidValue:function(t){return this.props._isValidValue.call(null,this,t)}}},{}],3:[function(t,i){i.exports={arraysDiffer:function(t,i){var s=!1;return t.length!==i.length?s=!0:t.forEach(function(t,r){t!==i[r]&&(s=!0)}),s}}},{}],4:[function(t,i){i.exports={isDefaultRequiredValue:function(t,i){return void 0===i||""===i},hasValue:function(t,i){return void 0!==i},matchRegexp:function(t,i,s){return void 0!==i&&!!i.match(s)},isUndefined:function(t,i){return void 0===i},isEmptyString:function(t,i){return""===i},isEmail:function(t,i){return void 0!==i&&i.match(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i)},isTrue:function(t,i){return i===!0},isFalse:function(t,i){return i===!1},isNumeric:function(t,i){if("number"==typeof i)return!0;var s=void 0!==i&&i.match(/[-+]?(\d*[.])?\d+/);return s?s[0]==i:!1},isAlpha:function(t,i){return void 0!==i&&i.match(/^[a-zA-Z]+$/)},isWords:function(t,i){return void 0!==i&&i.match(/^[a-zA-Z\s]+$/)},isSpecialWords:function(t,i){return void 0!==i&&i.match(/^[a-zA-Z\s\u00C0-\u017F]+$/)},isLength:function(t,i,s){return void 0!==i&&i.length===s},equals:function(t,i,s){return i==s},equalsField:function(t,i,s){return i==this[s]},maxLength:function(t,i,s){return void 0!==i&&i.length<=s},minLength:function(t,i,s){return void 0!==i&&i.length>=s}}},{}]},{},[1]); \ No newline at end of file diff --git a/src/main.js b/src/main.js index bd0e65d..c1206c8 100644 --- a/src/main.js +++ b/src/main.js @@ -93,7 +93,7 @@ Formsy.Form = React.createClass({ this.updateModel(); var model = this.mapModel(); this.props.onSubmit(model, this.resetModel, this.updateInputsWithError); - this.state.isValid ? this.props.onValidSubmit(model, this.resetModel, this.updateInputsWithError) : this.props.onInvalidSubmit(model, this.resetModel, this.updateInputsWithError); + this.state.isValid ? this.props.onValidSubmit(model, this.resetModel) : this.props.onInvalidSubmit(model, this.resetModel); return; } @@ -273,6 +273,10 @@ Formsy.Form = React.createClass({ return ''; } + if (validationResults.errors.length) { + return validationResults.errors[0]; + } + if (this.props.validationErrors && this.props.validationErrors[component.props.name]) { return this.props.validationErrors[component.props.name]; } @@ -293,6 +297,7 @@ Formsy.Form = React.createClass({ runRules: function (value, currentValues, validations) { var results = { + errors: [], failed: [], success: [] }; @@ -307,10 +312,28 @@ Formsy.Form = React.createClass({ throw new Error('Formsy does not have the validation rule: ' + validationMethod); } - if (typeof validations[validationMethod] === 'function' && !validations[validationMethod](currentValues, value)) { - return results.failed.push(validationMethod); - } else if (typeof validations[validationMethod] !== 'function' && !validationRules[validationMethod](currentValues, value, validations[validationMethod])) { - return results.failed.push(validationMethod); + if (typeof validations[validationMethod] === 'function') { + var validation = validations[validationMethod](currentValues, value); + if (typeof validation === 'string') { + results.errors.push(validation); + results.failed.push(validationMethod); + } else if (!validation) { + results.failed.push(validationMethod); + } + return; + + } else if (typeof validations[validationMethod] !== 'function') { + var validation = validationRules[validationMethod](currentValues, value, validations[validationMethod]); + if (typeof validation === 'string') { + results.errors.push(validation); + results.failed.push(validationMethod); + } else if (!validation) { + results.failed.push(validationMethod); + } else { + results.success.push(validationMethod); + } + return; + } return results.success.push(validationMethod); @@ -322,6 +345,53 @@ Formsy.Form = React.createClass({ }, +/* + + var results = { + errors: [], + failed: [], + success: [] + }; + if (Object.keys(validations).length) { + Object.keys(validations).forEach(function (validationMethod) { + + if (validationRules[validationMethod] && typeof validations[validationMethod] === 'function') { + throw new Error('Formsy does not allow you to override default validations: ' + validationMethod); + } + + if (!validationRules[validationMethod] && typeof validations[validationMethod] !== 'function') { + throw new Error('Formsy does not have the validation rule: ' + validationMethod); + } + + if (typeof validations[validationMethod] === 'function') { + var validation = validations[validationMethod](currentValues, value); + if (typeof validation === 'string') { + results.errors.push(validation); + results.failed.push(validationMethod); + } else if (!validation) { + results.failed.push(validationMethod); + } + return; + + } else if (typeof validations[validationMethod] !== 'function') { + var validation = validationRules[validationMethod](currentValues, value, validations[validationMethod]); + if (typeof validation === 'string') { + results.errors.push(validation); + results.failed.push(validationMethod); + } else if (!validation) { + results.failed.push(validationMethod); + } + return; + + } + + return results.success.push(validationMethod); + + }); + } + + return results; +*/ // Validate the form by going through all child input components // and check their state validateForm: function () {