ElementBaseInfo.vue 4.0 KB

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