mirror of
https://github.com/ascribe/onion.git
synced 2025-01-03 18:35:09 +01:00
Add naive & manual validation to Form
This commit is contained in:
parent
be7fa0c6eb
commit
62eb78ae76
@ -12,7 +12,7 @@ import GlobalNotificationActions from '../../actions/global_notification_actions
|
|||||||
import requests from '../../utils/requests';
|
import requests from '../../utils/requests';
|
||||||
|
|
||||||
import { getLangText } from '../../utils/lang_utils';
|
import { getLangText } from '../../utils/lang_utils';
|
||||||
import { mergeOptionsWithDuplicates } from '../../utils/general_utils';
|
import { mergeOptionsWithDuplicates, sanitize } from '../../utils/general_utils';
|
||||||
|
|
||||||
|
|
||||||
let Form = React.createClass({
|
let Form = React.createClass({
|
||||||
@ -155,7 +155,7 @@ let Form = React.createClass({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
handleError(err){
|
handleError(err) {
|
||||||
if (err.json) {
|
if (err.json) {
|
||||||
for (let input in err.json.errors){
|
for (let input in err.json.errors){
|
||||||
if (this.refs && this.refs[input] && this.refs[input].state) {
|
if (this.refs && this.refs[input] && this.refs[input].state) {
|
||||||
@ -185,7 +185,7 @@ let Form = React.createClass({
|
|||||||
this.setState({submitted: false});
|
this.setState({submitted: false});
|
||||||
},
|
},
|
||||||
|
|
||||||
clearErrors(){
|
clearErrors() {
|
||||||
for(let ref in this.refs){
|
for(let ref in this.refs){
|
||||||
if (this.refs[ref] && typeof this.refs[ref].clearErrors === 'function'){
|
if (this.refs[ref] && typeof this.refs[ref].clearErrors === 'function'){
|
||||||
this.refs[ref].clearErrors();
|
this.refs[ref].clearErrors();
|
||||||
@ -269,6 +269,62 @@ let Form = React.createClass({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_validateRef(refToValidate) {
|
||||||
|
let error = [];
|
||||||
|
|
||||||
|
Object
|
||||||
|
.keys(refToValidate)
|
||||||
|
.forEach((constraintKey) => {
|
||||||
|
const contraintValue = refToValidate[constraintKey];
|
||||||
|
|
||||||
|
if(!contraintValue) {
|
||||||
|
switch(constraintKey) {
|
||||||
|
case 'min' || 'max':
|
||||||
|
error.push(getLangText('The field you defined is not in the valid range.'));
|
||||||
|
break;
|
||||||
|
case 'pattern':
|
||||||
|
error.push(getLangText('The value you defined is not matching the valid pattern'));
|
||||||
|
break;
|
||||||
|
case 'required':
|
||||||
|
error.push(getLangText('This field is required.'));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return error.length ? error : false;
|
||||||
|
},
|
||||||
|
|
||||||
|
valid() {
|
||||||
|
this.clearErrors();
|
||||||
|
const validatedFormInputs = {};
|
||||||
|
|
||||||
|
Object
|
||||||
|
.keys(this.refs)
|
||||||
|
.forEach((refName) => {
|
||||||
|
let refToValidate = {};
|
||||||
|
const property = this.refs[refName];
|
||||||
|
const input = property.refs.input;
|
||||||
|
const value = input.getDOMNode().value;
|
||||||
|
const { max,
|
||||||
|
min,
|
||||||
|
pattern,
|
||||||
|
required,
|
||||||
|
type } = input.props;
|
||||||
|
|
||||||
|
refToValidate.required = required ? value !== '' : true;
|
||||||
|
refToValidate.pattern = pattern && typeof value === 'string' ? value.match(pattern) : true;
|
||||||
|
refToValidate.max = type === 'number' ? parseInt(value) <= max : true;
|
||||||
|
refToValidate.min = type === 'number' ? parseInt(value) >= min : true;
|
||||||
|
|
||||||
|
const validatedRef = this._validateRef(refToValidate);
|
||||||
|
validatedFormInputs[refName] = validatedRef;
|
||||||
|
});
|
||||||
|
const errorMessagesForFields = sanitize(validatedFormInputs, (val) => !val);
|
||||||
|
this.handleError({ json: { errors: errorMessagesForFields } });
|
||||||
|
return !Object.keys(errorMessagesForFields).length;
|
||||||
|
},
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let className = 'ascribe-form';
|
let className = 'ascribe-form';
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user