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: