diff --git a/packages/clay-core/src/tree-view/DragLayer.tsx b/packages/clay-core/src/tree-view/DragLayer.tsx index 10e63d3534..97788a3988 100644 --- a/packages/clay-core/src/tree-view/DragLayer.tsx +++ b/packages/clay-core/src/tree-view/DragLayer.tsx @@ -32,6 +32,11 @@ function getItemStyles( return { WebkitTransform: transform, + backgroundColor: 'white', + border: '1px solid aliceblue', + maxWidth: '140px', + padding: '2px', + textAlign: 'center', transform, }; } diff --git a/packages/clay-core/src/tree-view/__tests__/useTree.ts b/packages/clay-core/src/tree-view/__tests__/useTree.ts index 3da4c715a9..efcb69932e 100644 --- a/packages/clay-core/src/tree-view/__tests__/useTree.ts +++ b/packages/clay-core/src/tree-view/__tests__/useTree.ts @@ -77,4 +77,50 @@ describe('useTree', () => { expect(result).toMatchObject(newTree); }); + + it('can move nested items', () => { + const tree = [ + { + children: [{name: 'Blogs'}, {name: 'Documents and Media'}], + name: 'Liferay Drive', + }, + { + children: [{name: 'Blogs'}, {name: 'Documents and Media'}], + name: 'Repositories', + }, + { + children: [{name: 'PDF'}, {name: 'Word'}], + name: 'Documents and Media', + }, + ]; + + const newTree = [ + { + children: [ + {name: 'Blogs'}, + { + children: [{name: 'PDF'}], + name: 'Documents and Media', + }, + ], + name: 'Liferay Drive', + }, + { + children: [{name: 'Blogs'}, {name: 'Documents and Media'}], + name: 'Repositories', + }, + { + children: [{name: 'Word'}], + name: 'Documents and Media', + }, + ]; + + const immutableTree = createImmutableTree(tree, 'children'); + + immutableTree.produce([2, 0], [0, 1]); + + const result = immutableTree.applyPatches(); + + expect(result).toMatchObject(newTree); + }); }); diff --git a/packages/clay-core/src/tree-view/useItem.tsx b/packages/clay-core/src/tree-view/useItem.tsx index f2eb92751a..cc25a38a46 100644 --- a/packages/clay-core/src/tree-view/useItem.tsx +++ b/packages/clay-core/src/tree-view/useItem.tsx @@ -56,7 +56,7 @@ export function ItemContextProvider({children, value}: Props) { preview(getEmptyImage(), {captureDraggingState: true}); }, [preview]); - const [, drop] = useDrop({ + const [{overTarget}, drop] = useDrop({ accept: 'treeViewItem', collect: (monitor) => ({ canDrop: monitor.canDrop(), @@ -81,6 +81,7 @@ export function ItemContextProvider({children, value}: Props) { return ( {React.cloneElement(children as JSX.Element, { + overTarget, ref: childRef, })} diff --git a/packages/clay-core/src/tree-view/useTree.ts b/packages/clay-core/src/tree-view/useTree.ts index c651e392de..a77a6711c0 100644 --- a/packages/clay-core/src/tree-view/useTree.ts +++ b/packages/clay-core/src/tree-view/useTree.ts @@ -178,33 +178,15 @@ export function createImmutableTree>>( const pathToAdd = nodeByPath(path); - if (pathToAdd.parent) { - if (!Array.isArray(pathToAdd.parent[nestedKey])) { - pathToAdd.parent[nestedKey] = []; - } - - pathToAdd.parent[nestedKey].splice(pathToAdd.index, 1); - pathToAdd.parent[nestedKey].splice( - pathToAdd.index, - 0, - nodeToRemove.item - ); - pathToAdd.parent[nestedKey].splice( - pathToAdd.index + 1, - 0, - pathToAdd.item - ); - } else { - if (!Array.isArray(pathToAdd.item[nestedKey])) { - pathToAdd.item[nestedKey] = []; - } - - pathToAdd.item[nestedKey] = [ - ...pathToAdd.item[nestedKey], - nodeToRemove.item, - ]; + if (!Array.isArray(pathToAdd.item[nestedKey])) { + pathToAdd.item[nestedKey] = []; } + pathToAdd.item[nestedKey] = [ + ...pathToAdd.item[nestedKey], + nodeToRemove.item, + ]; + break; } default: