CustomizeContextPad.ts 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. import { changeTypeByTaskShape, changeTypeByTrigger, hasGatewayType, triggerTypeChange, typeConfig } from '../../../config';
  2. import { jnpfConfigBpmnContextPad } from '../../../config/contextPad';
  3. import {
  4. bpmnEnd,
  5. bpmnTask,
  6. bpmnSubFlow,
  7. typeEnd,
  8. typeTask,
  9. typeSubFlow,
  10. bpmnStart,
  11. bpmnTrigger,
  12. typeTrigger,
  13. bpmnSequenceFlow,
  14. typeCopy,
  15. typeOutside,
  16. } from '../../../config/variableName';
  17. import { jnpfApproverConfig } from '../../../config/element/approver';
  18. import { jnpfSubFlowConfig } from '../../../config/element/subFlow';
  19. import { jnpfEndConfig } from '../../../config/element/end';
  20. import { jnpfTriggerConfig } from '../../../config/element/trigger';
  21. import { jnpfMessageConfig } from '../../../config/element/execute/message';
  22. import { cloneDeep } from 'lodash-es';
  23. const CustomizeContextPad = (contextPadProvider: any, element: any) => {
  24. let type = element.type;
  25. let wnType = element.wnType;
  26. let isAction = true;
  27. if (wnType === bpmnTrigger) type = bpmnTrigger;
  28. if (changeTypeByTrigger[element.wnType]) type = changeTypeByTrigger[wnType];
  29. if (changeTypeByTaskShape[wnType]) type = changeTypeByTaskShape[wnType];
  30. if (typeConfig[type]) {
  31. const {
  32. _autoPlace: autoPlace,
  33. _create: create,
  34. _elementFactory: elementFactory,
  35. _modeling: modeling,
  36. _connect: connects,
  37. _injector: injector,
  38. _eventBus: eventBus,
  39. } = contextPadProvider;
  40. const { contextPad, shapeType } = typeConfig[type];
  41. const { connect, end, approver, subFlow, del, trigger } = jnpfConfigBpmnContextPad;
  42. // 根据类型 判断contextPad
  43. if (type === shapeType) {
  44. if (contextPad) {
  45. if (contextPad.default) {
  46. return defaultContextPad;
  47. } else if (contextPad.customization) {
  48. let customization: any = cloneDeep(type === bpmnStart ? contextPad.taskCustomization : contextPad.customization);
  49. if (changeTypeByTaskShape[type]) customization[end] = end;
  50. let result: any = {};
  51. for (let key of Object.keys(customization)) {
  52. let data = customization[key];
  53. if (data.group === 'model') {
  54. let options: any = {
  55. wnName: typeConfig[key]?.renderer.rendererName,
  56. };
  57. if (element.type === bpmnStart && hasGatewayType.has(key)) {
  58. // 开始节点只有分类节点 因为网关的分流节点和合流节点类型一致 多增加一个字段来表示
  59. options = {
  60. wnName: typeConfig[key]?.renderer.rendererName,
  61. // wnGatewayType: typeGateway,
  62. wnType: key,
  63. icon: data.icon,
  64. };
  65. }
  66. result[data.name] = appendAction(data.type, data.elementName, data.className, data.title, data.wnType, options);
  67. } else if (data.group === 'connect') {
  68. result[data.name] = {
  69. group: data.group,
  70. className: data.className,
  71. title: data.title,
  72. action: {
  73. click: startConnect,
  74. dragstart: startConnect,
  75. },
  76. };
  77. } else if (data.group === 'edit') {
  78. result[data.name] = {
  79. group: data.group,
  80. className: data.className,
  81. title: data.title,
  82. action: {
  83. click: removeElement,
  84. },
  85. };
  86. }
  87. }
  88. return Object.assign(result);
  89. } else return defaultContextPad();
  90. }
  91. // 单个节点删除功能
  92. function removeElement() {
  93. if (element.type === bpmnSequenceFlow) {
  94. modeling.removeElements([element]);
  95. } else {
  96. eventBus.fire('commandStack.canExecute', {
  97. command: 'shape.delete',
  98. context: {
  99. shape: element,
  100. },
  101. });
  102. }
  103. }
  104. // 开始连线(拖拽)
  105. function startConnect(event: any, element: any) {
  106. connects.start(event, element);
  107. }
  108. // 添加事件
  109. function appendAction(type: any, name: any, className: any, title: any, wnType: any, options?: any) {
  110. const appendStart = (event: any, element: any) => {
  111. let bpmnFactory = elementFactory._bpmnFactory;
  112. if (type === typeCopy) {
  113. let businessObject = bpmnFactory.create(element.type);
  114. let shape = elementFactory.createShape(Object.assign({ type: element.type, name: element.name, wnType: element.name, ...options }, businessObject));
  115. create.start(event, shape, { source: element });
  116. // 复制属性
  117. let jnpfData = injector.get('jnpfData');
  118. let data = jnpfData.getValue(element.id);
  119. jnpfData.setValue(shape.id, { ...data, nodeId: shape.id });
  120. } else {
  121. if ([typeOutside, typeSubFlow].includes(type)) type = bpmnTask;
  122. let businessObject = bpmnFactory.create(type);
  123. let shape = elementFactory.createShape(Object.assign({ type, name, wnType, ...options }, businessObject));
  124. create.start(event, shape, { source: element });
  125. }
  126. };
  127. const autoPlaceAppend = async (_event: any, element: any) => {
  128. if ([typeOutside, typeSubFlow, typeTrigger].includes(type) || triggerTypeChange[type] || changeTypeByTaskShape[wnType]) type = bpmnTask;
  129. let bpmnFactory = elementFactory._bpmnFactory;
  130. // 复制元素
  131. if (wnType === typeCopy) {
  132. let businessObject = bpmnFactory.create(element.type);
  133. let canvas = injector.get('canvas');
  134. let rootElement = canvas.getRootElement();
  135. let position = { x: element.x + 100, y: element.y + 200 };
  136. let shape = elementFactory.createShape(Object.assign({ type: element.type, name: name, businessObject, wnType: element.wnType }, options));
  137. modeling.createShape(shape, position, rootElement);
  138. // 复制属性
  139. let jnpfData = injector.get('jnpfData');
  140. let data = jnpfData.getValue(element.id);
  141. jnpfData.setValue(shape.id, { ...data, nodeId: shape.id });
  142. let shapeData = jnpfData.getValue(shape.id);
  143. shape['nodeName'] = shapeData.nodeName;
  144. shape['elementBodyName'] = shapeData.content;
  145. modeling.updateProperties(shape, {});
  146. const selection: any = injector.get('selection');
  147. selection.select(shape);
  148. } else {
  149. let businessObject = bpmnFactory.create(type);
  150. // 任务流程只有一个触发节点
  151. let triggerShape = injector
  152. .get('elementRegistry')
  153. .getAll()
  154. .find(element => changeTypeByTrigger[element.wnType]);
  155. if (triggerShape && changeTypeByTrigger[wnType]) {
  156. let { renderer } = typeConfig[changeTypeByTrigger[wnType]];
  157. triggerShape.wnType = wnType;
  158. triggerShape.elementBodyName = renderer?.bodyDefaultText;
  159. triggerShape.nodeName = renderer?.rendererName;
  160. injector.get('jnpfData').setValue(element.id, {}, false);
  161. modeling.updateProperties(triggerShape, {});
  162. } else {
  163. let shape = elementFactory.createShape(Object.assign({ type, name: name, businessObject, wnType: wnType }, options));
  164. autoPlace.append(element, shape);
  165. }
  166. }
  167. };
  168. var append = autoPlace ? autoPlaceAppend : appendStart;
  169. let disable = isAction;
  170. let triggerShape = injector
  171. .get('elementRegistry')
  172. .getAll()
  173. .find(element => changeTypeByTrigger[element.wnType]);
  174. if (triggerShape && changeTypeByTrigger[wnType]) disable = false;
  175. return {
  176. group: 'model',
  177. className: className,
  178. title: title,
  179. disable: disable,
  180. action: { dragstart: disable && appendStart, click: disable && append },
  181. };
  182. }
  183. // 默认contextPad
  184. function defaultContextPad() {
  185. return Object.assign({
  186. [approver.name]: appendAction(bpmnTask, typeTask, approver.className, approver.title, typeTask, { wnName: jnpfApproverConfig.renderer.rendererName }),
  187. [subFlow.name]: appendAction(bpmnTask, bpmnSubFlow, subFlow.className, subFlow.title, typeSubFlow, {
  188. wnName: jnpfSubFlowConfig.renderer.rendererName,
  189. }),
  190. [trigger.name]: appendAction(bpmnTrigger, bpmnTrigger, trigger.className, trigger.title, typeTrigger, {
  191. wnName: jnpfTriggerConfig.renderer.rendererName,
  192. }),
  193. [end.name]: appendAction(bpmnEnd, typeEnd, end.className, end.title, typeEnd, { wnName: jnpfEndConfig.renderer.rendererName }),
  194. [connect.name]: {
  195. group: connect.group,
  196. className: connect.className,
  197. title: connect.title,
  198. action: {
  199. click: startConnect,
  200. dragstart: startConnect,
  201. },
  202. },
  203. [del.name]: {
  204. group: del.group,
  205. className: del.className,
  206. title: del.title,
  207. action: {
  208. click: removeElement,
  209. },
  210. },
  211. });
  212. }
  213. }
  214. return undefined;
  215. }
  216. return undefined;
  217. };
  218. export default CustomizeContextPad;