FormDesign.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <template>
  2. <el-form ref="formRef" :model="modelData" :rules="rules" label-width="120px" class="mt-20px">
  3. <el-form-item label="表单类型" prop="formType" class="mb-20px">
  4. <el-radio-group v-model="modelData.formType">
  5. <el-radio
  6. v-for="dict in getIntDictOptions(DICT_TYPE.BPM_MODEL_FORM_TYPE)"
  7. :key="dict.value"
  8. :value="dict.value"
  9. >
  10. {{ dict.label }}
  11. </el-radio>
  12. </el-radio-group>
  13. </el-form-item>
  14. <el-form-item v-if="modelData.formType === 10" label="流程表单" prop="formId">
  15. <el-select v-model="modelData.formId" clearable style="width: 100%">
  16. <el-option v-for="form in formList" :key="form.id" :label="form.name" :value="form.id" />
  17. </el-select>
  18. </el-form-item>
  19. <el-form-item v-if="modelData.formType === 20" label="表单提交路由" prop="formCustomCreatePath">
  20. <el-input
  21. v-model="modelData.formCustomCreatePath"
  22. placeholder="请输入表单提交路由"
  23. style="width: 330px"
  24. />
  25. <el-tooltip
  26. class="item"
  27. content="自定义表单的提交路径,使用 Vue 的路由地址,例如说:bpm/oa/leave/create.vue"
  28. effect="light"
  29. placement="top"
  30. >
  31. <Icon icon="ep:question" class="ml-5px" />
  32. </el-tooltip>
  33. </el-form-item>
  34. <el-form-item v-if="modelData.formType === 20" label="表单查看地址" prop="formCustomViewPath">
  35. <el-input
  36. v-model="modelData.formCustomViewPath"
  37. placeholder="请输入表单查看的组件地址"
  38. style="width: 330px"
  39. />
  40. <el-tooltip
  41. class="item"
  42. content="自定义表单的查看组件地址,使用 Vue 的组件地址,例如说:bpm/oa/leave/detail.vue"
  43. effect="light"
  44. placement="top"
  45. >
  46. <Icon icon="ep:question" class="ml-5px" />
  47. </el-tooltip>
  48. </el-form-item>
  49. <!-- 表单预览 -->
  50. <div
  51. v-if="modelData.formType === 10 && modelData.formId && formPreview.rule.length > 0"
  52. class="mt-20px"
  53. >
  54. <div class="flex items-center mb-15px">
  55. <div class="h-15px w-4px bg-[#1890ff] mr-10px"></div>
  56. <span class="text-15px font-bold">表单预览</span>
  57. </div>
  58. <form-create
  59. v-model="formPreview.formData"
  60. :rule="formPreview.rule"
  61. :option="formPreview.option"
  62. />
  63. </div>
  64. </el-form>
  65. </template>
  66. <script lang="ts" setup>
  67. import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
  68. import * as FormApi from '@/api/bpm/form'
  69. import { setConfAndFields2 } from '@/utils/formCreate'
  70. const props = defineProps({
  71. modelValue: {
  72. type: Object,
  73. required: true
  74. },
  75. formList: {
  76. type: Array,
  77. required: true
  78. }
  79. })
  80. const emit = defineEmits(['update:modelValue'])
  81. const formRef = ref()
  82. // 创建本地数据副本
  83. const modelData = computed({
  84. get: () => props.modelValue,
  85. set: (val) => emit('update:modelValue', val)
  86. })
  87. // 表单预览数据
  88. const formPreview = ref({
  89. formData: {},
  90. rule: [],
  91. option: {
  92. submitBtn: false,
  93. resetBtn: false,
  94. formData: {}
  95. }
  96. })
  97. // 监听表单ID变化,加载表单数据
  98. watch(
  99. () => modelData.value.formId,
  100. async (newFormId) => {
  101. if (newFormId && modelData.value.formType === 10) {
  102. const data = await FormApi.getForm(newFormId)
  103. setConfAndFields2(formPreview.value, data.conf, data.fields)
  104. // 设置只读
  105. formPreview.value.rule.forEach((item: any) => {
  106. item.props = { ...item.props, disabled: true }
  107. })
  108. } else {
  109. formPreview.value.rule = []
  110. }
  111. },
  112. { immediate: true }
  113. )
  114. const rules = {
  115. formType: [{ required: true, message: '表单类型不能为空', trigger: 'blur' }],
  116. formId: [{ required: true, message: '流程表单不能为空', trigger: 'blur' }],
  117. formCustomCreatePath: [{ required: true, message: '表单提交路由不能为空', trigger: 'blur' }],
  118. formCustomViewPath: [{ required: true, message: '表单查看地址不能为空', trigger: 'blur' }]
  119. }
  120. /** 表单校验 */
  121. const validate = async () => {
  122. await formRef.value?.validate()
  123. }
  124. defineExpose({
  125. validate
  126. })
  127. </script>