Awesome
Introduction
English | 简体中文
A highly customizable streaming flow builder. The registration ability can flexibly customize your nodes, different types of node display and form, etc.
Try it out
https://bytedance.github.io/flow-builder
Github
https://github.com/bytedance/flow-builder
Installation
yarn add react-flow-builder
or
npm install react-flow-builder
Usage
// index.tsx
import React, { useState, useContext } from 'react';
import FlowBuilder, {
NodeContext,
INode,
IRegisterNode,
} from 'react-flow-builder';
import './index.css';
const StartNodeDisplay: React.FC = () => {
const node = useContext(NodeContext);
return <div className="start-node">{node.name}</div>;
};
const EndNodeDisplay: React.FC = () => {
const node = useContext(NodeContext);
return <div className="end-node">{node.name}</div>;
};
const OtherNodeDisplay: React.FC = () => {
const node = useContext(NodeContext);
return <div className="other-node">{node.name}</div>;
};
const ConditionNodeDisplay: React.FC = () => {
const node = useContext(NodeContext);
return <div className="condition-node">{node.name}</div>;
};
const registerNodes: IRegisterNode[] = [
{
type: 'start',
name: 'start node',
displayComponent: StartNodeDisplay,
isStart: true,
},
{
type: 'end',
name: 'end node',
displayComponent: EndNodeDisplay,
isEnd: true,
},
{
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;
}
API
FlowBuilder
Property | Description | Type | Required | Default | Version |
---|
backgroundColor | The color of background | string | | #F7F7F7 | |
className | The class name of the container | string | | - | |
draggable | drag and drop | boolean | | false | 1.0.0 |
DragComponent | custom drag component | React.FC <DragComponent> | | - | 1.0.0 |
DropComponent | custom drop component | React.FC <DropComponent> | | - | 1.0.0 |
createUuid | custom node uuid | (type?: string) => string | | - | 2.0.0 |
DrawerComponent | Drawer component | React.FC <DrawerComponent> | | - | 2.0.0 |
PopoverComponent | Popover component | React.FC <PopoverComponent> | | - | 2.0.0 |
PopconfirmComponent | Popconfirm component | React.FC <PopconfirmComponent> | | - | 2.0.0 |
drawerProps | Extra props of DrawerComponent | any | | - | |
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[] | ✓ | - | |
registerRemoteNodes | The registered remote nodes | RegisterRemoteNode[] | | - | 1.3.0 |
showPracticalBranchNode | - | boolean | | false | 1.1.0 |
showPracticalBranchRemove | - | boolean | | false | 1.1.0 |
sortable | Condition nodes can be dragged and sorted in branch | boolean | | false | 1.4.0 |
sortableAnchor | Anchor for start dragging 序 | ReactNode | | - | 1.4.0 |
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 , nodeChanged?: INode) => void | ✓ | - | |
onHistoryChange | | (undoDisabled: boolean, redoDisabled: boolean) => void | | - | |
onZoomChange | | (outDisabled: boolean, value: number, inDisabled: boolean) => void | | - | |
showArrow | Show arrow | boolean | | false | 1.4.5 |
arrowIcon | The icon of the arrow | ReactNode | | - | 1.4.5 |
onAddNodeSuccess | Called when add node success | (type: string, node: INode) => void | | - | 1.4.9 |
onDropNodeSuccess | Called when drop node success | (type: string, node: INode) => void | | - | 1.4.9 |
onRemoveNodeSuccess | Called when remove node success | (node: INode) => void | | - | 2.2.0 |
allowStartConfig | Allow start node config | boolean | | - | 2.1.0 |
allowEndConfig | Allow end node config | boolean | | - | 2.1.0 |
scrollByDrag | Scroll by mouse dragging | boolean | | - | 2.6.0 |
HistoryToolConfig
Property | Description | Type | Default |
---|
hidden | | boolean | false |
max | | number | 10 |
ZoomToolConfig
Property | Description | Type | Default |
---|
hidden | | boolean | false |
initialValue | | number | 100 |
min | | number | 10 |
max | | number | 200 |
step | | number | 10 |
DragComponent
Property | Description | Type | Version |
---|
onDragStart | The dragStart event of the custom drag component needs to call this method to set the dragged type( dragType in BuilderContext ) | (nodeType: string) => void | 1.0.0 |
onDragEnd | The dragEnd event of the custom drag component needs to call this method to clear the dragged type( dragType in BuilderContext ) | () => void | 1.0.0 |
DropComponent
Property | Description | Type | Version |
---|
onDrop | The drop event of the custom drop component needs to call this method to add the new node type | () => void | 1.0.0 |
DrawerComponent
Property | Description | Type | Version |
---|
visible | You can judge the boolean value of selectedNode by yourself. | any | 2.0.0 |
onClose | You can also call closeDrawer by yourself. | any | 2.0.0 |
children | | any | 2.0.0 |
title | | any | 2.0.0 |
width | | any | 2.0.0 |
destroyOnClose | | any | 2.0.0 |
maskClosable | | any | 2.0.0 |
configComponentRef | | React.MutableRefObject <any> | 2.5.0 |
PopoverComponent
Property | Description | Type | Version |
---|
visible | | any | 2.0.0 |
onVisibleChange | | any | 2.0.0 |
children | | any | 2.0.0 |
overlayClassName | | any | 2.0.0 |
placement | | any | 2.0.0 |
trigger | | any | 2.0.0 |
content | | any | 2.0.0 |
getPopupContainer | | any | 2.0.0 |
PopconfirmComponent
Property | Description | Type | Version |
---|
title | | any | 2.0.0 |
onConfirm | You can also call removeNode yourself. | any | 2.0.0 |
children | | any | 2.0.0 |
getPopupContainer | | any | 2.0.0 |
FlowBuilderInstance
Name | Description | Type | Version |
---|
add | add node | (node: INode, newNodeType: string) => void | (newNodeType: string) => void | |
history | undo, redo | (type: 'undo' | 'redo') => void | |
remove | remove noded | (nodes: INode | INode[] = useContext(NodeContext)) => void | |
zoom | zoom | (type: 'out' | 'in' | number) => void | |
closeDrawer | close drawer | () => void | |
context | BuilderContext | BuilderContext | 1.3.5 |
Formatter
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 |
RegisterNode
Property | Description | Type | Required | Default | Version |
---|
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 | | - | |
addConditionIcon | The icon of the branch node when adding a condition (The default icon already exists) | ReactNode | | - | 1.3.3 |
className | The class name of node | string | | - | 1.3.4 |
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> | React.ForwardRefExoticComponent <ConfigComponent & React.RefAttributes <any>> | | - | |
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 | the initial data when add new node | Record<string, any> | | - | |
isStart | Is start node | boolean | | false | |
isEnd | Is end node | boolean | | false | |
isLoop | Is loop node | boolean | | false | 1.4.6 |
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? | |
showPracticalBranchNode | - | boolean | | false | 1.1.0 |
showPracticalBranchRemove | - | boolean | | false | 1.1.0 |
type | The type of node, promise start is start node type and end is end node type | string | ✓ | - | |
RegisterRemoteNode
Property | Description | Type | Required | Default | Version |
---|
url | remote url | string | ✓ | - | 1.3.0 |
cssUrl | remote css url | string | | - | 1.3.0 |
DisplayComponent
Property | Description | Type |
---|
node | The all information of node (NodeContext is recommended since V1) | Node |
nodes | (BuilderContext is recommended since V1) | Node[] |
readonly | (BuilderContext is recommended since V1) | boolean |
remove | Remove node (useAction is recommended since V1) | (nodes?: INode | INode[]) => void |
ConfigComponent
Property | Description | Type |
---|
cancel | Called on cancel, used to close the drawer (useDrawer is recommended since V1) | () => void |
node | The all information of node (NodeContext is recommended since V1) | Node |
nodes | (BuilderContext is recommended since V1) | 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 (useDrawer is recommended since V1) | (values: any, validateStatusError?: boolean) => void |
AddableComponent
Property | Description | Type |
---|
add | | (type: string) => void |
node | The all information of node (NodeContext is recommended since V1) | Node |
nodes | (BuilderContext is recommended since V1) | Node[] |
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 |
Context
Added since V1
In the context of FlowBuilder the following contexts can be used
BuilderContext
Contains props and state. The following is the state:
Property | Description | Type |
---|
zoomValue | current zoom value | number |
setZoomValue | set zoomValue | (zoomValue: number) => void |
historyRecords | history nodes records | INode[][] |
setHistoryRecords | set historyRecords | (records: INode[][]) => void |
activeHistoryRecordIndex | current index in history nodes records | number |
setActiveHistoryRecordIndex | set activeHistoryRecordIndex | (index: number) => void |
selectedNode | current selecred node | INode | undefined |
setSelectedNode | set selectedNode | (node: INode | undefined) => void |
drawerTitle | the title of Drawer | string |
setDrawerTitle | set drawerTitle | (title: string) => void |
dragType | dragged node type | string |
setDragType | set dragType | (type: string) => void |
NodeContext
Get the data of the node where it is used. For details Node
Hooks
Added since V1
In the context of FlowBuilder the following hooks can be used
useAction
Property | Description | Type | Version |
---|
clickNode | click node | (node: INode = useContext(NodeContext)) => void | |
addNode | add one node. (Get the current node through NodeContext when there is no node property) | (node: INode, newNodeType: string) => void | (newNodeType: string) => void | |
addNodeInLoop | add one node in loop node. | (newNodeType: string) => void | 1.4.6 |
removeNode | remove one node or more nodes. | (targetNode: INode | INode[] = useContext(NodeContext)) => void | |
useDrawer
Property | Description | Type |
---|
closeDrawer | close Drawer and clear selectedNode | () => void |
saveDrawer | save the content in Drawer (same as the save method in ConfigComponent) | (values: any, validateStatusError?: boolean) => void |
useZoom
Property | Description | Type |
---|
minZoom | minimum zoom value | number |
maxZoom | maximum zoom value | number |
zoom | change zoom value (same as the zoom method in FlowBuilderInstance) | (type: 'out' | 'in' | number) => void |
useHistory
Property | Description | Type |
---|
maxLength | Maximum length of history nodes records | number |
pushHistory | add history nodes record | (record?: INode[] = useContext(BuilderContext).nodes) => void |
history | undo, redo (same as the history method in FlowBuilderInstance) | (type: 'undo' | 'redo') => void |
useSort
Property | Description | Type | Version |
---|
backward | sort to backward | (node: INode = useContext(NodeContext)) => void | 1.4.3 |
forward | sort to forward | (node: INode = useContext(NodeContext)) => void | 1.4.3 |
end | sort to end | (node: INode = useContext(NodeContext)) => void | 1.4.3 |
start | sort to start | (node: INode = useContext(NodeContext)) => void | 1.4.3 |