vxe-pc-ui
Version:
A vue based PC component library
117 lines (107 loc) • 4.34 kB
text/typescript
import { ref } from 'vue'
import { renderer } from '@vxe-ui/core'
import { getNewWidgetId } from './util'
import { errLog } from '../../ui/src/log'
import XEUtils from 'xe-utils'
import type { VxeFormPropTypes, VxeFormDesignConstructor, VxeFormDesignDefines, VxeGlobalRendererHandles } from '../../../types'
// 控件原始配置信息,带响应
const refWidgetReactConfigMaps = ref<Record<string, VxeGlobalRendererHandles.CreateFormDesignWidgetConfigObj>>({})
export const getWidgetConfig = (name: string) => {
const widgetReactConfigMaps = refWidgetReactConfigMaps.value
return widgetReactConfigMaps[name] || {}
}
export function getWidgetConfigTitle (name: string, $xeFormDesign: VxeFormDesignConstructor | null) {
const widgetConf = getWidgetConfig(name)
if (widgetConf) {
const configTitle = widgetConf.title
const params = { name, $formDesign: $xeFormDesign }
return XEUtils.toValueString(XEUtils.isFunction(configTitle) ? configTitle(params) : configTitle)
}
return name
}
export function getWidgetConfigCustomGroup (name: string, $xeFormDesign: VxeFormDesignConstructor | null) {
const widgetConf = getWidgetConfig(name)
if (widgetConf) {
const configCustomGroup = widgetConf.customGroup
const params = { name, $formDesign: $xeFormDesign }
return XEUtils.toValueString(XEUtils.isFunction(configCustomGroup) ? configCustomGroup(params) : configCustomGroup)
}
return name
}
const validWidgetUniqueField = (field: string, widgetObjList: VxeFormDesignDefines.WidgetObjItem<any>[]) => {
return !XEUtils.findTree(widgetObjList, item => item.field === field, { children: 'children' })
}
export class FormDesignWidgetInfo {
id = 0
field = ''
title = ''
name = ''
required = false
hidden = false
options: VxeFormPropTypes.Data = {}
children: FormDesignWidgetInfo[] = []
model = {
update: false,
value: ''
}
constructor ($xeFormDesign: VxeFormDesignConstructor | null, name: string, widgetObjList: VxeFormDesignDefines.WidgetObjItem<any>[]) {
let customField = ''
if (name) {
const compConf = renderer.get(name) || {}
if (compConf) {
const widgetReactConfigMaps = refWidgetReactConfigMaps.value
const createWidgetFormConfig = compConf.createFormDesignWidgetConfig
if (createWidgetFormConfig) {
const params = { name, $formDesign: $xeFormDesign }
const widgetConfig = createWidgetFormConfig(params) || {}
const titleConf = widgetConfig.title
const fieldConf = widgetConfig.field
this.title = XEUtils.toValueString(XEUtils.isFunction(titleConf) ? titleConf(params) : titleConf)
this.options = widgetConfig.options || {}
this.children = widgetConfig.children || []
if (fieldConf) {
if (XEUtils.isFunction(fieldConf)) {
customField = fieldConf({ name, $formDesign: $xeFormDesign })
} else {
customField = fieldConf
}
}
if (!widgetReactConfigMaps[name]) {
widgetReactConfigMaps[name] = { ...widgetConfig }
refWidgetReactConfigMaps.value = Object.assign({}, widgetReactConfigMaps)
}
}
}
}
const widgetId = getNewWidgetId(widgetObjList)
if (customField) {
// 如果使用了自定义字段,验证字段名是否唯一
if (!validWidgetUniqueField(customField, widgetObjList)) {
errLog('vxe.error.uniField', [customField])
}
}
this.id = widgetId
this.field = customField || `${name}${widgetId}`
this.name = name
}
}
export function configToWidget (conf: {
name: string
id: number
field: string
title: string
required: boolean
hidden: boolean
options?: any
children?: VxeFormDesignDefines.WidgetObjItem[]
}) {
const widget = new FormDesignWidgetInfo(null, conf.name, [])
widget.id = conf.id
widget.title = conf.title || ''
widget.field = conf.field || ''
widget.required = conf.required || false
widget.hidden = conf.hidden || false
widget.options = Object.assign({}, widget.options, conf.options)
widget.children = conf.children ? conf.children.map(item => configToWidget(item)) : []
return widget
}