vxe-pc-ui
Version:
A vue based PC component library
340 lines (339 loc) • 16.3 kB
JavaScript
import { h } from 'vue';
import { getIcon, getI18n, formats, renderer, renderEmptyElement } from '../../ui';
import { eqEmptyValue, getFuncText, isEnableConf } from '../../ui/src/utils';
import { toCssUnit } from '../../ui/src/dom';
import { getSlotVNs } from '../../ui/src/vn';
import { isActiveItem } from './util';
import VxeTooltipComponent from '../../tooltip/src/tooltip';
import VxeIconComponent from '../../icon/src/icon';
import XEUtils from 'xe-utils';
function renderPrefixIcon(titlePrefix) {
return h('span', {
class: 'vxe-form--item-title-tip-prefix'
}, [
h(VxeIconComponent, {
class: titlePrefix.icon || getIcon().FORM_PREFIX,
status: titlePrefix.iconStatus
})
]);
}
function renderSuffixIcon(titleSuffix) {
return h('span', {
class: 'vxe-form--item-title-tip-suffix'
}, [
h(VxeIconComponent, {
class: titleSuffix.icon || getIcon().FORM_SUFFIX,
status: titleSuffix.iconStatus
})
]);
}
export function getItemClass($xeForm, item, isGroup) {
const formProps = $xeForm.props;
const formReactData = $xeForm.reactData;
const $xeGrid = $xeForm.xeGrid;
const { computeSize, computeValidOpts } = $xeForm.getComputeMaps();
const { data, rules, readonly, disabled, span: allSpan, titleBackground: allTitleBackground, titleBold: allTitleBold, titleColon: allTitleColon, titleAsterisk: allTitleAsterisk, vertical: allVertical, padding: allPadding } = formProps;
const { collapseAll } = formReactData;
const { folding, field, itemRender, showError, className, vertical, padding, children, showContent } = item;
const vSize = computeSize.value;
const validOpts = computeValidOpts.value;
const { showErrorMessage, showMessage, showErrorBackground, showErrorIcon } = validOpts;
const compConf = isEnableConf(itemRender) ? renderer.get(itemRender.name) : null;
const itemClassName = compConf ? (compConf.formItemClassName || compConf.itemClassName) : '';
const span = item.span || allSpan;
const itemPadding = XEUtils.eqNull(padding) ? allPadding : padding;
const itemVertical = XEUtils.eqNull(vertical) ? allVertical : vertical;
const titleBackground = XEUtils.eqNull(item.titleBackground) ? allTitleBackground : item.titleBackground;
const titleBold = XEUtils.eqNull(item.titleBold) ? allTitleBold : item.titleBold;
const titleColon = XEUtils.eqNull(item.titleColon) ? allTitleColon : item.titleColon;
const titleAsterisk = XEUtils.eqNull(item.titleAsterisk) ? allTitleAsterisk : item.titleAsterisk;
const params = { data, disabled, readonly, field, property: field, item, $form: $xeForm, $grid: $xeGrid };
const hasGroup = children && children.length > 0;
let isRequired = false;
let isValid = false;
if (!readonly && rules) {
const itemRules = rules[field];
if (itemRules && itemRules.length) {
isValid = true;
isRequired = itemRules.some((rule) => rule.required);
}
}
const showErrMsg = XEUtils.isBoolean(showErrorMessage) ? showErrorMessage : showMessage;
return [
isGroup || hasGroup ? 'vxe-form--group' : '',
'vxe-form--item',
item.id,
span ? `vxe-form--item-col_${span} is--span` : '',
`${showErrMsg ? 'show' : 'hide'}--err-msg`,
className ? (XEUtils.isFunction(className) ? className(params) : className) : '',
itemClassName ? (XEUtils.isFunction(itemClassName) ? itemClassName(params) : itemClassName) : '',
{
[`size--${vSize}`]: vSize,
'is--colon': titleColon,
'is--tbg': titleBackground,
'is--bold': titleBold,
'is--padding': itemPadding,
'is--vertical': itemVertical,
'is--asterisk': titleAsterisk,
'hide--content': showContent === false,
'is--valid': isValid,
'is--required': isRequired,
'is--hidden': folding && collapseAll,
'is--active': isActiveItem($xeForm, item),
'err--icon': showErrorIcon,
'err--bg': showErrorBackground,
'is--error': showError
}
];
}
export function getItemContentClass($xeForm, item, isGroup) {
const formProps = $xeForm.props;
const $xeGrid = $xeForm.xeGrid;
const { data, readonly, disabled, align: allAlign, verticalAlign: allVerticalAlign } = formProps;
const { field, itemRender, contentClassName, children } = item;
const hasGroup = children && children.length > 0;
const compConf = isEnableConf(itemRender) ? renderer.get(itemRender.name) : null;
const itemContentClassName = compConf ? (compConf.formItemContentClassName || compConf.itemContentClassName) : '';
const align = hasGroup ? item.align : (XEUtils.eqNull(item.align) ? allAlign : item.align);
const verticalAlign = hasGroup ? item.verticalAlign : (XEUtils.eqNull(item.verticalAlign) ? allVerticalAlign : item.verticalAlign);
const params = { data, disabled, readonly, field, property: field, item, $form: $xeForm, $grid: $xeGrid };
return [
isGroup || hasGroup ? 'vxe-form--group-content vxe-form--item-row' : '',
'vxe-form--item-content',
align ? `align--${align}` : '',
verticalAlign ? `vertical-align--${verticalAlign}` : '',
itemContentClassName ? (XEUtils.isFunction(itemContentClassName) ? itemContentClassName(params) : itemContentClassName) : '',
contentClassName ? (XEUtils.isFunction(contentClassName) ? contentClassName(params) : contentClassName) : ''
];
}
export function renderTitle($xeForm, item, isGroup) {
const formProps = $xeForm.props;
const $xeGrid = $xeForm.xeGrid;
const { data, readonly, disabled, titleAlign: allTitleAlign, titleWidth: allTitleWidth, titleOverflow: allTitleOverflow, vertical: allVertical } = formProps;
const { slots, title, field, itemRender, titleOverflow, vertical, showTitle, titleClassName, titleStyle, titlePrefix, titleSuffix, children, showContent } = item;
const { computeTooltipOpts } = $xeForm.getComputeMaps();
const tooltipOpts = computeTooltipOpts.value;
const compConf = isEnableConf(itemRender) ? renderer.get(itemRender.name) : null;
const itemTitleClassName = compConf ? (compConf.formItemTitleClassName || compConf.itemTitleClassName) : '';
const itemTitleStyle = compConf ? (compConf.formItemTitleStyle || compConf.itemTitleStyle) : null;
const itemVertical = XEUtils.eqNull(vertical) ? allVertical : vertical;
const titleAlign = XEUtils.eqNull(item.titleAlign) ? allTitleAlign : item.titleAlign;
const titleWidth = itemVertical ? null : (XEUtils.eqNull(item.titleWidth) ? allTitleWidth : item.titleWidth);
const itemOverflow = XEUtils.eqNull(titleOverflow) ? allTitleOverflow : titleOverflow;
const ovEllipsis = itemOverflow === 'ellipsis';
const ovTitle = itemOverflow === 'title';
const ovTooltip = itemOverflow === true || itemOverflow === 'tooltip';
const hasEllipsis = ovTitle || ovTooltip || ovEllipsis;
const params = { data, disabled, readonly, field, property: field, item, $form: $xeForm, $grid: $xeGrid };
const titleSlot = slots ? slots.title : null;
const prefixSlot = slots ? slots.prefix : null;
const suffixSlot = slots ? slots.suffix || slots.extra : null;
const isTitle = (showTitle !== false) && (title || titleSlot);
const hasGroup = children && children.length > 0;
const titVNs = [];
if (prefixSlot) {
titVNs.push(h('span', {
key: 'pt',
class: 'vxe-form--item-title-prefix'
}, $xeForm.callSlot(prefixSlot, params)));
}
if (titlePrefix) {
titVNs.push((titlePrefix.content || titlePrefix.message)
? h(VxeTooltipComponent, Object.assign(Object.assign(Object.assign({ key: 'pm' }, tooltipOpts), titlePrefix), { content: getFuncText(titlePrefix.content || titlePrefix.message) }), {
default: () => renderPrefixIcon(titlePrefix)
})
: renderPrefixIcon(titlePrefix));
}
const rftTitle = compConf ? (compConf.renderFormItemTitle || compConf.renderItemTitle) : null;
titVNs.push(h('span', {
key: 'pl',
class: 'vxe-form--item-title-label'
}, titleSlot ? $xeForm.callSlot(titleSlot, params) : (rftTitle ? getSlotVNs(rftTitle(itemRender, params)) : getFuncText(item.title))));
const fixVNs = [];
if (titleSuffix) {
fixVNs.push((titleSuffix.content || titleSuffix.message)
? h(VxeTooltipComponent, Object.assign(Object.assign(Object.assign({ key: 'sm' }, tooltipOpts), titleSuffix), { content: getFuncText(titleSuffix.content || titleSuffix.message) }), {
default: () => renderSuffixIcon(titleSuffix)
})
: renderSuffixIcon(titleSuffix));
}
if (suffixSlot) {
fixVNs.push(h('span', {
key: 'st',
class: 'vxe-form--item-title-suffix'
}, $xeForm.callSlot(suffixSlot, params)));
}
const ons = ovTooltip
? {
onMouseenter(evnt) {
$xeForm.triggerTitleTipEvent(evnt, params);
},
onMouseleave: $xeForm.handleTitleTipLeaveEvent
}
: {};
const itStyle = Object.assign({}, XEUtils.isFunction(itemTitleStyle) ? itemTitleStyle(params) : itemTitleStyle, XEUtils.isFunction(titleStyle) ? titleStyle(params) : titleStyle);
if (titleWidth && titleWidth !== 'auto' && showContent !== false) {
itStyle.width = toCssUnit(titleWidth);
}
return isTitle
? h('div', Object.assign({ class: [
isGroup || hasGroup ? 'vxe-form--group-title' : '',
'vxe-form--item-title',
titleAlign ? `align--${titleAlign}` : '',
hasEllipsis ? 'is--ellipsis' : '',
itemTitleClassName ? (XEUtils.isFunction(itemTitleClassName) ? itemTitleClassName(params) : itemTitleClassName) : '',
titleClassName ? (XEUtils.isFunction(titleClassName) ? titleClassName(params) : titleClassName) : ''
], style: itStyle, itemid: item.id, title: ovTitle ? getFuncText(title) : null }, ons), [
h('div', {
class: 'vxe-form--item-title-content'
}, titVNs),
h('div', {
class: 'vxe-form--item-title-postfix'
}, fixVNs)
])
: renderEmptyElement($xeForm);
}
export function renderItemErrorIcon($xeForm, item) {
const { computeValidOpts } = $xeForm.getComputeMaps();
const validOpts = computeValidOpts.value;
const { showErrorIcon, errorIcon } = validOpts;
const { errRule, showIconMsg } = item;
if (!showErrorIcon) {
return renderEmptyElement($xeForm);
}
return h('div', {
key: 'emi',
class: ['vxe-form-item--valid-error-icon-wrapper', {
'is--show': showIconMsg,
'is--hide': !showIconMsg
}]
}, [
h('span', {
class: 'vxe-form-item--valid-error-icon-btn',
onClick(evnt) {
$xeForm.handleValidIconEvent(evnt, { item });
}
}, [
h('i', {
class: errorIcon || getIcon().FORM_VALID_ERROR_ICON
})
]),
h('div', {
class: 'vxe-form-item--valid-error-icon-msg-tip'
}, errRule
? [
h('div', {
class: `vxe-form-item--valid-error-icon-msg vxe-form-item--valid-error-icon-theme-${validOpts.theme || 'normal'}`
}, errRule.content || errRule.message)
]
: [])
]);
}
export function renderItemContent($xeForm, item) {
const formProps = $xeForm.props;
const formReactData = $xeForm.reactData;
const formInternalData = $xeForm.internalData;
const $xeGrid = $xeForm.xeGrid;
const { computeCollapseOpts, computeValidOpts } = $xeForm.getComputeMaps();
const { itemFormatCache } = formInternalData;
const { data, readonly, disabled } = formProps;
const { collapseAll } = formReactData;
const { slots, field, itemRender, collapseNode, errRule, formatter } = item;
const defaultSlot = slots ? slots.default : null;
const validSlot = slots ? slots.valid : null;
const collapseOpts = computeCollapseOpts.value;
const validOpts = computeValidOpts.value;
const { showErrorMessage, showMessage } = validOpts;
const compConf = isEnableConf(itemRender) ? renderer.get(itemRender.name) : null;
const itemValue = XEUtils.get(data, field);
const params = { data, disabled, readonly, field, property: field, item, itemValue, $form: $xeForm, $grid: $xeGrid };
let contentVNs = [];
const rftContent = compConf ? (compConf.renderFormItemContent || compConf.renderItemContent) : null;
if (defaultSlot) {
contentVNs = $xeForm.callSlot(defaultSlot, params);
}
else if (rftContent) {
contentVNs = getSlotVNs(rftContent(itemRender, params));
}
else if (field) {
let itemLabel = itemValue;
if (formatter) {
let formatData;
if (field) {
const itemRest = itemFormatCache[field];
if (itemRest) {
formatData = itemRest.formatData;
if (formatData) {
if (formatData.value === itemValue) {
return formatData.label;
}
}
else {
formatData = itemRest.formatData = {};
}
}
else {
itemFormatCache[field] = { field };
}
}
if (XEUtils.isString(formatter)) {
const gFormatOpts = formats.get(formatter);
const fiFormatMethod = gFormatOpts ? gFormatOpts.formItemFormatMethod : null;
itemLabel = fiFormatMethod ? fiFormatMethod(params) : '';
}
else if (XEUtils.isArray(formatter)) {
const gFormatOpts = formats.get(formatter[0]);
const fiFormatMethod = gFormatOpts ? gFormatOpts.formItemFormatMethod : null;
itemLabel = fiFormatMethod ? fiFormatMethod(params, ...formatter.slice(1)) : '';
}
else {
itemLabel = formatter(params);
}
if (formatData) {
formatData.value = itemValue;
formatData.label = itemLabel;
}
}
contentVNs = [eqEmptyValue(itemLabel) ? '' : `${itemLabel}`];
}
if (collapseNode) {
contentVNs.push(h('div', {
class: 'vxe-form--item-trigger-node',
onClick: $xeForm.toggleCollapseEvent
}, [
h('span', {
class: 'vxe-form--item-trigger-text'
}, collapseAll ? (collapseOpts.unfoldButtonText || getI18n('vxe.form.unfolding')) : (collapseOpts.foldButtonText || getI18n('vxe.form.folding'))),
h('i', {
class: ['vxe-form--item-trigger-icon', collapseAll ? (collapseOpts.foldIcon || getIcon().FORM_FOLDING) : (collapseOpts.unfoldIcon || getIcon().FORM_UNFOLDING)]
})
]));
}
if (errRule && (XEUtils.isBoolean(showErrorMessage) ? showErrorMessage : showMessage)) {
const validParams = Object.assign(Object.assign({}, params), { rule: errRule });
contentVNs.push(h('div', {
class: 'vxe-form-item--valid-error-tip',
style: errRule.maxWidth
? {
width: toCssUnit(errRule.maxWidth)
}
: null
}, [
h('div', {
class: `vxe-form-item--valid-error-wrapper vxe-form-item--valid-error-theme-${validOpts.theme || 'normal'}`
}, [
validSlot
? $xeForm.callSlot(validSlot, validParams)
: [
h('span', {
class: 'vxe-form--item--valid-error-msg'
}, errRule.content || errRule.message)
]
])
]));
}
return h('div', {
key: 'ct',
class: 'vxe-form--item-inner'
}, contentVNs);
}