Vue+bpmn.js自定义流程图之palette(二)

本文介绍如何自定义BPMN.js左侧工具栏的样式,包括创建自定义PaletteProvider类、定义CSS样式及整合到项目中的步骤。

一、回顾

1.预览

我们来实现如下左侧工具栏的自定义样式。
在这里插入图片描述

2.目录结构

plugins文件目录下新建palette文件夹。创建一个index.js入口文件和paletteProvider.js自定义palette文件(用来覆盖默认palette)。
在这里插入图片描述

二、代码

paletteProvider.js文件是一个导出类,里面是我们自定义的左侧工具栏的代码。

index.js是palette的入口文件,导出初始化的自定义paletteProvider.js

1.paletteProvider.js文件

import {
  assign
} from "min-dash";

export default function PaletteProvider(palette, create, elementFactory, spaceTool, lassoTool, handTool, globalConnect, translate) {
  this._palette = palette;
  this._create = create;
  this._elementFactory = elementFactory;
  this._spaceTool = spaceTool;
  this._lassoTool = lassoTool;
  this._handTool = handTool;
  this._globalConnect = globalConnect;
  this._translate = translate;

  palette.registerProvider(this);
}
PaletteProvider.$inject = ["palette", "create", "elementFactory", "spaceTool", "lassoTool", "handTool", "globalConnect", "translate"];


PaletteProvider.prototype.getPaletteEntries = function () {
  var actions = {},
    create = this._create,
    elementFactory = this._elementFactory,
    spaceTool = this._spaceTool,
    lassoTool = this._lassoTool,
    handTool = this._handTool,
    globalConnect = this._globalConnect,
    translate = this._translate;

  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,
      className,
      title: title || translate("Create {type}", {
        type: shortType
      }),
      action: {
        dragstart: createListener,
        click: createListener
      }
    };
  }

  assign(actions, {
    "hand-tool": {
      group: "tools",
      className: "bpmn-icon-hand-tool",
      title: translate("Activate the hand tool"),
      action: {
        click: function (event) {
          handTool.activateHand(event);
        }
      }
    },
    "lasso-tool": {
      group: "tools",
      className: "bpmn-icon-lasso-tool",
      title: translate("Activate the lasso tool"),
      action: {
        click: function (event) {
          lassoTool.activateSelection(event);
        }
      }
    },
    "space-tool": {
      group: "tools",
      className: "bpmn-icon-space-tool",
      title: translate("Activate the create/remove space tool"),
      action: {
        click: function (event) {
          spaceTool.activateSelection(event);
        }
      }
    },
    //连线样式
    "global-connect-tool": {
      group: "tools",
      // className: "bpmn-icon-connection-multi",
      className: "feelec feel-lianxian coldel",
      title: translate("Activate the global connect tool"),
      action: {
        click: function (event) {
          globalConnect.toggle(event);
        }
      }
    },
    "tool-separator": {
      group: "tools",
      separator: true
    },
    //开始事件 bpmn-icon-start-event-none
    "create.start-event": createAction("bpmn:StartEvent", "event", "icon-custom startNode", translate("Create StartEvent")),
   
    //用户  bpmn-icon-user-task
    "create.user-task": createAction("bpmn:UserTask", "activity", "icon-custom taskNode", translate("Create User Task")),
    // 网关 bpmn-icon-gateway-none
    "create.exclusive-gateway": createAction("bpmn:ExclusiveGateway", "gateway", "icon-custom gatewayNode", translate("Create Gateway")),
    // 结束事件 bpmn-icon-end-event-none
    "create.end-event": createAction("bpmn:EndEvent", "event", "icon-custom endNode", translate("Create EndEvent")),
  
  });

  return actions;
};

上面代码做的事情:
重写 PaletteProvider 类,同时覆盖了其原型上的 getPaletteEntries 方法

上面代码较多,拆分为两个部分来看更清晰:
第一部分:
首先导出了 PaletteProvider
在类中使用palette.registerProvider(this)指定这是一个palette
使用 $inject 注入一些需要的变量到 PaletteProvider

