From f03810c0d023a78212993b8ce6130011b651d553 Mon Sep 17 00:00:00 2001 From: xuyuan Date: Wed, 27 Oct 2021 14:48:09 +0800 Subject: [PATCH 1/2] fix(core): make exchangeArrayState be right when move --- packages/core/src/__tests__/array.spec.ts | 55 +++++++++++++++++++++++ packages/core/src/shared/internals.ts | 20 +++++++-- 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/packages/core/src/__tests__/array.spec.ts b/packages/core/src/__tests__/array.spec.ts index e7582a27a74..585ba408c90 100644 --- a/packages/core/src/__tests__/array.spec.ts +++ b/packages/core/src/__tests__/array.spec.ts @@ -140,6 +140,61 @@ test('array field children state exchanges', () => { expect(form.query('array.2.value').get('value')).toEqual(55) }) +test('array field move up/down then fields move', () => { + const form = attach(createForm()) + const array = attach( + form.createArrayField({ + name: 'array', + }) + ) + attach( + form.createField({ + name: 'value', + basePath: 'array.0', + }) + ) + attach( + form.createField({ + name: 'value', + basePath: 'array.1', + }) + ) + attach( + form.createField({ + name: 'value', + basePath: 'array.2', + }) + ) + attach( + form.createField({ + name: 'value', + basePath: 'array.3', + }) + ) + const line0 = form.fields['array.0.value'] + const line1 = form.fields['array.1.value'] + const line2 = form.fields['array.2.value'] + const line3 = form.fields['array.3.value'] + + array.push({ value: '0' }, { value: '1' }, { value: '2' }, { value: '3' }) + + array.move(0, 3) + + // 1,2,3,0 + expect(form.fields['array.0.value']).toBe(line1) + expect(form.fields['array.1.value']).toBe(line2) + expect(form.fields['array.2.value']).toBe(line3) + expect(form.fields['array.3.value']).toBe(line0) + + array.move(3, 1) + + // 1,0,2,3 + expect(form.fields['array.0.value']).toBe(line1) + expect(form.fields['array.1.value']).toBe(line0) + expect(form.fields['array.2.value']).toBe(line2) + expect(form.fields['array.3.value']).toBe(line3) +}) + test('void children', () => { const form = attach(createForm()) const array = attach( diff --git a/packages/core/src/shared/internals.ts b/packages/core/src/shared/internals.ts index 2d08df7132c..2cbec1b7d7d 100644 --- a/packages/core/src/shared/internals.ts +++ b/packages/core/src/shared/internals.ts @@ -423,12 +423,24 @@ export const exchangeArrayState = ( return identifier.indexOf(address) === 0 && identifier.length > addrLength } - const isFromOrToNode = (identifier: string) => { + const isDown = fromIndex < toIndex + + const isMoveNode = (identifier: string) => { + const afterStr = identifier.slice(address.length) + const number = afterStr.match(NumberIndexReg)?.[1] + if (number === undefined) return false + const index = Number(number) + return isDown + ? index > fromIndex && index <= toIndex + : index < fromIndex && index >= toIndex + } + + const isFromNode = (identifier: string) => { const afterStr = identifier.substring(addrLength) const number = afterStr.match(NumberIndexReg)?.[1] if (number === undefined) return false const index = Number(number) - return index === toIndex || index === fromIndex + return index === fromIndex } const moveIndex = (identifier: string) => { @@ -440,7 +452,7 @@ export const exchangeArrayState = ( if (index === fromIndex) { index = toIndex } else { - index = fromIndex + index += isDown ? -1 : 1 } return `${preStr}${afterStr.replace(/^\.\d+/, `.${index}`)}` @@ -449,7 +461,7 @@ export const exchangeArrayState = ( batch(() => { each(fields, (field, identifier) => { if (isArrayChildren(identifier)) { - if (isFromOrToNode(identifier)) { + if (isMoveNode(identifier) || isFromNode(identifier)) { const newIdentifier = moveIndex(identifier) fieldPatches.push({ type: 'update', From c61ae01b7ec624c5dd90d5c08836e7c019578bf5 Mon Sep 17 00:00:00 2001 From: xuyuan Date: Wed, 27 Oct 2021 16:21:56 +0800 Subject: [PATCH 2/2] fix(chore): old unit logic error --- packages/core/src/__tests__/array.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/src/__tests__/array.spec.ts b/packages/core/src/__tests__/array.spec.ts index 585ba408c90..59e9504c77e 100644 --- a/packages/core/src/__tests__/array.spec.ts +++ b/packages/core/src/__tests__/array.spec.ts @@ -411,8 +411,9 @@ test('array field move api with children', async () => { }) ) await array.move(0, 2) - expect(form.fields['array.0.name']).not.toBeUndefined() + expect(form.fields['array.0.name']).toBeUndefined() expect(form.fields['array.2.name']).toBeUndefined() + expect(form.fields['array.1.name']).not.toBeUndefined() }) test('array field remove memo leak', async () => {