Files
supervision-test-frontend-repo/src/utils/common/vxeUtils.ts
T
2026-04-09 15:09:34 +08:00

107 lines
4.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { getValueType } from '/@/utils';
export const VALIDATE_FAILED = Symbol();
/**
* 一次性验证主表单和所有的次表单(新版本)
* @param form 主表单 form 对象
* @param cases 接收一个数组,每项都是一个JEditableTable实例
* @returns {Promise<any>}
*/
export async function validateFormModelAndTables(validate, formData, cases, props, autoJumpTab?) {
if (!(validate && typeof validate === 'function')) {
throw `validate 参数需要的是一个方法,而传入的却是${typeof validate}`;
}
let dataMap = {};
let values = await new Promise((resolve, reject) => {
// 验证主表表单
validate()
.then(() => {
//update-begin---author:wangshuai ---date:20220507 for[VUEN-912]一对多用户组件(所有风格,单表和树没问题)保存报错------------
for (let data in formData) {
//如果该数据是数组
if (formData[data] instanceof Array) {
let valueType = getValueType(props, data);
//如果是字符串类型的需要变成以逗号分割的字符串
if (valueType === 'string') {
formData[data] = formData[data].join(',');
}
}
}
//update-end---author:wangshuai ---date:20220507 for[VUEN-912]一对多用户组件(所有风格,单表和树没问题)保存报错--------------
resolve(formData);
})
//update-begin---author:wangshuai---date:2024-06-17---for:【TV360X-1064】非原生提交表单滚动校验没通过的项---
.catch(({ errorFields }) => {
reject({ error: VALIDATE_FAILED, index: 0, errorFields: errorFields });
//update-end---author:wangshuai---date:2024-06-17---for:【TV360X-1064】非原生提交表单滚动校验没通过的项---
});
});
Object.assign(dataMap, { formValue: values });
// 验证所有子表的表单
let subData = await validateTables(cases, autoJumpTab);
// 合并最终数据
dataMap = Object.assign(dataMap, { tablesValue: subData });
return dataMap;
}
/**
* 验证并获取一个或多个表格的所有值
* @param cases 接收一个数组,每项都是一个JEditableTable实例
* @param autoJumpTab 是否自动跳转到报错的tab
*/
export function validateTables(cases, autoJumpTab = true) {
if (!(cases instanceof Array)) {
throw `'validateTables'函数的'cases'参数需要的是一个数组,而传入的却是${typeof cases}`;
}
return new Promise((resolve, reject) => {
let tablesData: any = [];
let index = 0;
if (!cases || cases.length === 0) {
resolve(tablesData);
}
(function next() {
let vm = cases[index];
vm.value.validateTable().then((errMap) => {
// 校验通过
if (!errMap) {
tablesData[index] = { tableData: vm.value.getTableData() };
// 判断校验是否全部完成,完成返回成功,否则继续进行下一步校验
if (++index === cases.length) {
resolve(tablesData);
} else next();
} else {
// 尝试获取tabKey,如果在ATab组件内即可获取
let paneKey;
let tabPane = getVmParentByName(vm.value, 'ATabPane');
if (tabPane) {
paneKey = tabPane.$.vnode.key;
// 自动跳转到该表格
if (autoJumpTab) {
let tabs = getVmParentByName(tabPane, 'Tabs');
tabs && tabs.setActiveKey && tabs.setActiveKey(paneKey);
}
}
// 出现未验证通过的表单,不再进行下一步校验,直接返回失败
//update-begin-author:liusq date:2024-06-12 for: TV360X-478 一对多tab,校验未通过时,tab没有跳转
reject({ error: VALIDATE_FAILED, index, paneKey, errMap, subIndex: index });
//update-end-author:liusq date:2024-06-12 for: TV360X-478 一对多tab,校验未通过时,tab没有跳转
}
});
})();
});
}
export function getVmParentByName(vm, name) {
let parent = vm.$parent;
if (parent && parent.$options) {
if (parent.$options.name === name) {
return parent;
} else {
let res = getVmParentByName(parent, name);
if (res) {
return res;
}
}
}
return null;
}