From 510deba6d7e71db2f08913be1c07269bc4eb6872 Mon Sep 17 00:00:00 2001 From: Alireza Mirian Date: Sat, 5 Jun 2021 16:39:36 +0200 Subject: [PATCH] fix(@react-stately/date): update parentKey when a tree node is moved to another parent closes #1987 --- packages/@react-stately/data/src/useTreeData.ts | 8 +++++++- .../@react-stately/data/test/useTreeData.test.js | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/@react-stately/data/src/useTreeData.ts b/packages/@react-stately/data/src/useTreeData.ts index 893521f98aa..c6feaf8ab5c 100644 --- a/packages/@react-stately/data/src/useTreeData.ts +++ b/packages/@react-stately/data/src/useTreeData.ts @@ -316,13 +316,19 @@ export function useTreeData(options: TreeOptions): TreeData } items = updateTree(items, key, () => null); + + const movedNode = { + ...node, + parentKey: toParentKey + }; + return updateTree(items, toParentKey, parentNode => ({ key: parentNode.key, parentKey: parentNode.parentKey, value: parentNode.value, children: [ ...parentNode.children.slice(0, index), - node, + movedNode, ...parentNode.children.slice(index) ] })); diff --git a/packages/@react-stately/data/test/useTreeData.test.js b/packages/@react-stately/data/test/useTreeData.test.js index 4acb9510dcf..49bd45b3386 100644 --- a/packages/@react-stately/data/test/useTreeData.test.js +++ b/packages/@react-stately/data/test/useTreeData.test.js @@ -528,11 +528,23 @@ describe('useTreeData', function () { expect(result.current.items[0].children[0]).toBe(initialResult.items[0].children[0]); expect(result.current.items[0].children[1]).not.toBe(initialResult.items[0].children[1]); expect(result.current.items[0].children[1].children).toHaveLength(2); - expect(result.current.items[0].children[1].children[0]).toBe(initialResult.items[0].children[1].children[1]); + expect(result.current.items[0].children[1].children[0]).toEqual(initialResult.items[0].children[1].children[1]); expect(result.current.items[0].children[1].children[1]).toBe(initialResult.items[0].children[1].children[0]); expect(result.current.items[0].children[2]).toBe(initialResult.items[0].children[2]); }); + it('update parentKey when a node is moved to another parent', function () { + const {result} = renderHook(() => useTreeData({initialItems: initial, getChildren, getKey})); + + act(() => { + result.current.move('Brad', 'John', 0); + }); + + const john = result.current.items[0].children[0]; + const brad = john.children[0]; + expect(brad.parentKey).toBe(john.key); + }); + it('should move an item to a different parent', function () { let {result} = renderHook(() => useTreeData({initialItems: initial, getChildren, getKey})); let initialResult = result.current; @@ -547,7 +559,7 @@ describe('useTreeData', function () { expect(result.current.items[0].children).toHaveLength(3); expect(result.current.items[0].children[0]).not.toBe(initialResult.items[0].children[0]); expect(result.current.items[0].children[0].children).toHaveLength(2); - expect(result.current.items[0].children[0].children[0]).toBe(initialResult.items[0].children[1].children[1]); + expect(result.current.items[0].children[0].children[0].value).toBe(initialResult.items[0].children[1].children[1].value); expect(result.current.items[0].children[0].children[1]).toBe(initialResult.items[0].children[0].children[0]); expect(result.current.items[0].children[1]).not.toBe(initialResult.items[0].children[1]); expect(result.current.items[0].children[1].children).toHaveLength(1);