CustomizeRenderer.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import { changeTypeByTaskShape, typeConfig } from '../../config';
  2. import { append as svgAppend, create as svgCreate } from 'tiny-svg';
  3. import {
  4. bpmnChoose,
  5. bpmnEnd,
  6. bpmnExclusive,
  7. bpmnGroup,
  8. bpmnInclusive,
  9. bpmnLabel,
  10. bpmnOutside,
  11. bpmnParallel,
  12. bpmnProcessing,
  13. bpmnStart,
  14. bpmnSubFlow,
  15. bpmnTask,
  16. bpmnTrigger,
  17. typeChoose,
  18. typeCondition,
  19. typeConfluence,
  20. typeOutside,
  21. typeProcessing,
  22. typeSubFlow,
  23. typeTrigger,
  24. } from '../../config/variableName';
  25. /**
  26. * svg重画bpmn节点
  27. */
  28. export default (parentNode: any, element: any, jnpfFlowInfo: any, injector: any) => {
  29. let type = element.type; // 获取到类型
  30. let data = jnpfFlowInfo?.flowNodes[element.id];
  31. let wnType = element.wnType || data?.type;
  32. if (typeConfig && typeConfig[type]) {
  33. if (type === bpmnGroup) return null;
  34. const typeMap = {
  35. [typeSubFlow]: bpmnSubFlow,
  36. [typeProcessing]: bpmnProcessing,
  37. [typeTrigger]: bpmnTrigger,
  38. [typeOutside]: bpmnOutside,
  39. };
  40. let matchedType = typeMap[data?.type] || typeMap[element.wnType];
  41. if(matchedType) type = matchedType;
  42. if (changeTypeByTaskShape[data?.type] || changeTypeByTaskShape[element?.wnType]) type = changeTypeByTaskShape[element?.wnType || data?.type];
  43. if (type === bpmnInclusive && wnType === typeChoose) type = bpmnChoose;
  44. let { renderer } = typeConfig[type];
  45. let { icon, iconColor, rendererName, background, titleColor, attr, bodyDefaultText } = renderer;
  46. // 直接修改元素的宽高
  47. element['width'] = wnType === typeConfluence ? 1 : element.isPreview ? 1 : attr.width;
  48. element['height'] = wnType === typeConfluence ? 1 : element.isPreview ? 1 : attr.height;
  49. let nodeName = element.nodeName != null ? element.nodeName : data?.nodeName != null ? data.nodeName : rendererName;
  50. let nodeContent = element.elementBodyName || data?.content || bodyDefaultText;
  51. let foreignObject: any = svgCreate('foreignObject', {
  52. width: wnType === typeConfluence ? 0 : element.isPreview ? 1 : wnType === typeCondition ? 128 : attr.width,
  53. height: wnType === typeConfluence ? 0 : element.isPreview ? 1 : wnType === typeCondition ? 28 : attr.height,
  54. class: type === bpmnStart || type === bpmnEnd ? 'begin-or-end-node' : 'task-node',
  55. });
  56. // 开始节点
  57. if (type === bpmnStart) {
  58. foreignObject.innerHTML = `
  59. <div class="node-container start-node-container" style="background:${background}" >
  60. <div class='node-top-container'>
  61. <i class="${icon}" style="color:${iconColor}"></i>
  62. <span>${nodeName}</span>
  63. </div>
  64. </div>`;
  65. svgAppend(parentNode, foreignObject);
  66. return parentNode;
  67. }
  68. // 审批节点
  69. if (type === bpmnTask) {
  70. foreignObject.innerHTML = `
  71. <div class="node-container" style="background:${background}" >
  72. <div class='node-top-container' style="background:${titleColor};">
  73. <i class="${icon}" style="color:${iconColor}"></i>
  74. <span>${nodeName}</span>
  75. </div>
  76. <div class='node-bottom-container'>
  77. <span>${nodeContent}</span>
  78. </div>
  79. </div>`;
  80. svgAppend(parentNode, foreignObject);
  81. return parentNode;
  82. }
  83. // 子流程节点
  84. if (type === bpmnSubFlow || type === bpmnProcessing || type === bpmnOutside || type === bpmnTrigger || changeTypeByTaskShape[element?.wnType || data?.type]) {
  85. foreignObject.innerHTML = `
  86. <div class="node-container" style="background:${background}" >
  87. <div class='node-top-container' style="background:${titleColor}">
  88. <i class="${icon}" style="color:${iconColor}"></i>
  89. <span>${nodeName}</span>
  90. </div>
  91. <div class='node-bottom-container'>
  92. <span>${nodeContent}</span>
  93. </div>
  94. </div>`;
  95. svgAppend(parentNode, foreignObject);
  96. return parentNode;
  97. }
  98. // 结束节点
  99. if (type === bpmnEnd) {
  100. foreignObject.innerHTML = `
  101. <div class="node-container end-node-container" style="background:${background}" >
  102. <div class='node-top-container'>
  103. <i class="${icon}" style="color:${iconColor}"></i>
  104. <span>${nodeName}</span>
  105. </div>
  106. </div>`;
  107. svgAppend(parentNode, foreignObject);
  108. return parentNode;
  109. }
  110. // label改为按钮
  111. if (type === bpmnLabel) {
  112. if (wnType === 'condition') {
  113. let jnpfData = injector?.get('jnpfData');
  114. let data = jnpfData.getValue('global');
  115. let connectName = jnpfData.getValue(element.id.replace('_label', ''))?.nodeName || '连接线';
  116. if (data.isShowConditions) {
  117. let foreignObject: any = svgCreate('foreignObject', {
  118. width: 128,
  119. height: 28,
  120. class: 'label-node',
  121. });
  122. foreignObject.innerHTML = `
  123. <div class="node-container-label" >
  124. <div class='node-top-container'>
  125. <span>${data.showNameType === 1 ? element.text : connectName}</span>
  126. </div>
  127. </div>`;
  128. element.text && svgAppend(parentNode, foreignObject);
  129. }
  130. return null;
  131. } else {
  132. foreignObject.innerHTML = `
  133. <div class="node-container" >
  134. <div class='label-node-container'>+</div>
  135. </div>`;
  136. svgAppend(parentNode, foreignObject);
  137. }
  138. return parentNode;
  139. }
  140. // 条件分支
  141. if (type === bpmnInclusive) {
  142. // 合流 展示一个点
  143. if (element.wnType === typeConfluence) {
  144. foreignObject.innerHTML = `
  145. <div class="node-container start-node-container node-simpleModeler" style="background:${background}" >
  146. <div class='node-top-container'>
  147. <span>合流</span>
  148. </div>
  149. </div>`;
  150. } else if (wnType === typeChoose) {
  151. foreignObject.innerHTML = `
  152. <div class="node-container start-node-container node-simpleModeler" style="background:${background}" >
  153. <div class='node-top-container'>
  154. <span>${rendererName}</span>
  155. </div>
  156. </div>`;
  157. } else {
  158. foreignObject.innerHTML = `
  159. <div class="node-container start-node-container node-simpleModeler" style="background:${background}" >
  160. <div class='node-top-container'>
  161. <span>添加条件</span>
  162. </div>
  163. </div>`;
  164. }
  165. svgAppend(parentNode, foreignObject);
  166. return parentNode;
  167. }
  168. // 其它网关
  169. let otherGatewayRule = new Set([bpmnParallel, bpmnExclusive, bpmnChoose]);
  170. if (otherGatewayRule.has(type)) {
  171. foreignObject.innerHTML = `
  172. <div class="node-container start-node-container node-simpleModeler" style="background:${background}" >
  173. <div class='node-top-container'>
  174. <span>${rendererName}</span>
  175. </div>
  176. </div>`;
  177. svgAppend(parentNode, foreignObject);
  178. return parentNode;
  179. }
  180. }
  181. };