vxeUtils.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { getValueType } from '/@/utils';
  2. export const VALIDATE_FAILED = Symbol();
  3. /**
  4. * 一次性验证主表单和所有的次表单(新版本)
  5. * @param form 主表单 form 对象
  6. * @param cases 接收一个数组,每项都是一个JEditableTable实例
  7. * @returns {Promise<any>}
  8. */
  9. export async function validateFormModelAndTables(validate, formData, cases, props, autoJumpTab?) {
  10. if (!(validate && typeof validate === 'function')) {
  11. throw `validate 参数需要的是一个方法,而传入的却是${typeof validate}`;
  12. }
  13. let dataMap = {};
  14. let values = await new Promise((resolve, reject) => {
  15. // 验证主表表单
  16. validate()
  17. .then(() => {
  18. //update-begin---author:wangshuai ---date:20220507 for:[VUEN-912]一对多用户组件(所有风格,单表和树没问题)保存报错------------
  19. for (let data in formData) {
  20. //如果该数据是数组
  21. if (formData[data] instanceof Array) {
  22. let valueType = getValueType(props, data);
  23. //如果是字符串类型的需要变成以逗号分割的字符串
  24. if (valueType === 'string') {
  25. formData[data] = formData[data].join(',');
  26. }
  27. }
  28. }
  29. //update-end---author:wangshuai ---date:20220507 for:[VUEN-912]一对多用户组件(所有风格,单表和树没问题)保存报错--------------
  30. resolve(formData);
  31. })
  32. .catch(() => {
  33. reject({ error: VALIDATE_FAILED });
  34. });
  35. });
  36. Object.assign(dataMap, { formValue: values });
  37. // 验证所有子表的表单
  38. let subData = await validateTables(cases, autoJumpTab);
  39. // 合并最终数据
  40. dataMap = Object.assign(dataMap, { tablesValue: subData });
  41. return dataMap;
  42. }
  43. /**
  44. * 验证并获取一个或多个表格的所有值
  45. * @param cases 接收一个数组,每项都是一个JEditableTable实例
  46. * @param autoJumpTab 是否自动跳转到报错的tab
  47. */
  48. export function validateTables(cases, autoJumpTab = true) {
  49. if (!(cases instanceof Array)) {
  50. throw `'validateTables'函数的'cases'参数需要的是一个数组,而传入的却是${typeof cases}`;
  51. }
  52. return new Promise((resolve, reject) => {
  53. let tablesData: any = [];
  54. let index = 0;
  55. if (!cases || cases.length === 0) {
  56. resolve(tablesData);
  57. }
  58. (function next() {
  59. let vm = cases[index];
  60. vm.value.validateTable().then((errMap) => {
  61. // 校验通过
  62. if (!errMap) {
  63. tablesData[index] = { tableData: vm.value.getTableData() };
  64. // 判断校验是否全部完成,完成返回成功,否则继续进行下一步校验
  65. if (++index === cases.length) {
  66. resolve(tablesData);
  67. } else next();
  68. } else {
  69. // 尝试获取tabKey,如果在ATab组件内即可获取
  70. let paneKey;
  71. let tabPane = getVmParentByName(vm.value, 'ATabPane');
  72. if (tabPane) {
  73. paneKey = tabPane.$.vnode.key;
  74. // 自动跳转到该表格
  75. if (autoJumpTab) {
  76. let tabs = getVmParentByName(tabPane, 'Tabs');
  77. tabs && tabs.setActiveKey && tabs.setActiveKey(paneKey);
  78. }
  79. }
  80. // 出现未验证通过的表单,不再进行下一步校验,直接返回失败
  81. reject({ error: VALIDATE_FAILED, index, paneKey, errMap });
  82. }
  83. });
  84. })();
  85. });
  86. }
  87. export function getVmParentByName(vm, name) {
  88. let parent = vm.$parent;
  89. if (parent && parent.$options) {
  90. if (parent.$options.name === name) {
  91. return parent;
  92. } else {
  93. let res = getVmParentByName(parent, name);
  94. if (res) {
  95. return res;
  96. }
  97. }
  98. }
  99. return null;
  100. }