Skip to content

Commit

Permalink
Support custom validation classes
Browse files Browse the repository at this point in the history
  • Loading branch information
cristijora committed Apr 15, 2017
1 parent 7ebd225 commit 378a2a7
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 11 deletions.
4 changes: 2 additions & 2 deletions dist/vfg-core.js

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions dist/vfg.js

Large diffs are not rendered by default.

26 changes: 20 additions & 6 deletions src/formGenerator.vue
Expand Up @@ -13,7 +13,7 @@ div
.buttons(v-if='buttonVisibility(field)')
button(v-for='btn in field.buttons', @click='btn.onclick(model, field)', :class='btn.classes') {{ btn.label }}
.hint(v-if='field.hint') {{ field.hint }}
.errors(v-if='fieldErrors(field).length > 0')
.errors.help-block(v-if='fieldErrors(field).length > 0')
span(v-for='(error, index) in fieldErrors(field)', track-by='index') {{ error }}
</template>

Expand Down Expand Up @@ -55,7 +55,9 @@ div
default() {
return {
validateAfterLoad: false,
validateAfterChanged: false
validateAfterChanged: false,
validationErrorClass: "error",
validationSuccessClass: "",
};
}
},
Expand Down Expand Up @@ -125,14 +127,26 @@ div
methods: {
// Get style classes of field
getFieldRowClasses(field) {
const hasErrors = this.fieldErrors(field).length > 0;
let baseClasses = {
error: this.fieldErrors(field).length > 0,
error: hasErrors,
disabled: this.fieldDisabled(field),
readonly: this.fieldReadonly(field),
featured: this.fieldFeatured(field),
required: this.fieldRequired(field)
};
let {validationErrorClass, validationSuccessClass} = this.options;
if (validationErrorClass && validationSuccessClass) {
if (hasErrors) {
baseClasses[validationErrorClass] = true;
baseClasses.error = false;
}
else {
baseClasses[validationSuccessClass] = true;
}
}
if (isArray(field.styleClasses)) {
each(field.styleClasses, (c) => baseClasses[c] = true);
}
Expand Down Expand Up @@ -252,7 +266,7 @@ div
each(this.$children, (child) => {
child.clearValidationErrors();
});
});
},
modelUpdated(newVal, schema){
Expand All @@ -262,7 +276,7 @@ div
buttonVisibility(field) {
return field.buttons && field.buttons.length > 0;
},
fieldErrors(field) {
let res = this.errors.filter(e => e.field == field);
return res.map(item => item.error);
Expand Down Expand Up @@ -349,7 +363,7 @@ div
left: 0;
position: absolute;
width: 100%;
}
}
&:hover .helpText {
opacity: 1;
Expand Down
27 changes: 27 additions & 0 deletions test/unit/specs/VueFormGenerator.spec.js
Expand Up @@ -116,6 +116,33 @@ describe("VueFormGenerator.vue", () => {
});
});

describe("custom validation classes", () => {
before(() => {
let options = {
validationErrorClass: "has-error",
validationSuccessClass: "has-success",
};
createFormGenerator(schema, null, options);
group = el.querySelector(".form-group");
});

it("error class", (done) => {
vm.$refs.form.errors.push({field: vm.schema.fields[0], error: "Validation error!"});
vm.$nextTick(() => {
expect(group.classList.contains("has-error")).to.be.true;
done();
});
});

it("success class", (done) => {
vm.$refs.form.errors = [];
vm.$nextTick(() => {
expect(group.classList.contains("has-success")).to.be.true;
done();
});
});
});

it("should be add a custom classes", (done) => {
Vue.set(vm.schema.fields[0], "styleClasses", "classA");
vm.$nextTick(() => {
Expand Down

0 comments on commit 378a2a7

Please sign in to comment.