Skip to content

Commit b9219b6

Browse files
authored
fix(form-core): prevent FormApi#moveFieldValues from mutating defaultValues (#1560)
* fix: moveFieldValues mutates default values * feat: improve unit test * fix: add clearFieldValues
1 parent 77acb33 commit b9219b6

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

packages/form-core/src/FormApi.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2110,8 +2110,9 @@ export class FormApi<
21102110
this.setFieldValue(
21112111
field,
21122112
(prev: any) => {
2113-
prev.splice(index2, 0, prev.splice(index1, 1)[0])
2114-
return prev
2113+
const next: any = [...prev]
2114+
next.splice(index2, 0, next.splice(index1, 1)[0])
2115+
return next
21152116
},
21162117
opts,
21172118
)

packages/form-core/tests/FormApi.spec.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,42 @@ describe('form api', () => {
986986
expect(field2Surname.state.meta.isBlurred).toBe(false)
987987
})
988988

989+
it('should preserve array default values when manipulating array values', () => {
990+
const defaultValues = {
991+
names: ['one', 'two', 'three'],
992+
}
993+
const form = new FormApi({
994+
defaultValues,
995+
})
996+
form.mount()
997+
form.pushFieldValue('names', 'four')
998+
expect(form.options.defaultValues?.names).toStrictEqual(defaultValues.names)
999+
1000+
form.reset()
1001+
form.insertFieldValue('names', 0, 'other')
1002+
expect(form.options.defaultValues?.names).toStrictEqual(defaultValues.names)
1003+
1004+
form.reset()
1005+
form.replaceFieldValue('names', 1, 'other')
1006+
expect(form.options.defaultValues?.names).toStrictEqual(defaultValues.names)
1007+
1008+
form.reset()
1009+
form.removeFieldValue('names', 1)
1010+
expect(form.options.defaultValues?.names).toStrictEqual(defaultValues.names)
1011+
1012+
form.reset()
1013+
form.swapFieldValues('names', 1, 2)
1014+
expect(form.options.defaultValues?.names).toStrictEqual(defaultValues.names)
1015+
1016+
form.reset()
1017+
form.moveFieldValues('names', 1, 2)
1018+
expect(form.options.defaultValues?.names).toStrictEqual(defaultValues.names)
1019+
1020+
form.reset()
1021+
form.clearFieldValues('names')
1022+
expect(form.options.defaultValues?.names).toStrictEqual(defaultValues.names)
1023+
})
1024+
9891025
it('should handle fields inside an array', async () => {
9901026
interface Employee {
9911027
firstName: string

0 commit comments

Comments
 (0)