DialogForm.vue 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <script setup lang="ts">
  2. import type { BasicForm, AdvancedForm } 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. advanced?: boolean
  12. }
  13. const props = defineProps<Props>()
  14. const emits = defineEmits(['update:modelValue', 'success'])
  15. const formInitData = ref({})
  16. watchEffect(() => {
  17. console.log(props.formData)
  18. formInitData.value = props.formData
  19. })
  20. const formRef = ref()
  21. const dialogTitle = computed(() => (props.formData.id ? '编辑' : '新增'))
  22. const dialogVisible = computed({
  23. get: () => props.modelValue,
  24. set: value => emits('update:modelValue', value)
  25. })
  26. const closeDialog = () => {
  27. dialogVisible.value = false
  28. formInitData.value = {}
  29. }
  30. const submit = async () => {
  31. const res = await formRef.value.submit()
  32. if (res) {
  33. closeDialog()
  34. emits('success')
  35. }
  36. }
  37. </script>
  38. <template>
  39. <el-dialog
  40. draggable
  41. :title="dialogTitle"
  42. v-bind="dialogConfig"
  43. v-model="dialogVisible"
  44. @close="closeDialog"
  45. :close-on-click-modal="false"
  46. >
  47. <pro-form
  48. ref="formRef"
  49. :formConfig="formConfig"
  50. :formData="formInitData"
  51. :create="create"
  52. :update="update"
  53. :advanced="advanced"
  54. />
  55. <template #footer>
  56. <el-button icon="Close" @click="closeDialog">取消</el-button>
  57. <el-button icon="Check" type="primary" @click="submit">保存</el-button>
  58. </template>
  59. </el-dialog>
  60. </template>
  61. <style lang="scss" scoped></style>