JEditableTableUtil.js 5.4 KB

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