UNPKG

element-plus

Version:

A Component Library for Vue 3

317 lines (312 loc) 11.9 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var vue = require('vue'); var index$1 = require('../../icon/index.js'); require('../../../directives/index.js'); require('../../../hooks/index.js'); var index = require('../../input/index.js'); require('../../../utils/index.js'); var iconsVue = require('@element-plus/icons-vue'); var inputNumber = require('./input-number.js'); var pluginVue_exportHelper = require('../../../_virtual/plugin-vue_export-helper.js'); var index$2 = require('../../../directives/repeat-click/index.js'); var index$3 = require('../../../hooks/use-form-item/index.js'); var index$4 = require('../../../hooks/use-namespace/index.js'); var error = require('../../../utils/error.js'); var index$5 = require('../../../hooks/use-common-props/index.js'); var core = require('@vueuse/core'); const _sfc_main = vue.defineComponent({ name: "ElInputNumber", components: { ElInput: index.ElInput, ElIcon: index$1.ElIcon, ArrowUp: iconsVue.ArrowUp, ArrowDown: iconsVue.ArrowDown, Plus: iconsVue.Plus, Minus: iconsVue.Minus }, directives: { RepeatClick: index$2["default"] }, props: inputNumber.inputNumberProps, emits: inputNumber.inputNumberEmits, setup(props, { emit }) { const input = vue.ref(); const data = vue.reactive({ currentValue: props.modelValue, userInput: null }); const { formItem } = index$3.useFormItem(); const ns = index$4.useNamespace("input-number"); const minDisabled = vue.computed(() => _decrease(props.modelValue) < props.min); const maxDisabled = vue.computed(() => _increase(props.modelValue) > props.max); const numPrecision = vue.computed(() => { const stepPrecision = getPrecision(props.step); if (props.precision !== void 0) { if (stepPrecision > props.precision) { error.debugWarn("InputNumber", "precision should not be less than the decimal places of step"); } return props.precision; } else { return Math.max(getPrecision(props.modelValue), stepPrecision); } }); const controlsAtRight = vue.computed(() => { return props.controls && props.controlsPosition === "right"; }); const inputNumberSize = index$5.useSize(); const inputNumberDisabled = index$5.useDisabled(); const displayValue = vue.computed(() => { if (data.userInput !== null) { return data.userInput; } let currentValue = data.currentValue; if (core.isNumber(currentValue)) { if (Number.isNaN(currentValue)) return ""; if (props.precision !== void 0) { currentValue = currentValue.toFixed(props.precision); } } return currentValue; }); const toPrecision = (num, pre) => { if (pre === void 0) pre = numPrecision.value; return Number.parseFloat(`${Math.round(num * 10 ** pre) / 10 ** pre}`); }; const getPrecision = (value) => { if (value === void 0) return 0; const valueString = value.toString(); const dotPosition = valueString.indexOf("."); let precision = 0; if (dotPosition !== -1) { precision = valueString.length - dotPosition - 1; } return precision; }; const _increase = (val) => { if (!core.isNumber(val)) return data.currentValue; const precisionFactor = 10 ** numPrecision.value; val = core.isNumber(val) ? val : Number.NaN; return toPrecision((precisionFactor * val + precisionFactor * props.step) / precisionFactor); }; const _decrease = (val) => { if (!core.isNumber(val)) return data.currentValue; const precisionFactor = 10 ** numPrecision.value; val = core.isNumber(val) ? val : Number.NaN; return toPrecision((precisionFactor * val - precisionFactor * props.step) / precisionFactor); }; const increase = () => { if (inputNumberDisabled.value || maxDisabled.value) return; const value = props.modelValue || 0; const newVal = _increase(value); setCurrentValue(newVal); }; const decrease = () => { if (inputNumberDisabled.value || minDisabled.value) return; const value = props.modelValue || 0; const newVal = _decrease(value); setCurrentValue(newVal); }; const setCurrentValue = (newVal) => { var _a; const oldVal = data.currentValue; if (props.stepStrictly) { const stepPrecision = getPrecision(props.step); const precisionFactor = 10 ** stepPrecision; newVal = Math.round(newVal / props.step) * precisionFactor * props.step / precisionFactor; } if (typeof newVal === "number" && props.precision !== void 0) { newVal = toPrecision(newVal, props.precision); } if (newVal !== void 0 && newVal >= props.max) newVal = props.max; if (newVal !== void 0 && newVal <= props.min) newVal = props.min; if (oldVal === newVal) return; if (!core.isNumber(newVal)) { newVal = void 0; } data.userInput = null; emit("update:modelValue", newVal); emit("input", newVal); emit("change", newVal, oldVal); (_a = formItem == null ? void 0 : formItem.validate) == null ? void 0 : _a.call(formItem, "change").catch((err) => error.debugWarn(err)); data.currentValue = newVal; }; const handleInput = (value) => { return data.userInput = value; }; const handleInputChange = (value) => { const newVal = value !== "" ? Number(value) : ""; if (core.isNumber(newVal) && !Number.isNaN(newVal) || value === "") { setCurrentValue(newVal); } data.userInput = null; }; const focus = () => { var _a, _b; (_b = (_a = input.value) == null ? void 0 : _a.focus) == null ? void 0 : _b.call(_a); }; const blur = () => { var _a, _b; (_b = (_a = input.value) == null ? void 0 : _a.blur) == null ? void 0 : _b.call(_a); }; const handleFocus = (event) => { emit("focus", event); }; const handleBlur = (event) => { var _a; emit("blur", event); (_a = formItem == null ? void 0 : formItem.validate) == null ? void 0 : _a.call(formItem, "blur").catch((err) => error.debugWarn(err)); }; vue.watch(() => props.modelValue, (value) => { let newVal = Number(value); if (value === null) { newVal = Number.NaN; } if (!Number.isNaN(newVal)) { if (props.stepStrictly) { const stepPrecision = getPrecision(props.step); const precisionFactor = 10 ** stepPrecision; newVal = Math.round(newVal / props.step) * precisionFactor * props.step / precisionFactor; } if (props.precision !== void 0) { newVal = toPrecision(newVal, props.precision); } if (newVal > props.max) { newVal = props.max; emit("update:modelValue", newVal); } if (newVal < props.min) { newVal = props.min; emit("update:modelValue", newVal); } } data.currentValue = newVal; data.userInput = null; }, { immediate: true }); vue.onMounted(() => { var _a; const innerInput = (_a = input.value) == null ? void 0 : _a.input; innerInput.setAttribute("role", "spinbutton"); innerInput.setAttribute("aria-valuemax", String(props.max)); innerInput.setAttribute("aria-valuemin", String(props.min)); innerInput.setAttribute("aria-valuenow", String(data.currentValue)); innerInput.setAttribute("aria-disabled", String(inputNumberDisabled.value)); if (!core.isNumber(props.modelValue)) { let val = Number(props.modelValue); if (Number.isNaN(val)) { val = void 0; } emit("update:modelValue", val); } }); vue.onUpdated(() => { var _a; const innerInput = (_a = input.value) == null ? void 0 : _a.input; innerInput == null ? void 0 : innerInput.setAttribute("aria-valuenow", data.currentValue); }); return { input, displayValue, handleInput, handleInputChange, controlsAtRight, decrease, increase, inputNumberSize, inputNumberDisabled, maxDisabled, minDisabled, focus, blur, handleFocus, handleBlur, ns }; } }); function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_arrow_down = vue.resolveComponent("arrow-down"); const _component_minus = vue.resolveComponent("minus"); const _component_el_icon = vue.resolveComponent("el-icon"); const _component_arrow_up = vue.resolveComponent("arrow-up"); const _component_plus = vue.resolveComponent("plus"); const _component_el_input = vue.resolveComponent("el-input"); const _directive_repeat_click = vue.resolveDirective("repeat-click"); return vue.openBlock(), vue.createElementBlock("div", { class: vue.normalizeClass([ _ctx.ns.b(), _ctx.ns.m(_ctx.inputNumberSize), _ctx.ns.is("disabled", _ctx.inputNumberDisabled), _ctx.ns.is("without-controls", !_ctx.controls), _ctx.ns.is("controls-right", _ctx.controlsAtRight) ]), onDragstart: _cache[2] || (_cache[2] = vue.withModifiers(() => { }, ["prevent"])) }, [ _ctx.controls ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("span", { key: 0, role: "button", class: vue.normalizeClass([_ctx.ns.e("decrease"), _ctx.ns.is("disabled", _ctx.minDisabled)]), onKeydown: _cache[0] || (_cache[0] = vue.withKeys((...args) => _ctx.decrease && _ctx.decrease(...args), ["enter"])) }, [ vue.createVNode(_component_el_icon, null, { default: vue.withCtx(() => [ _ctx.controlsAtRight ? (vue.openBlock(), vue.createBlock(_component_arrow_down, { key: 0 })) : (vue.openBlock(), vue.createBlock(_component_minus, { key: 1 })) ]), _: 1 }) ], 34)), [ [_directive_repeat_click, _ctx.decrease] ]) : vue.createCommentVNode("v-if", true), _ctx.controls ? vue.withDirectives((vue.openBlock(), vue.createElementBlock("span", { key: 1, role: "button", class: vue.normalizeClass([_ctx.ns.e("increase"), _ctx.ns.is("disabled", _ctx.maxDisabled)]), onKeydown: _cache[1] || (_cache[1] = vue.withKeys((...args) => _ctx.increase && _ctx.increase(...args), ["enter"])) }, [ vue.createVNode(_component_el_icon, null, { default: vue.withCtx(() => [ _ctx.controlsAtRight ? (vue.openBlock(), vue.createBlock(_component_arrow_up, { key: 0 })) : (vue.openBlock(), vue.createBlock(_component_plus, { key: 1 })) ]), _: 1 }) ], 34)), [ [_directive_repeat_click, _ctx.increase] ]) : vue.createCommentVNode("v-if", true), vue.createVNode(_component_el_input, { ref: "input", type: "number", step: _ctx.step, "model-value": _ctx.displayValue, placeholder: _ctx.placeholder, disabled: _ctx.inputNumberDisabled, size: _ctx.inputNumberSize, max: _ctx.max, min: _ctx.min, name: _ctx.name, label: _ctx.label, "validate-event": false, onKeydown: [ vue.withKeys(vue.withModifiers(_ctx.increase, ["prevent"]), ["up"]), vue.withKeys(vue.withModifiers(_ctx.decrease, ["prevent"]), ["down"]) ], onBlur: _ctx.handleBlur, onFocus: _ctx.handleFocus, onInput: _ctx.handleInput, onChange: _ctx.handleInputChange }, null, 8, ["step", "model-value", "placeholder", "disabled", "size", "max", "min", "name", "label", "onKeydown", "onBlur", "onFocus", "onInput", "onChange"]) ], 34); } var InputNumber = /* @__PURE__ */ pluginVue_exportHelper["default"](_sfc_main, [["render", _sfc_render]]); exports["default"] = InputNumber; //# sourceMappingURL=input-number2.js.map