diff --git a/src/fields/abstractField.js b/src/fields/abstractField.js
index 4752bfc6..879e7299 100644
--- a/src/fields/abstractField.js
+++ b/src/fields/abstractField.js
@@ -1,4 +1,4 @@
-import { get as objGet, each, isFunction, isString, isArray, debounce } from "lodash";
+import { get as objGet, forEach, isFunction, isString, isArray, debounce } from "lodash";
import validators from "../utils/validators";
import { slugifyFormID } from "../utils/schema";
@@ -60,52 +60,66 @@ export default {
methods: {
validate(calledParent) {
this.clearValidationErrors();
+ let validateAsync = objGet(this.formOptions, "validateAsync", false);
+
+ let results = [];
if (this.schema.validator && this.schema.readonly !== true && this.disabled !== true) {
let validators = [];
if (!isArray(this.schema.validator)) {
validators.push(convertValidator(this.schema.validator).bind(this));
} else {
- each(this.schema.validator, (validator) => {
+ forEach(this.schema.validator, (validator) => {
validators.push(convertValidator(validator).bind(this));
});
}
- each(validators, (validator) => {
- let addErrors = err => {
- if (isArray(err))
- Array.prototype.push.apply(this.errors, err);
- else if (isString(err))
- this.errors.push(err);
- };
-
- let res = validator(this.value, this.schema, this.model);
- if (res && isFunction(res.then)) {
- // It is a Promise, async validator
- res.then(err => {
- if (err) {
- addErrors(err);
+ forEach(validators, (validator) => {
+ if(validateAsync) {
+ results.push(validator(this.value, this.schema, this.model));
+ } else {
+ let result = validator(this.value, this.schema, this.model);
+ if(result && isFunction(result.then)) {
+ result.then((err) => {
+ if(err) {
+ this.errors = this.errors.concat(err);
+ }
let isValid = this.errors.length == 0;
this.$emit("validated", isValid, this.errors, this);
- }
- });
- } else {
- if (res)
- addErrors(res);
+ });
+ } else if(result) {
+ results = results.concat(result);
+ }
}
});
-
}
- if (isFunction(this.schema.onValidated)) {
- this.schema.onValidated.call(this, this.model, this.errors, this.schema);
- }
+ let handleErrors = (errors) => {
+ let fieldErrors = [];
+ forEach(errors, (err) => {
+ if(isArray(err) && err.length > 0) {
+ fieldErrors = fieldErrors.concat(err);
+ } else if(isString(err)) {
+ fieldErrors.push(err);
+ }
+ });
+ if (isFunction(this.schema.onValidated)) {
+ this.schema.onValidated.call(this, this.model, fieldErrors, this.schema);
+ }
- let isValid = this.errors.length == 0;
- if (!calledParent)
- this.$emit("validated", isValid, this.errors, this);
+ let isValid = fieldErrors.length == 0;
+ if (!calledParent) {
+ this.$emit("validated", isValid, fieldErrors, this);
+ }
+ this.errors = fieldErrors;
+ return fieldErrors;
+ };
+
+ if(!validateAsync) {
+ return handleErrors(results);
+ }
- return this.errors;
+ return Promise.all(results).then(handleErrors);
},
debouncedValidate() {
diff --git a/src/fields/core/fieldSubmit.vue b/src/fields/core/fieldSubmit.vue
index 4bf975ee..346e983d 100644
--- a/src/fields/core/fieldSubmit.vue
+++ b/src/fields/core/fieldSubmit.vue
@@ -1,26 +1,34 @@
- input(:id="getFieldID(schema)", type="submit", :value="schema.buttonText", @click="click", :name="schema.inputName", :disabled="disabled", :class="schema.fieldClasses")
+ input(:id="getFieldID(schema)", type="submit", :value="schema.buttonText", @click="onClick", :name="schema.inputName", :disabled="disabled", :class="schema.fieldClasses")