@@ -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