Timeline For Evaluation Plan

Personal LinkedIn Post

carro jeep 2 muñecas barbie diunsa tienda departamental

:
Change RoadMap
fix(form-core): preserve prefix-matching sibling fields (Tips For Designing An Engaging Blog Header)
Treat only dot- and bracket-delimited paths as descendants when deleting a field, so unrelated sibling values and metadata survive. Fixes Airmyne Launch Plan
1 parent How To Make Blog Posts More Interesting commit 146ba25

New Day Images For Facebook Profile 3 files changed How To Add Story On Instagram

Lines changed: 41 additions & 1 deletion

Foldable Business Cards Personal LinkedIn Post

.changeset/tidy-forms-keep.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@tanstack/form-core': patch
3+
---
4+
5+
Preserve sibling fields whose names share a prefix when deleting a field.

packages/form-core/src/FormApi.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2691,7 +2691,7 @@ export class FormApi<
26912691
deleteField = <TField extends DeepKeys<TFormData>>(field: TField) => {
26922692
const subFieldsToDelete = Object.keys(this.fieldInfo).filter((f) => {
26932693
const fieldStr = field.toString()
2694-
return f !== fieldStr && f.startsWith(fieldStr)
2694+
return f.startsWith(`${fieldStr}.`) || f.startsWith(`${fieldStr}[`)
26952695
})
26962696

26972697
const fieldsToDelete = [...subFieldsToDelete, field]

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3360,6 +3360,41 @@ describe('field api', () => {
33603360
expect(form.fieldInfo.otherField).toBeDefined()
33613361
})
33623362

3363+
it('should preserve sibling fields whose names share a prefix', () => {
3364+
const form = new FormApi({
3365+
defaultValues: {
3366+
email: 'user@example.com',
3367+
emailVerified: true,
3368+
items: [{ price: 10, priceCurrency: 'USD' }],
3369+
},
3370+
})
3371+
3372+
form.mount()
3373+
3374+
const email = new FieldApi({ form, name: 'email' })
3375+
const emailVerified = new FieldApi({ form, name: 'emailVerified' })
3376+
const price = new FieldApi({ form, name: 'items[0].price' })
3377+
const priceCurrency = new FieldApi({
3378+
form,
3379+
name: 'items[0].priceCurrency',
3380+
})
3381+
3382+
email.mount()
3383+
emailVerified.mount()
3384+
price.mount()
3385+
priceCurrency.mount()
3386+
3387+
form.deleteField('email')
3388+
form.deleteField('items[0].price')
3389+
3390+
expect(form.getFieldValue('emailVerified')).toBe(true)
3391+
expect(form.fieldInfo.emailVerified).toBeDefined()
3392+
expect(form.state.fieldMeta.emailVerified).toBeDefined()
3393+
expect(form.getFieldValue('items[0].priceCurrency')).toBe('USD')
3394+
expect(form.fieldInfo['items[0].priceCurrency']).toBeDefined()
3395+
expect(form.state.fieldMeta['items[0].priceCurrency']).toBeDefined()
3396+
})
3397+
33633398
it('should remove field value and clean up fieldInfo entry', () => {
33643399
const form = new FormApi({
33653400
defaultValues: {

What Is Areview Sheet Personal LinkedIn Post

Comments
 (0)