@mantine/core
Version:
React components library focused on usability, accessibility and developer experience
78 lines (77 loc) • 2.43 kB
JavaScript
"use client";
const require_get_children_nodes_values = require("../get-children-nodes-values/get-children-nodes-values.cjs");
//#region packages/@mantine/core/src/components/Tree/move-tree-node/move-tree-node.ts
function isDescendant(data, ancestorValue, value) {
const ancestor = require_get_children_nodes_values.findTreeNode(ancestorValue, data);
if (!ancestor || !ancestor.children) return false;
function check(nodes) {
for (const node of nodes) {
if (node.value === value) return true;
if (node.children && check(node.children)) return true;
}
return false;
}
return check(ancestor.children);
}
function removeNode(data, value) {
let removed = null;
return {
data: data.reduce((acc, node) => {
if (node.value === value) {
removed = { ...node };
return acc;
}
if (node.children) {
const result = removeNode(node.children, value);
if (result.removed) {
removed = result.removed;
acc.push({
...node,
children: result.data
});
} else acc.push(node);
} else acc.push(node);
return acc;
}, []),
removed
};
}
function insertNode(data, node, targetValue, position) {
if (position === "inside") return data.map((item) => {
if (item.value === targetValue) return {
...item,
children: [...item.children || [], node]
};
if (item.children) return {
...item,
children: insertNode(item.children, node, targetValue, position)
};
return item;
});
const targetIndex = data.findIndex((item) => item.value === targetValue);
if (targetIndex !== -1) {
const result = [...data];
const insertIndex = position === "before" ? targetIndex : targetIndex + 1;
result.splice(insertIndex, 0, node);
return result;
}
return data.map((item) => {
if (item.children) return {
...item,
children: insertNode(item.children, node, targetValue, position)
};
return item;
});
}
function moveTreeNode(data, payload) {
const { draggedNode, targetNode, position } = payload;
if (draggedNode === targetNode) return data;
if (!require_get_children_nodes_values.findTreeNode(targetNode, data)) return data;
if (isDescendant(data, draggedNode, targetNode)) return data;
const { data: dataWithout, removed } = removeNode(data, draggedNode);
if (!removed) return data;
return insertNode(dataWithout, removed, targetNode, position);
}
//#endregion
exports.moveTreeNode = moveTreeNode;
//# sourceMappingURL=move-tree-node.cjs.map