Skip to content

Commit 452d492

Browse files
authored
Merge pull request #183 from cristijora/custom-validation-classes
Support custom validation classes
2 parents 7ebd225 + 378a2a7 commit 452d492

File tree

4 files changed

+52
-11
lines changed

4 files changed

+52
-11
lines changed

dist/vfg-core.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/vfg.js

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/formGenerator.vue

+20-6
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ div
1313
.buttons(v-if='buttonVisibility(field)')
1414
button(v-for='btn in field.buttons', @click='btn.onclick(model, field)', :class='btn.classes') {{ btn.label }}
1515
.hint(v-if='field.hint') {{ field.hint }}
16-
.errors(v-if='fieldErrors(field).length > 0')
16+
.errors.help-block(v-if='fieldErrors(field).length > 0')
1717
span(v-for='(error, index) in fieldErrors(field)', track-by='index') {{ error }}
1818
</template>
1919

@@ -55,7 +55,9 @@ div
5555
default() {
5656
return {
5757
validateAfterLoad: false,
58-
validateAfterChanged: false
58+
validateAfterChanged: false,
59+
validationErrorClass: "error",
60+
validationSuccessClass: "",
5961
};
6062
}
6163
},
@@ -125,14 +127,26 @@ div
125127
methods: {
126128
// Get style classes of field
127129
getFieldRowClasses(field) {
130+
const hasErrors = this.fieldErrors(field).length > 0;
128131
let baseClasses = {
129-
error: this.fieldErrors(field).length > 0,
132+
error: hasErrors,
130133
disabled: this.fieldDisabled(field),
131134
readonly: this.fieldReadonly(field),
132135
featured: this.fieldFeatured(field),
133136
required: this.fieldRequired(field)
134137
};
135138
139+
let {validationErrorClass, validationSuccessClass} = this.options;
140+
if (validationErrorClass && validationSuccessClass) {
141+
if (hasErrors) {
142+
baseClasses[validationErrorClass] = true;
143+
baseClasses.error = false;
144+
}
145+
else {
146+
baseClasses[validationSuccessClass] = true;
147+
}
148+
}
149+
136150
if (isArray(field.styleClasses)) {
137151
each(field.styleClasses, (c) => baseClasses[c] = true);
138152
}
@@ -252,7 +266,7 @@ div
252266
253267
each(this.$children, (child) => {
254268
child.clearValidationErrors();
255-
});
269+
});
256270
},
257271
258272
modelUpdated(newVal, schema){
@@ -262,7 +276,7 @@ div
262276
buttonVisibility(field) {
263277
return field.buttons && field.buttons.length > 0;
264278
},
265-
279+
266280
fieldErrors(field) {
267281
let res = this.errors.filter(e => e.field == field);
268282
return res.map(item => item.error);
@@ -349,7 +363,7 @@ div
349363
left: 0;
350364
position: absolute;
351365
width: 100%;
352-
}
366+
}
353367
354368
&:hover .helpText {
355369
opacity: 1;

test/unit/specs/VueFormGenerator.spec.js

+27
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,33 @@ describe("VueFormGenerator.vue", () => {
116116
});
117117
});
118118

119+
describe("custom validation classes", () => {
120+
before(() => {
121+
let options = {
122+
validationErrorClass: "has-error",
123+
validationSuccessClass: "has-success",
124+
};
125+
createFormGenerator(schema, null, options);
126+
group = el.querySelector(".form-group");
127+
});
128+
129+
it("error class", (done) => {
130+
vm.$refs.form.errors.push({field: vm.schema.fields[0], error: "Validation error!"});
131+
vm.$nextTick(() => {
132+
expect(group.classList.contains("has-error")).to.be.true;
133+
done();
134+
});
135+
});
136+
137+
it("success class", (done) => {
138+
vm.$refs.form.errors = [];
139+
vm.$nextTick(() => {
140+
expect(group.classList.contains("has-success")).to.be.true;
141+
done();
142+
});
143+
});
144+
});
145+
119146
it("should be add a custom classes", (done) => {
120147
Vue.set(vm.schema.fields[0], "styleClasses", "classA");
121148
vm.$nextTick(() => {

0 commit comments

Comments
 (0)