UNPKG

@opensig/opendesign

Version:

260 lines (259 loc) 10.1 kB
import { defineComponent, useSlots, toRefs, ref, watchEffect, computed, createElementBlock, openBlock, normalizeClass, unref, createCommentVNode, createElementVNode, withModifiers, renderSlot, createVNode, createBlock, toDisplayString } from "vue"; import { inInputProps } from "./types.mjs"; import { IconClose, IconEyeOn, IconEyeOff } from "../../_utils/icons.mjs"; import { useInput } from "../../_headless/use-input.mjs"; import { useInputPassword } from "../../_headless/use-input-password.mjs"; import { useI18n } from "../../locale/index.mjs"; import { isUndefined } from "../../_utils/is.mjs"; import "../../hooks/use-theme.mjs"; import { useScreen } from "../../hooks/use-screen.mjs"; import "@vueuse/core"; const _hoisted_1 = ["for"]; const _hoisted_2 = ["date-value"]; const _hoisted_3 = ["id", "value", "type", "placeholder", "readonly", "disabled"]; const _hoisted_4 = { key: 0, class: "o_input-suffix-icon" }; const _hoisted_5 = ["innerHTML"]; const _hoisted_6 = { key: 1 }; const _hoisted_7 = { key: 4 }; const _sfc_main = /* @__PURE__ */ defineComponent({ __name: "InInput", props: inInputProps, emits: ["update:modelValue", "change", "input", "focus", "blur", "clear", "pressEnter"], setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const slots = useSlots(); const emits = __emit; const { t } = useI18n(); const { isPhonePad } = useScreen(); const { disabled, type, modelValue, inputOnOutlimit, maxLength, minLength, showLength, onlyNumericInput } = toRefs(props); const { displayValue, clearValue: clear, isValid, inputValueLength, isShowLength, isOutLengthLimit, handleBlur, handleInput, handleFocus, handlePressEnter, handleClear, inputEl, isFocus } = useInput({ emits, maxLength, minLength, showLength, inputOnOutlimit, modelValue, defaultValue: props.defaultValue ?? "", emitUpdate: (value) => { emits("update:modelValue", value); }, format: props.format, validate: props.validate, valueOnInvalidChange: props.valueOnInvalidChange, calculateLength: props.getLength, onlyNumericInput }); const { showPassword, onEyeMouseDown, onEyeClick } = useInputPassword({ type, disabled, showPasswordEvent: props.showPasswordEvent }); const inputType = ref(props.type); const togglePassword = (visible) => { if (isUndefined(visible)) { if (inputType.value === "text") { inputType.value = "password"; } else { inputType.value = "text"; } } else { inputType.value = visible ? "text" : "password"; } }; watchEffect(() => { togglePassword(showPassword.value); }); const isClearable = computed(() => props.clearable && !props.disabled && !props.readonly); const focus = () => { var _a; (_a = inputEl.value) == null ? void 0 : _a.focus(); }; const blur = () => { var _a; (_a = inputEl.value) == null ? void 0 : _a.blur(); }; const autoWidth = computed(() => props.autoWidth); const mirrorValue = computed(() => { if (props.type === "password") { return displayValue.value.replace(/./g, props.passwordPlaceholder); } return displayValue.value; }); __expose({ inputEl, focus, blur, clear, togglePassword }); return (_ctx, _cache) => { var _a, _b, _c, _d, _e; return openBlock(), createElementBlock("label", { class: normalizeClass(["o_input", { "o_input-clearable": isClearable.value && unref(displayValue) !== "", "o_input-clearable-focus": isClearable.value && unref(displayValue) !== "" && unref(isFocus), "o_input-disabled": props.disabled, "o_input-readonly": props.readonly, "o_input-password": props.type === "password", "o_input-invalid": !unref(isValid), "o_input-auto-width": autoWidth.value }]), for: props.inputId }, [ ((_a = slots.prefix) == null ? void 0 : _a.call(slots)) ? (openBlock(), createElementBlock( "div", { key: 0, class: "o_input-prefix", onMousedown: _cache[0] || (_cache[0] = withModifiers(() => { }, ["prevent"])) }, [ renderSlot(_ctx.$slots, "prefix") ], 32 /* NEED_HYDRATION */ )) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(["o_input-wrap", { "o_input-wrap-auto-width": autoWidth.value }]), "date-value": mirrorValue.value }, [ createElementVNode("input", { id: props.inputId, ref_key: "inputEl", ref: inputEl, class: "o_input-input", value: unref(displayValue), type: inputType.value, placeholder: props.placeholder, readonly: props.readonly || unref(isPhonePad) && props.noKeyboard, disabled: props.disabled, onFocus: _cache[1] || (_cache[1] = //@ts-ignore (...args) => unref(handleFocus) && unref(handleFocus)(...args)), onBlur: _cache[2] || (_cache[2] = //@ts-ignore (...args) => unref(handleBlur) && unref(handleBlur)(...args)), onInput: _cache[3] || (_cache[3] = //@ts-ignore (...args) => unref(handleInput) && unref(handleInput)(...args)), onKeydown: _cache[4] || (_cache[4] = //@ts-ignore (...args) => unref(handlePressEnter) && unref(handlePressEnter)(...args)) }, null, 40, _hoisted_3) ], 10, _hoisted_2), ((_b = slots.suffix) == null ? void 0 : _b.call(slots)) || ((_c = slots.extra) == null ? void 0 : _c.call(slots)) || isClearable.value || props.type === "password" || unref(isShowLength) ? (openBlock(), createElementBlock( "div", { key: 1, class: "o_input-suffix", onMousedown: _cache[10] || (_cache[10] = withModifiers(() => { }, ["prevent"])) }, [ createCommentVNode(" 自定义图标 "), ((_d = slots.suffix) == null ? void 0 : _d.call(slots)) ? (openBlock(), createElementBlock("span", _hoisted_4, [ renderSlot(_ctx.$slots, "suffix") ])) : createCommentVNode("v-if", true), createCommentVNode(" 清除图标 "), isClearable.value ? (openBlock(), createElementBlock( "div", { key: 1, class: "o_input-clear", onClick: _cache[5] || (_cache[5] = //@ts-ignore (...args) => unref(handleClear) && unref(handleClear)(...args)), onMousedown: _cache[6] || (_cache[6] = withModifiers(() => { }, ["prevent"])) }, [ createVNode(unref(IconClose), { class: "o_input-clear-icon" }) ], 32 /* NEED_HYDRATION */ )) : createCommentVNode("v-if", true), createCommentVNode(" 密码图标 "), props.type === "password" ? (openBlock(), createElementBlock( "div", { key: 2, class: "o_input-eye", onClick: _cache[7] || (_cache[7] = withModifiers( //@ts-ignore (...args) => unref(onEyeClick) && unref(onEyeClick)(...args), ["prevent", "stop"] )), onMousedown: _cache[8] || (_cache[8] = withModifiers( //@ts-ignore (...args) => unref(onEyeMouseDown) && unref(onEyeMouseDown)(...args), ["prevent", "stop"] )), onTouchstart: _cache[9] || (_cache[9] = withModifiers( //@ts-ignore (...args) => unref(onEyeMouseDown) && unref(onEyeMouseDown)(...args), ["stop"] )) }, [ unref(showPassword) ? (openBlock(), createBlock(unref(IconEyeOn), { key: 0, class: "o_input-eye-icon" })) : (openBlock(), createBlock(unref(IconEyeOff), { key: 1, class: "o_input-eye-icon" })) ], 32 /* NEED_HYDRATION */ )) : createCommentVNode("v-if", true), createCommentVNode(" 长度限制 "), unref(isShowLength) ? (openBlock(), createElementBlock( "div", { key: 3, class: normalizeClass(["o_input-limit", { "o_input-limit-error": unref(isOutLengthLimit) }]) }, [ renderSlot(_ctx.$slots, "length", { length: unref(inputValueLength) }, () => [ props.maxLength ?? props.minLength ? (openBlock(), createElementBlock("span", { key: 0, innerHTML: unref(t)("input.limit", unref(inputValueLength), props.maxLength ?? props.minLength) }, null, 8, _hoisted_5)) : (openBlock(), createElementBlock( "span", _hoisted_6, toDisplayString(unref(inputValueLength)), 1 /* TEXT */ )) ]) ], 2 /* CLASS */ )) : createCommentVNode("v-if", true), ((_e = slots.extra) == null ? void 0 : _e.call(slots)) ? (openBlock(), createElementBlock("span", _hoisted_7, [ renderSlot(_ctx.$slots, "extra") ])) : createCommentVNode("v-if", true) ], 32 /* NEED_HYDRATION */ )) : createCommentVNode("v-if", true) ], 10, _hoisted_1); }; } }); export { _sfc_main as default };