vue-admin-core
Version:
A Component Library for Vue 3
483 lines (478 loc) • 16.1 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var vue = require('vue');
var core = require('@formily/core');
var vue$1 = require('@formily/vue');
var iconsVue = require('@element-plus/icons-vue');
require('../../form-layout/index.js');
require('../../__builtins__/index.js');
var elementPlus = require('element-plus');
var ResizeObserver = require('resize-observer-polyfill');
require('../../form-grid/index.js');
var index = require('../../form-layout/src/index.js');
var index$1 = require('../../__builtins__/configs/index.js');
var index$2 = require('../../form-grid/src/index.js');
var style = require('../../__builtins__/shared/style.js');
var resolveComponent = require('../../__builtins__/shared/resolve-component.js');
var utils = require('../../__builtins__/shared/utils.js');
const useOverflow = (containerRef) => {
const overflow = vue.ref(false);
let resizeObserver;
const cleanup = () => {
if (resizeObserver && containerRef.value) {
resizeObserver.unobserve(containerRef.value);
resizeObserver = null;
}
};
const observer = () => {
if (!containerRef.value)
return;
const container = containerRef.value;
const content = container.querySelector("label");
const containerWidth = container.getBoundingClientRect().width;
const contentWidth = (content == null ? void 0 : content.getBoundingClientRect().width) || 0;
if (containerWidth !== 0) {
if (contentWidth > containerWidth) {
overflow.value = true;
} else {
overflow.value = false;
}
}
};
const stopWatch = vue.watch(
() => containerRef.value,
(el) => {
cleanup();
if (el) {
resizeObserver = new ResizeObserver(observer);
resizeObserver.observe(el);
}
},
{ immediate: true, flush: "post" }
);
vue.onBeforeUnmount(() => {
cleanup();
stopWatch();
});
return overflow;
};
const ICON_MAP = {
info: () => vue.h(elementPlus.ElIcon, {}, { default: () => vue.h(iconsVue.InfoFilled, {}, {}) }),
error: () => vue.h(elementPlus.ElIcon, {}, { default: () => vue.h(iconsVue.CircleClose, {}, {}) }),
success: () => vue.h(elementPlus.ElIcon, {}, { default: () => vue.h(iconsVue.CircleCheck, {}, {}) }),
warning: () => vue.h(elementPlus.ElIcon, {}, { default: () => vue.h(iconsVue.Warning, {}, {}) })
};
const FormBaseItem = vue.defineComponent({
name: "FormItem",
inheritAttrs: false,
props: {
className: {},
required: {},
label: {},
colon: {},
layout: {},
tooltip: {},
labelStyle: {},
labelAlign: {},
labelWrap: {},
labelWidth: {},
wrapperWidth: {},
labelCol: {},
wrapperCol: {},
wrapperAlign: {},
wrapperWrap: {},
wrapperStyle: {},
fullness: {},
addonBefore: {},
addonAfter: {},
size: {},
extra: {},
feedbackText: {},
feedbackLayout: {},
tooltipLayout: {},
feedbackStatus: {},
feedbackIcon: {},
hasIcon: {},
asterisk: {},
gridSpan: {},
bordered: { default: true },
inset: { default: false }
},
setup(props, { slots }) {
const active = vue.ref(false);
const deepLayoutRef = index.useFormLayout();
const prefixCls = `${index$1.stylePrefix}-form-item`;
const containerRef = vue.ref();
const overflow = useOverflow(containerRef);
vue.provide(index.FormLayoutShallowContext, vue.ref({}));
return () => {
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
const gridColumn = index$2.useGridColumn(props.gridSpan);
const gridStyles = {};
if (gridColumn) {
gridStyles.gridColumn = gridColumn;
}
const deepLayout = deepLayoutRef.value;
const {
label,
colon = (_a = deepLayout.colon) != null ? _a : true,
layout = (_b = deepLayout.layout) != null ? _b : "horizontal",
// TODO 拿不到 x-decorator-props 属性
tooltip,
labelStyle = {},
labelWrap = (_c = deepLayout.labelWrap) != null ? _c : false,
labelWidth = deepLayout.labelWidth,
wrapperWidth = deepLayout.wrapperWidth,
labelCol = deepLayout.labelCol,
wrapperCol = deepLayout.wrapperCol,
wrapperAlign = (_d = deepLayout.wrapperAlign) != null ? _d : "left",
wrapperWrap = deepLayout.wrapperWrap,
wrapperStyle = {},
fullness = deepLayout.fullness,
addonBefore,
addonAfter,
size = deepLayout.size,
extra,
feedbackText,
feedbackLayout = (_e = deepLayout.feedbackLayout) != null ? _e : "loose",
tooltipLayout = (_f = deepLayout.tooltipLayout) != null ? _f : "icon",
feedbackStatus,
feedbackIcon,
hasIcon,
asterisk,
bordered = deepLayout.bordered,
inset = deepLayout.inset
} = props;
const labelAlign = deepLayout.layout === "vertical" ? (_h = (_g = props.labelAlign) != null ? _g : deepLayout.labelAlign) != null ? _h : "left" : (_j = (_i = props.labelAlign) != null ? _i : deepLayout.labelAlign) != null ? _j : "right";
let enableCol = false;
if (labelWidth || wrapperWidth) {
if (labelWidth) {
labelStyle.width = labelWidth === "auto" ? void 0 : style.getStyleNumber(labelWidth);
labelStyle.maxWidth = labelWidth === "auto" ? void 0 : style.getStyleNumber(labelWidth);
}
if (wrapperWidth) {
wrapperStyle.width = wrapperWidth === "auto" ? void 0 : style.getStyleNumber(wrapperWidth);
wrapperStyle.maxWidth = wrapperWidth === "auto" ? void 0 : style.getStyleNumber(wrapperWidth);
}
} else if (labelCol || wrapperCol) {
enableCol = true;
}
const formatChildren = feedbackLayout === "popover" ? vue.h(
elementPlus.ElPopover,
{
disabled: !feedbackText,
placement: "top",
popperStyle: { width: "auto", maxWidth: "80%" }
},
{
reference: () => vue.h("div", {}, { default: () => {
var _a2;
return (_a2 = slots.default) == null ? void 0 : _a2.call(slots);
} }),
default: () => [
vue.h(
"div",
{
class: {
[`${prefixCls}-${feedbackStatus}-help`]: !!feedbackStatus,
[`${prefixCls}-help`]: true
}
},
{
default: () => [
feedbackStatus && ["error", "success", "warning"].includes(feedbackStatus) ? ICON_MAP[feedbackStatus]() : "",
resolveComponent.resolveComponent(feedbackText)
]
}
)
]
}
) : (_k = slots.default) == null ? void 0 : _k.call(slots);
const renderLabelText = () => {
const labelChildren = vue.h(
"div",
{
class: `${prefixCls}-label-content`,
ref: containerRef
},
{
default: () => [
asterisk && vue.h("span", { class: `${prefixCls}-asterisk` }, { default: () => ["*"] }),
vue.h("label", {}, { default: () => [resolveComponent.resolveComponent(label)] })
]
}
);
const isTextTooltip = tooltip && tooltipLayout === "text";
if (isTextTooltip || overflow.value) {
return vue.h(
elementPlus.ElTooltip,
{
placement: "top"
},
{
default: () => [labelChildren],
content: () => vue.h(
"div",
{},
{
default: () => [
overflow.value && resolveComponent.resolveComponent(label),
isTextTooltip && resolveComponent.resolveComponent(tooltip)
]
}
)
}
);
} else {
return labelChildren;
}
};
const renderTooltipIcon = () => {
if (tooltip && tooltipLayout === "icon") {
return vue.h(
"span",
{
class: `${prefixCls}-label-tooltip`
},
{
default: () => [
vue.h(
elementPlus.ElTooltip,
{
props: {
placement: "top"
}
},
{
default: ICON_MAP.info,
content: () => vue.h(
"div",
{
class: `${prefixCls}-label-tooltip-content`
},
{
default: () => [resolveComponent.resolveComponent(tooltip)]
}
)
}
)
]
}
);
}
};
const renderLabel = label && vue.h(
"div",
{
class: {
[`${prefixCls}-label`]: true,
[`${prefixCls}-label-tooltip`]: tooltip && tooltipLayout === "text" || overflow.value,
[`${prefixCls}-item-col-${labelCol}`]: enableCol && !!labelCol
},
style: labelStyle
},
{
default: () => [
// label content
renderLabelText(),
// label tooltip
renderTooltipIcon(),
// label colon
label && vue.h(
"span",
{
class: `${prefixCls}-colon`
},
{ default: () => [colon ? ":" : ""] }
)
]
}
);
const renderFeedback = !!feedbackText && feedbackLayout !== "popover" && feedbackLayout !== "none" && vue.h(
"div",
{
class: {
[`${prefixCls}-${feedbackStatus}-help`]: !!feedbackStatus,
[`${prefixCls}-help`]: true,
[`${prefixCls}-help-enter`]: true,
[`${prefixCls}-help-enter-active`]: true
}
},
{ default: () => [resolveComponent.resolveComponent(feedbackText)] }
);
const renderExtra = extra && vue.h("div", { class: `${prefixCls}-extra` }, { default: () => [extra] });
const renderContent = vue.h(
"div",
{
class: {
[`${prefixCls}-control`]: true,
[`${prefixCls}-item-col-${wrapperCol}`]: enableCol && !!wrapperCol
}
},
{
default: () => [
vue.h(
"div",
{ class: `${prefixCls}-control-content` },
{
default: () => [
addonBefore && vue.h(
"div",
{ class: `${prefixCls}-addon-before` },
{
default: () => [resolveComponent.resolveComponent(addonBefore)]
}
),
vue.h(
"div",
{
class: {
[`${prefixCls}-control-content-component`]: true,
[`${prefixCls}-control-content-component-has-feedback-icon`]: !!feedbackIcon,
[`${prefixCls}-control-content-component-has-icon`]: !!hasIcon
},
style: wrapperStyle
},
{
default: () => [
formatChildren,
feedbackIcon && vue.h(
"div",
{ class: `${prefixCls}-feedback-icon` },
{
default: () => [
typeof feedbackIcon === "string" ? vue.h("i", { class: feedbackIcon }, {}) : resolveComponent.resolveComponent(feedbackIcon)
]
}
)
]
}
),
addonAfter && vue.h(
"div",
{ class: `${prefixCls}-addon-after` },
{
default: () => [resolveComponent.resolveComponent(addonAfter)]
}
)
]
}
),
renderFeedback,
renderExtra
]
}
);
return vue.h(
"div",
{
style: {
...gridStyles
},
class: {
[`${prefixCls}`]: true,
[`${prefixCls}-layout-${layout}`]: true,
[`${prefixCls}-${feedbackStatus}`]: !!feedbackStatus,
[`${prefixCls}-feedback-has-text`]: !!feedbackText,
[`${prefixCls}-size-${size}`]: !!size,
[`${prefixCls}-feedback-layout-${feedbackLayout}`]: !!feedbackLayout,
[`${prefixCls}-fullness`]: !!fullness || !!inset || !!feedbackIcon,
[`${prefixCls}-inset`]: !!inset,
[`${prefixCls}-active`]: active.value,
[`${prefixCls}-inset-active`]: !!inset && active.value,
[`${prefixCls}-label-align-${labelAlign}`]: true,
[`${prefixCls}-control-align-${wrapperAlign}`]: true,
[`${prefixCls}-label-wrap`]: !!labelWrap,
[`${prefixCls}-control-wrap`]: !!wrapperWrap,
[`${prefixCls}-bordered-none`]: bordered === false || !!inset || !!feedbackIcon,
[`${props.className}`]: !!props.className
},
on: {
"!focus": () => {
if (feedbackIcon || inset) {
active.value = true;
}
},
"!blur": () => {
if (feedbackIcon || inset) {
active.value = false;
}
}
}
},
{
default: () => [renderLabel, renderContent]
}
);
};
}
});
const Item = vue$1.connect(
FormBaseItem,
vue$1.mapProps(
{ validateStatus: true, title: "label", required: true },
(props, field) => {
if (core.isVoidField(field))
return props;
if (!field)
return props;
const takeMessage = () => {
const split = (messages) => {
return messages.reduce((buf, text, index) => {
if (!text)
return buf;
return index < messages.length - 1 ? buf.concat([text, ", "]) : buf.concat([text]);
}, []);
};
if (field.validating)
return;
if (props.feedbackText)
return props.feedbackText;
if (field.selfErrors.length)
return split(field.selfErrors);
if (field.selfWarnings.length)
return split(field.selfWarnings);
if (field.selfSuccesses.length)
return split(field.selfSuccesses);
};
const errorMessages = takeMessage();
return {
feedbackText: Array.isArray(errorMessages) ? errorMessages.join(", ") : errorMessages,
extra: props.extra || field.description
};
},
(props, field) => {
var _a;
if (core.isVoidField(field))
return props;
if (!field)
return props;
return {
feedbackStatus: field.validateStatus === "validating" ? "pending" : Array.isArray(field.decorator) && ((_a = field.decorator[1]) == null ? void 0 : _a.feedbackStatus) || field.validateStatus
};
},
(props, field) => {
if (core.isVoidField(field))
return props;
if (!field)
return props;
let asterisk = false;
if (field.required && field.pattern !== "readPretty") {
asterisk = true;
}
if ("asterisk" in props) {
asterisk = props.asterisk;
}
return {
asterisk
};
}
)
);
const FormItem = utils.composeExport(Item, {
BaseItem: FormBaseItem
});
exports.FormBaseItem = FormBaseItem;
exports.FormItem = FormItem;
exports.default = FormItem;
//# sourceMappingURL=index.js.map