CustomizeRenderer.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import { changeTypeByTaskShape, typeConfig } from '../config';
  2. import { append as svgAppend, create as svgCreate } from 'tiny-svg';
  3. import {
  4. bpmnEnd,
  5. bpmnExecute,
  6. bpmnGroup,
  7. bpmnLabel,
  8. bpmnOutside,
  9. bpmnProcessing,
  10. bpmnStart,
  11. bpmnSubFlow,
  12. bpmnTask,
  13. bpmnTrigger,
  14. typeExecute,
  15. typeOutside,
  16. typeProcessing,
  17. typeSubFlow,
  18. typeTrigger,
  19. } from '../config/variableName';
  20. /**
  21. * svg重画bpmn节点
  22. */
  23. export default (parentNode: any, element: any, jnpfFlowInfo: any, injector: any) => {
  24. let data = jnpfFlowInfo?.flowNodes[element.id];
  25. let nodeMap = jnpfFlowInfo?.nodeList;
  26. let isPreview = jnpfFlowInfo?.isPreview;
  27. let type = element.type; // 获取到类型
  28. if (typeConfig && typeConfig[type]) {
  29. if (type === bpmnGroup) return null;
  30. const typeMap = {
  31. [typeSubFlow]: bpmnSubFlow,
  32. [typeProcessing]: bpmnProcessing,
  33. [typeTrigger]: bpmnTrigger,
  34. [typeExecute]: bpmnExecute,
  35. [typeOutside]: bpmnOutside,
  36. };
  37. let matchedType = typeMap[data?.type] || typeMap[element.wnType];
  38. if(matchedType) type = matchedType;
  39. if (changeTypeByTaskShape[data?.type] || changeTypeByTaskShape[element?.wnType]) type = changeTypeByTaskShape[element?.wnType || data?.type];
  40. let { renderer } = typeConfig[type];
  41. let { icon, iconColor, rendererName, background, titleColor, attr, bodyDefaultText } = renderer;
  42. // 直接修改元素的宽高
  43. element['width'] = type === bpmnLabel ? 128 : attr.width;
  44. element['height'] = type === bpmnLabel ? 28 : attr.height;
  45. let nodeName = element.nodeName != null ? element.nodeName : data?.nodeName != null ? data.nodeName : rendererName;
  46. let nodeContent = element.elementBodyName || nodeMap.get(element.id)?.userName || data?.content || bodyDefaultText;
  47. if (isPreview) {
  48. if (nodeMap.get(element.id)?.type) {
  49. if (nodeMap.get(element.id)?.type === '0') {
  50. titleColor = 'linear-gradient(90deg, #AEEFC2 0%, #4ED587 100%)';
  51. iconColor = '#25a210';
  52. }
  53. if (nodeMap.get(element.id)?.type === '1') {
  54. titleColor = 'linear-gradient(90deg, #C0EDF8 0%, #A6DEF8 100%)';
  55. iconColor = '#1eaceb';
  56. }
  57. if (nodeMap.get(element.id)?.type === '3') {
  58. titleColor = 'linear-gradient(90deg, #FDC9D1 0%,#E03845 100%)';
  59. iconColor = '#E03845';
  60. }
  61. } else {
  62. titleColor = 'linear-gradient(90deg, #CED1D5 0%, #CBCBCC 100%);';
  63. iconColor = '#4c4c58';
  64. }
  65. }
  66. let foreignObject: any = svgCreate('foreignObject', {
  67. width: type === bpmnLabel ? 128 : attr.width,
  68. height: type === bpmnLabel ? 28 : attr.height,
  69. class: type === bpmnStart || type === bpmnEnd ? 'begin-or-end-node' : 'task-node',
  70. });
  71. // 开始节点
  72. if (type === bpmnStart) {
  73. foreignObject.innerHTML = `
  74. <div class="node-container start-node-container" style="background:${background}" >
  75. <div class='node-top-container'>
  76. <i class="${icon}" style="color:${iconColor}"></i>
  77. <span>${nodeName}</span>
  78. </div>
  79. </div>`;
  80. svgAppend(parentNode, foreignObject);
  81. return parentNode;
  82. }
  83. // 审批节点
  84. if (type === bpmnTask) {
  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. if (type === bpmnSubFlow || type === bpmnProcessing || type === bpmnOutside || type === bpmnTrigger || changeTypeByTaskShape[element?.wnType || data?.type]) {
  99. foreignObject.innerHTML = `
  100. <div class="node-container" style="background:${background}" >
  101. <div class='node-top-container' style="background:${titleColor}">
  102. <i class="${icon}" style="color:${iconColor}"></i>
  103. <span>${nodeName}</span>
  104. </div>
  105. <div class='node-bottom-container'>
  106. <span>${nodeContent}</span>
  107. </div>
  108. </div>`;
  109. svgAppend(parentNode, foreignObject);
  110. return parentNode;
  111. }
  112. // 结束节点
  113. if (type === bpmnEnd) {
  114. foreignObject.innerHTML = `
  115. <div class="node-container end-node-container" style="background:${background}" >
  116. <div class='node-top-container'>
  117. <i class="${icon}" style="color:${iconColor}"></i>
  118. <span>${nodeName}</span>
  119. </div>
  120. </div>`;
  121. svgAppend(parentNode, foreignObject);
  122. return parentNode;
  123. }
  124. // label渲染
  125. if (type === bpmnLabel) {
  126. let jnpfData = injector?.get('jnpfData');
  127. let data = jnpfData.getValue('global');
  128. let connectName = jnpfData.getValue(element.id.replace('_label', ''))?.nodeName || '连接线';
  129. if (data.isShowConditions) {
  130. let foreignObject: any = svgCreate('foreignObject', {
  131. width: 128,
  132. height: 28,
  133. class: 'label-node',
  134. });
  135. foreignObject.innerHTML = `
  136. <div class="node-container-label" >
  137. <div class='node-top-container'>
  138. <span> ${data.showNameType === 1 ? element.text : connectName}</span>
  139. </div>
  140. </div>`;
  141. element.text && svgAppend(parentNode, foreignObject);
  142. return parentNode;
  143. }
  144. return null;
  145. }
  146. }
  147. };