ProFlow 流程编辑器框架 1.0 发布

简介: ProFlow 流程编辑器框架 1.0 发布

本文来源:支付宝体验科技公众号


ProFlow 官网地址直达:https://pro-flow.antdigital.dev/

在当前数字科技的业务中存在很多图展示、编辑的相关业务,大家设计方案不统一实现也不尽统一,最终导致设计与研发资源的浪费、产品体验参差不齐。为此我们设计和研发了 ProFlow,提供更现代化的 UI 组件设计以及 React 友好的 API 以及完善的基本功能,如无极缩放,自动布局,多线重叠的展示优化等。


  ProFlow 能做什么?


图展示场景 - FlowView

如果您需要展示复杂的节点逻辑,建议您使用 FlowView 组件,它内置了完善的展示逻辑,包括节点与线的主副级别选中、自动布局等能力,能够呈现出像下面这样的效果。

图编辑场景 - FlowEditor

如果您更注重交互和编辑,不想自己维护一套数据流,建议您使用 FlowEditor 组件。它内置了完善的增删改、撤销重做的逻辑,可以开箱即用,能够呈现出像下面这样的效果。

  快速上手(FlowView)


安装依赖

ProFlow 在 npm 上发布为 @ant-design/pro-flow ,推荐使用 pnpm 安装。

pnpm i @ant-design/pro-flow -S

引入pro-flow

引入 FlowView 组件,即可在页面上获得一块带有小地图能力的的画布。

import { FlowView } from '@ant-design/pro-flow';
import { createStyles } from 'antd-style';
const useStyles = createStyles(() => {
  return {
    container: {
      width: '100%',
      height: '400px',
    },
  };
});
function App() {
  const { styles } = useStyles();
  return (
    <div className={styles.container}>
      <FlowView nodes={[]} edges={[]} />
    </div>
  );
}
export default App;

效果如图:


注意:组件必须包裹在具有宽度和高度的元素中。

添加节点和边缘数据

现在我们加入一些 nodesedges 的数据。在这一步,我们无需关注nodes在画布中的坐标,ProFlow内置了dagre布局算法,我们只需描述节点之间的关系,即可获得自动布局后的效果,轻松实现流程图的美观展示。

export const nodes = [
  {
    id: 'a1',
    data: {
      title: 'XXX_API_a1',
      logo: 'https://mdn.alipayobjects.com/huamei_ntgeqc/afts/img/A*kgyiRKi04eUAAAAAAAAAAAAADvuvAQ/original',
      description: 'XXX_XXX_XXX_API',
    },
  },
  {
    id: 'a2',
    data: {
      title: 'XXX_API_a2',
      logo: 'https://mdn.alipayobjects.com/huamei_ntgeqc/afts/img/A*kgyiRKi04eUAAAAAAAAAAAAADvuvAQ/original',
      description: 'XXX_XXX_XXX_API',
    },
  },
  {
    id: 'a3',
    data: {
      title: 'XXX_API_a3',
      logo: 'https://mdn.alipayobjects.com/huamei_ntgeqc/afts/img/A*kgyiRKi04eUAAAAAAAAAAAAADvuvAQ/original',
      description: 'XXX_XXX_XXX_API',
    },
  },
];
export const edges = [
  {
    id: 'a1-a2',
    source: 'a1',
    target: 'a2',
  },
  {
    id: 'a1-a3',
    source: 'a1',
    target: 'a3',
    type: 'radius',
  },
];

并在FlowView中引入它们:

import { FlowView } from '@ant-design/pro-flow';
import { edges, nodes } from './data';
function App() {
  const { styles } = useStyles();
  return (
    <div className={styles.container}>
      <FlowView nodes={nodes} edges={edges} />
    </div>
  );
}
export default App;

效果如图:

添加交互性

我们需要一些方法来监听用户与画布的交互,比如选中节点、选中边缘以及取消选中。

  • onNodeClick - 点击节点回调
  • onEdgeClick - 点击边缘回调
  • onPaneClick - 点击画布回调

ProFlownodeedge提供可消费的SelectType。可以通过给 nodeedge 变更不同的 SelectType 来快速实现不同程度的选中。

