reactflow 泳道图的实现与自动排版

Project - Implement Swimlane flow chart with Reactflow

This is building Swimlane flowchart based on ReactFlow and Dagre alogrithm. It contains below features:

  • auto layout based on DAG Dagre algorithm.
  • auto change edge path if there is intermediate node.
  • supports change layout Top to Bottom and Left to Right
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

Sample of how to use

npm install @liangfaan/reactflow-swimlane
import React from "react";
import { SwimlaneFlow } from "@liangfaan/reactflow-swimlane";
// wrap the component under ReactFlowProvider
import { ReactFlowProvider } from "reactflow";
import "reactflow/dist/style.css";

function App() {
  return (
    <div style={{ height: 800 }}>
      <ReactFlowProvider>
        <SwimlaneFlow
          rankDirection="LR"
          selectedFlow={{
            id: "Sample 3",
            swimlanes: [
              {
                id: "S3-1",
                label: "Mindmap Root",
                layer: 0,
                nodes: [
                  {
                    id: "S3-1-M1",
                    label: "Root",
                    code: "ROOT",
                  },
                ],
              },
              {
                id: "S3-2",
                label: "Mindmap Level 1",
                layer: 1,
                nodes: [
                  {
                    id: "S3-2-M1",
                    label: "Child 1",
                    code: "CHILD1",
                  },
                  {
                    id: "S3-2-M2",
                    label: "Child 2",
                    code: "CHILD2",
                  },
                ],
              },
              {
                id: "S3-3",
                label: "Mindmap Level 2",
                layer: 2,
                nodes: [
                  {
                    id: "S3-3-M1",
                    label: "Child 1",
                    code: "CHILD1",
                  },
                  {
                    id: "S3-3-M2",
                    label: "Child 2",
                    code: "CHILD2",
                  },
                  {
                    id: "S3-3-M3",
                    label: "Child 3",
                    code: "CHILD4",
                  },
                  {
                    id: "S3-3-M4",
                    label: "Child 4",
                    code: "CHILD4",
                  },
                ],
              },
            ],
            edges: [
              {
                id: "E-S3-1-M1-S3-2-M1",
                sourceNodeId: "S3-1-M1",
                targetNodeId: "S3-2-M1",
              },
              {
                id: "E-S3-1-M1-S3-2-M2",
                sourceNodeId: "S3-1-M1",
                targetNodeId: "S3-2-M2",
              },
              {
                id: "E-S3-2-M1-S3-3-M1",
                sourceNodeId: "S3-2-M1",
                targetNodeId: "S3-3-M1",
              },
              {
                id: "E-S3-2-M1-S3-3-M2",
                sourceNodeId: "S3-2-M1",
                targetNodeId: "S3-3-M2",
              },
              {
                id: "E-S3-2-M1-S3-3-M3",
                sourceNodeId: "S3-2-M1",
                targetNodeId: "S3-3-M3",
              },
              {
                id: "E-S3-2-M1-S3-3-M4",
                sourceNodeId: "S3-2-M1",
                targetNodeId: "S3-3-M4",
              },
              {
                id: "E-S3-2-M2-S3-3-M3",
                sourceNodeId: "S3-2-M2",
                targetNodeId: "S3-3-M3",
              },
              {
                id: "E-S3-2-M2-S3-3-M4",
                sourceNodeId: "S3-2-M2",
                targetNodeId: "S3-3-M4",
              },
              {
                id: "E-S3-2-M2-S3-3-M2",
                sourceNodeId: "S3-2-M2",
                targetNodeId: "S3-3-M2",
              },
              {
                id: "E-S3-2-M2-S3-3-M1",
                sourceNodeId: "S3-2-M2",
                targetNodeId: "S3-3-M1",
              },
              {
                id: "E-S3-3-M3-S3-1-M1",
                targetNodeId: "S3-3-M3",
                sourceNodeId: "S3-1-M1",
              },
              {
                id: "E-S3-3-M2-S3-1-M1",
                targetNodeId: "S3-3-M2",
                sourceNodeId: "S3-1-M1",
              },
            ],
          }}
        />
      </ReactFlowProvider>
    </div>
  );
}

export default App;

Output

在这里插入图片描述

Start project npm start

Runs the app in the development mode.
Open http://localhost:3005 to view it in the browser.

The page will reload if you make edits.
You will also see any lint errors in the console.

Data Schema

