import { RenderData } from '@kevisual/container'; type Page = { data: { edges: { id: string; source: string; target: string }[]; nodes: { id: string; type: string; position: { x: number; y: number }; data: any }[]; }; id: string; type: string; [key: string]: any; }; type Container = { code: string; id: string; [key: string]: any; }; type PageEditData = { page: Page; containerList: Container[]; }; export const getContainerData = (pageEditData: PageEditData) => { const { page, containerList } = pageEditData; const containerObj = containerList.reduce((acc, container) => { acc[container.id] = container; return acc; }, {}); const { edges, nodes } = page.data; const nodesObj = nodes.reduce((acc, node) => { acc[node.id] = node; return acc; }, {}); const treeArray = getTreeFromEdges(edges); const floatNodes = nodes.filter((node) => !treeArray.find((item) => item.id === node.id)); const treeNodes = nodes.filter((node) => treeArray.find((item) => item.id === node.id)); const renderData: RenderData[] = []; for (let tree of treeArray) { const node = nodesObj[tree.id]; const container = containerObj[node.data?.cid]; const style = node.data?.style ?? { position: 'absolute', width: 100, height: 100, }; const data = { node: { ...node }, container: { ...container }, }; renderData.push({ id: node.id, children: tree.children, parents: tree.parents, code: container?.code || '', codeId: container?.id, data: data || {}, className: node.data?.className, shadowRoot: node.data?.shadowRoot, showChild: node.data?.showChild, style, }); } for (let node of floatNodes) { const container = containerObj[node.data?.cid]; const style = node.data?.style ?? { position: 'absolute', width: 100, height: 100, }; const data = { node: { ...node }, container: { ...container }, }; renderData.push({ id: node.id, children: [], parents: [], code: container?.code || '', codeId: container?.id, data: data || {}, className: node.data?.className, shadowRoot: node.data?.shadowRoot, showChild: node.data?.showChild, style, }); } return renderData; }; const getTreeFromEdges = ( edges: { id: string; source: string; target: string }[], ): { id: string; parents: string[]; children: string[]; }[] => { // 构建树形结构 function buildNodeTree(edges) { const nodeMap = {}; // 初始化每个节点的子节点列表和父节点列表 edges.forEach((edge) => { if (!nodeMap[edge.source]) { nodeMap[edge.source] = { id: edge.source, parents: [], children: [] }; } if (!nodeMap[edge.target]) { nodeMap[edge.target] = { id: edge.target, parents: [], children: [] }; } // 连接父节点和子节点 nodeMap[edge.source].children.push(nodeMap[edge.target]); nodeMap[edge.target].parents.push(nodeMap[edge.source]); }); return nodeMap; } const nodeTree = buildNodeTree(edges); // 递归获取所有父节点,按顺序 function getAllParents(node) { const parents: string[] = []; function traverseParents(currentNode) { if (currentNode.parents.length > 0) { currentNode.parents.forEach((parent: any) => { parents.push(parent.id); traverseParents(parent); }); } } traverseParents(node); return parents.reverse(); // 确保顺序从最顶层到直接父节点 } function getNodeInfo(nodeMap) { return Object.values(nodeMap).map((node: any) => ({ id: node.id, parents: getAllParents(node), children: node.children.map((child) => child.id), })); } const result = getNodeInfo(nodeTree); return result; };