ElementBaseInfo.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <template>
  2. <div class="panel-tab__content">
  3. <el-form
  4. size="mini"
  5. label-width="90px"
  6. :model="model"
  7. :rules="rules"
  8. @submit.native.prevent
  9. >
  10. <div v-if="elementBaseInfo.$type === 'bpmn:Process'">
  11. <!-- 如果是 Process 信息的时候,使用自定义表单 -->
  12. <el-link
  13. href="https://doc.iocoder.cn/bpm/#_3-%E6%B5%81%E7%A8%8B%E5%9B%BE%E7%A4%BA%E4%BE%8B"
  14. type="danger"
  15. target="_blank"
  16. >如何实现实现会签、或签?</el-link
  17. >
  18. <el-form-item label="流程标识" prop="key">
  19. <el-input
  20. v-model="model.key"
  21. placeholder="请输入流标标识"
  22. :disabled="model.id !== undefined && model.id.length > 0"
  23. @change="handleKeyUpdate"
  24. />
  25. </el-form-item>
  26. <el-form-item label="流程名称" prop="name">
  27. <el-input
  28. v-model="model.name"
  29. placeholder="请输入流程名称"
  30. clearable
  31. @change="handleNameUpdate"
  32. />
  33. </el-form-item>
  34. </div>
  35. <div v-else>
  36. <el-form-item label="ID">
  37. <el-input
  38. v-model="elementBaseInfo.id"
  39. clearable
  40. @change="updateBaseInfo('id')"
  41. />
  42. </el-form-item>
  43. <el-form-item label="名称">
  44. <el-input
  45. v-model="elementBaseInfo.name"
  46. clearable
  47. @change="updateBaseInfo('name')"
  48. />
  49. </el-form-item>
  50. </div>
  51. </el-form>
  52. </div>
  53. </template>
  54. <script>
  55. export default {
  56. name: "ElementBaseInfo",
  57. props: {
  58. businessObject: Object,
  59. model: Object, // 流程模型的数据
  60. },
  61. data () {
  62. return {
  63. elementBaseInfo: {},
  64. // 流程表单的下拉框的数据
  65. forms: [],
  66. // 流程模型的校验
  67. rules: {
  68. key: [{ required: true, message: "流程标识不能为空", trigger: "blur" }],
  69. name: [{ required: true, message: "流程名称不能为空", trigger: "blur" }],
  70. },
  71. }
  72. },
  73. watch: {
  74. businessObject: {
  75. immediate: false,
  76. handler: function (val) {
  77. if (val) {
  78. this.$nextTick(() => this.resetBaseInfo())
  79. }
  80. }
  81. },
  82. // 'model.key': {
  83. // immediate: false,
  84. // handler: function (val) {
  85. // this.handleKeyUpdate(val)
  86. // }
  87. // }
  88. },
  89. created () {
  90. // 针对上传的 bpmn 流程图时,需要延迟 1 秒的时间,保证 key 和 name 的更新
  91. setTimeout(() => {
  92. this.handleKeyUpdate(this.model.key)
  93. this.handleNameUpdate(this.model.name)
  94. }, 1000)
  95. },
  96. methods: {
  97. resetBaseInfo () {
  98. this.bpmnElement = window?.bpmnInstances?.bpmnElement
  99. this.elementBaseInfo = JSON.parse(JSON.stringify(this.bpmnElement.businessObject))
  100. },
  101. handleKeyUpdate (value) {
  102. // 校验 value 的值,只有 XML NCName 通过的情况下,才进行赋值。否则,会导致流程图报错,无法绘制的问题
  103. if (!value) {
  104. return
  105. }
  106. if (!value.match(/[a-zA-Z_][\-_.0-9a-zA-Z$]*/)) {
  107. console.log('key 不满足 XML NCName 规则,所以不进行赋值')
  108. return
  109. }
  110. console.log('key 满足 XML NCName 规则,所以进行赋值')
  111. // 在 BPMN 的 XML 中,流程标识 key,其实对应的是 id 节点
  112. this.elementBaseInfo['id'] = value
  113. this.updateBaseInfo('id')
  114. },
  115. handleNameUpdate (value) {
  116. if (!value) {
  117. return
  118. }
  119. this.elementBaseInfo['name'] = value
  120. this.updateBaseInfo('name')
  121. },
  122. handleDescriptionUpdate (value) {
  123. // TODO 芋艿:documentation 暂时无法修改,后续在看看
  124. // this.elementBaseInfo['documentation'] = value;
  125. // this.updateBaseInfo('documentation');
  126. },
  127. updateBaseInfo (key) {
  128. // 触发 elementBaseInfo 对应的字段
  129. const attrObj = Object.create(null)
  130. attrObj[key] = this.elementBaseInfo[key]
  131. if (key === "id") {
  132. window.bpmnInstances.modeling.updateProperties(this.bpmnElement, {
  133. id: this.elementBaseInfo[key],
  134. di: { id: `${this.elementBaseInfo[key]}_di` }
  135. })
  136. } else {
  137. window.bpmnInstances.modeling.updateProperties(this.bpmnElement, attrObj)
  138. }
  139. }
  140. },
  141. beforeDestroy () {
  142. this.bpmnElement = null
  143. }
  144. };
  145. </script>