UNPKG

vxe-table-demonic

Version:

一个基于 vue 的 PC 端表单/表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、JSON 配置式...

225 lines (224 loc) 11 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import { defineComponent, h, onUnmounted, inject, ref, provide, onMounted, createCommentVNode, reactive } from 'vue'; import XEUtils from 'xe-utils'; import GlobalConfig from '../../v-x-e-table/src/conf'; import { VXETable } from '../../v-x-e-table'; import { getFuncText, isEnableConf } from '../../tools/utils'; import { getSlotVNs } from '../../tools/vn'; import { createItem, watchItem, destroyItem, assemItem, isActivetem } from './util'; import { renderTitle } from './render'; export var formItemProps = { title: String, field: String, span: [String, Number], align: String, titleAlign: { type: String, default: null }, titleWidth: { type: [String, Number], default: null }, titleColon: { type: Boolean, default: null }, titleAsterisk: { type: Boolean, default: null }, showTitle: { type: Boolean, default: true }, vertical: { type: Boolean, default: null }, className: [String, Function], contentClassName: [String, Function], contentStyle: [Object, Function], titleClassName: [String, Function], titleStyle: [Object, Function], titleOverflow: { type: [Boolean, String], default: null }, titlePrefix: Object, titleSuffix: Object, resetValue: { default: null }, visibleMethod: Function, visible: { type: Boolean, default: null }, folding: Boolean, collapseNode: Boolean, itemRender: Object }; export default defineComponent({ name: 'VxeFormItem', props: formItemProps, setup: function (props, _a) { var slots = _a.slots; var refElem = ref(); var $xeform = inject('$xeform', {}); var formGather = inject('$xeformgather', null); var formItem = reactive(createItem($xeform, props)); var xeformitem = { formItem: formItem }; var xeformiteminfo = { itemConfig: formItem }; formItem.slots = slots; provide('$xeformiteminfo', xeformiteminfo); provide('$xeformitem', xeformitem); provide('$xeformgather', null); watchItem(props, formItem); onMounted(function () { assemItem($xeform, refElem.value, formItem, formGather); }); onUnmounted(function () { destroyItem($xeform, formItem); }); var renderItem = function ($xeform, item) { var props = $xeform.props, reactData = $xeform.reactData; var data = props.data, rules = props.rules, allTitleAlign = props.titleAlign, allTitleWidth = props.titleWidth, allTitleColon = props.titleColon, allTitleAsterisk = props.titleAsterisk, allTitleOverflow = props.titleOverflow, allVertical = props.vertical; var collapseAll = reactData.collapseAll; var computeValidOpts = $xeform.getComputeMaps().computeValidOpts; var validOpts = computeValidOpts.value; var slots = item.slots, title = item.title, visible = item.visible, folding = item.folding, field = item.field, collapseNode = item.collapseNode, itemRender = item.itemRender, showError = item.showError, errRule = item.errRule, className = item.className, titleOverflow = item.titleOverflow, vertical = item.vertical, showTitle = item.showTitle, contentClassName = item.contentClassName, contentStyle = item.contentStyle, titleClassName = item.titleClassName, titleStyle = item.titleStyle; var compConf = isEnableConf(itemRender) ? VXETable.renderer.get(itemRender.name) : null; var itemClassName = compConf ? compConf.itemClassName : ''; var itemStyle = compConf ? compConf.itemStyle : null; var itemContentClassName = compConf ? compConf.itemContentClassName : ''; var itemContentStyle = compConf ? compConf.itemContentStyle : null; var itemTitleClassName = compConf ? compConf.itemTitleClassName : ''; var itemTitleStyle = compConf ? compConf.itemTitleStyle : null; var defaultSlot = slots ? slots.default : null; var titleSlot = slots ? slots.title : null; var span = item.span || props.span; var align = item.align || props.align; var titleAlign = XEUtils.eqNull(item.titleAlign) ? allTitleAlign : item.titleAlign; var titleWidth = XEUtils.eqNull(item.titleWidth) ? allTitleWidth : item.titleWidth; var titleColon = XEUtils.eqNull(item.titleColon) ? allTitleColon : item.titleColon; var titleAsterisk = XEUtils.eqNull(item.titleAsterisk) ? allTitleAsterisk : item.titleAsterisk; var itemOverflow = (XEUtils.isUndefined(titleOverflow) || XEUtils.isNull(titleOverflow)) ? allTitleOverflow : titleOverflow; var itemVertical = (XEUtils.isUndefined(vertical) || XEUtils.isNull(vertical)) ? allVertical : vertical; var ovEllipsis = itemOverflow === 'ellipsis'; var ovTitle = itemOverflow === 'title'; var ovTooltip = itemOverflow === true || itemOverflow === 'tooltip'; var hasEllipsis = ovTitle || ovTooltip || ovEllipsis; var params = { data: data, field: field, property: field, item: item, $form: $xeform, $grid: $xeform.xegrid }; var isRequired = false; if (visible === false) { return createCommentVNode(); } if (rules) { var itemRules = rules[field]; if (itemRules) { isRequired = itemRules.some(function (rule) { return rule.required; }); } } var contentVNs = []; if (defaultSlot) { contentVNs = $xeform.callSlot(defaultSlot, params); } else if (compConf && compConf.renderItemContent) { contentVNs = getSlotVNs(compConf.renderItemContent(itemRender, params)); } else if (field) { contentVNs = ["".concat(XEUtils.get(data, field))]; } if (collapseNode) { contentVNs.push(h('div', { class: 'vxe-form--item-trigger-node', onClick: $xeform.toggleCollapseEvent }, [ h('span', { class: 'vxe-form--item-trigger-text' }, collapseAll ? GlobalConfig.i18n('vxe.form.unfolding') : GlobalConfig.i18n('vxe.form.folding')), h('i', { class: ['vxe-form--item-trigger-icon', collapseAll ? GlobalConfig.icon.FORM_FOLDING : GlobalConfig.icon.FORM_UNFOLDING] }) ])); } if (errRule && validOpts.showMessage) { contentVNs.push(h('div', { class: 'vxe-form--item-valid', style: errRule.maxWidth ? { width: "".concat(errRule.maxWidth, "px") } : null }, errRule.message)); } var ons = ovTooltip ? { onMouseenter: function (evnt) { $xeform.triggerTitleTipEvent(evnt, params); }, onMouseleave: $xeform.handleTitleTipLeaveEvent } : {}; return h('div', { ref: refElem, class: [ 'vxe-form--item', item.id, span ? "vxe-col--".concat(span, " is--span") : '', className ? (XEUtils.isFunction(className) ? className(params) : className) : '', itemClassName ? (XEUtils.isFunction(itemClassName) ? itemClassName(params) : itemClassName) : '', { 'is--title': title, 'is--colon': titleColon, 'is--vertical': itemVertical, 'is--asterisk': titleAsterisk, 'is--required': isRequired, 'is--hidden': folding && collapseAll, 'is--active': isActivetem($xeform, item), 'is--error': showError } ], style: XEUtils.isFunction(itemStyle) ? itemStyle(params) : itemStyle }, [ h('div', { class: 'vxe-form--item-inner' }, [ (showTitle !== false) && (title || titleSlot) ? h('div', __assign({ class: [ 'vxe-form--item-title', titleAlign ? "align--".concat(titleAlign) : '', hasEllipsis ? 'is--ellipsis' : '', itemTitleClassName ? (XEUtils.isFunction(itemTitleClassName) ? itemTitleClassName(params) : itemTitleClassName) : '', titleClassName ? (XEUtils.isFunction(titleClassName) ? titleClassName(params) : titleClassName) : '' ], style: Object.assign({}, XEUtils.isFunction(itemTitleStyle) ? itemTitleStyle(params) : itemTitleStyle, XEUtils.isFunction(titleStyle) ? titleStyle(params) : titleStyle, titleWidth ? { width: isNaN(titleWidth) ? titleWidth : "".concat(titleWidth, "px") } : null), title: ovTitle ? getFuncText(title) : null }, ons), renderTitle($xeform, item)) : null, h('div', { class: [ 'vxe-form--item-content', align ? "align--".concat(align) : '', itemContentClassName ? (XEUtils.isFunction(itemContentClassName) ? itemContentClassName(params) : itemContentClassName) : '', contentClassName ? (XEUtils.isFunction(contentClassName) ? contentClassName(params) : contentClassName) : '' ], style: Object.assign({}, XEUtils.isFunction(itemContentStyle) ? itemContentStyle(params) : itemContentStyle, XEUtils.isFunction(contentStyle) ? contentStyle(params) : contentStyle) }, contentVNs) ]) ]); }; var renderVN = function () { var formProps = $xeform ? $xeform.props : null; return formProps && formProps.customLayout ? renderItem($xeform, formItem) : h('div', { ref: refElem }); }; var $xeformitem = { renderVN: renderVN }; return $xeformitem; }, render: function () { return this.renderVN(); } });