Compare commits
1 Commits
master
...
validation
| Author | SHA1 | Date |
|---|---|---|
|
|
231ac4c7de |
6
API.md
6
API.md
|
|
@ -271,11 +271,13 @@ The message that will show when the form input component is invalid. It will be
|
||||||
name="email"
|
name="email"
|
||||||
validations={{
|
validations={{
|
||||||
isEmail: true,
|
isEmail: true,
|
||||||
maxLength: 50
|
maxLength: 50,
|
||||||
|
someCustomValidation: [1, 2, 3]
|
||||||
}}
|
}}
|
||||||
validationErrors={{
|
validationErrors={{
|
||||||
isEmail: 'You have to type valid email',
|
isEmail: 'You have to type valid email',
|
||||||
maxLength: 'You can not type in more than 50 characters'
|
maxLength: 'You can not type in more than {0} characters',
|
||||||
|
someCustomValidation: '{0} + {1} = {2}'
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,15 @@ import MySelect from './../components/Select';
|
||||||
import MyRadioGroup from './../components/RadioGroup';
|
import MyRadioGroup from './../components/RadioGroup';
|
||||||
import MyMultiCheckboxSet from './../components/MultiCheckboxSet';
|
import MyMultiCheckboxSet from './../components/MultiCheckboxSet';
|
||||||
|
|
||||||
|
const validationErrors = {
|
||||||
|
'isEmail': 'The field must contain a valid email address',
|
||||||
|
'isNumeric': 'The field must contain only numbers',
|
||||||
|
'isAlphanumeric': 'The field must only contain alpha-numeric characters',
|
||||||
|
'equals': 'The field must be equal to {0}',
|
||||||
|
'minLength': 'The field must be at least {0} characters in length',
|
||||||
|
'maxLength': 'The field must not exceed {0} characters in length'
|
||||||
|
};
|
||||||
|
|
||||||
const Fields = props => {
|
const Fields = props => {
|
||||||
function onRemove(pos) {
|
function onRemove(pos) {
|
||||||
return event => {
|
return event => {
|
||||||
|
|
@ -27,6 +36,7 @@ const Fields = props => {
|
||||||
title={field.validations ? JSON.stringify(field.validations) : 'No validations'}
|
title={field.validations ? JSON.stringify(field.validations) : 'No validations'}
|
||||||
required={field.required}
|
required={field.required}
|
||||||
validations={field.validations}
|
validations={field.validations}
|
||||||
|
validationErrors={validationErrors}
|
||||||
/>
|
/>
|
||||||
) :
|
) :
|
||||||
(
|
(
|
||||||
|
|
@ -35,6 +45,7 @@ const Fields = props => {
|
||||||
title={field.validations ? JSON.stringify(field.validations) : 'No validations'}
|
title={field.validations ? JSON.stringify(field.validations) : 'No validations'}
|
||||||
required={field.required}
|
required={field.required}
|
||||||
validations={field.validations}
|
validations={field.validations}
|
||||||
|
validationErrors={validationErrors}
|
||||||
options={[
|
options={[
|
||||||
{title: '123', value: '123'},
|
{title: '123', value: '123'},
|
||||||
{title: 'some long text', value: 'some long text'},
|
{title: 'some long text', value: 'some long text'},
|
||||||
|
|
@ -86,7 +97,6 @@ const App = React.createClass({
|
||||||
cmp={(a, b) => JSON.stringify(a) === JSON.stringify(b)}
|
cmp={(a, b) => JSON.stringify(a) === JSON.stringify(b)}
|
||||||
items={[
|
items={[
|
||||||
{isEmail: true},
|
{isEmail: true},
|
||||||
{isEmptyString: true},
|
|
||||||
{isNumeric: true},
|
{isNumeric: true},
|
||||||
{isAlphanumeric: true},
|
{isAlphanumeric: true},
|
||||||
{equals: 5},
|
{equals: 5},
|
||||||
|
|
|
||||||
18
src/main.js
18
src/main.js
|
|
@ -255,7 +255,7 @@ Formsy.Form = React.createClass({
|
||||||
|
|
||||||
// the component defines an explicit validate function
|
// the component defines an explicit validate function
|
||||||
if (typeof component.validate === "function") {
|
if (typeof component.validate === "function") {
|
||||||
validationResults.failed = component.validate() ? [] : ['failed'];
|
validationResults.failed = component.validate() ? [] : [{ method: 'failed' }];
|
||||||
}
|
}
|
||||||
|
|
||||||
var isRequired = Object.keys(component._requiredValidations).length ? !!requiredResults.success.length : false;
|
var isRequired = Object.keys(component._requiredValidations).length ? !!requiredResults.success.length : false;
|
||||||
|
|
@ -285,7 +285,13 @@ Formsy.Form = React.createClass({
|
||||||
|
|
||||||
if (validationResults.failed.length) {
|
if (validationResults.failed.length) {
|
||||||
return validationResults.failed.map(function(failed) {
|
return validationResults.failed.map(function(failed) {
|
||||||
return validationErrors[failed] ? validationErrors[failed] : validationError;
|
var errorMessage = validationErrors[failed.method] ? validationErrors[failed.method] : validationError;
|
||||||
|
|
||||||
|
failed.args && [].concat(failed.args).forEach((arg, i) => {
|
||||||
|
errorMessage = errorMessage.replace(new RegExp('\\{' + i + '\\}', 'g'), arg);
|
||||||
|
});
|
||||||
|
|
||||||
|
return errorMessage;
|
||||||
}).filter(function(x, pos, arr) {
|
}).filter(function(x, pos, arr) {
|
||||||
// Remove duplicates
|
// Remove duplicates
|
||||||
return arr.indexOf(x) === pos;
|
return arr.indexOf(x) === pos;
|
||||||
|
|
@ -319,9 +325,9 @@ Formsy.Form = React.createClass({
|
||||||
var validation = validations[validationMethod](currentValues, value);
|
var validation = validations[validationMethod](currentValues, value);
|
||||||
if (typeof validation === 'string') {
|
if (typeof validation === 'string') {
|
||||||
results.errors.push(validation);
|
results.errors.push(validation);
|
||||||
results.failed.push(validationMethod);
|
results.failed.push({ method: validationMethod });
|
||||||
} else if (!validation) {
|
} else if (!validation) {
|
||||||
results.failed.push(validationMethod);
|
results.failed.push({ method: validationMethod });
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -329,9 +335,9 @@ Formsy.Form = React.createClass({
|
||||||
var validation = validationRules[validationMethod](currentValues, value, validations[validationMethod]);
|
var validation = validationRules[validationMethod](currentValues, value, validations[validationMethod]);
|
||||||
if (typeof validation === 'string') {
|
if (typeof validation === 'string') {
|
||||||
results.errors.push(validation);
|
results.errors.push(validation);
|
||||||
results.failed.push(validationMethod);
|
results.failed.push({ method: validationMethod, args: validations[validationMethod] });
|
||||||
} else if (!validation) {
|
} else if (!validation) {
|
||||||
results.failed.push(validationMethod);
|
results.failed.push({ method: validationMethod, args: validations[validationMethod] });
|
||||||
} else {
|
} else {
|
||||||
results.success.push(validationMethod);
|
results.success.push(validationMethod);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -399,6 +399,39 @@ export default {
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
'should validation parameters passed to validation errors messages': function (test) {
|
||||||
|
|
||||||
|
const TestForm = React.createClass({
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<Formsy.Form>
|
||||||
|
<TestInput name="A"
|
||||||
|
validations={{
|
||||||
|
'minLength': 3,
|
||||||
|
'maxLength': 5
|
||||||
|
}}
|
||||||
|
validationErrors={{
|
||||||
|
'minLength': 'The field must be at least {0} characters in length',
|
||||||
|
'maxLength': 'The field must not exceed {0} characters in length'
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Formsy.Form>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const form = TestUtils.renderIntoDocument(<TestForm/>);
|
||||||
|
|
||||||
|
const inputComponent = TestUtils.findRenderedComponentWithType(form, TestInput);
|
||||||
|
const input = TestUtils.findRenderedDOMComponentWithTag(form, 'INPUT');
|
||||||
|
TestUtils.Simulate.change(input, {target: {value: 'xx'}});
|
||||||
|
test.equal(inputComponent.getErrorMessage(), 'The field must be at least 3 characters in length');
|
||||||
|
TestUtils.Simulate.change(input, {target: {value: 'xxxxxx'}});
|
||||||
|
test.equal(inputComponent.getErrorMessage(), 'The field must not exceed 5 characters in length');
|
||||||
|
|
||||||
|
test.done();
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
'should not be valid if it is required and required rule is true': function (test) {
|
'should not be valid if it is required and required rule is true': function (test) {
|
||||||
|
|
||||||
const TestForm = React.createClass({
|
const TestForm = React.createClass({
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue