| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611 |
- import { CreateElement } from 'vue'
- import XEUtils from 'xe-utils'
- import { renderer, getComponent } from '../../ui'
- import { getOnName, getModelEvent, getChangeEvent } from '../../ui/src/vn'
- import { errLog } from '../../ui/src/log'
- import type { VxeGlobalRendererHandles } from '../../../types'
- const componentDefaultModelProp = 'value'
- /**
- * 已废弃
- * @deprecated
- */
- function getOldComponentName (name: string | undefined) {
- return `vxe-${`${name || ''}`.replace('$', '')}`
- }
- /**
- * 已废弃
- * @deprecated
- */
- function getOldComponent ({ name }: VxeGlobalRendererHandles.RenderFormItemContentOptions) {
- return getOldComponentName(name)
- }
- function getDefaultComponent ({ name }: VxeGlobalRendererHandles.RenderFormItemContentOptions) {
- return getComponent(name as any) || name
- }
- function getNativeAttrs (renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions) {
- let { name, attrs } = renderOpts
- if (name === 'input') {
- attrs = Object.assign({ type: 'text' }, attrs)
- }
- return attrs
- }
- function getComponentFormItemProps (renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any, value: any, defaultProps?: any) {
- return XEUtils.assign({}, defaultProps, renderOpts.props, { [componentDefaultModelProp]: value })
- }
- /**
- * 原生事件处理
- * @param renderOpts
- * @param params
- * @param modelFunc
- * @param changeFunc
- */
- function getElementOns (renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any, modelFunc?: any, changeFunc?: any) {
- const { events } = renderOpts
- const modelEvent = getModelEvent(renderOpts)
- const changeEvent = getChangeEvent(renderOpts)
- const isSameEvent = changeEvent === modelEvent
- const ons: any = {}
- if (events) {
- XEUtils.objectEach(events, (func, key: any) => {
- ons[getOnName(key)] = function (...args: any[]) {
- func(params, ...args)
- }
- })
- }
- if (modelFunc) {
- ons[getOnName(modelEvent)] = function (targetEvnt: any) {
- modelFunc(targetEvnt)
- if (isSameEvent && changeFunc) {
- changeFunc(targetEvnt)
- }
- if (events && events[modelEvent]) {
- events[modelEvent](params, targetEvnt)
- }
- }
- }
- if (!isSameEvent && changeFunc) {
- ons[getOnName(changeEvent)] = function (...args: any[]) {
- changeFunc(...args)
- if (events && events[changeEvent]) {
- events[changeEvent](params, ...args)
- }
- }
- }
- return ons
- }
- /**
- * 组件事件处理
- * @param renderOpts
- * @param params
- * @param modelFunc
- * @param changeFunc
- */
- function getComponentOns (renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any, eFns?: {
- model: (cellValue: any) => void
- change?: (...args: any[]) => void
- }, eventOns?: Record<string, any>) {
- const { events } = renderOpts
- const { model: modelFunc, change: changeFunc } = eFns || {}
- const modelEvent = getModelEvent(renderOpts)
- const changeEvent = getChangeEvent(renderOpts)
- const ons: any = {}
- XEUtils.objectEach(events, (func, key: any) => {
- ons[getOnName(key)] = function (...args: any[]) {
- if (!XEUtils.isFunction(func)) {
- errLog('vxe.error.errFunc', [`[form] ${func}`])
- }
- func(params, ...args)
- }
- })
- if (modelFunc) {
- ons[getOnName(modelEvent)] = function (targetEvnt: any) {
- modelFunc(targetEvnt)
- if (events && events[modelEvent]) {
- events[modelEvent](params, targetEvnt)
- }
- }
- }
- if (changeFunc) {
- ons[getOnName(changeEvent)] = function (...args: any[]) {
- changeFunc(...args)
- if (events && events[changeEvent]) {
- events[changeEvent](params, ...args)
- }
- }
- }
- return eventOns ? Object.assign(ons, eventOns) : ons
- }
- function getItemOns (renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { $form, data, field } = params
- return getComponentOns(renderOpts, params, {
- model (value: any) {
- // 处理 model 值双向绑定
- XEUtils.set(data, field, value)
- },
- change () {
- // 处理 change 事件相关逻辑
- $form.updateStatus(params)
- }
- })
- }
- function getNativeItemOns (renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { $form, data, field } = params
- return getElementOns(renderOpts, params, (evnt: any) => {
- // 处理 model 值双向绑定
- const itemValue = evnt.target.value
- XEUtils.set(data, field, itemValue)
- }, () => {
- // 处理 change 事件相关逻辑
- $form.updateStatus(params)
- })
- }
- function renderNativeOptgroup (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any, renderOptionsMethods: any) {
- const { optionGroups, optionGroupProps = {} } = renderOpts
- const groupOptions = optionGroupProps.options || 'options'
- const groupLabel = optionGroupProps.label || 'label'
- if (optionGroups) {
- return optionGroups.map((group: any, gIndex: any) => {
- return h('optgroup', {
- key: gIndex,
- attrs: {
- label: group[groupLabel]
- }
- }, renderOptionsMethods(group[groupOptions], renderOpts, params))
- })
- }
- return []
- }
- /**
- * 渲染表单-项
- * 用于渲染原生的标签
- */
- function nativeItemRender (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { data, field } = params
- const { name } = renderOpts
- const attrs = getNativeAttrs(renderOpts)
- const itemValue = XEUtils.get(data, field)
- return [
- h(`${name}`, {
- class: `vxe-default-${name}`,
- attrs,
- domProps: {
- value: attrs && name === 'input' && (attrs.type === 'submit' || attrs.type === 'reset') ? null : itemValue
- },
- on: getNativeItemOns(renderOpts, params)
- })
- ]
- }
- function defaultItemRender (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: VxeGlobalRendererHandles.RenderFormItemContentParams) {
- const { data, field } = params
- const itemValue = XEUtils.get(data, field)
- return [
- h(getDefaultComponent(renderOpts), {
- props: getComponentFormItemProps(renderOpts, params, itemValue),
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- /**
- * 已废弃
- * @deprecated
- */
- function oldItemRender (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { data, field } = params
- const itemValue = XEUtils.get(data, field)
- return [
- h(getOldComponent(renderOpts), {
- props: getComponentFormItemProps(renderOpts, params, itemValue),
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- /**
- * 已废弃
- * @deprecated
- */
- function oldButtonItemRender (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- return [
- h('vxe-button', {
- props: getComponentFormItemProps(renderOpts, params, null),
- on: getComponentOns(renderOpts, params)
- })
- ]
- }
- /**
- * 已废弃
- * @deprecated
- */
- function oldButtonsItemRender (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { children } = renderOpts
- return children ? children.map((childRenderOpts: any) => oldButtonItemRender(h, childRenderOpts, params)[0]) : []
- }
- /**
- * 渲染原生的 select 标签
- */
- function renderNativeFormOptions (h: CreateElement, options: any, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { data, field } = params
- const { optionProps = {} } = renderOpts
- const labelProp = optionProps.label || 'label'
- const valueProp = optionProps.value || 'value'
- const disabledProp = optionProps.disabled || 'disabled'
- const cellValue = XEUtils.get(data, field)
- if (options) {
- return options.map((item: any, oIndex: any) => {
- return h('option', {
- key: oIndex,
- props: {
- value: item[valueProp],
- disabled: item[disabledProp],
- /* eslint-disable eqeqeq */
- selected: item[valueProp] == cellValue
- }
- }, item[labelProp])
- })
- }
- return []
- }
- /**
- * 渲染表单-项
- */
- function defaultFormItemRender (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { data, field } = params
- const itemValue = XEUtils.get(data, field)
- return [
- h(getDefaultComponent(renderOpts), {
- props: getComponentFormItemProps(renderOpts, params, itemValue),
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- function formItemRadioAndCheckboxRender (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { options, optionProps } = renderOpts
- const { data, field } = params
- const itemValue = XEUtils.get(data, field)
- return [
- h(getDefaultComponent(renderOpts), {
- props: {
- options,
- optionProps,
- ...getComponentFormItemProps(renderOpts, params, itemValue)
- },
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- /**
- * 已废弃
- * @deprecated
- */
- function oldFormItemRadioAndCheckboxRender (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { name, options, optionProps = {} } = renderOpts
- const { data, field } = params
- const labelProp = optionProps.label || 'label'
- const valueProp = optionProps.value || 'value'
- const disabledProp = optionProps.disabled || 'disabled'
- const itemValue = XEUtils.get(data, field)
- const compName = getOldComponentName(name)
- // 如果是分组
- if (options) {
- return [
- h(`${compName}-group`, {
- props: getComponentFormItemProps(renderOpts, params, itemValue),
- on: getItemOns(renderOpts, params),
- scopedSlots: {
- default: () => {
- return options.map((item: any, index: any) => {
- return h(compName, {
- key: index,
- props: {
- label: item[valueProp],
- content: item[labelProp],
- disabled: item[disabledProp]
- }
- })
- })
- }
- }
- })
- ]
- }
- return [
- h(compName, {
- props: getComponentFormItemProps(renderOpts, params, itemValue),
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- /**
- * 表单 - 渲染器
- */
- renderer.mixin({
- input: {
- formItemAutoFocus: 'input',
- renderFormItemContent: nativeItemRender
- },
- textarea: {
- formItemAutoFocus: 'textarea',
- renderFormItemContent: nativeItemRender
- },
- select: {
- formItemAutoFocus: 'input',
- renderFormItemContent (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- return [
- h('select', {
- class: 'vxe-default-select',
- attrs: {
- ...getNativeAttrs(renderOpts)
- },
- on: getNativeItemOns(renderOpts, params)
- },
- renderOpts.optionGroups ? renderNativeOptgroup(h, renderOpts, params, renderNativeFormOptions) : renderNativeFormOptions(h, renderOpts.options, renderOpts, params))
- ]
- }
- },
- VxeInput: {
- formItemAutoFocus: 'input',
- renderFormItemContent: defaultItemRender
- },
- VxeNumberInput: {
- formItemAutoFocus: 'input',
- renderFormItemContent: defaultItemRender
- },
- VxePasswordInput: {
- formItemAutoFocus: 'input',
- renderFormItemContent: defaultItemRender
- },
- VxeTextarea: {
- formItemAutoFocus: 'textarea',
- renderFormItemContent: defaultItemRender
- },
- VxeDatePicker: {
- formItemAutoFocus: 'input',
- renderFormItemContent: defaultItemRender
- },
- VxeDateRangePicker: {
- formItemAutoFocus: 'input',
- renderFormItemContent (h, renderOpts, params) {
- const { startField, endField } = renderOpts
- const { $form, data, field } = params
- const itemValue = XEUtils.get(data, field)
- const seProps: Record<string, any> = {}
- const seOs: Record<string, any> = {}
- if (startField && endField) {
- seProps.startValue = XEUtils.get(data, startField)
- seProps.endValue = XEUtils.get(data, endField)
- seOs['update:startValue'] = (value: any) => {
- if (startField) {
- XEUtils.set(data, startField, value)
- }
- }
- seOs['update:endValue'] = (value: any) => {
- if (endField) {
- XEUtils.set(data, endField, value)
- }
- }
- }
- return [
- h(getDefaultComponent(renderOpts), {
- props: getComponentFormItemProps(renderOpts, params, itemValue, seProps),
- on: getComponentOns(renderOpts, params, {
- model (value: any) {
- // 处理 model 值双向绑定
- XEUtils.set(data, field, value)
- },
- change () {
- // 处理 change 事件相关逻辑
- $form.updateStatus(params)
- }
- }, seOs)
- })
- ]
- }
- },
- VxeButton: {
- renderFormItemContent: defaultFormItemRender
- },
- VxeButtonGroup: {
- renderFormItemContent (h: CreateElement, renderOpts, params) {
- const { options } = renderOpts
- const { data, field } = params
- const itemValue = XEUtils.get(data, field)
- return [
- h(getDefaultComponent(renderOpts), {
- props: {
- options,
- ...getComponentFormItemProps(renderOpts, params, itemValue)
- },
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- },
- VxeSelect: {
- formItemAutoFocus: 'input',
- renderFormItemContent (h: CreateElement, renderOpts, params) {
- const { data, field } = params
- const { options, optionProps, optionGroups, optionGroupProps } = renderOpts
- const itemValue = XEUtils.get(data, field)
- return [
- h(getDefaultComponent(renderOpts), {
- props: getComponentFormItemProps(renderOpts, params, itemValue, { options, optionProps, optionGroups, optionGroupProps }),
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- },
- VxeTreeSelect: {
- formItemAutoFocus: 'input',
- renderFormItemContent (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { data, field } = params
- const { options, optionProps } = renderOpts
- const itemValue = XEUtils.get(data, field)
- return [
- h(getDefaultComponent(renderOpts), {
- props: getComponentFormItemProps(renderOpts, params, itemValue, { options, optionProps }),
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- },
- VxeTableSelect: {
- formItemAutoFocus: 'input',
- renderFormItemContent (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { data, field } = params
- const { options, optionProps } = renderOpts
- const itemValue = XEUtils.get(data, field)
- return [
- h(getDefaultComponent(renderOpts), {
- props: getComponentFormItemProps(renderOpts, params, itemValue, { options, optionProps }),
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- },
- VxeColorPicker: {
- formItemAutoFocus: 'input',
- renderFormItemContent (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { data, field } = params
- const { options } = renderOpts
- const itemValue = XEUtils.get(data, field)
- return [
- h(getDefaultComponent(renderOpts), {
- props: getComponentFormItemProps(renderOpts, params, itemValue, { colors: options }),
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- },
- VxeIconPicker: {
- formItemAutoFocus: 'input',
- renderFormItemContent (h: CreateElement, renderOpts: VxeGlobalRendererHandles.RenderFormItemContentOptions, params: any) {
- const { data, field } = params
- const { options } = renderOpts
- const itemValue = XEUtils.get(data, field)
- return [
- h(getDefaultComponent(renderOpts), {
- props: getComponentFormItemProps(renderOpts, params, itemValue, { icons: options }),
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- },
- VxeRadio: {
- renderFormItemContent: defaultFormItemRender
- },
- VxeRadioGroup: {
- renderFormItemContent: formItemRadioAndCheckboxRender
- },
- VxeCheckbox: {
- renderFormItemContent: defaultFormItemRender
- },
- VxeCheckboxGroup: {
- renderFormItemContent: formItemRadioAndCheckboxRender
- },
- VxeSwitch: {
- renderFormItemContent: defaultItemRender
- },
- VxeRate: {
- renderFormItemContent: defaultItemRender
- },
- VxeSlider: {
- renderFormItemContent: defaultItemRender
- },
- VxeImage: {
- renderFormItemContent (h: CreateElement, renderOpts, params) {
- const { data, field } = params
- const { props } = renderOpts
- const itemValue = XEUtils.get(data, field)
- return [
- h(getDefaultComponent(renderOpts), {
- props: {
- ...props,
- src: itemValue
- },
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- },
- VxeImageGroup: {
- renderFormItemContent (h: CreateElement, renderOpts, params) {
- const { data, field } = params
- const { props } = renderOpts
- const itemValue = XEUtils.get(data, field)
- return [
- h(getDefaultComponent(renderOpts), {
- props: {
- ...props,
- urlList: itemValue
- },
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- },
- VxeUpload: {
- renderFormItemContent: defaultItemRender
- },
- // 以下已废弃
- $input: {
- formItemAutoFocus: 'input',
- renderFormItemContent: oldItemRender
- },
- $textarea: {
- formItemAutoFocus: 'textarea',
- renderFormItemContent: oldItemRender
- },
- $button: {
- renderFormItemContent: oldButtonItemRender
- },
- $buttons: {
- renderFormItemContent: oldButtonsItemRender
- },
- $select: {
- formItemAutoFocus: 'input',
- renderFormItemContent (h: CreateElement, renderOpts, params) {
- const { data, field } = params
- const { options, optionProps, optionGroups, optionGroupProps } = renderOpts
- const itemValue = XEUtils.get(data, field)
- return [
- h(getOldComponent(renderOpts), {
- props: getComponentFormItemProps(renderOpts, params, itemValue, { options, optionProps, optionGroups, optionGroupProps }),
- on: getItemOns(renderOpts, params)
- })
- ]
- }
- },
- $radio: {
- renderFormItemContent: oldFormItemRadioAndCheckboxRender
- },
- $checkbox: {
- renderFormItemContent: oldFormItemRadioAndCheckboxRender
- },
- $switch: {
- renderFormItemContent: oldItemRender
- }
- // 以上已废弃
- })
|