bpmn-js系列之Palette

前边写了四篇文章介绍了bpmn.js的基本使用,最近陆续有小伙伴加我催更,感谢对我这个半吊子前端的信任,接着更新bpmn.js的一些高级用法,本篇介绍对左侧工具栏Palette的隐藏和自定义修改

隐藏shape

左侧工具栏Palette有些图标我用不到,那该如何隐藏呢?最简单的方法就是直接找到对应的class,通过css隐藏,例如我不需要创建数据存储,可以通过下边的代码隐藏

.bpmn-icon-data-store {display: none;
}

自定义shape

为了编辑方便,我想在palette上添加一个shape该如何操作呢?这里我们需要自定义Palette,自定义Palette有两种方式可以选择,第一种就是基于默认的Palette来修改,第二种就是完全写个新的Palette来替代默认的Palette,第一种只能在默认的Palette上添加shape,而不能修改或删除,比较鸡肋我们就直接放弃了,来看下完全自定义Palette该如何实现

以下代码基于我们之前搭建好的代码框架,具体可看文章『最好用的流程编辑器bpmn-js系列之基本使用』,

1.在components目录下新建customBpmn目录,在customBpmn目录下新建custom目录,每层目录下都新建index.js文件,最终目录结构如下

2.在custom目录下新建CustomPalette.js文件,内容如下

import { assign } from "min-dash";export default function PaletteProvider(palette,create,elementFactory,handTool,lassoTool,spaceTool,globalConnect,translate
) {this.create = create;this.elementFactory = elementFactory;this.handTool = handTool;this.lassoTool = lassoTool;this.spaceTool = spaceTool;this.globalConnect = globalConnect;this.translate = translate;palette.registerProvider(this);
}PaletteProvider.$inject = ["palette","create","elementFactory","handTool","lassoTool","spaceTool","globalConnect","translate"
];PaletteProvider.prototype.getPaletteEntries = function (element) {const {create,elementFactory,handTool,lassoTool,spaceTool,globalConnect,translate} = this;function createAction(type, group, className, title, options) {function createListener(event) {var shape = elementFactory.createShape(assign({ type: type }, options));if (options) {shape.businessObject.di.isExpanded = options.isExpanded;}create.start(event, shape);}var shortType = type.replace(/^bpmn:/, "");return {group: group,className: className,title: title || translate("Create {type}", { type: shortType }),action: {dragstart: createListener,click: createListener}};}return {"lasso-tool": {group: "tools",className: "bpmn-icon-lasso-tool",title: "Activate the lasso tool",action: {click: function (event) {lassoTool.activateSelection(event);}}},"tool-separator": {group: "tools",separator: true},"create.start-event": createAction("bpmn:StartEvent","event","bpmn-icon-start-event-none","创建开始节点"),"create.end-event": createAction("bpmn:EndEvent","event","bpmn-icon-end-event-none","创建结束节点"),"create.user-task": createAction("bpmn:UserTask","activity","bpmn-icon-user-task","创建用户任务"),"create.exclusive-gateway": createAction("bpmn:ExclusiveGateway","gateway","bpmn-icon-gateway-xor","创建排他网关")};
};

这段代码的意思相信各位前端的大佬比我理解的要深刻,就不过多介绍了,Platte展示的shape就是最后return输出的那个字典数据定义的,一个shape对应的数据格式如下:

"lasso-tool": {group: "tools",className: "bpmn-icon-lasso-tool",title: "Activate the lasso tool",action: {click: function (event) {lassoTool.activateSelection(event);}}
}

其中key为这个shape的名称,value为这个shape定义的一些属性,主要有四个:

  • group: 定义这个shape属于哪个组,主要有tools、event、gateway和activity可以选择
  • className: 定义这个shape的chass名称,可以通过这个class给shape指定具体的样式
  • title: 定义这个shape的title,也就是鼠标移动到shape上的提示
  • action: 用户操作时触发的事件

通过这个数据我们就可以随意添加、删除或者修改Palette的shape了,改位置该样式轻松自如

3.在custom/index.js文件中添加如下内容将自定义的Palette导出

import CustomPalette from "./CustomPalette";export default {__init__: ["paletteProvider"],paletteProvider: ["type", CustomPalette],
};

4.在customModeler/index.js文件中编写自定义的CustomModeler

import inherits from "inherits";import Modeler from "bpmn-js/lib/Modeler";import CustomModule from "./custom";function CustomModeler(options) {Modeler.call(this, options);this._customElements = [];
}inherits(CustomModeler, Modeler);CustomModeler.prototype._modules = [].concat(CustomModeler.prototype._modules, [CustomModule
]);export { CustomModeler };

5.在页面上引用自定义的CustomModeler以替代原本引用的BpmnModeler类,这样就能用到我们自定义的Palette啦

import { xmlStr } from "../mock/xmlStrPreview";
import { CustomModeler } from "../components/customBpmn";export default {...methods: {init() {const canvas = this.$refs.canvas;this.bpmnModeler = new CustomModeler({container: canvas});this.createNewDiagram();},async createNewDiagram() {try {const result = await this.bpmnModeler.importXML(xmlStr);const { warnings } = result;console.log(warnings);} catch (err) {console.log(err.message, err.warnings);}}}
};

