DialogForm.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <script setup lang="ts">
  2. import type { BasicForm, AdvancedForm, formSlot } from '@/types/form'
  3. import type { DialogProps } from 'element-plus'
  4. interface Props {
  5. modelValue: boolean
  6. dialogConfig?: DialogProps
  7. formConfig: BasicForm | AdvancedForm
  8. formData: any
  9. create: Function
  10. update: Function
  11. }
  12. const props = defineProps<Props>()
  13. const emits = defineEmits(['update:modelValue', 'success'])
  14. const formInitData = ref({})
  15. watchEffect(() => {
  16. formInitData.value = props.formData
  17. })
  18. const formRef = ref()
  19. const formSlots = ref<formSlot[]>([])
  20. if (props.formConfig.advanced) {
  21. props.formConfig.formItems.forEach((item: any) => {
  22. item.group.forEach((subItem: any) => Array.prototype.push.apply(formSlots.value, subItem.slots))
  23. })
  24. } else {
  25. props.formConfig.formItems.forEach((item: any) => Array.prototype.push.apply(formSlots.value, item.slots))
  26. }
  27. const dialogTitle = computed(() => (props.formData.id ? '编辑' : '新增'))
  28. const dialogVisible = computed({
  29. get: () => props.modelValue,
  30. set: value => emits('update:modelValue', value)
  31. })
  32. const closeDialog = () => {
  33. dialogVisible.value = false
  34. formInitData.value = {}
  35. }
  36. const submit = async () => {
  37. const res = await formRef.value.submit()
  38. if (res) {
  39. closeDialog()
  40. emits('success')
  41. }
  42. }
  43. </script>
  44. <template>
  45. <el-dialog
  46. draggable
  47. :title="dialogTitle"
  48. v-bind="dialogConfig"
  49. v-model="dialogVisible"
  50. @close="closeDialog"
  51. :close-on-click-modal="false"
  52. >
  53. <pro-form ref="formRef" :formConfig="formConfig" :formData="formInitData" :create="create" :update="update">
  54. <template #[slot.alias] v-for="slot in formSlots" :key="slot.alias">
  55. <slot :name="slot.alias"></slot>
  56. </template>
  57. </pro-form>
  58. <template #footer>
  59. <el-button icon="Close" @click="closeDialog">取消</el-button>
  60. <el-button icon="Check" type="primary" @click="submit">保存</el-button>
  61. </template>
  62. </el-dialog>
  63. </template>
  64. <style lang="scss" scoped></style>