Write.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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 { TableData } from '@/api/table/types'
  6. import { useI18n } from '@/hooks/web/useI18n'
  7. import { useValidator } from '@/hooks/web/useValidator'
  8. import { IDomEditor } from '@wangeditor/editor'
  9. const { required } = useValidator()
  10. const props = defineProps({
  11. currentRow: {
  12. type: Object as PropType<Nullable<TableData>>,
  13. default: () => null
  14. }
  15. })
  16. const { t } = useI18n()
  17. const { formRegister, formMethods } = useForm()
  18. const { setValues, getFormData, getElFormExpose, setSchema } = formMethods
  19. const schema = reactive<FormSchema[]>([
  20. {
  21. field: 'title',
  22. label: t('exampleDemo.title'),
  23. component: 'Input',
  24. formItemProps: {
  25. rules: [required()]
  26. },
  27. colProps: {
  28. span: 24
  29. }
  30. },
  31. {
  32. field: 'author',
  33. label: t('exampleDemo.author'),
  34. component: 'Input',
  35. formItemProps: {
  36. rules: [required()]
  37. }
  38. },
  39. {
  40. field: 'display_time',
  41. label: t('exampleDemo.displayTime'),
  42. component: 'DatePicker',
  43. componentProps: {
  44. type: 'datetime',
  45. valueFormat: 'YYYY-MM-DD HH:mm:ss'
  46. },
  47. formItemProps: {
  48. rules: [required()]
  49. }
  50. },
  51. {
  52. field: 'importance',
  53. label: t('exampleDemo.importance'),
  54. component: 'Select',
  55. formItemProps: {
  56. rules: [required()]
  57. },
  58. componentProps: {
  59. options: [
  60. {
  61. label: '重要',
  62. value: 3
  63. },
  64. {
  65. label: '良好',
  66. value: 2
  67. },
  68. {
  69. label: '一般',
  70. value: 1
  71. }
  72. ]
  73. }
  74. },
  75. {
  76. field: 'pageviews',
  77. label: t('exampleDemo.pageviews'),
  78. component: 'InputNumber',
  79. value: 0,
  80. formItemProps: {
  81. rules: [required()]
  82. }
  83. },
  84. {
  85. field: 'content',
  86. component: 'Editor',
  87. colProps: {
  88. span: 24
  89. },
  90. componentProps: {
  91. defaultHtml: '',
  92. // @ts-ignore
  93. onChange: (edit: IDomEditor) => {
  94. setValues({
  95. content: edit.getHtml()
  96. })
  97. }
  98. },
  99. label: t('exampleDemo.content')
  100. }
  101. ])
  102. const rules = reactive({
  103. title: [required()],
  104. author: [required()],
  105. importance: [required()],
  106. pageviews: [required()],
  107. display_time: [required()],
  108. content: [required()]
  109. })
  110. const submit = async () => {
  111. const elForm = await getElFormExpose()
  112. const valid = await elForm?.validate().catch((err) => {
  113. console.log(err)
  114. })
  115. if (valid) {
  116. const formData = await getFormData()
  117. return formData
  118. }
  119. }
  120. watch(
  121. () => props.currentRow,
  122. (currentRow) => {
  123. if (!currentRow) return
  124. setValues(currentRow)
  125. setSchema([
  126. {
  127. field: 'content',
  128. path: 'componentProps.defaultHtml',
  129. value: currentRow.content
  130. }
  131. ])
  132. },
  133. {
  134. deep: true,
  135. immediate: true
  136. }
  137. )
  138. defineExpose({
  139. submit
  140. })
  141. </script>
  142. <template>
  143. <Form :rules="rules" @register="formRegister" :schema="schema" />
  144. </template>