export function toElk()

in visual/react/lib/util_elk.tsx [49:98]


export function toElk({ nodes, edges }: { nodes: Node[], edges: Edge[] }): ElkNode {
    let rootElkNode: ElkNode = { id: rootID, children: [], edges: [] }
    let allElkNodes: Map<string, ElkNode> = new Map();
    let whoIsParent: Map<string, string> = new Map();
    allElkNodes.set(rootID, rootElkNode)
    nodes.forEach((node) => {
        let elkNode = allElkNodes.get(node.id)
        if (!elkNode) {
            elkNode = {
                id: node.id,
                x: node.position.x,
                y: node.position.y,
                width: node.width === null ? undefined : node.width,
                height: node.height === null ? undefined : node.height,
                labels: [{text: node.data.label }],
                children: [],
                edges: [],
            }
            allElkNodes.set(node.id, elkNode)
        }
        let parentElkNode: ElkNode | undefined
        let parentId = node.parentId || rootID
        whoIsParent.set(node.id, parentId)
        parentElkNode = allElkNodes.get(parentId)
        if (!parentElkNode) {
            parentElkNode = { id: parentId, children: [] }
            allElkNodes.set(parentId, parentElkNode)
        }
        parentElkNode?.children?.push(elkNode)
    })
    edges.forEach((edge) => {
        let sourceNode = allElkNodes.get(edge.source)
        let targetNode = allElkNodes.get(edge.target)
        if (sourceNode && targetNode) {
            let elkEdge: ElkExtendedEdge = {
                id: edge.id,
                sources: [sourceNode.id],
                targets: [targetNode.id],
            }
            let parent = whoIsParent.get(edge.source)
            if (parent) {
                let parentNode = allElkNodes.get(parent)
                if (parentNode) {
                    parentNode.edges?.push(elkEdge)
                }
            }
        }
    })
    return rootElkNode
}