最终效果如下:

Shape类型

关于Shape总共有哪些类型,以及各自对应的属性都是什么,这个官方没有具体的文档给列出,我在使用的时候通常直接查看源码bpmn-js/lib/features/palette/PaletteProvider.js和bpmn-js/lib/features/context-pad/ContextPadProvider.js文件获取,对于部分类型,需要添加options选项

例如中间时间事件IntermediateThrowEvent所对应的属性为:

return {"create.timer-intermediate-event": createAction("bpmn:IntermediateThrowEvent","event","bpmn-icon-intermediate-event-catch-timer","Create IntermediateThrowEvent",{ eventDefinitionType: "bpmn:TimerEventDefinition" })
};

写在最后

接触bpmn-js不久,边学边写,文章难免出错,各位多多包含。想要打造一个好用的适合自己的流程编辑器,需要了解的内容比较多,bpmn-js会分多篇文章来介绍,欢迎关注

源码地址:https://github.com/Mrs-Bean/bpmn-src.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/541014.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB:一些杂例

a 2; b 5; x 0:pi/40:pi/2; %增量为pi/40 y b*exp(-a*x).*sin(b*x).*(0.012*x.^4-0.15*x.^30.075*x.^22.5*x); %点乘的意义 z y.^2; %点乘的意义 w(:,1) x; %组成w,第一列为x w(:,2) y; %组成w,第二列为y w(:,3) z; %组成w,第三列为z…

MySQL一些命令记录

查看数据引擎 show engines;创建数据库,并选择库 CREATE DATABASE IF NOT EXISTS test_database; USE test_database;创建表 CREATE TABLE IF NOT EXISTS test_table (id INT AUTO_INCREMENT PRIMARY KEY,field1 VARCHAR(50),field2 VARCHAR(50),field3 VARCHAR(50),field4 …

2024最新注册谷歌账号(Gmail邮箱),解决此号码无法用于验证的方法,亲测有用!

我们知道,拥有一个谷歌账号/Gmail邮箱注册在全球互联网冲浪时会比较方便。但不少人在注册过程中,遇到了“此号码无法用于验证”的问题,如图: 有些人可能会认为是因为国内的手机号才没办法用于验证的,这简直是在胡说&am…

续上篇 qiankun 微前端配置

上篇文章地址:微前端框架 qiankun 配置使用【基于 vue/react脚手架创建项目 】-CSDN博客 主应用: src/main.js 配置: import Vue from vue import App from ./App.vue import router from ./router import { registerMicroApps, start } …

云计算与APP开发,如何利用云端服务提升应用性能?

随着移动应用程序(APP)的普及,如何提升应用性能成为了开发者们关注的重点之一。而云计算技术的发展为APP开发者提供了全新的解决方案。本文将探讨云计算与APP开发的结合,以及我们公司提出的解决方案,帮助开发者利用云端…

使用阿里云服务器查看网站备案的方法和注意事项

随着互联网的发展,网站注册已成为在中国建设网站的必要步骤。 在使用阿里云服务器时,我们可以通过以下步骤查看网站注册状态。 备案概述: 在中国,互联网信息服务提供者必须进行登记,以监管互联网内容、规范市场运营和…

3.14号arm

1. 计算机基础理论 1.1 计算机的组成 输入设备:将数据转换成计算机可以识别,存储,处理的形式,发送到计算机中 输出设备:将计算机对程序和数据的运算结果输送到外部的设备 存储器:用于将数据保存的模块。 …

phy接口不用网络变压器

phy接口不用网络变压器 Hqst华强盛导读:网络变压器的作用原理是基于电磁感应的原理。当电流通过一个线圈时,会产生一个磁场。如果将另一个线圈放置在这个磁场中,磁场就会穿过另一个线圈,从而在另一个线圈中产生电流。这个过程被称…

识别和定位 - 实现工业自动化及生产数字化,推动现代工业4.0

工业4.0的定义 工业 4.0 是指将智能数字化技术集成到制造和工业流程,包括工业物联网网络、人工智能、大数据、机器人和自动化等一系列技术。工业 4.0 能帮助企业实现智能制造,建立智能工厂,目标是提高生产力、效率和灵活性,同时在…

vue2之过滤器

过滤器 过滤器的实现类似Django的过滤器。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>过…

程序人生——Java数组和集合使用建议(1)

目录 引出数组和集合建议60&#xff1a;性能考虑&#xff0c;数组是首选建议61&#xff1a;若有必要&#xff0c;使用变长数组建议62&#xff1a;警惕数组的浅拷贝 建议63&#xff1a;在明确的场景下&#xff0c;为集合指定初始容量建议64&#xff1a;多种最值算法&#xff0c;…

Java Day 10 io流

IO流 1、前置知识 字符集1.1 标准ASCII1.2 GBK编码1.3 UTF-321.4 UTF-81.5 编码和解码方法 2、IO流2.1 流的分类2.2 FileInputStream2.2.1 常用方法 2.3 FileOutputStram2.3.1 常用方法2.3.2 文件复制案例 2.4 释放资源的方式2.4.1 try-catch-finally2.4.2 try-with-resource 1…