vxe-table-demonic
Version:
一个基于 vue 的 PC 端表单/表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、JSON 配置式...
80 lines (69 loc) • 2.81 kB
text/typescript
import { watch } from 'vue'
import { VXETable } from '../../v-x-e-table'
import XEUtils from 'xe-utils'
import { ItemInfo } from './itemInfo'
import { isEnableConf } from '../../tools/utils'
import { VxeFormConstructor, VxeFormDefines } from '../../../types/all'
export interface XEFormItemProvide {
formItem: ItemInfo;
}
export function isFormItem (item: any): item is ItemInfo {
return item instanceof ItemInfo
}
export function createItem ($xeform: VxeFormConstructor, _vm: any) {
return isFormItem(_vm) ? _vm : new ItemInfo($xeform, _vm)
}
export function handleFieldOrItem ($xeform: VxeFormConstructor, fieldOrItem: string | VxeFormDefines.ItemInfo) {
if (fieldOrItem) {
return XEUtils.isString(fieldOrItem) ? $xeform.getItemByField(fieldOrItem) : fieldOrItem
}
return null
}
export function isHiddenItem ($xeform: VxeFormConstructor, formItem: VxeFormDefines.ItemInfo) {
const { reactData } = $xeform
const { collapseAll } = reactData
const { folding, visible } = formItem
return visible === false || (folding && collapseAll)
}
export function isActivetem ($xeform: VxeFormConstructor, formItem: VxeFormDefines.ItemInfo) {
let { visibleMethod, itemRender, visible, field } = formItem
if (visible === false) {
return visible
}
const compConf = isEnableConf(itemRender) ? VXETable.renderer.get(itemRender.name) : null
if (!visibleMethod && compConf && compConf.itemVisibleMethod) {
visibleMethod = compConf.itemVisibleMethod
}
if (!visibleMethod) {
return true
}
const { data } = $xeform.props
return visibleMethod({ data, field, property: field, item: formItem, $form: $xeform, $grid: $xeform.xegrid })
}
export function watchItem (props: any, formItem: ItemInfo) {
Object.keys(props).forEach(name => {
watch(() => props[name], (value: any) => {
formItem.update(name, value)
})
})
}
export function assemItem ($xeform: VxeFormConstructor, el: HTMLDivElement, formItem: ItemInfo, formGather: XEFormItemProvide | null) {
const { reactData } = $xeform
const { staticItems } = reactData
const parentElem = el.parentNode
const parentItem = formGather ? formGather.formItem : null
const parentItems = parentItem ? parentItem.children : staticItems
if (parentElem) {
parentItems.splice(XEUtils.arrayIndexOf(parentElem.children, el), 0, formItem)
reactData.staticItems = staticItems.slice(0)
}
}
export function destroyItem ($xeform: VxeFormConstructor, formItem: ItemInfo) {
const { reactData } = $xeform
const { staticItems } = reactData
const index = XEUtils.findIndexOf(staticItems, item => item.id === formItem.id)
if (index > -1) {
staticItems.splice(index, 1)
}
reactData.staticItems = staticItems.slice(0)
}