diff --git a/src/formGenerator.vue b/src/formGenerator.vue index 47ae7b0b..3c20e8d1 100644 --- a/src/formGenerator.vue +++ b/src/formGenerator.vue @@ -76,7 +76,7 @@ div.vue-form-generator(v-if='schema != null') validateAfterLoad: false, validateAfterChanged: false, validationErrorClass: "error", - validationSuccessClass: "", + validationSuccessClass: "success" }; } }, @@ -102,6 +102,7 @@ div.vue-form-generator(v-if='schema != null') data () { return { + touched: [], errors: [] // Validation errors }; }, @@ -165,8 +166,10 @@ div.vue-form-generator(v-if='schema != null') // Get style classes of field getFieldRowClasses(field) { const hasErrors = this.fieldErrors(field).length > 0; + const wasTouched = this.fieldTouched(field); let baseClasses = { - error: hasErrors, + error: hasErrors && wasTouched, + success: !hasErrors && wasTouched, disabled: this.fieldDisabled(field), readonly: this.fieldReadonly(field), featured: this.fieldFeatured(field), @@ -174,13 +177,13 @@ div.vue-form-generator(v-if='schema != null') }; let {validationErrorClass, validationSuccessClass} = this.options; - if (validationErrorClass && validationSuccessClass) { + if (validationErrorClass && validationSuccessClass && wasTouched) { if (hasErrors) { baseClasses[validationErrorClass] = true; baseClasses.error = false; - } - else { + } else { baseClasses[validationSuccessClass] = true; + baseClasses.success = false; } } @@ -283,6 +286,12 @@ div.vue-form-generator(v-if='schema != null') onFieldValidated(res, errors, field) { // Remove old errors for this field this.errors = this.errors.filter(e => e.field != field.schema); + this.touched = this.touched.filter(e => e.field != field.schema); + + this.touched.push({ + field: field.schema, + touched: true + }); if (!res && errors && errors.length > 0) { // Add errors with this field @@ -301,10 +310,16 @@ div.vue-form-generator(v-if='schema != null') // Validating the model properties validate() { this.clearValidationErrors(); + this.touched.splice(0); this.$children.forEach((child) => { if (isFunction(child.validate)) { + this.touched.push({ + field: child.schema, + touched: true + }); + let errors = child.validate(true); errors.forEach((err) => { this.errors.push({ @@ -342,6 +357,10 @@ div.vue-form-generator(v-if='schema != null') return res.map(item => item.error); }, + fieldTouched(field) { + return this.touched.find(e=>e.field == field); + }, + getFieldID(schema) { const idPrefix = this.options && this.options.fieldIdPrefix ? this.options.fieldIdPrefix : ""; return slugifyFormID(schema, idPrefix);