77 lines
2.0 KiB
JavaScript
77 lines
2.0 KiB
JavaScript
var RibicaValidationMixin = {
|
|
_updateState: function(prop, value, callback) {
|
|
var newState = {};
|
|
newState[prop] = value;
|
|
this.setState(newState, function(){
|
|
if(callback) {
|
|
callback();
|
|
}
|
|
}.bind(this));
|
|
},
|
|
_validate: function(prop, value) {
|
|
if(this.validations && this.validations[prop]) {
|
|
var cb = function(err, revalidateFields) {
|
|
var errors = this.state.errors || {};
|
|
if (err !== undefined) {
|
|
if(err.length > 0) {
|
|
errors[prop] = err;
|
|
} else {
|
|
delete errors[prop];
|
|
}
|
|
} else {
|
|
delete errors[prop];
|
|
}
|
|
this.setState({errors: errors});
|
|
if (revalidateFields) {
|
|
for(var i = 0; i < revalidateFields.length; i++) {
|
|
this.validateField(revalidateFields[i], this.state[revalidateFields[i]]);
|
|
}
|
|
}
|
|
}.bind(this);
|
|
|
|
var immediateErrors = this.validations[prop](value, cb);
|
|
cb(immediateErrors);
|
|
}
|
|
},
|
|
handleChange: function(prop) {
|
|
return function(event) {
|
|
event.preventDefault();
|
|
var target = event.target;
|
|
this._updateState(prop, target.value, function(){
|
|
this._validate(prop, target.value);
|
|
}.bind(this));
|
|
}.bind(this);
|
|
|
|
},
|
|
getValidationMessages:function(prop) {
|
|
var errors = this.state.errors || {};
|
|
return (errors[prop] || []);
|
|
},
|
|
validateField: function(field) {
|
|
this._validate(field, this.state[field]);
|
|
},
|
|
validate: function() {
|
|
for (var key in this.state) {
|
|
if (this.state.hasOwnProperty(key)) {
|
|
this._validate(key, this.state[key]);
|
|
}
|
|
}
|
|
return this.isValid();
|
|
},
|
|
isValid: function() {
|
|
var errors = this.state.errors || {};
|
|
return Object.keys(errors).length === 0;
|
|
},
|
|
componentDidMount : function(){
|
|
this.setState({errors: {}});
|
|
if (this.validations) {
|
|
var self = this;
|
|
this.validations.getState = function() {
|
|
return self.state;
|
|
};
|
|
}
|
|
},
|
|
};
|
|
|
|
module.exports = RibicaValidationMixin;
|