JEditableTableUtil.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import { getVmParentByName } from '@/utils/util'
  2. const FormTypes = {
  3. normal: 'normal',
  4. input: 'input',
  5. inputNumber: 'inputNumber',
  6. checkbox: 'checkbox',
  7. select: 'select',
  8. date: 'date',
  9. datetime: 'datetime',
  10. time: 'time',
  11. upload: 'upload',
  12. file: 'file',
  13. image: 'image',
  14. popup:'popup',
  15. list_multi:"list_multi",
  16. sel_search:"sel_search",
  17. sel_search_async:"sel_search_async",
  18. radio:'radio',
  19. checkbox_meta:"checkbox_meta",
  20. input_pop:'input_pop',
  21. sel_depart: 'sel_depart',
  22. sel_user: 'sel_user',
  23. slot: 'slot',
  24. hidden: 'hidden'
  25. }
  26. const VALIDATE_NO_PASSED = Symbol()
  27. export { FormTypes, VALIDATE_NO_PASSED }
  28. /**
  29. * 获取指定的 $refs 对象
  30. * 有时候可能会遇到组件未挂载到页面中的情况,导致无法获取 $refs 中的某个对象
  31. * 这个方法可以等待挂载完成之后再返回 $refs 的对象,避免报错
  32. * @author sunjianlei
  33. **/
  34. export function getRefPromise(vm, name) {
  35. return new Promise((resolve) => {
  36. (function next() {
  37. let ref = vm.$refs[name]
  38. if (ref) {
  39. resolve(ref)
  40. } else {
  41. setTimeout(() => {
  42. next()
  43. }, 10)
  44. }
  45. })()
  46. })
  47. }
  48. /**
  49. * 一次性验证主表单和所有的次表单
  50. * @param form 主表单 form 对象
  51. * @param cases 接收一个数组,每项都是一个JEditableTable实例
  52. * @returns {Promise<any>}
  53. * @author sunjianlei
  54. */
  55. export function validateFormAndTables(form, cases) {
  56. if (!(form && typeof form.validateFields === 'function')) {
  57. throw `form 参数需要的是一个form对象,而传入的却是${typeof form}`
  58. }
  59. let options = {}
  60. return new Promise((resolve, reject) => {
  61. // 验证主表表单
  62. form.validateFields((err, values) => {
  63. err ? reject({ error: VALIDATE_NO_PASSED }) : resolve(values)
  64. })
  65. }).then(values => {
  66. Object.assign(options, { formValue: values })
  67. // 验证所有子表的表单
  68. return validateTables(cases)
  69. }).then(all => {
  70. Object.assign(options, { tablesValue: all })
  71. return Promise.resolve(options)
  72. }).catch(error => {
  73. return Promise.reject(error)
  74. })
  75. }
  76. /**
  77. * 一次性验证主表单和所有的次表单(新版本)
  78. * @param form 主表单 form 对象
  79. * @param cases 接收一个数组,每项都是一个JEditableTable实例
  80. * @returns {Promise<any>}
  81. * @author sunjianlei
  82. */
  83. export function validateFormModelAndTables(form,values, cases) {
  84. if (!(form && typeof form.validate === 'function')) {
  85. throw `form 参数需要的是一个form对象,而传入的却是${typeof form}`
  86. }
  87. let options = {}
  88. return new Promise((resolve, reject) => {
  89. // 验证主表表单
  90. form.validate((valid,obj) => {
  91. valid ?resolve(values):reject({ error: VALIDATE_NO_PASSED })
  92. })
  93. }).then(values => {
  94. Object.assign(options, { formValue: values })
  95. // 验证所有子表的表单
  96. return validateTables(cases)
  97. }).then(all => {
  98. Object.assign(options, { tablesValue: all })
  99. return Promise.resolve(options)
  100. }).catch(error => {
  101. return Promise.reject(error)
  102. })
  103. }
  104. /**
  105. * 验证并获取一个或多个表格的所有值
  106. * @param cases 接收一个数组,每项都是一个JEditableTable实例
  107. * @param deleteTempId 是否删除临时ID,如果设为true,行编辑就不返回新增行的ID,ID需要后台生成
  108. * @author sunjianlei
  109. */
  110. export function validateTables(cases, deleteTempId) {
  111. if (!(cases instanceof Array)) {
  112. throw `'validateTables'函数的'cases'参数需要的是一个数组,而传入的却是${typeof cases}`
  113. }
  114. return new Promise((resolve, reject) => {
  115. let tables = []
  116. let index = 0;
  117. if(!cases || cases.length === 0){
  118. resolve()
  119. }
  120. (function next() {
  121. let vm = cases[index]
  122. vm.getAll(true, deleteTempId).then(all => {
  123. tables[index] = all
  124. // 判断校验是否全部完成,完成返回成功,否则继续进行下一步校验
  125. if (++index === cases.length) {
  126. resolve(tables)
  127. } else (
  128. next()
  129. )
  130. }, error => {
  131. // 出现未验证通过的表单,不再进行下一步校验,直接返回失败并跳转到该表格
  132. if (error === VALIDATE_NO_PASSED) {
  133. // 尝试获取tabKey,如果在ATab组件内即可获取
  134. let paneKey;
  135. let tabPane = getVmParentByName(vm, 'ATabPane')
  136. if (tabPane) {
  137. paneKey = tabPane.$vnode.key
  138. }
  139. reject({error: VALIDATE_NO_PASSED, index, paneKey})
  140. }
  141. reject(error)
  142. })
  143. })()
  144. })
  145. }