Skip to content

Commit 4e11ff9

Browse files
committedJul 8, 2023
fix: validate form values on setValues by default closes #4359
1 parent 8bd9efa commit 4e11ff9

File tree

4 files changed

+53
-4
lines changed

4 files changed

+53
-4
lines changed
 

Diff for: ‎.changeset/rotten-buttons-kiss.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'vee-validate': patch
3+
---
4+
5+
fix: validate form values on setValues by default closes #4359

Diff for: ‎packages/vee-validate/src/types/forms.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ export interface FormActions<TValues extends GenericObject, TOutput = TValues> {
165165
setFieldValue<T extends Path<TValues>>(field: T, value: PathValue<TValues, T>, shouldValidate?: boolean): void;
166166
setFieldError(field: Path<TValues>, message: string | string[] | undefined): void;
167167
setErrors(fields: FormErrors<TValues>): void;
168-
setValues(fields: PartialDeep<TValues>): void;
168+
setValues(fields: PartialDeep<TValues>, shouldValidate?: boolean): void;
169169
setFieldTouched(field: Path<TValues>, isTouched: boolean): void;
170170
setTouched(fields: Partial<Record<Path<TValues>, boolean>>): void;
171171
resetForm(state?: Partial<FormState<TValues>>): void;

Diff for: ‎packages/vee-validate/src/useForm.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -590,11 +590,14 @@ export function useForm<
590590
/**
591591
* Sets multiple fields values
592592
*/
593-
function setValues(fields: PartialDeep<TValues>) {
593+
function setValues(fields: PartialDeep<TValues>, shouldValidate = true) {
594594
merge(formValues, fields);
595-
596595
// regenerate the arrays when the form values change
597596
fieldArrays.forEach(f => f && f.reset());
597+
598+
if (shouldValidate) {
599+
validate();
600+
}
598601
}
599602

600603
function createModel<TPath extends Path<TValues>>(path: MaybeRef<TPath>) {
@@ -670,7 +673,7 @@ export function useForm<
670673
setFieldValue(state.path as Path<TValues>, getFromPath(newValues, state.path), false);
671674
setFieldError(state.path as Path<TValues>, undefined);
672675
});
673-
setValues(newValues);
676+
setValues(newValues, false);
674677

675678
setErrors(resetState?.errors || {});
676679
submitCount.value = resetState?.submitCount || 0;

Diff for: ‎packages/vee-validate/tests/useForm.spec.ts

+41
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,47 @@ describe('useForm()', () => {
158158
expect(meta[2]?.textContent).toBe('true');
159159
});
160160

161+
// #4359
162+
test('setValues should validate by default', async () => {
163+
let form!: FormContext<any>;
164+
mountWithHoc({
165+
setup() {
166+
form = useForm({ validationSchema: yup.object().shape({ field: yup.string().required(REQUIRED_MESSAGE) }) });
167+
form.defineInputBinds('field');
168+
169+
return {};
170+
},
171+
template: `<div></div>`,
172+
});
173+
174+
await flushPromises();
175+
expect(form.errors.value.field).toBe(undefined);
176+
177+
form.setValues({ field: '' });
178+
await flushPromises();
179+
expect(form.errors.value.field).toBe(REQUIRED_MESSAGE);
180+
});
181+
182+
test('setValues should not validate if passed false as second arg', async () => {
183+
let form!: FormContext<any>;
184+
mountWithHoc({
185+
setup() {
186+
form = useForm({ validationSchema: yup.object().shape({ field: yup.string().required(REQUIRED_MESSAGE) }) });
187+
form.defineInputBinds('field');
188+
189+
return {};
190+
},
191+
template: `<div></div>`,
192+
});
193+
194+
await flushPromises();
195+
expect(form.errors.value.field).toBe(undefined);
196+
197+
form.setValues({ field: '' }, false);
198+
await flushPromises();
199+
expect(form.errors.value.field).toBe(undefined);
200+
});
201+
161202
test('has a validate() method that returns an aggregate of validation results using field rules', async () => {
162203
let validate: any;
163204
mountWithHoc({

0 commit comments

Comments
 (0)
Please sign in to comment.