bpmn-js系列-自定义Palette工具(二)
前面文章介绍了bpmn-js的基本使用本篇介绍对左侧工具栏的自定义修改。自定义Palettebpmn-js默认的Palette有不怎么用的项目要求左侧把常用的展示出来所以我们只能自定义写个新的来代替默认的Palette。以下代码基于搭建好的React v18项目和引入了bpmn-js语法可根据自己项目修改1. 创建customBpmn文件夹在customBpmn文件夹下新建custom文件夹和index.tsx文件在custom文件夹下新建CustomPalette.tsx和index.tsx文件。最终目录结构如下图所示2. custom/CustomPalette.tsx文件内容如下: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?: any) { function createListener(event) { var shape elementFactory.createShape(assign({ type: type }, options)); if (options) { shape.businessObject.di.isExpanded options.isExpanded; } create.start(event, shape, { hints: { autoSelect: [ 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, 开始事件 StartEvent ), create.end-event: createAction( bpmn:EndEvent, event, bpmn-icon-end-event-none, 结束事件 EndEvent ), create.task: createAction( bpmn:Task, activity, bpmn-icon-task, 任务 Task ), create.service-task: createAction( bpmn:ServiceTask, activity, bpmn-icon-service-task, 服务任务 ServiceTask ), create.script-task: createAction( bpmn:ScriptTask, activity, bpmn-icon-script-task, 脚本任务 ScriptTask ), create.receive-task: createAction( bpmn:ReceiveTask, activity, bpmn-icon-receive-task, 接收任务 ReceiveTask ), create.subprocess-collapsed: createAction( bpmn:SubProcess, activity, bpmn-icon-subprocess-collapsed, 子流程(折叠) SubProcess(collapsed), {isExpanded: false} ), create.subprocess-expanded: createAction( bpmn:SubProcess, activity, bpmn-icon-subprocess-expanded, 子流程(展开) SubProcess(expanded), {isExpanded: true} ), create.call-activity: createAction( bpmn:CallActivity, activity, bpmn-icon-call-activity, 调用活动 CallActivity ), create.exclusive-gateway: createAction( bpmn:ExclusiveGateway, gateway, bpmn-icon-gateway-xor, 排他网关 ExclusiveGateway ), create.parallel-gateway: createAction( bpmn:ParallelGateway, gateway, bpmn-icon-gateway-parallel, 并行网关 ParallelGateway ), create.inclusive-gateway: createAction( bpmn:InclusiveGateway, gateway, bpmn-icon-gateway-none, 包容网关 InclusiveGateway ), }; };Platte展示的shape就是最后return输出的那个字典数据定义的一个shape对应的数据格式如下create.start-event: { group: event, className: bpmn-icon-start-event-none, title: 开始事件 StartEvent, action: { click: function (event) { var shape elementFactory.createShape({ type: bpmn:StartEvent }); create.start(event, shape, { hints: { autoSelect: [ shape ] } }); }, dragstart: function() {...} } }其中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.tsx中将Palette导出import CustomPalette from ./CustomPalette; export default { __init__: [paletteProvider], paletteProvider: [type, CustomPalette], };4. customBpmn/index.tsx 中编写自定义的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. 在bpmn组件中引用自定义的CustomModeler来替换原本引用的BpmnModelerimport React, { useEffect, useRef, useState } from react; import BpmnModeler from bpmn-js/lib/Modeler; //默认引入 import { CustomModeler } from ./customBpmn; //自定义引入 import bpmn-js/dist/assets/diagram-js.css; import bpmn-js/dist/assets/bpmn-font/css/bpmn.css; import bpmn-js/dist/assets/bpmn-js.css; import { defXmlStr } from ./xmlStr; import ./styles.less const BpmnModelerWidget ({ initialXml, onSave }) { const containerRef useRef(null); const modelerRef useRef(null); const [xml, setXml] useState(); const [error, setError] useState(null); useEffect(() { // 初始化建模器 // modelerRef.current new BpmnModeler({ //默认左侧Palette modelerRef.current new CustomModeler({ //自定义左侧Palette !!!重要修改------- container: containerRef.current }); // 加载初始XML if (initialXml) { loadDiagram(initialXml); } else { createNewDiagram(); } // 监听变化 modelerRef.current.on(commandStack.changed, async () { try { const { xml: newXml } await modelerRef.current.saveXML({ format: true }); setXml(newXml); } catch (err) { console.error(Failed to save XML, err); } }); return () { modelerRef.current?.destroy(); }; }, []); const loadDiagram async (xml) { try { await modelerRef.current.importXML(xml); const canvas modelerRef.current.get(canvas); canvas.zoom(fit-viewport); setError(null); } catch (err) { setError(Failed to load diagram); console.error(err); } }; const createNewDiagram async () { const newDiagram defXmlStr(New_Process, New Process) await loadDiagram(newDiagram); }; return ( div classNamebpmn-modeler div idcanvas classNamemodeler-container ref{containerRef} / /div ); }; export default BpmnModelerWidget;最终效果如图配置源码使用的时候可以直接查看源码bpmn-js/lib/features/palette/PaletteProvider.js和bpmn-js/lib/features/context-pad/ContextPadProvider.js文件进行自定义修改。对于部分类型需要添加options选项如上例中的子流程 bpmn:SubProcess代码仓库完整代码已上传至https://gitee.com/z-beast/bpmn-logic-flowchart

相关新闻

COSMO-RS 实操:从量子力学到热力学性质的“无参”预测之路

COSMO-RS 实操:从量子力学到热力学性质的“无参”预测之路

COSMO-RS 实操:从量子力学到热力学性质的“无参”预测之路 摘要:在化工热力学与药物设计中,COSMO-RS(Conductor-like Screening Model for Real Solvents)被视为连接微观量子化学与宏观相平衡的“圣杯”之一。不同于传统的基团贡献法(如UNIFAC),COSMO-RS不依赖大量的实…

2026/8/15 20:29:27 阅读更多 →
Vue Query Builder高级技巧:提升查询构建体验的7个方法

Vue Query Builder高级技巧:提升查询构建体验的7个方法

Vue Query Builder高级技巧:提升查询构建体验的7个方法 【免费下载链接】vue-query-builder A UI component for building complex queries with nested conditionals. 项目地址: https://gitcode.com/gh_mirrors/vu/vue-query-builder Vue Query Builder是一…

2026/8/16 23:49:59 阅读更多 →
Unity TMP_SDF 分析(三)顶点着色器中的屏幕空间缩放

Unity TMP_SDF 分析(三)顶点着色器中的屏幕空间缩放

Unity TMP_SDF 分析(三):顶点着色器中的屏幕空间缩放适用版本:Unity 2021.3.23f1c1|TextMeshPro 3.0.9|UGUI 1.0.0 分析范围:项目中的标准 Assets/TextMesh Pro/Shaders/TMP_SDF.shader 及其关联…

2026/8/15 20:29:27 阅读更多 →

最新新闻

nslookup命令使用说明

nslookup命令使用说明

个人建站,域名备案完成后,往往还要做域名解析服务,技术人员怎么能知道自己配置的DNS正确与否呢?NSLOOKUP查询域名信息的一个非常有用的命令,可以指定查询的类型,可以查到DNS记录的生存时间还可以指定使用哪…

2026/8/17 0:00:08 阅读更多 →
【原创唯一】基于SpringBoot+Vue的在线书店商城系统 课程设计/大作业/期末作业(源码+MySQL数据库+实验报告+PPT+远程部署)

【原创唯一】基于SpringBoot+Vue的在线书店商城系统 课程设计/大作业/期末作业(源码+MySQL数据库+实验报告+PPT+远程部署)

摘要 电子商务与移动支付的普及,线上购书已成为高校师生及社会公众获取图书的重要方式。传统线下书店在图书检索、库存查询、订单跟踪等方面存在信息分散、效率较低等问题。本文设计并实现了一套基于 B/S 架构的网上书店系统,采用前后端分离模式&#xf…

2026/8/17 0:00:08 阅读更多 →
飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

2026/8/17 0:00:08 阅读更多 →
错误分享:误将磁盘分区类型选成磁盘名称

错误分享:误将磁盘分区类型选成磁盘名称

1.先删除原有分区2.fdisk重新创建3.发现进程被占用4.使用kill关不掉进程,加 -9 强制关闭5.关闭后重新使用fdisk创建,tips:记得改完后要使用 w 保存

2026/8/16 23:59:08 阅读更多 →

日新闻

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:00:08 阅读更多 →
飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 0:00:08 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →