GenerateForm.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <template>
  2. <el-form
  3. ref="generateForm"
  4. label-suffix=":"
  5. :model="model"
  6. :rules="rules"
  7. :size="widgetForm.config.size"
  8. :label-position="widgetForm.config.labelPosition"
  9. :label-width="`${widgetForm.config.labelWidth}px`"
  10. :hide-required-asterisk="widgetForm.config.hideRequiredAsterisk"
  11. >
  12. <template v-for="(element, index) of widgetForm.list" :key="element.key">
  13. <GenerateFormItem
  14. :model="model"
  15. :updated-model="updatedModel"
  16. :element="widgetForm.list[index]"
  17. :config="data.config"
  18. :disabled="disabled"
  19. :request="request"
  20. :widgetFormData="widgetForm.list"
  21. @updateWidgetForm="updateWidgetForm"
  22. />
  23. </template>
  24. </el-form>
  25. </template>
  26. <script lang="ts">
  27. import { defineComponent, reactive, toRefs, watch } from 'vue'
  28. import { ElMessage } from 'element-plus'
  29. import GenerateFormItem from './GenerateFormItem.vue'
  30. import { getWidgetForm } from '@/config'
  31. export default defineComponent({
  32. name: 'FormGenerate',
  33. components: {
  34. GenerateFormItem,
  35. },
  36. props: {
  37. data: {
  38. type: Object,
  39. default: getWidgetForm(),
  40. },
  41. value: {
  42. type: Object,
  43. },
  44. disabled: {
  45. type: Boolean,
  46. default: false,
  47. },
  48. request: {
  49. type: Function,
  50. },
  51. },
  52. setup(props) {
  53. const state = reactive({
  54. generateForm: null as any,
  55. model: {} as any,
  56. updatedModel: {} as any,
  57. rules: {} as any,
  58. widgetForm:
  59. (props.data && JSON.parse(JSON.stringify(props.data)))
  60. ?? getWidgetForm(),
  61. })
  62. const generateModel = (list: any[]) => {
  63. for (let index = 0; index < list.length; index++) {
  64. const model = list[index].model
  65. if (!model)
  66. return
  67. if (list[index].type === 'grid') {
  68. list[index].columns.forEach((col: any) => generateModel(col.list))
  69. }
  70. else {
  71. if (props.value && Object.keys(props.value).includes(model))
  72. state.model[model] = props.value[model]
  73. else
  74. state.model[model] = list[index].options.defaultValue
  75. state.rules[model] = list[index].options.rules
  76. }
  77. }
  78. }
  79. const generateOptions = (list: any[]) => {
  80. list.forEach(async(item) => {
  81. if (item.type === 'grid') {
  82. item.columns.forEach((col: any) => generateOptions(col.list))
  83. }
  84. else {
  85. if (item.options.remote && item.options.remoteFunc) {
  86. if (props.request) {
  87. const { data } = await props.request({
  88. url: item.options.remoteFunc,
  89. })
  90. item.options.remoteOptions = data.map((i: any) => ({
  91. label: i[item.options.props.label],
  92. value: i[item.options.props.value],
  93. children: i[item.options.props.children],
  94. }))
  95. return
  96. }
  97. const token: any = sessionStorage.getItem('token')
  98. fetch(item.options.remoteFunc, {
  99. headers: {
  100. "Content-type": " application/x-www-form-urlencoded; charset=UTF-8",
  101. "Token": token
  102. }
  103. })
  104. .then(resp => resp.json())
  105. .then((json) => {
  106. const res = json.data
  107. if (res instanceof Array) {
  108. item.options.remoteOptions = res.map(data => ({
  109. label: data[item.options.props.label],
  110. value: data[item.options.props.value],
  111. children: data[item.options.props.children],
  112. }))
  113. }
  114. })
  115. }
  116. }
  117. })
  118. }
  119. const updateWidgetForm = (list: any[]) => {
  120. // console.log(list, '<=====')
  121. const listIndex = state.widgetForm.list.findIndex((item: any) => item.type === 'grid')
  122. state.widgetForm.list[listIndex].columns = list
  123. // console.log(state.widgetForm.list);
  124. state.model = {...state.model, contactsId: ''}
  125. }
  126. watch(
  127. () => props.data,
  128. (val) => {
  129. state.widgetForm
  130. = (val && JSON.parse(JSON.stringify(val))) ?? getWidgetForm()
  131. state.model = {}
  132. state.rules = {}
  133. generateModel(state.widgetForm.list)
  134. generateOptions(state.widgetForm.list)
  135. },
  136. { deep: true, immediate: true },
  137. )
  138. const getData = () => {
  139. return new Promise((resolve, reject) => {
  140. state.generateForm
  141. .validate()
  142. .then((validate: boolean) => {
  143. if (validate)
  144. resolve(state.updatedModel)
  145. else
  146. ElMessage.error('验证失败')
  147. })
  148. .catch((error: Error) => {
  149. reject(error)
  150. })
  151. })
  152. }
  153. const reset = () => {
  154. state.generateForm.resetFields()
  155. }
  156. return {
  157. ...toRefs(state),
  158. getData,
  159. reset,
  160. updateWidgetForm
  161. }
  162. },
  163. })
  164. </script>