Skip to content

Commit f7aa4e3

Browse files
kevinkielsstoel
authored andcommitted
On blur (#1)
* onBlur validation * Only validate when validateOffFocus is true * Rename validateOffFocus => validateAfterBlur * Make is possible to overwrite field validation * no message
1 parent fe66d78 commit f7aa4e3

File tree

5 files changed

+49
-12
lines changed

5 files changed

+49
-12
lines changed

src/fields/abstractField.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,30 @@ export default {
162162
this.schema.onChanged.call(this, this.model, newValue, oldValue, this.schema);
163163
}
164164

165-
if (objGet(this.formOptions, "validateAfterChanged", false) === true) {
166-
if (objGet(this.schema, "validateDebounceTime", objGet(this.formOptions, "validateDebounceTime", 0)) > 0) {
167-
this.debouncedValidate();
168-
} else {
169-
this.validate();
165+
if (
166+
(this.schema.validation && this.schema.validation === 'onBlur') ||
167+
(!this.schema.validation && objGet(this.formOptions, 'validateAfterBlur', false) === true)
168+
) {
169+
if (this.errors && this.errors[0]) {
170+
this.validateSchemaField()
170171
}
172+
} else if (
173+
(this.schema.validation && this.schema.validation === 'onChanged') ||
174+
(!this.schema.validation && objGet(this.formOptions, 'validateAfterChanged', false) === true)
175+
) {
176+
this.validateSchemaField()
171177
}
172178
}
173179
},
174180

181+
validateSchemaField() {
182+
if (objGet(this.schema, "validateDebounceTime", objGet(this.formOptions, "validateDebounceTime", 0)) > 0) {
183+
this.debouncedValidate();
184+
} else {
185+
this.validate();
186+
}
187+
},
188+
175189
clearValidationErrors() {
176190
this.errors.splice(0);
177191
},

src/fields/core/fieldInput.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,12 @@ export default {
135135
}
136136
this.value = value;
137137
},
138-
onBlur() {
138+
onBlur($event) {
139139
if (isFunction(this.debouncedFormatFunc)) {
140140
this.debouncedFormatFunc.flush();
141141
}
142+
143+
this.$emit("blur", $event.target.value, this.schema.model);
142144
}
143145
},
144146

src/fields/core/fieldTextArea.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
:id="getFieldID(schema)",
55
:class="schema.fieldClasses",
66
:disabled="disabled",
7+
@blur="onBlur",
78
:maxlength="schema.max",
89
:minlength="schema.min",
910
:placeholder="schema.placeholder",
@@ -18,7 +19,12 @@
1819
import abstractField from "../abstractField";
1920
2021
export default {
21-
mixins: [abstractField]
22+
mixins: [abstractField],
23+
methods: {
24+
onBlur($event) {
25+
this.$emit("blur", $event.target.value, this.schema.model);
26+
}
27+
}
2228
};
2329
</script>
2430

src/formGenerator.vue

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
div.vue-form-generator(v-if='schema != null')
33
fieldset(v-if="schema.fields", :is='tag')
44
template(v-for='field in fields')
5-
form-group(v-if='isVisible(field)', :vfg="vfg", :field="field", :errors="errors", :model="model", :options="options", @validated="onFieldValidated", @model-updated="onModelUpdated")
5+
form-group(v-if='isVisible(field)', :vfg="vfg", :field="field", :errors="errors", :model="model", :options="options", @blur="onBlur", @validated="onFieldValidated", @model-updated="onModelUpdated")
66

77
template(v-for='group in groups')
88
fieldset(v-if='isVisible(group)', :is='tag', :class='getFieldRowClasses(group)')
99
legend(v-if='group.legend') {{ group.legend }}
1010
template(v-for='field in group.fields')
11-
form-group(v-if='isVisible(field)', :vfg="vfg", :field="field", :errors="errors", :model="model", :options="options", @validated="onFieldValidated", @model-updated="onModelUpdated")
11+
form-group(v-if='isVisible(field)', :vfg="vfg", :field="field", :errors="errors", :model="model", :options="options", @blur="onBlur", @validated="onFieldValidated", @model-updated="onModelUpdated")
1212
</template>
1313

1414
<script>
@@ -130,6 +130,12 @@ export default {
130130
},
131131
132132
methods: {
133+
onBlur(value, model) {
134+
if(objGet(this.options, "validateAfterBlur", false)) {
135+
this.validateModelField(model)
136+
}
137+
},
138+
133139
// Get visible prop of field/group
134140
isVisible(option) {
135141
if (isFunction(option.visible)) return option.visible.call(this, this.model, option, this);
@@ -139,15 +145,21 @@ export default {
139145
return option.visible;
140146
},
141147
148+
142149
// Validating one or more model properties
143150
validateModelField(model) {
144-
this.clearValidationErrors();
145-
146151
forEach(this.$children, child => {
147152
if (isFunction(child.validate)) {
148153
if (model.includes(child.field.model)) {
149154
child.validate(true).then(function (error) {
150155
if (error[0]) {
156+
// Remove old child errors
157+
Object.keys(this.errors)
158+
.filter((key) => {
159+
return this.errors[key].field.model === child.field.model
160+
})
161+
.forEach(key => delete this.errors[key]);
162+
151163
this.errors.push({
152164
field: child.field,
153165
error: error[0]

src/formGroup.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</label>
1010

1111
<div class="field-wrap">
12-
<component ref="child" :is="getFieldType(field)" :vfg="vfg" :disabled="fieldDisabled(field)" :model="model" :schema="field" :formOptions="options" @model-updated="onModelUpdated" @validated="onFieldValidated"></component>
12+
<component ref="child" :is="getFieldType(field)" :vfg="vfg" :disabled="fieldDisabled(field)" :model="model" :schema="field" :formOptions="options" @blur="onBlurValidated" @model-updated="onModelUpdated" @validated="onFieldValidated"></component>
1313
<div v-if="buttonVisibility(field)" class="buttons">
1414
<button v-for="(btn, index) in field.buttons" @click="buttonClickHandler(btn, field, $event)" :class="btn.classes" :key="index" v-text="btn.label" :type="getButtonType(btn)"></button>
1515
</div>
@@ -123,6 +123,9 @@ export default {
123123
fieldErrors(field) {
124124
return this.errors.filter((e) => e.field === field).map((item) => item.error);
125125
},
126+
onBlurValidated(newVal, schema) {
127+
this.$emit("blur", newVal, schema);
128+
},
126129
onModelUpdated(newVal, schema) {
127130
this.$emit("model-updated", newVal, schema);
128131
},

0 commit comments

Comments
 (0)