| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- import { changeTypeByTaskShape, changeTypeByTrigger, hasGatewayType, triggerTypeChange, typeConfig } from '../../../config';
- import { jnpfConfigBpmnContextPad } from '../../../config/contextPad';
- import {
- bpmnEnd,
- bpmnTask,
- bpmnSubFlow,
- typeEnd,
- typeTask,
- typeSubFlow,
- bpmnStart,
- bpmnTrigger,
- typeTrigger,
- bpmnSequenceFlow,
- typeCopy,
- typeOutside,
- } from '../../../config/variableName';
- import { jnpfApproverConfig } from '../../../config/element/approver';
- import { jnpfSubFlowConfig } from '../../../config/element/subFlow';
- import { jnpfEndConfig } from '../../../config/element/end';
- import { jnpfTriggerConfig } from '../../../config/element/trigger';
- import { jnpfMessageConfig } from '../../../config/element/execute/message';
- import { cloneDeep } from 'lodash-es';
- const CustomizeContextPad = (contextPadProvider: any, element: any) => {
- let type = element.type;
- let wnType = element.wnType;
- let isAction = true;
- if (wnType === bpmnTrigger) type = bpmnTrigger;
- if (changeTypeByTrigger[element.wnType]) type = changeTypeByTrigger[wnType];
- if (changeTypeByTaskShape[wnType]) type = changeTypeByTaskShape[wnType];
- if (typeConfig[type]) {
- const {
- _autoPlace: autoPlace,
- _create: create,
- _elementFactory: elementFactory,
- _modeling: modeling,
- _connect: connects,
- _injector: injector,
- _eventBus: eventBus,
- } = contextPadProvider;
- const { contextPad, shapeType } = typeConfig[type];
- const { connect, end, approver, subFlow, del, trigger } = jnpfConfigBpmnContextPad;
- // 根据类型 判断contextPad
- if (type === shapeType) {
- if (contextPad) {
- if (contextPad.default) {
- return defaultContextPad;
- } else if (contextPad.customization) {
- let customization: any = cloneDeep(type === bpmnStart ? contextPad.taskCustomization : contextPad.customization);
- if (changeTypeByTaskShape[type]) customization[end] = end;
- let result: any = {};
- for (let key of Object.keys(customization)) {
- let data = customization[key];
- if (data.group === 'model') {
- let options: any = {
- wnName: typeConfig[key]?.renderer.rendererName,
- };
- if (element.type === bpmnStart && hasGatewayType.has(key)) {
- // 开始节点只有分类节点 因为网关的分流节点和合流节点类型一致 多增加一个字段来表示
- options = {
- wnName: typeConfig[key]?.renderer.rendererName,
- // wnGatewayType: typeGateway,
- wnType: key,
- icon: data.icon,
- };
- }
- result[data.name] = appendAction(data.type, data.elementName, data.className, data.title, data.wnType, options);
- } else if (data.group === 'connect') {
- result[data.name] = {
- group: data.group,
- className: data.className,
- title: data.title,
- action: {
- click: startConnect,
- dragstart: startConnect,
- },
- };
- } else if (data.group === 'edit') {
- result[data.name] = {
- group: data.group,
- className: data.className,
- title: data.title,
- action: {
- click: removeElement,
- },
- };
- }
- }
- return Object.assign(result);
- } else return defaultContextPad();
- }
- // 单个节点删除功能
- function removeElement() {
- if (element.type === bpmnSequenceFlow) {
- modeling.removeElements([element]);
- } else {
- eventBus.fire('commandStack.canExecute', {
- command: 'shape.delete',
- context: {
- shape: element,
- },
- });
- }
- }
- // 开始连线(拖拽)
- function startConnect(event: any, element: any) {
- connects.start(event, element);
- }
- // 添加事件
- function appendAction(type: any, name: any, className: any, title: any, wnType: any, options?: any) {
- const appendStart = (event: any, element: any) => {
- let bpmnFactory = elementFactory._bpmnFactory;
- if (type === typeCopy) {
- let businessObject = bpmnFactory.create(element.type);
- let shape = elementFactory.createShape(Object.assign({ type: element.type, name: element.name, wnType: element.name, ...options }, businessObject));
- create.start(event, shape, { source: element });
- // 复制属性
- let jnpfData = injector.get('jnpfData');
- let data = jnpfData.getValue(element.id);
- jnpfData.setValue(shape.id, { ...data, nodeId: shape.id });
- } else {
- if ([typeOutside, typeSubFlow].includes(type)) type = bpmnTask;
- let businessObject = bpmnFactory.create(type);
- let shape = elementFactory.createShape(Object.assign({ type, name, wnType, ...options }, businessObject));
- create.start(event, shape, { source: element });
- }
- };
- const autoPlaceAppend = async (_event: any, element: any) => {
- if ([typeOutside, typeSubFlow, typeTrigger].includes(type) || triggerTypeChange[type] || changeTypeByTaskShape[wnType]) type = bpmnTask;
- let bpmnFactory = elementFactory._bpmnFactory;
- // 复制元素
- if (wnType === typeCopy) {
- let businessObject = bpmnFactory.create(element.type);
- let canvas = injector.get('canvas');
- let rootElement = canvas.getRootElement();
- let position = { x: element.x + 100, y: element.y + 200 };
- let shape = elementFactory.createShape(Object.assign({ type: element.type, name: name, businessObject, wnType: element.wnType }, options));
- modeling.createShape(shape, position, rootElement);
- // 复制属性
- let jnpfData = injector.get('jnpfData');
- let data = jnpfData.getValue(element.id);
- jnpfData.setValue(shape.id, { ...data, nodeId: shape.id });
- let shapeData = jnpfData.getValue(shape.id);
- shape['nodeName'] = shapeData.nodeName;
- shape['elementBodyName'] = shapeData.content;
- modeling.updateProperties(shape, {});
- const selection: any = injector.get('selection');
- selection.select(shape);
- } else {
- let businessObject = bpmnFactory.create(type);
- // 任务流程只有一个触发节点
- let triggerShape = injector
- .get('elementRegistry')
- .getAll()
- .find(element => changeTypeByTrigger[element.wnType]);
- if (triggerShape && changeTypeByTrigger[wnType]) {
- let { renderer } = typeConfig[changeTypeByTrigger[wnType]];
- triggerShape.wnType = wnType;
- triggerShape.elementBodyName = renderer?.bodyDefaultText;
- triggerShape.nodeName = renderer?.rendererName;
- injector.get('jnpfData').setValue(element.id, {}, false);
- modeling.updateProperties(triggerShape, {});
- } else {
- let shape = elementFactory.createShape(Object.assign({ type, name: name, businessObject, wnType: wnType }, options));
- autoPlace.append(element, shape);
- }
- }
- };
- var append = autoPlace ? autoPlaceAppend : appendStart;
- let disable = isAction;
- let triggerShape = injector
- .get('elementRegistry')
- .getAll()
- .find(element => changeTypeByTrigger[element.wnType]);
- if (triggerShape && changeTypeByTrigger[wnType]) disable = false;
- return {
- group: 'model',
- className: className,
- title: title,
- disable: disable,
- action: { dragstart: disable && appendStart, click: disable && append },
- };
- }
- // 默认contextPad
- function defaultContextPad() {
- return Object.assign({
- [approver.name]: appendAction(bpmnTask, typeTask, approver.className, approver.title, typeTask, { wnName: jnpfApproverConfig.renderer.rendererName }),
- [subFlow.name]: appendAction(bpmnTask, bpmnSubFlow, subFlow.className, subFlow.title, typeSubFlow, {
- wnName: jnpfSubFlowConfig.renderer.rendererName,
- }),
- [trigger.name]: appendAction(bpmnTrigger, bpmnTrigger, trigger.className, trigger.title, typeTrigger, {
- wnName: jnpfTriggerConfig.renderer.rendererName,
- }),
- [end.name]: appendAction(bpmnEnd, typeEnd, end.className, end.title, typeEnd, { wnName: jnpfEndConfig.renderer.rendererName }),
- [connect.name]: {
- group: connect.group,
- className: connect.className,
- title: connect.title,
- action: {
- click: startConnect,
- dragstart: startConnect,
- },
- },
- [del.name]: {
- group: del.group,
- className: del.className,
- title: del.title,
- action: {
- click: removeElement,
- },
- },
- });
- }
- }
- return undefined;
- }
- return undefined;
- };
- export default CustomizeContextPad;
|