这里可以使用FlowView提供的useFlowViewer来更轻松的变更SelectType

import {
  FlowPanel,
  FlowView,
  FlowViewProvider,
  SelectType,
  useFlowViewer,
} from '@ant-design/pro-flow';
import { useState } from 'react';
import { edges, nodes } from './data';
function App() {
  const { selectNode, selectEdges, selectNodes } = useFlowViewer();
  const [node, setNode] = useState(null);
  const { styles } = useStyles();
  return (
    <div className={styles.container}>
      <FlowView
        onNodeClick={(e, node) => {
          setNode(node);
          selectNodes(['a1', 'a2', 'a3'], SelectType.SUB_SELECT);
          selectNode(node.id, SelectType.SELECT);
          selectEdges(['a1-a2', 'a1-a3'], SelectType.SUB_SELECT);
        }}
        onPaneClick={() => {
          setNode(null);
          selectNodes(['a1', 'a2', 'a3'], SelectType.DEFAULT);
          selectEdges(['a1-a2', 'a1-a3'], SelectType.DEFAULT);
        }}
        nodes={nodes}
        edges={edges}
      >
        <FlowPanel>
          <div className="panel-title">
            {node ? `当前选中的是:${node.id}` : `当前没有选中节点`}
          </div>
        </FlowPanel>
      </FlowView>
    </div>
  );
}
function ProApp() {
  return (
    <FlowViewProvider>
      <App />
    </FlowViewProvider>
  );
}
export default ProApp;

效果如下:

  进阶使用(FlowEditor)


如果您的需求涉及到了节点、边缘的增删改,需要对画布进行编辑,有着更复杂的画布交互需求,可以直接使用FlowEditor组件。

FlowEditor 提供了一套开箱即用的功能。包括拖拽周围节点、缩放和平移、选择多个节点和边、添加删除节点边缘、快捷键、剪切板、撤销重做等能力。使得对画布的编辑操作变得更加流畅、直观。通过FlowEditor,您可以轻松处理节点和边缘的增删改操作,满足了更复杂的画布交互需求。

实现自定义节点

首先我们需要创建一个自定义节点。在ProFlow中节点是一个 React 组件,这意味着它可以渲染您喜欢的任何内容。

import { Handle, Position } from '@ant-design/pro-flow';
  
// 自定义节点
const StringRender: FC = (node: any) => {
  const { handles, id } = node;
  return (
    <div className={'stringNode'}>
      <Handle
        id={typeof handles?.source === 'string' ? handles?.source : id}
        type={'target'}
        position={Position.Left}
      />
      {node.data.title}
      <Handle
        id={typeof handles?.source === 'string' ? handles?.source : id}
        type={'source'}
        position={Position.Right}
      />
    </div>
  );
};

在这段代码中,我们创建了一个名为StringRender的组件,组件内展示一段文字,在左右两边各有一个Handle(连接桩)。

添加节点类型

您可以将新的节点类型添加到props中传递给 FlowViewFlowEditor

在组件外部定义或缓存nodeTypes非常重要。 否则 React 会在每次渲染时创建一个新的对象,这会导致性能问题和错误。

// 注册自定义节点类型
const nodeTypes = { StringNode: StringRender };
function App() {
  const { styles } = useStyles();
  
  return (
    <div className={styles.container}>
      <FlowEditor nodeTypes={nodeTypes} />
    </div>
  );
}

通过 useFlowEditor 数据驱动

// 注册自定义节点类型
const nodeTypes = { StringNode: StringRender };
const App = () => {
  const editor = useFlowEditor();
  const { styles } = useStyles();
  useEffect(() => {
    editor.addNode({
      id: 'a1',
      type: 'StringNode',
      position: { x: 0, y: 100 },
      data: {
        title: 'String Node',
      },
    });
  }, [editor]);
  return (
    <div className={styles.container}>
      <FlowEditor nodeTypes={nodeTypes} />
    </div>
  );
};
// 使用useFlowEditor,需包裹一层FlowEditorProvider.
const ProApp = () => {
  return (
    <FlowEditorProvider>
      <App />
    </FlowEditorProvider>
  );
};

