@farris/ui-vue
Version:
Farris Vue, a Farris Design based Vue3 component library.
449 lines (448 loc) • 13.7 kB
JavaScript
import { ref as p, computed as s, watch as O, onMounted as E, nextTick as P, createVNode as c, withDirectives as L, vModelText as R, reactive as j, resolveDirective as F, defineComponent as D, Fragment as G } from "vue";
import { useTextBox as H, useClear as K, withInstall as z } from "../common/index.esm.js";
import { useNumber as U, useFormat as W, useSpinner as $, useTextBox as _ } from "../number-spinner/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: "" },
/** 密码模式 */
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 || void 0, default: void 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 },
/**
* 作为内嵌编辑器被创建后默认获得焦点
*/
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: {} }
};
function Z(e, t) {
const l = p(e.groupText), o = s(() => e.showButtonWhenDisabled && (e.readonly || e.disabled)), n = s(() => e.enableClear || !!e.groupText);
return { appendedButtonClass: s(() => ({
"input-group-append": !0,
"append-force-show": o.value
})), appendedContent: l, shouldShowAppendedButton: n };
}
function q(e, t, l, o) {
const { appendedContent: n } = o, f = p(e.enableViewPassword), i = s(() => e.type === "password"), v = '<span class="f-icon f-icon-eye" style="color: rgb(56, 143, 255);"></span>', d = '<span class="f-icon f-icon-eye"></span>', r = p(!1);
O(() => [e.readonly, e.disabled], ([h, x]) => {
i.value && (l.value = h || x ? "password" : l.value, n.value = h || x ? d : n.value);
});
function g() {
return r.value = !r.value, l.value = r.value ? "text" : "password", n.value = r.value ? v : d, !1;
}
function u() {
l.value = i.value ? "password" : "text", n.value = i.value ? f.value ? d : "" : n.value;
}
return u(), { isPassword: i, onClickAppendedButton: g };
}
function J(e, t, l) {
const o = p(), {
onBlurTextBox: n,
onFocusTextBox: f,
onInput: i,
onKeyDown: v,
textBoxValue: d
} = l, r = s(() => e.disabled || e.readonly || !e.editable ? "" : e.placeholder), g = s(() => ({
"form-control": !0,
"f-utils-fill": !0
})), u = s(() => ({
"text-align": e.textAlign
}));
function h(y) {
y.stopPropagation();
}
function x() {
var y, B;
e.selectOnCreated && ((y = o.value) == null || y.select()), e.focusOnCreated && ((B = o.value) == null || B.focus({
preventScroll: !0
}));
}
async function m(y) {
f(y), await P, x();
}
return E(async () => {
await P, x();
}), () => c("input", {
ref: o,
class: g.value,
style: u.value,
type: "text",
value: d.value,
disabled: e.disabled,
readonly: e.readonly || !e.editable,
placeholder: r.value,
onBlur: n,
onChange: h,
onFocus: m,
onInput: i,
onKeydown: v
}, null);
}
function Q(e, t, l) {
const {
canDownward: o,
canUpward: n,
onClickDownButton: f,
onClickUpButton: i
} = l, v = s(() => ({
"input-group-append": !0,
"btn-group": !0,
"btn-group-number": !0
})), d = s(() => ({
btn: !0,
"btn-secondary": !0,
"btn-number-flag": !0
})), r = s(() => ({
cursor: n() ? "pointer" : "not-allowed",
"margin-left": 0
})), g = s(() => ({
cursor: o() ? "pointer" : "not-allowed",
"margin-left": 0
}));
return () => c("div", {
class: v.value
}, [c("button", {
class: d.value,
style: r.value,
onClick: i,
disabled: !n()
}, [c("span", {
class: "f-icon f-icon-arrow-chevron-up number-arrow-chevron",
style: "cursor: inherit"
}, null)]), c("button", {
class: d.value,
style: g.value,
onClick: f,
disabled: !o()
}, [c("span", {
class: "f-icon f-icon-arrow-chevron-down number-arrow-chevron",
style: "cursor: inherit"
}, null)])]);
}
function X(e, t) {
const l = U(e, t), o = W(e, t, l), n = $(e, t, o, l), f = _(e, t, o, l, n), i = Q(e, t, n), {
displayValue: v,
modelValue: d,
getRealValue: r
} = l, g = J(e, t, f), {
format: u
} = o, {
isFocus: h
} = f, x = s(() => !e.disabled && !e.readonly);
return E(() => {
const m = r(e.modelValue);
v.value = u(m);
}), O(() => [e.value], ([m]) => {
const y = r(m);
d.value = y, v.value = u(y);
}), O(() => [e.modelValue], ([m]) => {
m !== d.value && (d.value = m, !h.value && (v.value = u(r(m))));
}), O(() => [e.precision, e.useThousands, e.prefix, e.suffix, e.showZero], () => {
v.value = u(d.value);
}), () => c("div", {
class: "input-group flex-row f-cmp-number-spinner"
}, [g(), x.value && i()]);
}
function ee(e, t, l, o) {
const n = p(), {
inputGroupClass: f,
onBlur: i,
onFocus: v
} = o, {
clearButtonClass: d,
clearButtonStyle: r
} = l, g = s(() => e.maxLength ? e.maxLength : e.modelValue ? e.modelValue.length : 0), u = (b) => {
var C, a;
b.stopPropagation(), t.emit("update:modelValue", (C = b.target) == null ? void 0 : C.value), t.emit("valueChange", (a = b.target) == null ? void 0 : a.value);
}, h = s(() => ({
"form-control": !0,
"h-100": e.autoHeight
})), x = s(() => e.enableClear && !e.readonly && !e.disabled), m = s(() => e.disabled || e.readonly ? "" : e.placeholder), y = s(() => ({
...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 = s(() => {
const b = {
resize: "none",
"padding-right": "15px"
};
return e.rows > 2 ? {
height: "auto",
...b
} : b;
}), w = (b) => {
b.stopPropagation(), n.value.value = "", t.emit("update:modelValue", ""), t.emit("valueChange", "");
};
function T() {
return L(c("textarea", {
class: h.value,
id: e.id,
"onUpdate:modelValue": (b) => e.modelValue = b,
ref: n,
minlength: e.minLength,
maxlength: e.maxLength ? e.maxLength : null,
tabindex: e.tabIndex,
disabled: e.disabled,
readonly: e.readonly,
autocomplete: e.autocomplete,
placeholder: m.value,
autofocus: e.autofocus,
rows: e.rows,
onInput: u,
onFocus: v,
onBlur: i,
style: B.value
}, null), [[R, e.modelValue]]);
}
function S() {
return e.showCount && c("span", {
style: "position: absolute;bottom: 0;right: 5px;z-index:999;font-size:12px"
}, [`${e.modelValue ? e.modelValue.length : 0}/${g.value}`]);
}
function I() {
return x.value && c("span", {
id: "clearIcon",
class: d.value,
style: y.value,
onClick: (b) => w(b)
}, [c("i", {
class: "f-icon modal_close",
style: "font-size:8px;color:#fff"
}, null)]);
}
return {
renderTextarea: T,
renderCount: S,
renderClear: I
};
}
function te(e, t, l, o) {
const n = p(), f = p(e.autocomplete), i = p(e.enableTitle), {
isPassword: v
} = l, d = p(e.minLength), r = p(e.maxLength), g = p(e.tabIndex), {
disabled: u,
displayText: h,
inputType: x,
onBlur: m,
onFocus: y,
onInput: B,
onClick: w,
onKeydown: T,
onKeyup: S,
onMousedown: I,
onMouseup: b,
onTextBoxValueChange: C,
readonly: a,
placeholder: k,
textBoxClass: V,
textBoxTitle: N
} = o;
return E(() => {
var A, M;
e.selectOnCreated && ((A = n.value) == null || A.select()), e.focusOnCreated && ((M = n.value) == null || M.focus({
preventScroll: !0
}));
}), () => c("input", {
ref: n,
name: "input-group-value",
autocomplete: f.value,
class: V.value,
disabled: u == null ? void 0 : u.value,
maxlength: r.value,
minlength: d.value,
placeholder: k.value,
readonly: a == null ? void 0 : a.value,
tabindex: g.value,
title: i.value && !v.value ? N.value : "",
type: x.value,
value: h == null ? void 0 : h.value,
onBlur: m,
onClick: w,
onChange: C,
onFocus: y,
onInput: B,
onKeydown: T,
onKeyup: S,
onMousedown: I,
onMouseup: b
}, null);
}
function ne(e, t) {
const l = s(() => e.useExtendInfo && !!e.extendInfo), o = j({
content: e.extendInfo
});
function n() {
t.emit("updateExtendInfo");
}
return () => l.value && L(c("span", {
class: "input-group-before-tips",
onMouseenter: n
}, [c("i", {
class: "f-icon f-icon-info-circle"
}, null), c("b", {
class: "tips-arrow"
}, null)]), [[F("tooltip"), o]]);
}
function oe(e, t, l, o, n) {
const {
appendedButtonClass: f,
appendedContent: i
} = l, v = s(() => e.showButtonWhenDisabled && (!e.editable || !e.readonly) && !e.disabled), d = s(() => i.value && !t.slots.groupTextTemplate), r = s(() => !!t.slots.groupTextTemplate), {
clearButtonClass: g,
clearButtonStyle: u,
onClearValue: h,
shouldShowClearButton: x
} = o;
function m() {
return c("span", {
id: "clearIcon",
class: g.value,
style: u.value,
onClick: (a) => h(a)
}, [c("i", {
class: "f-icon modal_close"
}, null)]);
}
function y(a) {
t.emit("iconMouseEnter", a);
}
function B(a) {
t.emit("iconMouseLeave", a);
}
function w(a) {
v.value && t.emit("clickHandle", {
originalEvent: a
}), a.stopPropagation();
}
const T = e.type === "password" ? n.onClickAppendedButton : w;
function S() {
return c("span", {
class: "input-group-text",
onMouseenter: (a) => y(a),
onMouseleave: (a) => B(a),
innerHTML: i.value,
onClick: (a) => T(a)
}, null);
}
function I() {
return t.slots.groupTextTemplate && t.slots.groupTextTemplate();
}
function b() {
return d.value ? S : r.value ? I : "";
}
const C = b();
return () => c("div", {
class: f.value
}, [x.value && m(), C && C()]);
}
const le = /* @__PURE__ */ D({
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 l = p(), o = p(e.modelValue), n = p(e.modelValue), f = H(e, t, o, n, l), {
inputGroupClass: i,
inputType: v,
inputGroupStyle: d
} = f, r = Z(e), {
shouldShowAppendedButton: g
} = r, u = K(e, t, f), {
onMouseEnter: h,
onMouseLeave: x
} = u, m = q(e, t, v, r), y = X(e, t), {
renderTextarea: B,
renderCount: w,
renderClear: T
} = ee(e, t, u, f), S = te(e, t, m, f), I = oe(e, t, r, u, m), b = ne(e, t), C = s(() => e.type === "number"), a = s(() => e.type === "textarea");
O(() => [e.value], ([V]) => {
o.value = V, n.value = V;
}), O(() => [e.modelValue], ([V]) => {
o.value = V, n.value = V;
}), E(() => {
e.value && (o.value = e.value, n.value = e.value);
});
const k = () => c("div", {
ref: l,
id: e.id,
class: i.value,
style: d.value,
onMouseenter: h,
onMouseleave: x
}, [C.value ? y() : a.value ? B() : c(G, null, [b(), S()]), !a.value && g.value && I(), a.value && T(), a.value && w()]);
return () => k();
}
}), re = z(le);
export {
le as FInputGroup,
re as default,
Y as inputGroupProps
};