适配Camunda Modeler插件:双击CallActivity打开对应BPMN图新标签页
问题描述
我想给Camunda Modeler的Tooltip插件做适配,实现双击指定CallActivity时,在新标签页打开它关联的BPMN图。比如双击名为“My Process”的CallActivity,就打开对应Called Element属性值为文件名的BPMN图,所有XML文件都在同一目录下。我用的是Camunda Modeler Platform,之前试过bpmn-io库的importXML方法,但文档没覆盖这个场景,也没找到在Modeler里新增标签页的方法。下面是我写的部分代码,求帮忙补充:
'use strict'; var $ = require('jquery'); var _ = require('lodash'); function TooltipInfoService(eventBus, overlays, elementRegistry, editorActions) { // 注册'toggleTooltipInfos'事件 editorActions.register({ toggleTooltipInfos: function () { toggleTooltipInfos(); } }); // 绑定双击事件 eventBus.on('element.dblclick', function (e) { _.defer(function () { dblclick(e); }); }); } /** * 双击处理函数 */ function dblclick(e) { var type = e.element.businessObject.$type; if (type == 'bpmn:CallActivity') { // 这里需要添加打开对应BPMN图的代码 } }
解决方案
要在Camunda Modeler里打开新标签页加载关联BPMN文件,你需要利用Modeler内部的app对象来访问文件打开能力,而非bpmn-io的importXML(后者仅能将XML加载到当前编辑器,无法新建标签)。
修改你的dblclick函数如下:
/** * 双击处理函数 */ function dblclick(e) { var element = e.element; var bo = element.businessObject; if (bo.$type !== 'bpmn:CallActivity') { return; } // 获取Called Element属性值(即目标BPMN文件名) var calledElement = bo.calledElement; if (!calledElement) { // 未设置Called Element时直接返回 return; } // 确保文件名带.bpmn后缀 var targetFileName = calledElement.endsWith('.bpmn') ? calledElement : `${calledElement}.bpmn`; try { // 获取当前编辑器路径,拼接目标文件的完整路径 var currentEditor = app.current.get('editor'); var currentFilePath = currentEditor.get('path'); var targetFilePath = require('path').join(require('path').dirname(currentFilePath), targetFileName); // 在新标签页打开目标BPMN文件 currentEditor.openPath(targetFilePath); } catch (error) { console.error('打开关联BPMN文件失败:', error); // 可在此添加用户提示逻辑,比如弹出错误提示框 } }
关键说明
- 依赖Modeler内部全局对象
app:Camunda Modeler暴露了app对象,通过它可获取当前编辑器实例,进而调用openPath方法在新标签页打开文件。 - 路径拼接:借助Node.js的
path模块,从当前文件所在目录拼接目标文件的完整路径,确保能正确定位同目录下的BPMN文件。 - 异常处理:添加错误捕获逻辑,避免因文件不存在或路径错误导致插件崩溃。
内容的提问来源于stack exchange,提问作者Andres
相关产品推荐
相关产品推荐

