English | 简体中文
A highly customizable streaming flow builder. The registration ability can flexibly customize your nodes, different types of node display and form, etc.
https://react-flow-builder.web.cloudendpoint.cn/
yarn add react-flow-builder
or
npm install react-flow-builder
// index.tsx
import React, { useState } from 'react';
import FlowBuilder, {
INode,
IRegisterNode,
IDisplayComponent,
} from 'react-flow-builder';
import './index.css';
const StartNodeDisplay: React.FC<IDisplayComponent> = ({ node }) => {
return <div className="start-node">{node.name}</div>;
};
const EndNodeDisplay: React.FC<IDisplayComponent> = ({ node }) => {
return <div className="end-node">{node.name}</div>;
};
const OtherNodeDisplay: React.FC<IDisplayComponent> = ({ node }) => {
return <div className="other-node">{node.name}</div>;
};
const ConditionNodeDisplay: React.FC<IDisplayComponent> = ({ node }) => {
return <div className="condition-node">{node.name}</div>;
};
const registerNodes: IRegisterNode[] = [
{
type: 'start',
name: 'start node',
displayComponent: StartNodeDisplay,
},
{
type: 'end',
name: 'end node',
displayComponent: EndNodeDisplay,
},
{
type: 'node',
name: 'other node',
displayComponent: OtherNodeDisplay,
},
{
type: 'condition',
name: 'condition node',
displayComponent: ConditionNodeDisplay,
},
{
type: 'branch',
name: 'branch node',
conditionNodeType: 'condition',
},
];
const Demo = () => {
const [nodes, setNodes] = useState<INode[]>([]);
const handleChange = (nodes: INode[]) => {
console.log('nodes change', nodes);
setNodes(nodes);
};
return (
<FlowBuilder
nodes={nodes}
onChange={handleChange}
registerNodes={registerNodes}
/>
);
};
export default Demo;
// index.css
.start-node, .end-node {
height: 64px;
width: 64px;
border-radius: 50%;
line-height: 64px;
color: #fff;
text-align: center;
}
.start-node {
background-color: #338aff;
}
.end-node {
background-color: #666;
}
.other-node, .condition-node {
width: 224px;
border-radius: 4px;
color: #666;
background: #fff;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.08);
}
.other-node {
height: 118px;
padding: 16px;
display: flex;
flex-direction: column;
}
.condition-node {
height: 44px;
padding: 12px 16px;
}
| Property |
Description |
Type |
Required |
Default |
| backgroundColor |
The color of background |
string |
|
#F7F7F7 |
| className |
The class name of the container |
string |
|
- |
| drawerProps |
Extra props of Drawer Component from antd. visible and onClose have already in FlowBuilder, and {title: "Configuration", width: 480, destroyOnClose: true, maskClosable: false} |
DrawerProps |
|
- |
| drawerVisibleWhenAddNode |
Drawer visible when add node |
boolean |
|
false |
| historyTool |
undo and redo |
boolean | HistoryToolConfig |
|
false |
| layout |
Use vertical or horizontal layout |
vertical | horizontal |
|
vertical |
| lineColor |
The color of line |
string |
|
#999999 |
| nodes |
The nodes of FlowBuilder |
Node[] |
✓ |
- |
| readonly |
Readonly mode, cannot add, remove, configure. |
boolean |
|
false |
| registerNodes |
The registered nodes |
RegisterNode[] |
✓ |
- |
| spaceX |
Horizontal spacing between nodes |
number |
|
16 |
| spaceY |
Vertical spacing between nodes |
number |
|
16 |
| zoomTool |
zoom |
boolean | ZoomToolConfig |
|
false |
| onChange |
Callback function for when the data change |
(nodes: Node[], changeEvent?: string) => void |
✓ |
- |
| onHistoryChange |
|
(undoDisabled: boolean, redoDisabled: boolean) => void |
|
- |
| onZoomChange |
|
(outDisabled: boolean, value: number, inDisabled: boolean) => void |
|
- |
| Property |
Description |
Type |
Default |
| hidden |
|
boolean |
false |
| max |
|
number |
10 |
| Property |
Description |
Type |
Default |
| hidden |
|
boolean |
false |
| initialValue |
|
number |
100 |
| min |
|
number |
10 |
| max |
|
number |
200 |
| step |
|
number |
10 |
| Name |
Description |
Type |
| add |
add node |
(node: INode, newNodeType: string) => void |
| history |
undo, redo |
(type: 'undo' | 'redo') => void |
| remove |
remove noded |
(nodes: INode | INode[]) => void |
| zoom |
zoom |
(type: 'out' | 'in' | number) => void |
| closeDrawer |
close drawer |
() => void |
| Name |
Description |
Type |
| buildFlatNodes |
Translate to flat nodes |
(params: {registerNodes: IRegisterNode[], nodes: INode[]}) => INode[] |
| buildTreeNodes |
Translate to tree nodes |
(params: {nodes: INode[]}) => INode[] |
| createUuid |
Create uuid |
(prefix?: string) => string |
| Property |
Description |
Type |
Required |
Default |
| addableComponent |
|
React.FC<AddableComponent> |
|
- |
| addableNodeTypes |
The list of nodes that can be added below the node |
string[] |
|
- |
| addIcon |
The icon in addable node list (There are already some default icons) |
ReactNode |
|
- |
| conditionMinNum |
The min number of condition node |
number |
|
1 |
| conditionMaxNum |
The max number of condition node |
number |
|
- |
| conditionNodeType |
The type of condition node |
string |
|
- |
| configComponent |
The Component of configuring node form |
React.FC<ConfigComponent> |
|
- |
| configTitle |
The drawer title of configuring node |
string | ((node: INode, nodes: INode[]) => string) |
|
- |
| customRemove |
Custom remove button |
boolean |
|
false |
| displayComponent |
The Component of displaying node |
React.FC<DisplayComponent> |
|
- |
| initialNodeData |
增加节点时初始化数据 |
Record<string, any> |
|
- |
| isStart |
Is start node |
boolean |
|
false |
| isEnd |
Is end node |
boolean |
|
false |
| name |
The name of node |
string |
✓ |
- |
| removeConfirmTitle |
The confirmation information before deleting the node. The title of Popconfirm |
string | ReactNode |
|
Are you sure to remove this node? |
| type |
The type of node, promise start is start node type and end is end node type |
string |
✓ |
- |
| Property |
Description |
Type |
| node |
The all information of node |
Node |
| nodes |
|
Node[] |
| remove |
Remove node |
(nodes?: INode | INode[]) => void |
| Property |
Description |
Type |
| cancel |
Called on cancel, used to close the drawer |
() => void |
| node |
The all information of node |
Node |
| nodes |
|
Node[] |
| save |
Called on save node data (automatically close the drawer, no need to call cancel). FlowBuilder will set the validateStatusError property according to the second param |
(values: any, validateStatusError?: boolean) => void |
| Property |
Description |
Type |
| add |
|
(type: string) => void |
| node |
The all information of node |
Node |
| nodes |
|
Node[] |
| Property |
Description |
Type |
| children |
The condition nodes array of branch node, or the next flow of condition node |
Node[] |
| configuring |
Whether configuring of node. The display Component can highlight the node according to this property |
boolean |
| data |
The data of node |
any |
| id |
The unique id of node |
string |
| name |
The name of node. Same as the name of the registered node |
string |
| path |
The full path in FlowBuilder |
string[] |
| type |
The type of node. Same as the type of the registered node |
string |
| validateStatusError |
The Component of configuring node form validate failed. The display Component can highlight the node according to this property |
boolean |