PropertyPanel.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <template>
  2. <div ref="propertyPanel" class="property-panel">
  3. <div v-if="nodeName" class="node-name">{{ nodeName }}</div>
  4. <component
  5. :is="getComponent"
  6. v-if="element"
  7. :element="element"
  8. :modeler="modeler"
  9. :users="users"
  10. :groups="groups"
  11. :tableName="tableName"
  12. :nodeIdFormJsonArray="nodeIdFormJsonArray"
  13. :menuConfig = "menuConfig"
  14. :purview="purview"
  15. :categorys="categorys"
  16. :flowAbleIndex="flowAbleIndex"
  17. />
  18. </div>
  19. </template>
  20. <script>
  21. import taskPanel from './components/nodePanel/task'
  22. import startEndPanel from './components/nodePanel/startEnd'
  23. import processPanel from './components/nodePanel/process'
  24. import sequenceFlowPanel from './components/nodePanel/sequenceFlow'
  25. import gatewayPanel from './components/nodePanel/gateway'
  26. import { NodeName } from './lang/zh'
  27. export default {
  28. name: 'PropertyPanel',
  29. components: { processPanel, taskPanel, startEndPanel, sequenceFlowPanel, gatewayPanel },
  30. props: {
  31. users: {
  32. type: Array,
  33. required: true
  34. },
  35. groups: {
  36. type: Array,
  37. required: true
  38. },
  39. categorys: {
  40. type: Array,
  41. required: true
  42. },
  43. modeler: {
  44. type: Object,
  45. required: true
  46. },
  47. tableName : {
  48. type: String,
  49. default: ''
  50. },
  51. nodeIdFormJsonArray : {
  52. type : Array,
  53. default: () => []
  54. },
  55. purview : {
  56. type: String,
  57. default: ''
  58. },
  59. menuConfig :{
  60. type : Object,
  61. default: () => {}
  62. },
  63. flowAbleIndex : {
  64. type : Object,
  65. default: () => {}
  66. }
  67. },
  68. data() {
  69. return {
  70. element: null,
  71. form: {
  72. id: '',
  73. name: '',
  74. color: null
  75. },
  76. roles: [
  77. { value: 'manager', label: '经理' },
  78. { value: 'personnel', label: '人事' },
  79. { value: 'charge', label: '主管' }
  80. ]
  81. }
  82. },
  83. computed: {
  84. getComponent() {
  85. console.log("getComponent");
  86. const type = this.element?.type;
  87. if (type == 'bpmn:EndEvent') {
  88. let extensionElements = this.element.businessObject.get('extensionElements')
  89. if (!extensionElements) {
  90. extensionElements = this.modeler.get('moddle').create('bpmn:ExtensionElements');
  91. const executionListener = this.modeler.get('moddle').create('flowable:ExecutionListener')
  92. executionListener['event'] = 'start'
  93. executionListener['class'] = 'com.huyi.flowable.listener.ExecutionCallListener'
  94. extensionElements.get('values').push(executionListener)
  95. const modeling = this.modeler.get('modeling')
  96. modeling.updateProperties(this.element, { extensionElements: extensionElements })
  97. }
  98. }
  99. if (['bpmn:IntermediateThrowEvent', 'bpmn:StartEvent', 'bpmn:EndEvent'].includes(type)) {
  100. return 'startEndPanel';
  101. }
  102. if ([
  103. 'bpmn:UserTask',
  104. 'bpmn:Task',
  105. 'bpmn:SendTask',
  106. 'bpmn:ReceiveTask',
  107. 'bpmn:ManualTask',
  108. 'bpmn:BusinessRuleTask',
  109. 'bpmn:ServiceTask',
  110. 'bpmn:ScriptTask'
  111. // 'bpmn:CallActivity',
  112. // 'bpmn:SubProcess'
  113. ].includes(type)) {
  114. return 'taskPanel';
  115. }
  116. if (type === 'bpmn:SequenceFlow') {
  117. return 'sequenceFlowPanel';
  118. }
  119. if ([
  120. 'bpmn:InclusiveGateway',
  121. 'bpmn:ExclusiveGateway',
  122. 'bpmn:ParallelGateway',
  123. 'bpmn:EventBasedGateway'
  124. ].includes(type)) {
  125. return 'gatewayPanel';
  126. }
  127. if (type === 'bpmn:Process') {
  128. return 'processPanel';
  129. }
  130. return null;
  131. },
  132. nodeName() {
  133. if (this.element) {
  134. const bizObj = this.element.businessObject
  135. const type = bizObj?.eventDefinitions
  136. ? bizObj.eventDefinitions[0].$type
  137. : bizObj.$type
  138. return NodeName[type] || type
  139. }
  140. return ''
  141. }
  142. },
  143. mounted() {
  144. this.handleModeler()
  145. },
  146. methods: {
  147. handleModeler() {
  148. this.modeler.on('root.added', e => {
  149. if (e.element.type === 'bpmn:Process') {
  150. this.element = null
  151. this.$nextTick().then(() => {
  152. this.element = e.element
  153. })
  154. }
  155. })
  156. // 节点点击
  157. this.modeler.on('element.click', e => {
  158. const { element } = e
  159. console.log(element)
  160. if (element.type === 'bpmn:Process') {
  161. this.element = element
  162. }
  163. })
  164. this.modeler.on('selection.changed', e => {
  165. // hack 同类型面板不刷新
  166. this.element = null
  167. const element = e.newSelection[0]
  168. if (element) {
  169. this.$nextTick().then(() => {
  170. this.element = element
  171. })
  172. }
  173. })
  174. }
  175. }
  176. }
  177. </script>
  178. <style lang="scss">
  179. .property-panel {
  180. padding: 20px 20px;
  181. // reset element css
  182. .el-form--label-top .el-form-item__label {
  183. padding: 0;
  184. }
  185. .el-form-item {
  186. margin-bottom: 6px;
  187. }
  188. .tab-table .el-form-item {
  189. margin-bottom: 16px;
  190. }
  191. .node-name{
  192. border-bottom: 1px solid #ccc;
  193. padding: 0 0 10px 20px;
  194. margin-bottom: 10px;
  195. font-size: 16px;
  196. font-weight: bold;
  197. color: #444;
  198. }
  199. }
  200. </style>