第二部分:
在PaletteProvider函数原型上编写getPaletteEntries函数;函数返回的是一个对象,对象中就是左侧工具栏的每一项。

我的前四项用的原生项,后四项start-eventuser-taskexclusive-gatewayend-event是自定义项;createAction函数是用来创建自定义工具栏shape的方法。

返回的对象中的属性:
group:当前项属于哪个分组
className:样式类名,主要是通过这个类名来修改自定义项的样式
title: 鼠标移动到元素上面给出的提示信息
action:用户操作时会触发的事件

2.css文件

自定义样式文件process-panel.scss里定义了className里面的类来实现自定义样式。

/* process-panel.scss */
.icon-custom {
  border-radius: 50%;
  background-size: 65%;
  background-repeat: no-repeat;
  background-position: center;
}
.startNode {
  background-image: url('../../../../../../public/bpmn_imgs/startNode.png');
}
.endNode {
  background-image: url('../../../../../../public/bpmn_imgs/endNode.png');
}
.taskNode {
  background-image: url('../../../../../../public/bpmn_imgs/taskNode.png');
}
.gatewayNode {
  background-image: url('../../../../../../public/bpmn_imgs/gatewayNode.png');
}

3.index.js文件

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

导出自定义palette

三、总结

到这palette部分就完成了,接下来就是部分renderer、contextPad部分和在页面中的使用了。renderer、contextPad这两部分的思路和palette一样,重写原生的类来达到自定义的效果。

VueBpmn.js 结合可以创建动态流程图并导出 XML 文件。Bpmn.js 是一个强大的库,用于绘制 Business Process Model and Notation (业务流程模型和表示法) 流程图。要在导出的 XML 中修改内容,你需要首先理解 Bpmn 的基本元素结构,然后通过 Vue 的数据绑定和事件处理功能来控制。 这里是一个简单的步骤说明: 1. 安装依赖: 在 Vue 项目中安装 Bpmn.js 和相关插件: ```bash npm install @bpmn-io/bpmn-json-import @bpmn-io/drawio-exporter bpmn-js ``` 2. 创建流程图组件: 使用 Vue 的 `ref` 注册一个画布实例,并监听 JSON 数据的变化: ```html <template> <div ref="canvasRef"> <!-- ...加载 BPMN 图形的 HTML 元素... --> </div> </template> <script> import { BPMNJS, registerElement } from 'bpmn-js'; import { CamundaModeler } from '@bpmn-io/modeler'; export default { setup() { // 初始化 BpmnJS 和模型管理器 const bpmnModeler = new CamundaModeler({ container: this.$refs.canvasRef, palette: [], }); const canvas = bpmnModeler.get('canvas'); // 假设你有自定义JSON 数据 sourceData const initialDiagram = { ... // 初始化的 Bpmn JSON 数据 }; // 将 JSON 数据应用到画布上 bpmnModeler.importXML(initialDiagram.xml); return { onDiagramChange: () => { // 当流程图变化时,获取当前状态的 XML const xml = bpmnModeler.toXML(); // 这里你可以操作 xml 对象,比如修改元素属性 // 示例:更改某个任务的名称 const task = bpmnModeler.getBusinessObject('someTaskId'); task.name = '新的任务名称'; // 假设someTaskId是你需要修改的任务 ID // 更新导出的 XML const modifiedXml = modifyXmlElement(xml); // 自定义函数对XML进行处理 // 保存或导出修改后的 XML saveModifiedXml(modifiedXml); }, }; }, methods: { // ...其他方法,如保存或导出 XML }, }; ``` 3. 修改 XML 函数示例: ```javascript function modifyXmlElement(xml) { const parser = new DOMParser(); const doc = parser.parseFromString(xml, 'text/xml'); const element = doc.getElementById('yourElementId'); // 根据实际需要查找要修改的元素 if (element) { // 修改元素内容 element.textContent = '新内容'; } return doc.documentElement.outerHTML; } ``` 4.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值