@@ -37,23 +37,23 @@ div.vue-form-generator(v-if='schema != null')
3737
3838<script >
3939 // import Vue from "vue";
40- import {each , isFunction , isNil , isArray , isString } from " lodash" ;
40+ import { get as objGet , forEach , isFunction , isNil , isArray , isString } from " lodash" ;
4141 import { slugifyFormID } from " ./utils/schema" ;
4242
4343 // Load all fields from '../fields' folder
4444 let fieldComponents = {};
4545
4646 let coreFields = require .context (" ./fields/core" , false , / ^ \.\/ field([\w -_ ] + )\. vue$ / );
4747
48- each (coreFields .keys (), (key ) => {
48+ forEach (coreFields .keys (), (key ) => {
4949 let compName = key .replace (/ ^ \.\/ / , " " ).replace (/ \. vue/ , " " );
5050 fieldComponents[compName] = coreFields (key);
5151 });
5252
5353 if (process .env .FULL_BUNDLE ) { // eslint-disable-line
5454 let Fields = require .context (" ./fields/optional" , false , / ^ \.\/ field([\w -_ ] + )\. vue$ / );
5555
56- each (Fields .keys (), (key ) => {
56+ forEach (Fields .keys (), (key ) => {
5757 let compName = key .replace (/ ^ \.\/ / , " " ).replace (/ \. vue/ , " " );
5858 fieldComponents[compName] = Fields (key);
5959 });
@@ -74,9 +74,10 @@ div.vue-form-generator(v-if='schema != null')
7474 default () {
7575 return {
7676 validateAfterLoad: false ,
77+ validateAsync: false ,
7778 validateAfterChanged: false ,
7879 validationErrorClass: " error" ,
79- validationSuccessClass: " " ,
80+ validationSuccessClass: " "
8081 };
8182 }
8283 },
@@ -110,7 +111,7 @@ div.vue-form-generator(v-if='schema != null')
110111 fields () {
111112 let res = [];
112113 if (this .schema && this .schema .fields ) {
113- each (this .schema .fields , (field ) => {
114+ forEach (this .schema .fields , (field ) => {
114115 if (! this .multiple || field .multi === true )
115116 res .push (field);
116117 });
@@ -121,7 +122,7 @@ div.vue-form-generator(v-if='schema != null')
121122 groups () {
122123 let res = [];
123124 if (this .schema && this .schema .groups ) {
124- each (this .schema .groups , (group ) => {
125+ forEach (this .schema .groups , (group ) => {
125126 res .push (group);
126127 });
127128 }
@@ -139,10 +140,11 @@ div.vue-form-generator(v-if='schema != null')
139140 if (newModel != null ) {
140141 this .$nextTick (() => {
141142 // Model changed!
142- if (this .options .validateAfterLoad === true && this .isNewModel !== true )
143+ if (this .options .validateAfterLoad === true && this .isNewModel !== true ) {
143144 this .validate ();
144- else
145+ } else {
145146 this .clearValidationErrors ();
147+ }
146148 });
147149 }
148150 }
@@ -152,7 +154,7 @@ div.vue-form-generator(v-if='schema != null')
152154 this .$nextTick (() => {
153155 if (this .model ) {
154156 // First load, running validation if neccessary
155- if (this .options .validateAfterLoad === true && this .isNewModel !== true ){
157+ if (this .options .validateAfterLoad === true && this .isNewModel !== true ) {
156158 this .validate ();
157159 } else {
158160 this .clearValidationErrors ();
@@ -185,7 +187,7 @@ div.vue-form-generator(v-if='schema != null')
185187 }
186188
187189 if (isArray (field .styleClasses )) {
188- each (field .styleClasses , (c ) => baseClasses[c] = true );
190+ forEach (field .styleClasses , (c ) => baseClasses[c] = true );
189191 }
190192 else if (isString (field .styleClasses )) {
191193 baseClasses[field .styleClasses ] = true ;
@@ -298,7 +300,7 @@ div.vue-form-generator(v-if='schema != null')
298300
299301 if (! res && errors && errors .length > 0 ) {
300302 // Add errors with this field
301- errors . forEach ((err ) => {
303+ forEach (errors, (err ) => {
302304 this .errors .push ({
303305 field: field .schema ,
304306 error: err
@@ -311,32 +313,52 @@ div.vue-form-generator(v-if='schema != null')
311313 },
312314
313315 // Validating the model properties
314- validate () {
316+ validate (isAsync = null ) {
317+ if (isAsync === null ) {
318+ isAsync = objGet (this .options , " validateAsync" , false );
319+ }
315320 this .clearValidationErrors ();
316321
317- this .$children .forEach ((child ) => {
318- if (isFunction (child .validate ))
319- {
320- let errors = child .validate (true );
321- errors .forEach ((err ) => {
322- this .errors .push ({
323- field: child .schema ,
324- error: err
325- });
326- });
322+ let fields = [];
323+ let results = [];
324+
325+ forEach (this .$children , (child ) => {
326+ if (isFunction (child .validate )) {
327+ fields .push (child); // keep track of validated children
328+ results .push (child .validate (true ));
327329 }
328330 });
329331
330- let isValid = this .errors .length == 0 ;
331- this .$emit (" validated" , isValid, this .errors );
332- return isValid;
332+ let handleErrors = (errors ) => {
333+ let formErrors = [];
334+ forEach (errors, (err , i ) => {
335+ if (isArray (err) && err .length > 0 ) {
336+ forEach (err, (error ) => {
337+ formErrors .push ({
338+ field: fields[i].schema ,
339+ error: error,
340+ });
341+ });
342+ }
343+ });
344+ this .errors = formErrors;
345+ let isValid = formErrors .length == 0 ;
346+ this .$emit (" validated" , isValid, formErrors);
347+ return isAsync ? formErrors : isValid;
348+ };
349+
350+ if (! isAsync) {
351+ return handleErrors (results);
352+ }
353+
354+ return Promise .all (results).then (handleErrors);
333355 },
334356
335357 // Clear validation errors
336358 clearValidationErrors () {
337359 this .errors .splice (0 );
338360
339- each (this .$children , (child ) => {
361+ forEach (this .$children , (child ) => {
340362 child .clearValidationErrors ();
341363 });
342364 },
0 commit comments