@farris/ui-vue
Version:
Farris Vue, a Farris Design based Vue3 component library.
423 lines (422 loc) • 13.6 kB
JavaScript
import { ref as g, computed as i, watch as w, onMounted as L, createVNode as d, withDirectives as N, vModelText as F, resolveDirective as O, Fragment as R, mergeProps as D, defineComponent as G } from "vue";
import { useTextBox as H, useClear as z, withInstall as K } from "../common/index.esm.js";
import { useNumber as j, useFormat as W, useSpinner as _, useTextBox as $, getSpinnerRender as Z, getNumberTextBoxRender as U } from "../number-spinner/index.esm.js";
import { LocaleService as Y } from "../locale/index.esm.js";
import { useInputExpand as q } from "../common/index.esm.js/text-box/use-input-expand";
const J = {
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 },
/** 是否可扩展 */
expandable: { type: Boolean, default: !1 },
/** 扩展模式 text | button */
expandMode: { type: String, default: "text" },
/** 扩展文本内容 */
expandContent: { type: String, default: "" },
/** 扩展按钮是否禁用 */
expandDisabled: { type: Boolean, default: !1 }
};
function Q(e, n) {
const o = g(e.groupText), l = i(() => e.showButtonWhenDisabled && (e.readonly || e.disabled)), a = i(() => e.type === "password" || e.showType === "password" || e.enableClear || !!e.groupText || l.value);
return { appendedButtonClass: i(() => ({
"input-group-append": !0,
"append-force-show": l.value
})), appendedContent: o, shouldShowAppendedButton: a };
}
function X(e, n, o, l) {
const { appendedContent: a } = l, s = g(e.enableViewPassword), u = i(() => 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>', c = g(!1);
w(() => [e.readonly, e.disabled], ([y, b]) => {
u.value && (o.value = y || b ? "password" : o.value, a.value = e.readonly || e.disabled ? "" : s.value ? m : "");
});
function x() {
return c.value = !c.value, o.value = c.value ? "text" : "password", a.value = c.value ? v : m, !1;
}
function h() {
o.value = u.value ? "password" : o.value, u.value && (a.value = e.readonly || e.disabled ? "" : s.value ? m : "");
}
return h(), { isPassword: u, onClickAppendedButton: x };
}
function ee(e, n) {
const o = j(e, n), l = W(e, n, o), a = _(e, n, l, o), s = $(e, n, l, o, a), u = Z(e, n, a), {
displayValue: v,
modelValue: m,
getRealValue: c
} = o, x = U(e, n, s), {
format: h
} = l, {
isFocus: y
} = s, b = i(() => !e.disabled && !e.readonly);
return L(() => {
const f = c(e.modelValue);
v.value = h(f);
}), w(() => [e.value], ([f]) => {
const C = c(f);
m.value = C, v.value = h(C);
}), w(() => [e.modelValue], ([f]) => {
f !== m.value && (m.value = f, !y.value && (v.value = h(c(f))));
}), w(() => [e.precision, e.useThousands, e.prefix, e.suffix, e.showZero], () => {
v.value = h(m.value);
}), () => d("div", {
class: "input-group flex-row f-cmp-number-spinner",
style: "border:none;"
}, [x(), b.value && u()]);
}
function ne(e) {
return e ? Y.getRealPropertyValue(e, "请输入", "input-group.placeholder") : "";
}
function te(e, n, o, l) {
const a = g(), {
inputGroupClass: s,
onBlur: u,
onFocus: v
} = l, {
clearButtonClass: m,
clearButtonStyle: c
} = o, x = i(() => e.maxLength ? e.maxLength : e.modelValue ? e.modelValue.length : 0), h = (r) => {
var T, t;
r.stopPropagation(), n.emit("update:modelValue", (T = r.target) == null ? void 0 : T.value), n.emit("valueChange", (t = r.target) == null ? void 0 : t.value);
}, y = i(() => ({
"form-control": !0,
"h-100": e.autoHeight
})), b = i(() => e.enableClear && !e.readonly && !e.disabled), f = ne(e.placeholder), C = i(() => e.disabled || e.readonly ? "" : f), B = i(() => ({
...c.value,
position: "absolute",
right: "5px",
top: "50%",
transform: "translateY(-50%)",
"background-color": "rgb(199, 207, 221)",
"border-radius": "100%",
width: "16px",
height: "16px"
})), S = i(() => {
const r = {
resize: "none",
"padding-right": "15px"
};
return e.rows > 2 ? {
height: "auto",
...r
} : r;
}), I = (r) => {
r.stopPropagation(), a.value.value = "", n.emit("update:modelValue", ""), n.emit("valueChange", "");
};
function V() {
return N(d("textarea", {
class: y.value,
id: e.id,
"onUpdate:modelValue": (r) => e.modelValue = r,
ref: a,
minlength: e.minLength,
maxlength: e.maxLength ? e.maxLength : null,
tabindex: e.tabIndex,
disabled: e.disabled,
readonly: e.readonly,
autocomplete: e.autocomplete,
placeholder: C.value,
autofocus: e.autofocus,
rows: e.rows,
onInput: h,
onFocus: v,
onBlur: u,
style: S.value
}, null), [[F, e.modelValue]]);
}
function P() {
return e.showCount && d("span", {
style: "position: absolute;bottom: 0;right: 5px;z-index:999;font-size:12px"
}, [`${e.modelValue ? e.modelValue.length : 0}/${x.value}`]);
}
function E() {
return b.value && d("span", {
id: "clearIcon",
class: m.value,
style: B.value,
onClick: (r) => I(r)
}, [d("i", {
class: "f-icon modal_close",
style: "font-size:8px;color:#fff"
}, null)]);
}
return {
renderTextarea: V,
renderCount: P,
renderClear: E
};
}
function ae(e, n, o, l) {
const a = g(), s = g(e.autocomplete), u = g(e.enableTitle), {
isPassword: v
} = o, m = g(e.minLength), c = g(e.maxLength), x = g(e.tabIndex), {
disabled: h,
displayText: y,
inputType: b,
onBlur: f,
onFocus: C,
onInput: B,
onClick: S,
onKeydown: I,
onKeyup: V,
onMousedown: P,
onMouseup: E,
onTextBoxValueChange: r,
readonly: T,
placeholder: t,
textBoxClass: M,
textBoxTitle: p
} = l;
return L(() => {
var k, A;
e.selectOnCreated && ((k = a.value) == null || k.select()), e.focusOnCreated && ((A = a.value) == null || A.focus({
preventScroll: !0
}));
}), () => d("input", {
id: e.id + "_textbox",
ref: a,
name: "input-group-value",
autocomplete: s.value,
class: M.value,
disabled: h == null ? void 0 : h.value,
maxlength: c.value,
minlength: m.value,
placeholder: t.value,
readonly: T == null ? void 0 : T.value,
tabindex: x.value,
title: u.value && !v.value ? p.value : "",
type: b.value,
value: y == null ? void 0 : y.value,
onBlur: f,
onClick: S,
onChange: r,
onFocus: C,
onInput: B,
onKeydown: I,
onKeyup: V,
onMousedown: P,
onMouseup: E
}, null);
}
function oe(e, n) {
const o = g(e.extendInfo), l = i(() => e.useExtendInfo && !!e.extendInfo), a = i(() => ({
content: o.value
}));
w(() => e.extendInfo, (u) => {
o.value = u;
});
function s() {
n.emit("updateExtendInfo");
}
return () => l.value && N(d("span", {
class: "input-group-before-tips",
onMouseenter: s
}, [d("i", {
class: "f-icon f-icon-info-circle"
}, null), d("b", {
class: "tips-arrow"
}, null)]), [[O("tooltip"), a.value]]);
}
function le(e, n, o, l, a) {
const {
appendedButtonClass: s,
appendedContent: u
} = o, v = i(() => !e.readonly && !e.disabled), m = i(() => u.value && !n.slots.groupTextTemplate), c = i(() => !!n.slots.groupTextTemplate), {
clearButtonClass: x,
clearButtonStyle: h,
onClearValue: y,
shouldShowClearButton: b
} = l, f = g(0);
w(u, (t) => {
f.value++;
});
function C() {
return d("span", {
id: "clearIcon",
class: x.value,
style: h.value,
onClick: (t) => y(t)
}, [d("i", {
class: "f-icon modal_close"
}, null)]);
}
function B(t) {
n.emit("iconMouseEnter", t);
}
function S(t) {
n.emit("iconMouseLeave", t);
}
function I(t) {
v.value && n.emit("clickHandle", {
originalEvent: t
}), t.stopPropagation();
}
const V = e.type === "password" || e.showType === "password" ? a.onClickAppendedButton : I;
function P() {
const t = u.value;
if (!t || !(e.showButtonWhenDisabled || !e.disabled && !e.readonly))
return null;
const p = {
class: "input-group-text",
onMouseenter: B,
onMouseleave: S,
onClick: V
};
if (typeof t == "string")
return d("span", D(p, {
innerHTML: t
}), null);
if (typeof t == "function") {
const k = t();
return d("span", p, [typeof k == "string" ? d("span", {
innerHTML: k
}, null) : k]);
} else
return d("span", p, [t]);
}
function E() {
return n.slots.groupTextTemplate && n.slots.groupTextTemplate();
}
function r() {
return m.value ? P() : c.value ? E() : "";
}
w(() => e.expandDisabled, (t, M) => {
f.value++;
});
const {
renderExpandContent: T
} = q({
...e,
skipReadonlyCheck: !0
}, n);
return () => d(R, null, [d("div", {
class: s.value,
key: "append-button-" + f.value
}, [b.value && C(), r()]), T()]);
}
const ue = /* @__PURE__ */ G({
name: "FInputGroup",
props: J,
emits: ["clear", "change", "blur", "click", "clickHandle", "focus", "input", "keydown", "keyup", "iconMouseEnter", "iconMouseLeave", "update:modelValue", "update:value", "updateExtendInfo", "valueChange", "mousedownEvent", "mouseupEvent", "expandClick"],
setup(e, n) {
const o = g(), l = g(e.modelValue), a = g(e.modelValue), s = H(e, n, l, a, o), {
inputGroupClass: u,
inputType: v,
inputGroupStyle: m,
changeTextBoxValue: c
} = s, x = Q(e), {
shouldShowAppendedButton: h
} = x, y = z(e, n, s), {
onMouseEnter: b,
onMouseLeave: f
} = y, C = X(e, n, v, x), B = ee(e, n), {
renderTextarea: S,
renderCount: I,
renderClear: V
} = te(e, n, y, s), P = ae(e, n, C, s), E = le(e, n, x, y, C), r = oe(e, n), T = i(() => v.value === "number"), t = i(() => v.value === "textarea");
w(() => [e.value], ([p]) => {
l.value = p, a.value = p;
}), w(() => [e.modelValue], ([p]) => {
l.value = p, a.value = p;
}), L(() => {
e.value && (l.value = e.value, a.value = e.value);
}), n.expose({
clear: () => {
c("", !1), a.value = "";
},
setText: (p) => {
c(p, !1), a.value = p;
}
});
const M = () => d("div", {
ref: o,
id: e.id,
class: u.value,
style: m.value,
onMouseenter: b,
onMouseleave: f
}, [T.value ? B() : t.value ? S() : d(R, null, [r(), P()]), !t.value && !T.value && h.value && E(), t.value && V(), t.value && I()]);
return () => M();
}
}), fe = K(ue);
export {
ue as FInputGroup,
fe as default,
J as inputGroupProps
};