PropertiesPanel.vue 7.8 KB

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