function getSuitablePlaceForNode()

in packages/engine/src/inner-plugins/builtin-hotkey.ts [163:221]


function getSuitablePlaceForNode(targetNode: IPublicModelNode, node: IPublicModelNode, ref: any): any {
  const { document } = targetNode;
  if (!document) {
    return null;
  }

  const dragNodeObject: IPublicTypeDragNodeObject = {
    type: IPublicEnumDragObjectType.Node,
    nodes: [node],
  };

  const focusNode = document?.focusNode;
  // 如果节点是模态框,插入到根节点下
  if (node?.componentMeta?.isModal) {
    return { container: focusNode, ref };
  }

  if (!ref && focusNode && targetNode.contains(focusNode)) {
    if (document.checkNesting(focusNode, dragNodeObject)) {
      return { container: focusNode };
    }

    return null;
  }

  if (targetNode.isRootNode && targetNode.children) {
    const dropElement = targetNode.children.filter((c) => {
      if (!c.isContainerNode) {
        return false;
      }
      if (document.checkNesting(c, dragNodeObject)) {
        return true;
      }
      return false;
    })[0];

    if (dropElement) {
      return { container: dropElement, ref };
    }

    if (document.checkNesting(targetNode, dragNodeObject)) {
      return { container: targetNode, ref };
    }

    return null;
  }

  if (targetNode.isContainerNode) {
    if (document.checkNesting(targetNode, dragNodeObject)) {
      return { container: targetNode, ref };
    }
  }

  if (targetNode.parent) {
    return getSuitablePlaceForNode(targetNode.parent, node, { index: targetNode.index });
  }

  return null;
}