1.0.0 • Published 10 months ago

@ingensystems/flow-builder v1.0.0

Weekly downloads
-
License
-
Repository
github
Last release
10 months ago

简介

English | 简体中文

高度可定制的流式流程引擎。注册能力可以灵活定制你的节点类型以及不同类型的节点展示和节点表单等。

demo1demo2

试一试

https://bytedance.github.io/flow-builder

Github

https://github.com/bytedance/flow-builder

安装

yarn add react-flow-builder

或

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: '开始节点',
    displayComponent: StartNodeDisplay,
    isStart: true,
  },
  {
    type: 'end',
    name: '结束节点',
    displayComponent: EndNodeDisplay,
    isEnd: true,
  },
  {
    type: 'node',
    name: '普通节点',
    displayComponent: OtherNodeDisplay,
  },
  {
    type: 'condition',
    name: '条件节点',
    displayComponent: ConditionNodeDisplay,
  },
  {
    type: 'branch',
    name: '分支节点',
    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

参数说明类型必须默认值版本
backgroundColor背景颜色string#F7F7F7
className外层容器的类名string-
draggable是否启用拖拽能力booleanfalse1.0.0
DragComponent自定义拖拽组件React.FC\<DragComponent>-1.0.0
DropComponent自定义放置组件React.FC\<DropComponent>-1.0.0
createUuid自定义节点的 uuid(type?: string) => string-2.0.0
DrawerComponentDrawer 组件React.FC\<DrawerComponent>-2.0.0
PopoverComponentPopover 组件React.FC\<PopoverComponent>-2.0.0
PopconfirmComponentPopconfirm 组件React.FC\<PopconfirmComponent>-2.0.0
drawerProps传给 DrawerComponent 额外的属性any-
drawerVisibleWhenAddNode增加节点时打开抽屉booleanfalse
historyTool撤销,重做boolean | HistoryToolConfigfalse
layout垂直/水平布局vertical | horizontalvertical
lineColor连线的颜色string#999999
nodes流程引擎的节点Node[]-
readonly只读模式,不能进行节点的增加、删除、配置booleanfalse
registerNodes注册节点RegisterNode[]-
registerRemoteNodes注册远程节点RegisterRemoteNode[]-1.3.0
showPracticalBranchNode-booleanfalse1.1.0
showPracticalBranchRemove-booleanfalse1.1.0
sortable条件节点在分支内可拖拽排序booleanfalse1.4.0
sortableAnchor自定义拖拽排序的锚点序ReactNode-1.4.0
spaceX节点之间水平方向的间距number16
spaceY节点之间垂直方向的间距number16
zoomTool缩放boolean | ZoomToolConfigfalse
onChange节点数据改变时的回调函数(nodes: Node[], changeEvent: string, nodeChanged?: INode) => void-
onHistoryChange历史状态变化之后的回调,两个参数分别代表是否需要禁用撤销和重做(undoDisabled: boolean, redoDisabled: boolean) => void-
onZoomChange缩放变化之后的回调,三个参数分别代表是否需要禁用缩小、当前的缩放值、是否需要禁用放大(outDisabled: boolean, value: number, inDisabled: boolean) => void-
showArrow显示箭头booleanfalse1.4.5
arrowIcon自定义箭头ReactNode-1.4.5
onAddNodeSuccess增加节点成功之后的回调(type: string, node: INode) => void-1.4.9
onDropNodeSuccess放置节点成功之后的回调(type: string, node: INode) => void-1.4.9
onRemoveNodeSuccess删除节点成功之后的回调(node: INode) => void-2.2.0
allowStartConfig允许配置开始节点boolean-2.1.0
allowEndConfig允许配置结束节点boolean-2.1.0
scrollByDrag通过拖动画布进行滚动boolean-2.6.0

HistoryToolConfig

参数说明类型默认值
hidden是否隐藏默认的历史工具栏booleanfalse
max最多保存的数量number10

ZoomToolConfig

参数说明类型默认值
hidden是否隐藏默认的缩放工具栏booleanfalse
initialValue初始值number100
min最小值number10
max最大值number200
step每次缩放比例的变化大小number10

DragComponent

参数说明类型版本
onDragStart自定义拖拽组件的 dragStart 事件需要调用此方法,设置正在拖拽的节点类型( BuilderContext 中的 dragType )(nodeType: string) => void1.0.0
onDragEnd自定义拖拽组件的 dragEnd 事件需要调用此方法,清空正在拖拽的节点类型( BuilderContext 中的 dragType )() => void1.0.0

DropComponent

参数说明类型版本
onDrop自定义放置组件的 drop 事件需要调用此方法,完成放置动作增加对应的节点() => void1.0.0

DrawerComponent

参数说明类型版本
visible也可以自行判断 selectedNode 的布尔值any2.0.0
onClose也可以自行调用 closeDrawerany2.0.0
childrenany2.0.0
titleany2.0.0
widthany2.0.0
destroyOnCloseany2.0.0
maskClosableany2.0.0
configComponentRefReact.MutableRefObject\<any>2.5.0

PopoverComponent

参数说明类型版本
visibleany2.0.0
onVisibleChangeany2.0.0
childrenany2.0.0
overlayClassNameany2.0.0
placementany2.0.0
triggerany2.0.0
contentany2.0.0
getPopupContainerany2.0.0

PopconfirmComponent

参数说明类型版本
titleany2.0.0
onConfirm也可以自行调用 removeNodeany2.0.0
childrenany2.0.0
getPopupContainerany2.0.0

FlowBuilderInstance

名称说明类型版本
add增加节点(node: INode, newNodeType: string) => void | (newNodeType: string) => void
history撤销、重做(type: 'undo' \| 'redo') => void
remove删除一个或多个节点(nodes: INode \| INode[] = useContext(NodeContext)) => void
zoom缩放(type: 'out' \| 'in' \| number) => void
closeDrawer关闭抽屉() => void
contextBuilderContextBuilderContext1.3.5

Formatter

名称说明类型
buildFlatNodes转换成扁平结构(params: {registerNodes: IRegisterNode[], nodes: INode[]}) => INode[]
buildTreeNodes转换成树形结构(params: {nodes: INode[]}) => INode[]
createUuid创建 uuid(prefix?: string) => string

RegisterNode

参数说明类型必须默认值版本
addableComponent节点下方点击加号展开的内容React.FC\<AddableComponent>-
addableNodeTypes指定节点下方的可添加节点列表string[]-
addIcon在可添加节点列表中的图标(已经内置了一些图标)ReactNode-
addConditionIcon分支节点添加条件时的图标(已有默认图标)ReactNode-1.3.3
className节点外层的类名string-1.3.4
conditionMaxNum对应的条件节点最大数量number-
conditionNodeType对应的条件节点类型string-
configComponent节点的配置表单组件React.FC\<ConfigComponent> | React.ForwardRefExoticComponent\<ConfigComponent & React.RefAttributes\<any>>-
configTitle节点对应的抽屉标题string \| ((node: INode, nodes: INode[]) => string)-
customRemove自定义删除按钮booleanfalse
displayComponent节点的展示组件React.FC\<DisplayComponent>-
initialNodeData增加节点时初始化数据Record<string, any>-
isStart是否为开始节点booleanfalse
isEnd是否为结束节点booleanfalse
isLoop是否为循环节点booleanfalse1.4.6
name节点名称string-
removeConfirmTitle删除节点前的提示信息。Popconfirm 组件的 title 属性string | ReactNodeAre you sure to remove this node?
showPracticalBranchNode-booleanfalse1.1.0
showPracticalBranchRemove-booleanfalse1.1.0
type节点类型string-

RegisterRemoteNode

参数说明类型必须默认值版本
url节点的远程地址string-1.3.0
cssUrl节点样式的远程地址string-1.3.0

DisplayComponent

参数说明类型
node节点信息(V1 版本开始推荐使用 NodeContext 获取)Node
nodes(V1 版本开始推荐使用 BuilderContext 获取)Node[]
readonly继承 FlowBuilder 的 readonly(V1 版本开始推荐使用 BuilderContext 获取)boolean
remove删除一个或多个节点,默认删除当前节点(V1 版本开始推荐使用 useAction 中的 removeNode 方法)(nodes?: INode \| INode[]) => void

ConfigComponent

参数说明类型
cancel取消时调用,用来关闭抽屉(V1 版本开始推荐使用 useDrawer 中的 closeDrawer 方法)() => void
node节点信息(V1 版本开始推荐使用 BuilderContext 获取 selectedNode )Node
nodes(V1 版本开始推荐使用 BuilderContext 获取)Node[]
save保存节点数据时调用(自动关闭抽屉,无需再执行 cancel),流程引擎会根据第二个参数的布尔值设置节点的 validateStatusError 属性(V1 版本开始推荐使用 useDrawer 中的 saveDrawer 方法)(values: any, validateStatusError?: boolean) => void

AddableComponent

参数说明类型
add增加节点时调用,会自动关闭 popover(type: string) => void
node节点信息(V1 版本开始推荐使用 NodeContext 获取)Node
nodes(V1 版本开始推荐使用 BuilderContext 获取)Node[]

Node

参数说明类型
children分支节点对应的条件节点数组 或 条件节点对应的子流程Node[]
configuring节点是否正在配置,节点的展示组件可根据此属性高亮节点boolean
data节点的数据any
id节点的唯一 idstring
name节点名称,同节点注册时的 namestring
path节点在流程引擎中的路径string[]
type节点类型,同节点注册时的 typestring
validateStatusError节点的表单校验失败,节点的展示组件可根据此属性高亮节点boolean

Context

V1 版本新增

在 FlowBuilder 的上下文环境中,可以使用以下 context

BuilderContext

包含 props 和 state。以下为 state

属性说明类型
zoomValue当前缩放比例number
setZoomValue设置 zoomValue(zoomValue: number) => void
historyRecords历史数据INode[][]
setHistoryRecords设置 historyRecords(records: INode[][]) => void
activeHistoryRecordIndex当前状态在历史数据中的序号number
setActiveHistoryRecordIndex设置 activeHistoryRecordIndex(index: number) => void
selectedNode当前选中的节点INode \| undefined
setSelectedNode设置 selectedNode(node: INode \| undefined) => void
drawerTitle抽屉标题string
setDrawerTitle设置 drawerTitle(title: string) => void
dragType正在拖拽的节点类型string
setDragType设置 dragType(type: string) => void

NodeContext

在调用的地方,获取到所在节点的数据。具体内容见 Node

Hooks

V1 版本新增

在 FlowBuilder 的上下文环境中,可以使用以下 hooks

useAction

属性说明类型版本
clickNode点击一个节点(node: INode = useContext(NodeContext)) => void
addNode增加一个节点,不指定操作节点时,内部通过 NodeContext 获取到当前所在节点实现(node: INode, newNodeType: string) => void | (newNodeType: string) => void
addNodeInLoop循环节点内增加一个节点(newNodeType: string) => void1.4.6
removeNode删除一个/多个节点(targetNode: INode \| INode[] = useContext(NodeContext)) => void

useDrawer

属性说明类型
closeDrawer关闭抽屉,并将 selectedNode 置空() => void
saveDrawer保存抽屉的内容(同 ConfigComponent 中提供的 save 方法)(values: any, validateStatusError?: boolean) => void

useZoom

属性说明类型
minZoom最小缩放比例number
maxZoom最大缩放比例number
zoom改变缩放比例(同 FlowBuilderInstance 中提供的 zoom 方法 )(type: 'out' \| 'in' \| number) => void

useHistory

属性说明类型
maxLength最多保存的数量number
pushHistory增加历史记录(record?: INode[] = useContext(BuilderContext).nodes) => void
history撤销/重做(同 FlowBuilderInstance 中提供的 history 方法)(type: 'undo' \| 'redo') => void

useSort

属性说明类型版本
backward向后排序(node: INode = useContext(NodeContext)) => void1.4.3
forward向前排序(node: INode = useContext(NodeContext)) => void1.4.3
end排序到最末尾(node: INode = useContext(NodeContext)) => void1.4.3
start排序到最前面(node: INode = useContext(NodeContext)) => void1.4.3