7cbf9ee467a7d16d52ec471f8aa633946b7356df.svn-base 4.4 KB

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