123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- import { getVmParentByName } from '@/utils/util'
- import { JVXETypes } from '@comp/jeecg/JVxeTable/index'
- export const VALIDATE_FAILED = Symbol()
- /**
- * 获取指定的 $refs 对象
- * 有时候可能会遇到组件未挂载到页面中的情况,导致无法获取 $refs 中的某个对象
- * 这个方法可以等待挂载完成之后再返回 $refs 的对象,避免报错
- * @author sunjianlei
- **/
- export function getRefPromise(vm, name) {
- return new Promise((resolve) => {
- (function next() {
- let ref = vm.$refs[name]
- if (ref) {
- resolve(ref)
- } else {
- setTimeout(() => {
- next()
- }, 10)
- }
- })()
- })
- }
- /** 获取某一数字输入框列中的最大的值 */
- export function getInputNumberMaxValue(col, rowsValues) {
- let maxNum = 0
- Object.values(rowsValues).forEach((rowValue, index) => {
- let val = rowValue[col.key], num
- try {
- num = Number.parseFloat(val)
- } catch {
- num = 0
- }
- // 把首次循环的结果当成最大值
- if (index === 0) {
- maxNum = num
- } else {
- maxNum = (num > maxNum) ? num : maxNum
- }
- })
- return maxNum
- }
- /**
- *
- * 根据 tagName 获取父级节点
- *
- * @param dom 一级dom节点
- * @param tagName 标签名,不区分大小写
- * @return {HTMLElement | NULL}
- */
- export function getParentNodeByTagName(dom, tagName = 'body') {
- if (tagName === 'body') {
- return document.body
- }
- if (dom.parentNode) {
- if (dom.parentNode.tagName.toLowerCase() === tagName.trim().toLowerCase()) {
- return dom.parentNode
- } else {
- return getParentNodeByTagName(dom.parentNode, tagName)
- }
- } else {
- return null
- }
- }
- /**
- * vxe columns 封装成高级查询可识别的选项
- * @param columns
- * @param handler 单独处理方法
- */
- export function vxePackageToSuperQuery(columns, handler) {
- if (Array.isArray(columns)) {
- // 高级查询所需要的参数
- let fieldList = []
- // 遍历列
- for (let i = 0; i < columns.length; i++) {
- let col = columns[i]
- if (col.type === JVXETypes.rowCheckbox ||
- col.type === JVXETypes.rowRadio ||
- col.type === JVXETypes.rowExpand ||
- col.type === JVXETypes.rowNumber
- ) {
- continue
- }
- let field = {
- type: 'string',
- value: col.key,
- text: col.title,
- dictCode: col.dictCode || col.dict,
- }
- if (col.type === JVXETypes.date || col.type === JVXETypes.datetime) {
- field.type = col.type
- field.format = col.format
- }
- if (col.type === JVXETypes.inputNumber) {
- field.type = 'int'
- }
- if (Array.isArray(col.options)) {
- field.options = col.options
- }
- if (typeof handler === 'function') {
- Object.assign(field, handler(col, idx))
- }
- fieldList.push(field)
- }
- return fieldList
- } else {
- console.error('columns必须是一个数组')
- }
- return null
- }
- /**
- * 一次性验证主表单和所有的次表单
- * @param form 主表单 form 对象
- * @param cases 接收一个数组,每项都是一个JVxeTable实例
- * @param autoJumpTab
- * @returns {Promise<any>}
- * @author sunjianlei
- */
- export async function validateFormAndTables(form, cases, autoJumpTab) {
- if (!(form && typeof form.validateFields === 'function')) {
- throw `form 参数需要的是一个form对象,而传入的却是${typeof form}`
- }
- let dataMap = {}
- let values = await new Promise((resolve, reject) => {
- // 验证主表表单
- form.validateFields((err, values) => {
- err ? reject({error: VALIDATE_FAILED, originError: err}) : resolve(values)
- })
- })
- Object.assign(dataMap, {formValue: values})
- // 验证所有子表的表单
- let subData = await validateTables(cases, autoJumpTab)
- // 合并最终数据
- dataMap = Object.assign(dataMap, {tablesValue: subData})
- return dataMap
- }
- /**
- * 一次性验证主表单和所有的次表单
- * @param form 主表单 form 对象
- * @param cases 接收一个数组,每项都是一个JVxeTable实例
- * @param autoJumpTab
- * @returns {Promise<any>}
- * @author sunjianlei
- */
- export async function validateFormModelAndTables(form,formData, cases, autoJumpTab) {
- if (!(form && typeof form.validate === 'function')) {
- throw `form 参数需要的是一个form对象,而传入的却是${typeof form}`
- }
- let dataMap = {}
- let values = await new Promise((resolve, reject) => {
- // 验证主表表单
- form.validate((valid,obj) => {
- valid ?resolve(formData): reject({error: VALIDATE_FAILED, originError: valid})
- })
- })
- Object.assign(dataMap, {formValue: values})
- // 验证所有子表的表单
- let subData = await validateTables(cases, autoJumpTab)
- // 合并最终数据
- dataMap = Object.assign(dataMap, {tablesValue: subData})
- return dataMap
- }
- /**
- * 验证并获取一个或多个表格的所有值
- *
- * @param cases 接收一个数组,每项都是一个JVxeTable实例
- * @param autoJumpTab 校验失败后,是否自动跳转tab选项
- */
- export function validateTables(cases, autoJumpTab = true) {
- if (!Array.isArray(cases)) {
- throw `'validateTables'函数的'cases'参数需要的是一个数组,而传入的却是${typeof cases}`
- }
- return new Promise((resolve, reject) => {
- let tablesData = []
- let index = 0
- if (!cases || cases.length === 0) {
- resolve()
- }
- (function next() {
- let vm = cases[index]
- vm.validateTable().then(errMap => {
- // 校验通过
- if (!errMap) {
- tablesData[index] = vm.getAll()
- // 判断校验是否全部完成,完成返回成功,否则继续进行下一步校验
- if (++index === cases.length) {
- resolve(tablesData)
- } else (
- next()
- )
- } else {
- // 尝试获取tabKey,如果在ATab组件内即可获取
- let paneKey
- let tabPane = getVmParentByName(vm, 'ATabPane')
- if (tabPane) {
- paneKey = tabPane.$vnode.key
- // 自动跳转到该表格
- if (autoJumpTab) {
- let tabs = getVmParentByName(tabPane, 'Tabs')
- tabs && tabs.setActiveKey && tabs.setActiveKey(paneKey)
- }
- }
- // 出现未验证通过的表单,不再进行下一步校验,直接返回失败
- reject({error: VALIDATE_FAILED, index, paneKey, errMap})
- }
- })
- })()
- })
- }
|