PropertiesPanel.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <template>
  2. <div class="process-panel__container" :style="{ width: `${this.width}px` }">
  3. <el-collapse v-model="activeTab">
  4. <el-collapse-item name="base">
  5. <template #title>
  6. <div class="panel-tab__title">
  7. <el-icon><info-filled /></el-icon>常规
  8. </div>
  9. </template>
  10. <element-base-info :id-edit-disabled="idEditDisabled" :business-object="elementBusinessObject" :type="elementType" />
  11. </el-collapse-item>
  12. <el-collapse-item name="condition" v-if="elementType === 'Process'" key="message">
  13. <template #title>
  14. <div class="panel-tab__title">
  15. <el-icon><comment /></el-icon>消息与信号
  16. </div>
  17. </template>
  18. <signal-and-massage />
  19. </el-collapse-item>
  20. <el-collapse-item name="condition" v-if="conditionFormVisible" key="condition">
  21. <template #title>
  22. <div class="panel-tab__title">
  23. <el-icon><promotion /></el-icon>流转条件
  24. </div>
  25. </template>
  26. <flow-condition :business-object="elementBusinessObject" :type="elementType" />
  27. </el-collapse-item>
  28. <!-- <el-collapse-item name="condition" v-if="formVisible" key="form">-->
  29. <!-- <template #title>-->
  30. <!-- <div class="panel-tab__title">-->
  31. <!-- <el-icon><list /></el-icon>表单-->
  32. <!-- </div>-->
  33. <!-- </template>-->
  34. <!-- <element-form :id="elementId" :type="elementType" />-->
  35. <!-- </el-collapse-item>-->
  36. <el-collapse-item name="task" v-if="elementType.indexOf('Task') !== -1" key="task">
  37. <template #title>
  38. <div class="panel-tab__title">
  39. <el-icon><checked /></el-icon>审核者
  40. </div>
  41. </template>
  42. <element-task :id="elementId" :key="elementId" :business-object="elementBusinessObject" :type="elementType" />
  43. </el-collapse-item>
  44. <!-- <el-collapse-item name="multiInstance" v-if="elementType.indexOf('Task') !== -1" key="multiInstance">-->
  45. <!-- <template #title>-->
  46. <!-- <div class="panel-tab__title">-->
  47. <!-- <el-icon><help-filled /></el-icon>会签配置-->
  48. <!-- </div>-->
  49. <!-- </template>-->
  50. <!-- <element-multi-instance :business-object="elementBusinessObject" :type="elementType" />-->
  51. <!-- </el-collapse-item>-->
  52. <el-collapse-item name="listeners" key="listeners">
  53. <template #title>
  54. <div class="panel-tab__title">
  55. <el-icon><bell-filled /></el-icon>执行监听器
  56. </div>
  57. </template>
  58. <element-listeners :id="elementId" :type="elementType" />
  59. </el-collapse-item>
  60. <el-collapse-item name="taskListeners" v-if="elementType === 'UserTask'" key="taskListeners">
  61. <template #title>
  62. <div class="panel-tab__title">
  63. <el-icon><bell-filled /></el-icon>任务监听器
  64. </div>
  65. </template>
  66. <user-task-listeners :id="elementId" :type="elementType" />
  67. </el-collapse-item>
  68. <el-collapse-item name="extensions" key="extensions">
  69. <template #title>
  70. <div class="panel-tab__title">
  71. <el-icon><circle-plus /></el-icon>扩展属性
  72. </div>
  73. </template>
  74. <element-properties :id="elementId" :type="elementType" />
  75. </el-collapse-item>
  76. <!-- <el-collapse-item name="other" key="other">-->
  77. <!-- <template #title>-->
  78. <!-- <div class="panel-tab__title">-->
  79. <!-- <el-icon><promotion /></el-icon>其他-->
  80. <!-- </div>-->
  81. <!-- </template>-->
  82. <!-- <element-other-config :id="elementId" />-->
  83. <!-- </el-collapse-item>-->
  84. </el-collapse>
  85. </div>
  86. </template>
  87. <script>
  88. import ElementBaseInfo from "./base/ElementBaseInfo.vue";
  89. import ElementOtherConfig from "./other/ElementOtherConfig.vue";
  90. import ElementTask from "./task/ElementTask.vue";
  91. import ElementMultiInstance from "./multi-instance/ElementMultiInstance.vue";
  92. import FlowCondition from "./flow-condition/FlowCondition.vue";
  93. import SignalAndMassage from "./signal-message/SignalAndMessage.vue";
  94. import ElementListeners from "./listeners/ElementListeners.vue";
  95. import ElementProperties from "./properties/ElementProperties.vue";
  96. // import ElementForm from "./form/ElementForm.vue";
  97. import UserTaskListeners from "./listeners/UserTaskListeners.vue";
  98. import Log from "../Log";
  99. /**
  100. * 侧边栏
  101. * @Author MiyueFE
  102. * @Home https://github.com/miyuesc
  103. * @Date 2021年3月31日18:57:51
  104. */
  105. export default {
  106. name: "MyPropertiesPanel",
  107. components: {
  108. UserTaskListeners,
  109. // ElementForm,
  110. ElementProperties,
  111. ElementListeners,
  112. SignalAndMassage,
  113. FlowCondition,
  114. ElementMultiInstance,
  115. ElementTask,
  116. // ElementOtherConfig,
  117. ElementBaseInfo
  118. },
  119. componentName: "MyPropertiesPanel",
  120. props: {
  121. bpmnModeler: Object,
  122. prefix: {
  123. type: String,
  124. default: "camunda"
  125. },
  126. width: {
  127. type: Number,
  128. default: 480
  129. },
  130. idEditDisabled: {
  131. type: Boolean,
  132. default: false
  133. }
  134. },
  135. provide() {
  136. return {
  137. prefix: this.prefix,
  138. width: this.width
  139. };
  140. },
  141. data() {
  142. return {
  143. activeTab: "base",
  144. elementId: "",
  145. elementType: "",
  146. elementBusinessObject: {}, // 元素 businessObject 镜像,提供给需要做判断的组件使用
  147. conditionFormVisible: false, // 流转条件设置
  148. formVisible: false // 表单配置
  149. };
  150. },
  151. watch: {
  152. elementId: {
  153. handler() {
  154. this.activeTab = "base";
  155. }
  156. }
  157. },
  158. created() {
  159. this.initModels();
  160. },
  161. methods: {
  162. initModels() {
  163. // 初始化 modeler 以及其他 moddle
  164. if (!this.bpmnModeler) {
  165. // 避免加载时 流程图 并未加载完成
  166. this.timer = setTimeout(() => this.initModels(), 10);
  167. return;
  168. }
  169. if (this.timer) clearTimeout(this.timer);
  170. window.bpmnInstances = {
  171. modeler: this.bpmnModeler,
  172. modeling: this.bpmnModeler.get("modeling"),
  173. moddle: this.bpmnModeler.get("moddle"),
  174. eventBus: this.bpmnModeler.get("eventBus"),
  175. bpmnFactory: this.bpmnModeler.get("bpmnFactory"),
  176. elementFactory: this.bpmnModeler.get("elementFactory"),
  177. elementRegistry: this.bpmnModeler.get("elementRegistry"),
  178. replace: this.bpmnModeler.get("replace"),
  179. selection: this.bpmnModeler.get("selection")
  180. };
  181. this.getActiveElement();
  182. },
  183. getActiveElement() {
  184. // 初始第一个选中元素 bpmn:Process
  185. this.initFormOnChanged(null);
  186. this.bpmnModeler.on("import.done", (e) => {
  187. this.initFormOnChanged(null);
  188. });
  189. // 监听选择事件,修改当前激活的元素以及表单
  190. this.bpmnModeler.on("selection.changed", ({ newSelection }) => {
  191. this.initFormOnChanged(newSelection[0] || null);
  192. });
  193. this.bpmnModeler.on("element.changed", ({ element }) => {
  194. // 保证 修改 "默认流转路径" 类似需要修改多个元素的事件发生的时候,更新表单的元素与原选中元素不一致。
  195. if (element && element.id === this.elementId) {
  196. this.initFormOnChanged(element);
  197. }
  198. });
  199. },
  200. // 初始化数据
  201. initFormOnChanged(element) {
  202. let activatedElement = element;
  203. if (!activatedElement) {
  204. activatedElement = window.bpmnInstances.elementRegistry.find((el) => el.type === "bpmn:Process") ?? window.bpmnInstances.elementRegistry.find((el) => el.type === "bpmn:Collaboration");
  205. }
  206. if (!activatedElement) return;
  207. Log.printBack(`select element changed: id: ${activatedElement.id} , type: ${activatedElement.businessObject.$type}`);
  208. Log.prettyInfo("businessObject", activatedElement.businessObject);
  209. window.bpmnInstances.bpmnElement = activatedElement;
  210. this.bpmnElement = activatedElement;
  211. this.elementId = activatedElement.id;
  212. this.elementType = activatedElement.type.split(":")[1] || "";
  213. this.elementBusinessObject = JSON.parse(JSON.stringify(activatedElement.businessObject));
  214. this.conditionFormVisible = !!(this.elementType === "SequenceFlow" && activatedElement.source && activatedElement.source.type.indexOf("StartEvent") === -1);
  215. this.formVisible = this.elementType === "UserTask" || this.elementType === "StartEvent";
  216. },
  217. beforeUnmount() {
  218. window.bpmnInstances = null;
  219. }
  220. }
  221. };
  222. </script>