Skip to content

Commit d75959f

Browse files
logaretmclaude
andcommitted
fix: resetField({ value: undefined }) form validity (#4996)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7d8cc52 commit d75959f

3 files changed

Lines changed: 58 additions & 0 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"vee-validate": patch
3+
---
4+
5+
Fix resetField({ value: undefined }) preventing form from becoming valid (#4996)

packages/vee-validate/src/useForm.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,7 @@ export function useForm<
779779
const pathState = findPathState(field);
780780
if (pathState) {
781781
pathState.__flags.pendingReset = true;
782+
pathState.validated = false;
782783
}
783784

784785
setFieldInitialValue(field, deepCopy(newValue), true);
@@ -790,6 +791,8 @@ export function useForm<
790791
if (pathState) {
791792
pathState.__flags.pendingReset = false;
792793
}
794+
795+
validateField(field, { mode: 'silent' });
793796
});
794797
}
795798

packages/vee-validate/tests/useForm.spec.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1489,4 +1489,54 @@ describe('useForm()', () => {
14891489
form.setValues({ file: f2 });
14901490
expect(form.values.file).toEqual(f2);
14911491
});
1492+
1493+
// #4996
1494+
test('resetField with undefined value should not prevent form from becoming valid', async () => {
1495+
let form!: FormContext<{ name: string }>;
1496+
1497+
mountWithHoc({
1498+
setup() {
1499+
form = useForm({
1500+
validationSchema: z.object({
1501+
name: z.string().min(1),
1502+
}),
1503+
});
1504+
1505+
form.defineField('name');
1506+
1507+
return {};
1508+
},
1509+
template: `
1510+
<div></div>
1511+
`,
1512+
});
1513+
1514+
await flushPromises();
1515+
1516+
// Fill in a valid value and validate
1517+
form.setFieldValue('name', 'John');
1518+
await flushPromises();
1519+
1520+
const pending1 = form.validate();
1521+
await flushPromises();
1522+
const result1 = await pending1;
1523+
expect(result1.valid).toBe(true);
1524+
expect(form.meta.value.valid).toBe(true);
1525+
1526+
// Reset field with undefined value using form-level resetField
1527+
form.resetField('name', { value: undefined });
1528+
await flushPromises();
1529+
1530+
// After reset, validated should be false so that subsequent validation works correctly
1531+
const pathState = form.getPathState('name');
1532+
expect(pathState?.validated).toBe(false);
1533+
1534+
// Now fill in a valid value again
1535+
form.setFieldValue('name', 'Jane');
1536+
await flushPromises();
1537+
1538+
// The form should be valid again
1539+
expect(form.meta.value.valid).toBe(true);
1540+
expect(form.errors.value.name).toBeUndefined();
1541+
});
14921542
});

0 commit comments

Comments
 (0)