{"version":3,"file":"move-tree-node.mjs","names":[],"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,WAAW,aAAa,eAAe,KAAK;AAClD,KAAI,CAAC,YAAY,CAAC,SAAS,SACzB,QAAO;CAGT,SAAS,MAAM,OAAgC;AAC7C,OAAK,MAAM,QAAQ,OAAO;AACxB,OAAI,KAAK,UAAU,MACjB,QAAO;AAGT,OAAI,KAAK,YAAY,MAAM,KAAK,SAAS,CACvC,QAAO;;AAIX,SAAO;;AAGT,QAAO,MAAM,SAAS,SAAS;;AAGjC,SAAS,WACP,MACA,OACwD;CACxD,IAAI,UAA+B;AAuBnC,QAAO;EAAE,MArBO,KAAK,QAAwB,KAAK,SAAS;AACzD,OAAI,KAAK,UAAU,OAAO;AACxB,cAAU,EAAE,GAAG,MAAM;AACrB,WAAO;;AAGT,OAAI,KAAK,UAAU;IACjB,MAAM,SAAS,WAAW,KAAK,UAAU,MAAM;AAC/C,QAAI,OAAO,SAAS;AAClB,eAAU,OAAO;AACjB,SAAI,KAAK;MAAE,GAAG;MAAM,UAAU,OAAO;MAAM,CAAC;UAE5C,KAAI,KAAK,KAAK;SAGhB,KAAI,KAAK,KAAK;AAGhB,UAAO;KACN,EAAE,CAAC;EAEkB;EAAS;;AAGnC,SAAS,WACP,MACA,MACA,aACA,UACgB;AAChB,KAAI,aAAa,SACf,QAAO,KAAK,KAAK,SAAS;AACxB,MAAI,KAAK,UAAU,YACjB,QAAO;GAAE,GAAG;GAAM,UAAU,CAAC,GAAI,KAAK,YAAY,EAAE,EAAG,KAAK;GAAE;AAGhE,MAAI,KAAK,SACP,QAAO;GAAE,GAAG;GAAM,UAAU,WAAW,KAAK,UAAU,MAAM,aAAa,SAAS;GAAE;AAGtF,SAAO;GACP;CAGJ,MAAM,cAAc,KAAK,WAAW,SAAS,KAAK,UAAU,YAAY;AAExE,KAAI,gBAAgB,IAAI;EACtB,MAAM,SAAS,CAAC,GAAG,KAAK;EACxB,MAAM,cAAc,aAAa,WAAW,cAAc,cAAc;AACxE,SAAO,OAAO,aAAa,GAAG,KAAK;AACnC,SAAO;;AAGT,QAAO,KAAK,KAAK,SAAS;AACxB,MAAI,KAAK,SACP,QAAO;GAAE,GAAG;GAAM,UAAU,WAAW,KAAK,UAAU,MAAM,aAAa,SAAS;GAAE;AAGtF,SAAO;GACP;;AAGJ,SAAgB,aAAa,MAAsB,SAA8C;CAC/F,MAAM,EAAE,aAAa,YAAY,aAAa;AAE9C,KAAI,gBAAgB,WAClB,QAAO;AAGT,KAAI,CAAC,aAAa,YAAY,KAAK,CACjC,QAAO;AAGT,KAAI,aAAa,MAAM,aAAa,WAAW,CAC7C,QAAO;CAGT,MAAM,EAAE,MAAM,aAAa,YAAY,WAAW,MAAM,YAAY;AAEpE,KAAI,CAAC,QACH,QAAO;AAGT,QAAO,WAAW,aAAa,SAAS,YAAY,SAAS"}