Write.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <script setup lang="ts">
  2. import { Form, FormSchema } from '@/components/Form'
  3. import { useForm } from '@/hooks/web/useForm'
  4. import { PropType, reactive, watch } from 'vue'
  5. import { useValidator } from '@/hooks/web/useValidator'
  6. import { useI18n } from '@/hooks/web/useI18n'
  7. const { t } = useI18n()
  8. const { required } = useValidator()
  9. const props = defineProps({
  10. currentRow: {
  11. type: Object as PropType<any>,
  12. default: () => null
  13. }
  14. })
  15. const formSchema = reactive<FormSchema[]>([
  16. {
  17. field: 'meta.title',
  18. label: t('menu.menuName'),
  19. component: 'Input'
  20. },
  21. {
  22. field: 'component',
  23. label: t('menu.component'),
  24. component: 'Input'
  25. },
  26. {
  27. field: 'name',
  28. label: t('menu.name'),
  29. component: 'Input'
  30. },
  31. {
  32. field: 'meta.icon',
  33. label: t('menu.icon'),
  34. component: 'Input'
  35. },
  36. {
  37. field: 'path',
  38. label: t('menu.path'),
  39. component: 'Input'
  40. },
  41. {
  42. field: 'status',
  43. label: t('menu.status'),
  44. component: 'Select',
  45. componentProps: {
  46. options: [
  47. {
  48. label: t('userDemo.disable'),
  49. value: 0
  50. },
  51. {
  52. label: t('userDemo.enable'),
  53. value: 1
  54. }
  55. ]
  56. }
  57. },
  58. {
  59. field: 'meta.activeMenu',
  60. label: t('menu.activeMenu'),
  61. component: 'Input'
  62. },
  63. {
  64. field: 'permission',
  65. label: t('menu.permission'),
  66. component: 'CheckboxGroup',
  67. componentProps: {
  68. options: [
  69. {
  70. label: 'add',
  71. value: 'add'
  72. },
  73. {
  74. label: 'edit',
  75. value: 'edit'
  76. },
  77. {
  78. label: 'delete',
  79. value: 'delete'
  80. }
  81. ]
  82. }
  83. },
  84. {
  85. field: 'meta.hidden',
  86. label: t('menu.hidden'),
  87. component: 'Switch'
  88. },
  89. {
  90. field: 'meta.alwaysShow',
  91. label: t('menu.alwaysShow'),
  92. component: 'Switch'
  93. },
  94. {
  95. field: 'meta.noCache',
  96. label: t('menu.noCache'),
  97. component: 'Switch'
  98. },
  99. {
  100. field: 'meta.breadcrumb',
  101. label: t('menu.breadcrumb'),
  102. component: 'Switch'
  103. },
  104. {
  105. field: 'meta.affix',
  106. label: t('menu.affix'),
  107. component: 'Switch'
  108. },
  109. {
  110. field: 'meta.noTagsView',
  111. label: t('menu.noTagsView'),
  112. component: 'Switch'
  113. },
  114. {
  115. field: 'canTo',
  116. label: t('menu.canTo'),
  117. component: 'Switch'
  118. }
  119. ])
  120. const rules = reactive({
  121. component: [required()],
  122. path: [required()],
  123. 'meta.title': [required()]
  124. })
  125. const { formRegister, formMethods } = useForm()
  126. const { setValues, getFormData, getElFormExpose } = formMethods
  127. const submit = async () => {
  128. const elForm = await getElFormExpose()
  129. const valid = await elForm?.validate().catch((err) => {
  130. console.log(err)
  131. })
  132. if (valid) {
  133. const formData = await getFormData()
  134. return formData
  135. }
  136. }
  137. watch(
  138. () => props.currentRow,
  139. (currentRow) => {
  140. if (!currentRow) return
  141. setValues(currentRow)
  142. },
  143. {
  144. deep: true,
  145. immediate: true
  146. }
  147. )
  148. defineExpose({
  149. submit
  150. })
  151. </script>
  152. <template>
  153. <Form :rules="rules" @register="formRegister" :schema="formSchema" />
  154. </template>