Giter VIP home page Giter VIP logo

wfd's Introduction

Workflow Designer

NPM Version NPM Downloads

Online Demo 1

image

https://guozhaolong.github.io/wfd/

Online Demo 2

image

https://guozhaolong.github.io/wfd2-example/

Vue version

https://github.com/guozhaolong/wfd-vue/

Form Designer

https://guozhaolong.github.io/apd-example/

Usage

import React, { Component } from 'react';
import Designer from 'wfd';

const data = {
    nodes: [{ id: 'startNode', x: 50, y: 200, label: 'Start', clazz: 'start' },
      { id: 'taskNode1', x: 200, y: 200, label: 'Supervisor', assigneType: 'person', assigneValue: 'admin', isSequential:false, clazz: 'userTask' },
      { id: 'taskNode2', x: 400, y: 200, label: 'Manager', assigneType: 'person', assigneValue: 'admin', isSequential:false, clazz: 'userTask' },
      { id: 'decisionNode', x: 400, y: 320, label: 'Cost > 1000', clazz: 'gateway' },
      { id: 'taskNode3', x: 400, y: 450, label: 'CEO', clazz: 'userTask' },
      { id: 'endNode', x: 600, y: 320, label: 'End', clazz: 'end' }],
    edges: [{ source: 'startNode', target: 'taskNode1', sourceAnchor:1, targetAnchor:3, clazz: 'flow' },
      { source: 'taskNode1', target: 'endNode', sourceAnchor:0, targetAnchor:0, clazz: 'flow' },
      { source: 'taskNode1', target: 'taskNode2', sourceAnchor:1, targetAnchor:3, clazz: 'flow' },
      { source: 'taskNode2', target: 'decisionNode', sourceAnchor:1, targetAnchor:0, clazz: 'flow' },
      { source: 'taskNode2', target: 'taskNode1', sourceAnchor:2, targetAnchor:2, clazz: 'flow' },
      { source: 'decisionNode', target: 'taskNode3', sourceAnchor:2, targetAnchor:0, clazz: 'flow' },
      { source: 'decisionNode', target: 'endNode', sourceAnchor:1, targetAnchor:2, clazz: 'flow'},
      { source: 'taskNode3', target: 'endNode', sourceAnchor:1, targetAnchor:1, clazz: 'flow' },
      { source: 'taskNode3', target: 'taskNode1', sourceAnchor:3, targetAnchor:2, clazz: 'flow'},

class WFDemo extends Component {
    constructor(props) {
        super(props);
        this.wfDef = React.createRef();
    }
    
    handleSave = () => {
        const bpm = this.wfDef.current.graph.save();
    }
      
    render(){
        const candidateUsers = [{id:'1',name:'Tom'},{id:'2',name:'Steven'},{id:'3',name:'Andy'}];
        const candidateGroups = [{id:'1',name:'Manager'},{id:'2',name:'Security'},{id:'3',name:'OA'}];
        return (
            <>
                <a onClick={this.handleSave}>Save</a>
                <Designer data={data} ref={this.wfDef} height={600} mode={"edit"} lang="zh" users={candidateUsers} groups={candidateGroups}/>
            </>
        )
    }
}

API

Designer
属性
  • data: 初始化数据
  • height: 画布高度
  • mode: view为只读,edit为可编辑
  • lang: zh为中文,en为英文
  • isView: 是否为预览模式(隐藏工具栏和属性栏)
  • users: 选择审批人时对应的数据,数组内对象以id为键,name为值
  • groups: 选择审批组时对应的数据,数组内对象以id为键,name为值
方法
  • save(): 调用graph.save()生成json
  • saveXML(): 调用graph.saveXML(createFile)生成Flowable XML,createFile参数是否同时生成xml文件,默认为true
Node
属性
  • id: 唯一标识
  • x: x点
  • y: y点
  • label: 节点标题
  • hideIcon: 是否隐藏图标
  • active: 是否显示节点状态(节点边将显示运动动画)
  • clazz: 类,对应flowable节点,支持类型如下:
    • start 开始节点
    • timerStart 定时启动节点
    • messageStart 消息启动节点
    • signalStart 信号启动节点
    • gateway 排他网关
    • exclusiveGateway 排他网关
    • parallelGateway 并行网关
    • inclusiveGateway 包容网关
    • userTask 用户审批节点
    • scriptTask 脚本节点
    • mailTask 邮件节点
    • javaTask 自定义类节点
    • receiveTask 接收状态节点
    • timerCatch 定时捕获节点
    • messageCatch 消息捕获节点
    • signalCatch 信号捕获节点
    • end 结束节点
Edge
属性
  • source: 源节点ID
  • target: 目标节点ID
  • sourceAnchor: 源节点锚点,0上、1右、2下、3左
  • targetAnchor: 目标节点锚点
  • clazz: 类,目前只有flow一种
UserTask
属性
  • assignType 审批类型,包含人员、人员组、自定义类
  • assignValue 关联审批人或组
  • javaClass 自定义类名
  • dueDate 持续时间
  • isSequential 是否会签
ScriptTask
属性
  • script 脚本内容
JavaTask
属性
  • javaClass 自定义类名
ReceiveTask
属性
  • waitState 等待状态字段名
  • stateValue 等待状态值
MailTask
属性
  • to 收件人
  • subject 邮件主题
  • content 邮件内容

Run Example

npm run dev

React Version

>= 16.x

wfd's People

Contributors

forbreak avatar guozhaolong avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wfd's Issues

审批节点无法添加表单信息

相比于官方的modeler,好像少了很多属性,是遗漏了还是我需要集成其他插件呢?目前我的需求是要给审批节点添加form url

对齐线bug

在页面demo能复现,活动的矩形方块使用上边界或下边界对齐时,方块之间的连接线会有一点错位,使用中线连接线对齐时不会出现

大佬 ,项目启动报错

D:\wfd-master>umi dev
fs.js:904
return binding.readdir(pathModule._makeLong(path), options.encoding);
^

Error: ENOENT: no such file or directory, scandir 'D:\wfd-master\pages'
at fs.readdirSync (fs.js:904:18)

save方法的问题

save方法的问题。我改变了节点的图片,然后预览时调用save()方法,但是预览的节点现实的图片还是改变前的图片,感觉是更换了图片但是没有检测到数据的变化,节点使用的是group中包裹的image。点击更换了图片的节点,查看时image节点的值没有改变。大佬有什么好的方法解决这个问题呢?

怎样增加节点的拖拽缩放功能?

请教大佬,怎样增加节点的拖拽缩放功能?
考虑通过一个事件如节点的双击事件,使得节点可以通过拖拽控制节点的大小?这个功能应该怎么实现呢?

TypeError: Cannot read property 'getContainer' of undefined

TypeError: Cannot read property 'getContainer' of undefined

1633 | var group = subProcess.getContainer();
652 | cmdPlugin._deleteSubProcessNode(graph, i);
646 | selectedItems.forEach(function (i) {
528 | this.method && (isString(this.method) ? graphthis.method : this.method(graph));
557 | cmd.execute(graph);
503 | _this.execute(name, graph, cfg);
910 | graph.commandEnable(cmdName) && graph.executeCommand(cmdName);

1.这错误是模块原有的吗 ?(删除节点时出现)

2.图片改文字可行,只是拖拽时默认是选中文字,如果先选中文字,再拖动是可以的,如下图GIF:

demo3

拖拽的节点必须是img?

比如删除img,将自定义属性放在div上,但文字无法拖拽

<div data-item={"{clazz:'start',size:'30*30',label:''}"} >{i18n['startEvent']}</div>

比较初级,希望指点一下

大佬 启动报错

image

我需要先npm run build 然后在npm run dev 才能启动 如果直接把../../dist 替换为../../src 页面会报
image

在example下执行 umi dev 和上面的报错一样。。

请教大佬,想增加显示类似echarts图表的节点应该怎么实现?

请教大佬,想增加显示类似echarts图表的节点应该怎么实现?目前使用自定义dom节点的方式,无法成功的增加类似于echarts这样的图表,大佬是否有考虑过增加此类型的实现?也就是说在节点中,显示echarts,感觉上不难,实际上实现就比较困难!请教下大佬,如果要实现此类的功能,应该怎么实现。

引入报错

KJM~($2WZ@X7LZ{1AU7$UAG
哥,我放到项目里,这种引入方法报错,下面一种不报错,是差什么loader,求指导啊

不好意思,提错了,我去vue那边提

node无法拖动(偶现)

鼠标在node上已出现可拖动cursor,此时拖动鼠标,node并没有移动。demo上可以复现此问题,开始事件、捕获事件、结束事件出现该问题的几率比较大,暂不知道原因。

this.graph.setItemState无法有效设置state

在更新wfd-vue到g6 3.5 时遇到的问题,然后到wfd中复查,发现也有此问题。

运行wfd时,behaviour事件无反应,经debug发现是this.graph.setItemState的问题

onNodeMouseOver(e) {
      if (this.graph.getCurrentMode() === 'edit') {
        // this.graph.setItemState(e.item, 'hover', true); // 无法设置状态,hasState均为false
        e.item.setState('hover', true) // 可以设置状态 // hasState均为true
        console.log(e.item.hasState('hover'))
      } else {
        // this.graph.setItemState(e.item, 'hover', false);
        e.item.setState('hover', false)
      }
    },

改为e.item.setState() 就可以了。

"@antv/g6@~3.5.0":
version "3.5.3"

image

直接用的最新wfd repo,yarn运行的,有人遇到同样问题么?

普通的html如何使用

请问下,如果要在普通的html中,要如何引用这个呢?还有就是是否考虑支撑activiti?

项目很棒,提一个小建议

项目很精致,逻辑也很顺畅,费心了。
不过提一个小建议,试用后感觉业务耦合有些过于紧密,实际应用中可能不够灵活,不知有没有发布简化版的计划。将数据、业务逻辑和具体渲染拆分,比如为itempanel和canvas展示提供配置化的node基础信息,节点绘制后,节点通过逻辑接口决定toolbar,contextmenu的渲染内容,节点点击后提供回调函数决定detailpanel的渲染,等等。这样的话项目可能能更方便的应用于各个场景,而项目维护也可以更专注于工作流的渲染与编辑交互上,将具体业务的渲染和业务逻辑解放出来。

请教大佬。更新节点的size属性后,视图没有变化

请教大佬。更新节点的size属性后,调用的是updataItem(),视图没有变化,可以从控制台上看到数据是变了的,但是节点的视图没有重新绘制,按您先前说的使用keyShape.attr()的方法,也不能解决!数据是变化的,但是视图就是不更新,就很尴尬!

请问是否支持框选?

目前鼠标左键按下想要选定区域进行删除操作时会移动画布,请问API中有框选或多元素选择吗?谢谢!

请问节点节点active时候的运动动画是怎么做的,我尝试在自己的项目中用g6-editor,好像不生效

看完你的代码后,又去官方文档上看了一遍,还是不能实现

 afterDraw(item) {
    const shape = item.getGraphicGroup().get('children')[0];
    const length = 9;
    let totalArray = [];
    for (let i = 0; i < length; i += interval) {
      totalArray = totalArray.concat(lineDash);
    }
    let index = 0;
    shape.animate({
      onFrame(ratio) {
        const cfg = {
          lineDash: dashArray[index].concat(totalArray)
        };
        index = (index + 1) % interval;
        return cfg;
      },
      fill: 'red',
      repeat: true
    }, 5000, 'easeLinear',  ()=> {
      console.log(11)
    });
  },
......

使用package.json中的依赖版本依然报错

采用与源码package.json一致的版本引入项目后依然报错

@antv/dom-util": "^2.0.2",
    "@antv/matrix-util": "^2.0.7",
    "@antv/g-canvas": "^0.4.12",
    "@antv/g6": "3.5.2",
    "@antv/util": "~2.0.9",
    "antd": "^4.2.5",
    "antd-etable": "^1.3.44",
    "moment": "^2.26.0"
These dependencies were not found:

* @antv/g6/src in ./node_modules/wfd/dist/index.esm.js
* @antv/g6/src/item/item in ./node_modules/wfd/dist/index.esm.js
* @antv/g6/src/shape/single-shape-mixin in ./node_modules/wfd/dist/index.esm.js

如何获取和设置流程标识?

image

设置流程的标识后,调用 save 方法,获取到的json中没有流程的信息,是否是bug?

另外再次编辑时,如何把流程标识的信息设置上,readme中貌似只可以设置节点

大佬,请教下,关于toFront()/toBack()方法

关于toFront()/toBack()方法,在节点调用这两个方法的时候,是直接将选中的节点置为顶层或者底层了。有什么方法可以使节点每次只移动一层?
比如有三个节点,A,B,C,如图。选中B节点调用toBack()方法,B节点视觉上位于A,C节点的下方,但是在调用toFront()方法后,B节点会位于A,C节点的上方,怎么做才能才能时B向上移动一层而不是直接移动到顶层?
image

请教一下,添加节点时要选择数据源。这个操作怎么实现?

请教大佬,添加节点(部分节点需要后台数据)时要选择数据源(类似于弹框选择数据来源等)。这个操作怎么实现?
在dragPanelItemAddNode.js中判断进行判断(给需要数据的节点添加了标识),然后对对应节点进行数据的添加,使用element-ui的弹框,数据选择时使用树状表格。

无法从anchor拉edge(偶现)

有时鼠标悬停在node的anchor上,cursor已变成 ‘+’ 状态,此时拖动鼠标,并没有拉出edge。demo上可以复现该问题。demo上出现该问题的概率略低

强烈建议弄一个vue版本

大佬,你这个编辑器,简洁明了直观,很给力,但是强烈建议支持vue,因为现在国内用vue的太多了,越来越多的人用vue

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.