{"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"}