@farris/ui-vue
Version:
Farris Vue, a Farris Design based Vue3 component library.
384 lines (383 loc) • 12.6 kB
JavaScript
import { ref as g, computed as c, watch as T, onMounted as M, createVNode as h, withDirectives as L, vModelText as F, resolveDirective as O, Fragment as N, defineComponent as G } from "vue";
import { useTextBox as H, useClear as D, withInstall as z } from "../common/index.esm.js";
import { useNumber as K, useFormat as j, useSpinner as W, useTextBox as _, getSpinnerRender as $, getNumberTextBoxRender as Z } from "../number-spinner/index.esm.js";
import { LocaleService as U } from "../locale/index.esm.js";
const Y = {
id: { Type: String, default: "" },
/** 是否自动完成 */
autocomplete: { Type: String, default: "off" },
/** 自定义CLASS */
customClass: { Type: String, default: "" },
/** 禁用 */
disabled: { Type: Boolean, default: !1 },
/** 允许编辑 */
editable: { Type: Boolean, default: !0 },
/** 启用清除按钮 */
enableClear: { Type: Boolean, default: !0 },
/** 启用提示文本 */
enableTitle: { Type: Boolean, default: !0 },
/** 能否查看密码 */
enableViewPassword: { Type: Boolean, default: !0 },
/** 始终显示占位符文本 */
forcePlaceholder: { Type: Boolean, default: !1 },
/** 扩展按钮 */
groupText: { Type: String, default: "" },
/** 密码模式 */
showType: { Type: String, default: "text" },
/** 密码模式 --废弃*/
type: { Type: String, default: "text" },
/** 最大值 */
max: { type: [Number, String] },
/** 最小值 */
min: { type: [Number, String] },
/** 最大长度 */
maxLength: { Type: Number || void 0, default: void 0 },
/** 最小长度 */
minLength: { Type: Number || void 0, default: void 0 },
/** 组件值 */
modelValue: { Type: String || Boolean, default: "" },
/** 隐藏边线 */
showBorder: { Type: Boolean, default: !0 },
/** 步长 */
step: { Type: Number, default: 1 },
/** 启用提示信息 */
placeholder: { Type: String, default: "" },
precision: { Type: Number, default: 0 },
/** 只读 */
readonly: { Type: Boolean, default: !1 },
/** 当组件禁用或只读时显示后边的按钮 */
showButtonWhenDisabled: { Type: Boolean, default: !1 },
/** tab索引 */
tabIndex: { Type: Number, default: 0 },
/** 文本在输入框中的对齐方式 */
textAlign: { Type: String, default: "left" },
/** 是否启用前置扩展信息;在输入框前面 显示 ① 图标鼠标滑过后显示 */
useExtendInfo: { Type: Boolean, default: !1 },
/** 前置扩展信息 */
extendInfo: { Type: String, default: "" },
/** 输入值 */
value: { Type: String, default: "" },
/** 是否撑开高度 */
autoHeight: { type: Boolean, default: !1 },
/** 自动聚焦 */
autofocus: { type: Boolean, default: !1 },
/** 文本区域可见的行数 */
rows: { type: Number, default: 2 },
/** 展示输入文本数量 */
showCount: { type: Boolean, default: !1 },
showZero: { type: Boolean, default: !1 },
/**
* 作为内嵌编辑器被创建后默认获得焦点
*/
focusOnCreated: { type: Boolean, default: !1 },
/**
* 作为内嵌编辑器被创建后默认选中文本
*/
selectOnCreated: { type: Boolean, default: !1 },
/**
* modelValue 更新时机, 默认 blur; 可选值:blur | input
* - blur: 离开焦点时更新
* - change: 输入时更新
*/
updateOn: { type: String, default: "blur" },
formatValidation: { type: Object, default: {} },
/**
* 是否启用快捷键
*/
keyboard: { type: Boolean, default: !0 }
};
function q(e, t) {
const a = g(e.groupText), l = c(() => e.showButtonWhenDisabled && (e.readonly || e.disabled)), o = c(() => e.type === "password" || e.showType === "password" || e.enableClear || !!e.groupText || l.value);
return { appendedButtonClass: c(() => ({
"input-group-append": !0,
"append-force-show": l.value
})), appendedContent: a, shouldShowAppendedButton: o };
}
function J(e, t, a, l) {
const { appendedContent: o } = l, s = g(e.enableViewPassword), u = c(() => e.type === "password" || e.showType === "password"), v = '<span class="f-icon f-icon-eye" style="color: rgb(56, 143, 255);"></span>', m = '<span class="f-icon f-icon-eye"></span>', r = g(!1);
T(() => [e.readonly, e.disabled], ([y, b]) => {
u.value && (a.value = y || b ? "password" : a.value, o.value = e.readonly || e.disabled ? "" : s.value ? m : "");
});
function x() {
return r.value = !r.value, a.value = r.value ? "text" : "password", o.value = r.value ? v : m, !1;
}
function i() {
a.value = u.value ? "password" : a.value, u.value && (o.value = e.readonly || e.disabled ? "" : s.value ? m : "");
}
return i(), { isPassword: u, onClickAppendedButton: x };
}
function Q(e, t) {
const a = K(e, t), l = j(e, t, a), o = W(e, t, l, a), s = _(e, t, l, a, o), u = $(e, t, o), {
displayValue: v,
modelValue: m,
getRealValue: r
} = a, x = Z(e, t, s), {
format: i
} = l, {
isFocus: y
} = s, b = c(() => !e.disabled && !e.readonly);
return M(() => {
const f = r(e.modelValue);
v.value = i(f);
}), T(() => [e.value], ([f]) => {
const p = r(f);
m.value = p, v.value = i(p);
}), T(() => [e.modelValue], ([f]) => {
f !== m.value && (m.value = f, !y.value && (v.value = i(r(f))));
}), T(() => [e.precision, e.useThousands, e.prefix, e.suffix, e.showZero], () => {
v.value = i(m.value);
}), () => h("div", {
class: "input-group flex-row f-cmp-number-spinner",
style: "border:none;"
}, [x(), b.value && u()]);
}
function X(e) {
return e ? U.getRealPropertyValue(e, "请输入", "input-group.placeholder") : "";
}
function ee(e, t, a, l) {
const o = g(), {
inputGroupClass: s,
onBlur: u,
onFocus: v
} = l, {
clearButtonClass: m,
clearButtonStyle: r
} = a, x = c(() => e.maxLength ? e.maxLength : e.modelValue ? e.modelValue.length : 0), i = (d) => {
var n, E;
d.stopPropagation(), t.emit("update:modelValue", (n = d.target) == null ? void 0 : n.value), t.emit("valueChange", (E = d.target) == null ? void 0 : E.value);
}, y = c(() => ({
"form-control": !0,
"h-100": e.autoHeight
})), b = c(() => e.enableClear && !e.readonly && !e.disabled), f = X(e.placeholder), p = c(() => e.disabled || e.readonly ? "" : f), w = c(() => ({
...r.value,
position: "absolute",
right: "5px",
top: "50%",
transform: "translateY(-50%)",
"background-color": "rgb(199, 207, 221)",
"border-radius": "100%",
width: "16px",
height: "16px"
})), B = c(() => {
const d = {
resize: "none",
"padding-right": "15px"
};
return e.rows > 2 ? {
height: "auto",
...d
} : d;
}), C = (d) => {
d.stopPropagation(), o.value.value = "", t.emit("update:modelValue", ""), t.emit("valueChange", "");
};
function S() {
return L(h("textarea", {
class: y.value,
id: e.id,
"onUpdate:modelValue": (d) => e.modelValue = d,
ref: o,
minlength: e.minLength,
maxlength: e.maxLength ? e.maxLength : null,
tabindex: e.tabIndex,
disabled: e.disabled,
readonly: e.readonly,
autocomplete: e.autocomplete,
placeholder: p.value,
autofocus: e.autofocus,
rows: e.rows,
onInput: i,
onFocus: v,
onBlur: u,
style: B.value
}, null), [[F, e.modelValue]]);
}
function I() {
return e.showCount && h("span", {
style: "position: absolute;bottom: 0;right: 5px;z-index:999;font-size:12px"
}, [`${e.modelValue ? e.modelValue.length : 0}/${x.value}`]);
}
function V() {
return b.value && h("span", {
id: "clearIcon",
class: m.value,
style: w.value,
onClick: (d) => C(d)
}, [h("i", {
class: "f-icon modal_close",
style: "font-size:8px;color:#fff"
}, null)]);
}
return {
renderTextarea: S,
renderCount: I,
renderClear: V
};
}
function te(e, t, a, l) {
const o = g(), s = g(e.autocomplete), u = g(e.enableTitle), {
isPassword: v
} = a, m = g(e.minLength), r = g(e.maxLength), x = g(e.tabIndex), {
disabled: i,
displayText: y,
inputType: b,
onBlur: f,
onFocus: p,
onInput: w,
onClick: B,
onKeydown: C,
onKeyup: S,
onMousedown: I,
onMouseup: V,
onTextBoxValueChange: d,
readonly: n,
placeholder: E,
textBoxClass: P,
textBoxTitle: R
} = l;
return M(() => {
var k, A;
e.selectOnCreated && ((k = o.value) == null || k.select()), e.focusOnCreated && ((A = o.value) == null || A.focus({
preventScroll: !0
}));
}), () => h("input", {
id: e.id + "_textbox",
ref: o,
name: "input-group-value",
autocomplete: s.value,
class: P.value,
disabled: i == null ? void 0 : i.value,
maxlength: r.value,
minlength: m.value,
placeholder: E.value,
readonly: n == null ? void 0 : n.value,
tabindex: x.value,
title: u.value && !v.value ? R.value : "",
type: b.value,
value: y == null ? void 0 : y.value,
onBlur: f,
onClick: B,
onChange: d,
onFocus: p,
onInput: w,
onKeydown: C,
onKeyup: S,
onMousedown: I,
onMouseup: V
}, null);
}
function ne(e, t) {
const a = g(e.extendInfo), l = c(() => e.useExtendInfo && !!e.extendInfo), o = c(() => ({
content: a.value
}));
T(() => e.extendInfo, (u) => {
a.value = u;
});
function s() {
t.emit("updateExtendInfo");
}
return () => l.value && L(h("span", {
class: "input-group-before-tips",
onMouseenter: s
}, [h("i", {
class: "f-icon f-icon-info-circle"
}, null), h("b", {
class: "tips-arrow"
}, null)]), [[O("tooltip"), o.value]]);
}
function ae(e, t, a, l, o) {
const {
appendedButtonClass: s,
appendedContent: u
} = a, v = c(() => !e.readonly && !e.disabled), m = c(() => u.value && !t.slots.groupTextTemplate), r = c(() => !!t.slots.groupTextTemplate), {
clearButtonClass: x,
clearButtonStyle: i,
onClearValue: y,
shouldShowClearButton: b
} = l, f = g(0);
T(u, (n) => {
f.value++;
});
function p() {
return h("span", {
id: "clearIcon",
class: x.value,
style: i.value,
onClick: (n) => y(n)
}, [h("i", {
class: "f-icon modal_close"
}, null)]);
}
function w(n) {
t.emit("iconMouseEnter", n);
}
function B(n) {
t.emit("iconMouseLeave", n);
}
function C(n) {
v.value && t.emit("clickHandle", {
originalEvent: n
}), n.stopPropagation();
}
const S = e.type === "password" || e.showType === "password" ? o.onClickAppendedButton : C;
function I() {
return h(N, null, [(e.showButtonWhenDisabled || !e.disabled && !e.readonly) && h("span", {
class: "input-group-text",
onMouseenter: (n) => w(n),
onMouseleave: (n) => B(n),
innerHTML: u.value,
onClick: (n) => S(n)
}, null)]);
}
function V() {
return t.slots.groupTextTemplate && t.slots.groupTextTemplate();
}
function d() {
return m.value ? I() : r.value ? V() : "";
}
return () => h("div", {
class: s.value,
key: "append-button-" + f.value
}, [b.value && p(), d()]);
}
const oe = /* @__PURE__ */ G({
name: "FInputGroup",
props: Y,
emits: ["clear", "change", "blur", "click", "clickHandle", "focus", "input", "keydown", "keyup", "iconMouseEnter", "iconMouseLeave", "update:modelValue", "update:value", "updateExtendInfo", "valueChange", "mousedownEvent", "mouseupEvent"],
setup(e, t) {
const a = g(), l = g(e.modelValue), o = g(e.modelValue), s = H(e, t, l, o, a), {
inputGroupClass: u,
inputType: v,
inputGroupStyle: m
} = s, r = q(e), {
shouldShowAppendedButton: x
} = r, i = D(e, t, s), {
onMouseEnter: y,
onMouseLeave: b
} = i, f = J(e, t, v, r), p = Q(e, t), {
renderTextarea: w,
renderCount: B,
renderClear: C
} = ee(e, t, i, s), S = te(e, t, f, s), I = ae(e, t, r, i, f), V = ne(e, t), d = c(() => v.value === "number"), n = c(() => v.value === "textarea");
T(() => [e.value], ([P]) => {
l.value = P, o.value = P;
}), T(() => [e.modelValue], ([P]) => {
l.value = P, o.value = P;
}), M(() => {
e.value && (l.value = e.value, o.value = e.value);
});
const E = () => h("div", {
ref: a,
id: e.id,
class: u.value,
style: m.value,
onMouseenter: y,
onMouseleave: b
}, [d.value ? p() : n.value ? w() : h(N, null, [V(), S()]), !n.value && !d.value && x.value && I(), n.value && C(), n.value && B()]);
return () => E();
}
}), re = z(oe);
export {
oe as FInputGroup,
re as default,
Y as inputGroupProps
};