FlowEditor内置了节点的拖拽、复制、粘贴、撤销、重做等能力,于是便可以获得如下效果:

  案例展示

多 Handle 连接

image.png

https://pro-flow.antdigital.dev/case-show/tech-pileline

PipeLine Flow

https://pro-flow.antdigital.dev/case-show/cicd-pipe-line

拖拽插入节点

  开源地址 & 联系我们


接下去的一段时间,我们会继续根据用户反馈持续优化产品体验,修复和完善产品功能。如果你在使用中碰到了问题,欢迎来给我们提需求和缺陷,欢迎扫码加入群聊。

相关文章
|
1月前
|
JSON 前端开发 数据可视化
AMIS【部署 01】amis前端低代码框架可视化编辑器amis-editor本地部署流程
AMIS【部署 01】amis前端低代码框架可视化编辑器amis-editor本地部署流程
623 0
|
1月前
|
前端开发 JavaScript 搜索推荐
react-app框架——使用monaco editor实现online编辑html代码编辑器
react-app框架——使用monaco editor实现online编辑html代码编辑器
64 3
|
1月前
|
传感器 移动开发 Go
如何像人类一样写HTML之代码编辑器的选择与基础框架
如何像人类一样写HTML之代码编辑器的选择与基础框架
|
1月前
|
存储 搜索推荐 前端开发
SpringBoot框架+原生HTML云端SaaS服务方式的电子病历编辑器源码
一体化电子病历系统基于云端SaaS服务的方式,采用B/S(Browser/Server)架构提供,覆盖了医疗机构电子病历模板制作到管理使用的整个流程。除实现在线制作内容丰富、图文并茂、功能完善的电子病历模板外,还可按照医疗机构的特色,根据不同业务的需求,使用该系统定制个性化、实用化、特色化电子病历模板。 该系统能对电子病历模板进行统一集中管理,通用的电子病历模板能直接提供给不同的医疗机构直接使用,避免重复制作;提供了功能齐备的控件元素,实现电子病历在业务使用中数据的自动获取功能,简化了人工的大量填报。
|
10月前
|
JavaScript
Vue CKEditor5 自定义编辑器详细流程(插件安装使用流程)
Vue CKEditor5 自定义编辑器详细流程(插件安装使用流程)
927 0
|
前端开发 JavaScript 搜索推荐
JAVA带编辑器医院电子病历管理系统源码 springboot框架
Java电子病历系统技术说明 1、技术选型 :本电子病历系统采用前后端分离模式开发和部署。 2、前端技术:原生HTML、JS、CSS,Jquery、BootStrap、layui、Swf插件、Clipboard剪切板、 Echarts、PagedJS打印插件、Prince打印插件、Wkhtmltopdf打印插件等。 3.后端技术:SpringBoot框架、Mybatis-Plus、WebSocket、Stomp、Vintage-Engine页面解析模板引擎、 Thymeleaf页面解析模板引擎、Fileupload文件上传组件等。 4、数据库:MySQL数据库
334 0
JAVA带编辑器医院电子病历管理系统源码 springboot框架
flowable 重构流程编辑器获取用户信息
flowable 重构流程编辑器获取用户信息
146 0
|
JavaScript 前端开发 PHP
如何将文本编辑器嵌入框架--以Umeditor&CodeIgniter框架为例
转:http://blog.csdn.net/u013332865/article/details/52066211 最近接到一个给某私立贵族(小,初,高 12年只是学费近200W)学校做一个网站,时间紧迫,本来打算用wordpress,但是要求页面要重新设计,而我们的前端开发没有WP主题开发的经验,无疑需要额外的学习成本(主要是时间来不及),所以提出自己做一个CMS的系统。
1510 0
|
PHP
CI框架中集成CKEditor编辑器的教程
CKEditor是在很多开发过程中都会用到的一个富文本编辑器,那么如何在CI框架中使用它呢?这里介绍了在CI下使用CKEditor的方法,版本比较低,是在CI 1.7.3下使用fckeditor 2.6.6。
1274 0