CustomContextPadProvider.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import ContextPadProvider from 'bpmn-js/lib/features/context-pad/ContextPadProvider';
  2. import { Injector } from 'didi';
  3. import EventBus from 'diagram-js/lib/core/EventBus';
  4. import ContextPad from 'diagram-js/lib/features/context-pad/ContextPad';
  5. import Modeling from 'bpmn-js/lib/features/modeling/Modeling.js';
  6. import ElementFactory from 'bpmn-js/lib/features/modeling/ElementFactory';
  7. import Connect from 'diagram-js/lib/features/connect/Connect';
  8. import Create from 'diagram-js/lib/features/create/Create';
  9. import PopupMenu from 'diagram-js/lib/features/popup-menu/PopupMenu';
  10. import Canvas from 'diagram-js/lib/core/Canvas';
  11. import Rules from 'diagram-js/lib/features/rules/Rules';
  12. import { Element, Shape } from 'diagram-js/lib/model/Types';
  13. import BpmnFactory from 'bpmn-js/lib/features/modeling/BpmnFactory';
  14. import modeler from '@/store/modules/modeler';
  15. // @Description: 增强元素连线事件
  16. class CustomContextPadProvider extends ContextPadProvider {
  17. private _contextPad: ContextPad;
  18. private _modeling: Modeling;
  19. private _elementFactory: ElementFactory;
  20. private _autoPlace: any;
  21. private _connect: Connect;
  22. private _create: Create;
  23. private _popupMenu: PopupMenu;
  24. private _canvas: Canvas;
  25. private _rules: Rules;
  26. constructor(
  27. config: any,
  28. injector: Injector,
  29. eventBus: EventBus,
  30. contextPad: ContextPad,
  31. modeling: Modeling,
  32. elementFactory: ElementFactory,
  33. connect: Connect,
  34. create: Create,
  35. popupMenu: PopupMenu,
  36. canvas: Canvas,
  37. rules: Rules,
  38. translate
  39. ) {
  40. // @ts-ignore
  41. super(config, injector, eventBus, contextPad, modeling, elementFactory, connect, create, popupMenu, canvas, rules, translate);
  42. this._contextPad = contextPad;
  43. this._modeling = modeling;
  44. this._elementFactory = elementFactory;
  45. this._connect = connect;
  46. this._create = create;
  47. this._popupMenu = popupMenu;
  48. this._canvas = canvas;
  49. this._rules = rules;
  50. this._autoPlace = injector.get('autoPlace', false);
  51. }
  52. getContextPadEntries(element: Element) {
  53. const actions: Record<string, any> = {};
  54. const appendUserTask = (event: Event, element: Shape) => {
  55. const shape = this._elementFactory.createShape({ type: 'bpmn:UserTask' });
  56. this._create.start(event, shape, {
  57. source: element
  58. });
  59. };
  60. const appendMultiInstanceUserTask = (event: Event, element: Shape) => {
  61. const store = modeler();
  62. const bpmnFactory = store.getModeler().get('bpmnFactory') as BpmnFactory;
  63. const businessObject = bpmnFactory.create('bpmn:UserTask', {
  64. // name: '多实例用户任务',
  65. isForCompensation: false
  66. });
  67. businessObject.loopCharacteristics = bpmnFactory.create('bpmn:MultiInstanceLoopCharacteristics');
  68. // 创建 Shape
  69. const shape = this._elementFactory.createShape({
  70. type: 'bpmn:UserTask',
  71. businessObject: businessObject
  72. });
  73. this._create.start(event, shape, { source: element });
  74. };
  75. const appendTask = this._autoPlace
  76. ? (event, element) => {
  77. const bpmnFactory: BpmnFactory | undefined = modeler().getModeler().get('bpmnFactory');
  78. const businessObject = bpmnFactory.create('bpmn:UserTask', {
  79. // name: '多实例用户任务',// 右键创建显示
  80. isForCompensation: false
  81. });
  82. // 创建多实例属性并分配给用户任务的 loopCharacteristics
  83. businessObject.loopCharacteristics = bpmnFactory.create('bpmn:MultiInstanceLoopCharacteristics');
  84. // 创建 Shape
  85. const shape = this._elementFactory.createShape({
  86. type: 'bpmn:UserTask',
  87. businessObject: businessObject
  88. });
  89. this._autoPlace.append(element, shape);
  90. }
  91. : appendMultiInstanceUserTask;
  92. const append = this._autoPlace
  93. ? (event: Event, element: Shape) => {
  94. const shape = this._elementFactory.createShape({ type: 'bpmn:UserTask' });
  95. this._autoPlace.append(element, shape);
  96. }
  97. : appendUserTask;
  98. // // 添加创建用户任务按钮
  99. actions['append.append-user-task'] = {
  100. group: 'model',
  101. className: 'bpmn-icon-user-task',
  102. title: '用户任务',
  103. action: {
  104. dragstart: appendUserTask,
  105. click: append
  106. }
  107. };
  108. // 添加创建多实例用户任务按钮
  109. actions['append.append-multi-instance-user-task'] = {
  110. group: 'model',
  111. className: 'bpmn-icon-user', // 你可以使用多实例用户任务的图标 bpmn-icon-user bpmn-icon-user-task
  112. title: '多实例用户任务',
  113. action: {
  114. dragstart: appendMultiInstanceUserTask,
  115. click: appendTask
  116. }
  117. };
  118. return actions;
  119. }
  120. }
  121. export default CustomContextPadProvider;