{
    "id": "object id",
    "swimlanes": [
        {
            "id": "swimlane obj",
            "layer": 0,  <=swimlane layer order
            "label": "swimlane label, will display in flowchat",
            "nodes": [
                {
                    "id": "nodes id",
                    "name": "node name",
                    "label": "node label, will display in flowchart"
                },
            ],
            "edges": [
                {
                    "id": "edge id",
                    "sourceNodeId": "source node id",
                    "targetNodeId": "target node id"
                }
            ]
        }
    ]
}

Samples

Simple swimlane

{
  "id": "Sample 2",
  "swimlanes": [
    {
      "id": "S21",
      "layer": 0,
      "label": "Swimlane 21",
      "nodes": [
        {
          "id": "S21-1",
          "name": "Node S211",
          "label": "Node S211",
          "code": "NODES211"
        }
      ]
    },
    {
      "id": "S22",
      "label": "Swimlane 22",
      "layer": 1,
      "nodes": [
        {
          "id": "S22-1",
          "name": "Node S221",
          "label": "Node S221",
          "code": "NODES221"
        }
      ]
    }
  ],
  "edges": [
    {
      "id": "S211-S221",
      "sourceNodeId": "S21-1",
      "targetNodeId": "S22-1"
    }
  ]
}

在这里插入图片描述

Swimlane mindmap

{
  "id": "Sample 3",
  "swimlanes": [
    {
      "id": "S3-1",
      "label": "Mindmap Root",
      "layer": 0,
      "nodes": [
        {
          "id": "S3-1-M1",
          "label": "Root",
          "code": "ROOT"
        }
      ]
    },
    {
      "id": "S3-2",
      "label": "Mindmap Level 1",
      "layer": 1,
      "nodes": [
        {
          "id": "S3-2-M1",
          "label": "Child 1",
          "code": "CHILD1"
        },
        {
          "id": "S3-2-M2",
          "label": "Child 2",
          "code": "CHILD2"
        }
      ]
    },
    {
      "id": "S3-3",
      "label": "Mindmap Level 2",
      "layer": 2,
      "nodes": [
        {
          "id": "S3-3-M1",
          "label": "Child 1",
          "code": "CHILD1"
        },
        {
          "id": "S3-3-M2",
          "label": "Child 2",
          "code": "CHILD2"
        },
        {
          "id": "S3-3-M3",
          "label": "Child 3",
          "code": "CHILD4"
        },
        {
          "id": "S3-3-M4",
          "label": "Child 4",
          "code": "CHILD4"
        }
      ]
    }
  ],
  "edges": [
    {
      "id": "E-S3-1-M1-S3-2-M1",
      "sourceNodeId": "S3-1-M1",
      "targetNodeId": "S3-2-M1"
    },
    {
      "id": "E-S3-1-M1-S3-2-M2",
      "sourceNodeId": "S3-1-M1",
      "targetNodeId": "S3-2-M2"
    },
    {
      "id": "E-S3-2-M1-S3-3-M1",
      "sourceNodeId": "S3-2-M1",
      "targetNodeId": "S3-3-M1"
    },
    {
      "id": "E-S3-2-M1-S3-3-M2",
      "sourceNodeId": "S3-2-M1",
      "targetNodeId": "S3-3-M2"
    },
    {
      "id": "E-S3-2-M1-S3-3-M3",
      "sourceNodeId": "S3-2-M1",
      "targetNodeId": "S3-3-M3"
    },
    {
      "id": "E-S3-2-M1-S3-3-M4",
      "sourceNodeId": "S3-2-M1",
      "targetNodeId": "S3-3-M4"
    },
    {
      "id": "E-S3-2-M2-S3-3-M3",
      "sourceNodeId": "S3-2-M2",
      "targetNodeId": "S3-3-M3"
    },
    {
      "id": "E-S3-2-M2-S3-3-M4",
      "sourceNodeId": "S3-2-M2",
      "targetNodeId": "S3-3-M4"
    },
    {
      "id": "E-S3-2-M2-S3-3-M2",
      "sourceNodeId": "S3-2-M2",
      "targetNodeId": "S3-3-M2"
    },
    {
      "id": "E-S3-2-M2-S3-3-M1",
      "sourceNodeId": "S3-2-M2",
      "targetNodeId": "S3-3-M1"
    },
    {
      "id": "E-S3-3-M3-S3-1-M1",
      "targetNodeId": "S3-3-M3",
      "sourceNodeId": "S3-1-M1"
    },
    {
      "id": "E-S3-3-M2-S3-1-M1",
      "targetNodeId": "S3-3-M2",
      "sourceNodeId": "S3-1-M1"
    }
  ]
}

左右排版

在这里插入图片描述

上下排版

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值