Skip to content

This is built on top of reactflow and using dagre algorithm to auto layout swimlane flowchart

Notifications You must be signed in to change notification settings

liang-faan/reactflow-swimlane

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

38 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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
  • v0.1.1 Support Swimlane crosses multiple layers if nodes within same swimlane communicate each other. Before After

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

Split into multiple layers for Nodes communicate within same Swimlane.

About

This is built on top of reactflow and using dagre algorithm to auto layout swimlane flowchart

Resources

Stars

Watchers

Forks

Packages

No packages published