UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

1 lines 4.97 kB
{"version":3,"file":"move-tree-node.cjs","names":["findTreeNode"],"sources":["../../../../src/components/Tree/move-tree-node/move-tree-node.ts"],"sourcesContent":["import { findTreeNode } from '../get-children-nodes-values/get-children-nodes-values';\nimport type { TreeNodeData } from '../Tree';\n\nexport type TreeDragDropPosition = 'before' | 'after' | 'inside';\n\nexport interface TreeDragDropPayload {\n /** Value of the dragged node */\n draggedNode: string;\n\n /** Value of the target node */\n targetNode: string;\n\n /** Position relative to the target node */\n position: TreeDragDropPosition;\n}\n\nfunction isDescendant(data: TreeNodeData[], ancestorValue: string, value: string): boolean {\n const ancestor = findTreeNode(ancestorValue, data);\n if (!ancestor || !ancestor.children) {\n return false;\n }\n\n function check(nodes: TreeNodeData[]): boolean {\n for (const node of nodes) {\n if (node.value === value) {\n return true;\n }\n\n if (node.children && check(node.children)) {\n return true;\n }\n }\n\n return false;\n }\n\n return check(ancestor.children);\n}\n\nfunction removeNode(\n data: TreeNodeData[],\n value: string\n): { data: TreeNodeData[]; removed: TreeNodeData | null } {\n let removed: TreeNodeData | null = null;\n\n const newData = data.reduce<TreeNodeData[]>((acc, node) => {\n if (node.value === value) {\n removed = { ...node };\n return acc;\n }\n\n if (node.children) {\n const result = removeNode(node.children, value);\n if (result.removed) {\n removed = result.removed;\n acc.push({ ...node, children: result.data });\n } else {\n acc.push(node);\n }\n } else {\n acc.push(node);\n }\n\n return acc;\n }, []);\n\n return { data: newData, removed };\n}\n\nfunction insertNode(\n data: TreeNodeData[],\n node: TreeNodeData,\n targetValue: string,\n position: TreeDragDropPosition\n): TreeNodeData[] {\n if (position === 'inside') {\n return data.map((item) => {\n if (item.value === targetValue) {\n return { ...item, children: [...(item.children || []), node] };\n }\n\n if (item.children) {\n return { ...item, children: insertNode(item.children, node, targetValue, position) };\n }\n\n return item;\n });\n }\n\n const targetIndex = data.findIndex((item) => item.value === targetValue);\n\n if (targetIndex !== -1) {\n const result = [...data];\n const insertIndex = position === 'before' ? targetIndex : targetIndex + 1;\n result.splice(insertIndex, 0, node);\n return result;\n }\n\n return data.map((item) => {\n if (item.children) {\n return { ...item, children: insertNode(item.children, node, targetValue, position) };\n }\n\n return item;\n });\n}\n\nexport function moveTreeNode(data: TreeNodeData[], payload: TreeDragDropPayload): TreeNodeData[] {\n const { draggedNode, targetNode, position } = payload;\n\n if (draggedNode === targetNode) {\n return data;\n }\n\n if (!findTreeNode(targetNode, data)) {\n return data;\n }\n\n if (isDescendant(data, draggedNode, targetNode)) {\n return data;\n }\n\n const { data: dataWithout, removed } = removeNode(data, draggedNode);\n\n if (!removed) {\n return data;\n }\n\n return insertNode(dataWithout, removed, targetNode, position);\n}\n"],"mappings":";;;AAgBA,SAAS,aAAa,MAAsB,eAAuB,OAAwB;CACzF,MAAM,WAAWA,kCAAAA,aAAa,eAAe,IAAI;CACjD,IAAI,CAAC,YAAY,CAAC,SAAS,UACzB,OAAO;CAGT,SAAS,MAAM,OAAgC;EAC7C,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,KAAK,UAAU,OACjB,OAAO;GAGT,IAAI,KAAK,YAAY,MAAM,KAAK,QAAQ,GACtC,OAAO;EAEX;EAEA,OAAO;CACT;CAEA,OAAO,MAAM,SAAS,QAAQ;AAChC;AAEA,SAAS,WACP,MACA,OACwD;CACxD,IAAI,UAA+B;CAuBnC,OAAO;EAAE,MArBO,KAAK,QAAwB,KAAK,SAAS;GACzD,IAAI,KAAK,UAAU,OAAO;IACxB,UAAU,EAAE,GAAG,KAAK;IACpB,OAAO;GACT;GAEA,IAAI,KAAK,UAAU;IACjB,MAAM,SAAS,WAAW,KAAK,UAAU,KAAK;IAC9C,IAAI,OAAO,SAAS;KAClB,UAAU,OAAO;KACjB,IAAI,KAAK;MAAE,GAAG;MAAM,UAAU,OAAO;KAAK,CAAC;IAC7C,OACE,IAAI,KAAK,IAAI;GAEjB,OACE,IAAI,KAAK,IAAI;GAGf,OAAO;EACT,GAAG,CAAC,CAEiB;EAAG;CAAQ;AAClC;AAEA,SAAS,WACP,MACA,MACA,aACA,UACgB;CAChB,IAAI,aAAa,UACf,OAAO,KAAK,KAAK,SAAS;EACxB,IAAI,KAAK,UAAU,aACjB,OAAO;GAAE,GAAG;GAAM,UAAU,CAAC,GAAI,KAAK,YAAY,CAAC,GAAI,IAAI;EAAE;EAG/D,IAAI,KAAK,UACP,OAAO;GAAE,GAAG;GAAM,UAAU,WAAW,KAAK,UAAU,MAAM,aAAa,QAAQ;EAAE;EAGrF,OAAO;CACT,CAAC;CAGH,MAAM,cAAc,KAAK,WAAW,SAAS,KAAK,UAAU,WAAW;CAEvE,IAAI,gBAAgB,IAAI;EACtB,MAAM,SAAS,CAAC,GAAG,IAAI;EACvB,MAAM,cAAc,aAAa,WAAW,cAAc,cAAc;EACxE,OAAO,OAAO,aAAa,GAAG,IAAI;EAClC,OAAO;CACT;CAEA,OAAO,KAAK,KAAK,SAAS;EACxB,IAAI,KAAK,UACP,OAAO;GAAE,GAAG;GAAM,UAAU,WAAW,KAAK,UAAU,MAAM,aAAa,QAAQ;EAAE;EAGrF,OAAO;CACT,CAAC;AACH;AAEA,SAAgB,aAAa,MAAsB,SAA8C;CAC/F,MAAM,EAAE,aAAa,YAAY,aAAa;CAE9C,IAAI,gBAAgB,YAClB,OAAO;CAGT,IAAI,CAACA,kCAAAA,aAAa,YAAY,IAAI,GAChC,OAAO;CAGT,IAAI,aAAa,MAAM,aAAa,UAAU,GAC5C,OAAO;CAGT,MAAM,EAAE,MAAM,aAAa,YAAY,WAAW,MAAM,WAAW;CAEnE,IAAI,CAAC,SACH,OAAO;CAGT,OAAO,WAAW,aAAa,SAAS,YAAY,QAAQ;AAC9D"}