UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 12.9 kB
{"version":3,"file":"input-number2.mjs","sources":["../../../../../../packages/components/input-number/src/input-number.vue"],"sourcesContent":["<template>\n <div\n :class=\"[\n ns.b(),\n ns.m(inputNumberSize),\n ns.is('disabled', inputNumberDisabled),\n ns.is('without-controls', !controls),\n ns.is('controls-right', controlsAtRight),\n ]\"\n @dragstart.prevent\n >\n <span\n v-if=\"controls\"\n v-repeat-click=\"decrease\"\n role=\"button\"\n :class=\"[ns.e('decrease'), ns.is('disabled', minDisabled)]\"\n @keydown.enter=\"decrease\"\n >\n <el-icon>\n <arrow-down v-if=\"controlsAtRight\" />\n <minus v-else />\n </el-icon>\n </span>\n <span\n v-if=\"controls\"\n v-repeat-click=\"increase\"\n role=\"button\"\n :class=\"[ns.e('increase'), ns.is('disabled', maxDisabled)]\"\n @keydown.enter=\"increase\"\n >\n <el-icon>\n <arrow-up v-if=\"controlsAtRight\" />\n <plus v-else />\n </el-icon>\n </span>\n <el-input\n ref=\"input\"\n type=\"number\"\n :step=\"step\"\n :model-value=\"displayValue\"\n :placeholder=\"placeholder\"\n :disabled=\"inputNumberDisabled\"\n :size=\"inputNumberSize\"\n :max=\"max\"\n :min=\"min\"\n :name=\"name\"\n :label=\"label\"\n :validate-event=\"false\"\n @keydown.up.prevent=\"increase\"\n @keydown.down.prevent=\"decrease\"\n @blur=\"handleBlur\"\n @focus=\"handleFocus\"\n @input=\"handleInput\"\n @change=\"handleInputChange\"\n />\n </div>\n</template>\n<script lang=\"ts\">\nimport {\n computed,\n defineComponent,\n reactive,\n ref,\n watch,\n onMounted,\n onUpdated,\n} from 'vue'\n\nimport { ElIcon } from '@element-plus/components/icon'\nimport { RepeatClick } from '@element-plus/directives'\nimport {\n useDisabled,\n useFormItem,\n useSize,\n useNamespace,\n} from '@element-plus/hooks'\nimport ElInput from '@element-plus/components/input'\nimport { isNumber, debugWarn } from '@element-plus/utils'\nimport { ArrowUp, ArrowDown, Plus, Minus } from '@element-plus/icons-vue'\nimport { inputNumberProps, inputNumberEmits } from './input-number'\n\nimport type { ComponentPublicInstance } from 'vue'\n\ninterface IData {\n currentValue: number | undefined\n userInput: null | number | string\n}\n\nexport default defineComponent({\n name: 'ElInputNumber',\n components: {\n ElInput,\n ElIcon,\n ArrowUp,\n ArrowDown,\n Plus,\n Minus,\n },\n directives: {\n RepeatClick,\n },\n props: inputNumberProps,\n emits: inputNumberEmits,\n setup(props, { emit }) {\n const input = ref<ComponentPublicInstance<typeof ElInput>>()\n const data = reactive<IData>({\n currentValue: props.modelValue,\n userInput: null,\n })\n const { formItem } = useFormItem()\n const ns = useNamespace('input-number')\n\n const minDisabled = computed(() => _decrease(props.modelValue) < props.min)\n const maxDisabled = computed(() => _increase(props.modelValue) > props.max)\n\n const numPrecision = computed(() => {\n const stepPrecision = getPrecision(props.step)\n if (props.precision !== undefined) {\n if (stepPrecision > props.precision) {\n debugWarn(\n 'InputNumber',\n 'precision should not be less than the decimal places of step'\n )\n }\n return props.precision\n } else {\n return Math.max(getPrecision(props.modelValue), stepPrecision)\n }\n })\n const controlsAtRight = computed(() => {\n return props.controls && props.controlsPosition === 'right'\n })\n\n const inputNumberSize = useSize()\n const inputNumberDisabled = useDisabled()\n\n const displayValue = computed(() => {\n if (data.userInput !== null) {\n return data.userInput\n }\n let currentValue: number | string | undefined = data.currentValue\n if (isNumber(currentValue)) {\n if (Number.isNaN(currentValue)) return ''\n if (props.precision !== undefined) {\n currentValue = currentValue.toFixed(props.precision)\n }\n }\n return currentValue\n })\n const toPrecision = (num: number, pre?: number) => {\n if (pre === undefined) pre = numPrecision.value\n return parseFloat(\n `${Math.round(num * Math.pow(10, pre)) / Math.pow(10, pre)}`\n )\n }\n const getPrecision = (value: number | undefined) => {\n if (value === undefined) return 0\n const valueString = value.toString()\n const dotPosition = valueString.indexOf('.')\n let precision = 0\n if (dotPosition !== -1) {\n precision = valueString.length - dotPosition - 1\n }\n return precision\n }\n const _increase = (val: number) => {\n if (!isNumber(val)) return data.currentValue\n const precisionFactor = Math.pow(10, numPrecision.value)\n // Solve the accuracy problem of JS decimal calculation by converting the value to integer.\n val = isNumber(val) ? val : NaN\n return toPrecision(\n (precisionFactor * val + precisionFactor * props.step) / precisionFactor\n )\n }\n const _decrease = (val: number) => {\n if (!isNumber(val)) return data.currentValue\n const precisionFactor = Math.pow(10, numPrecision.value)\n // Solve the accuracy problem of JS decimal calculation by converting the value to integer.\n val = isNumber(val) ? val : NaN\n return toPrecision(\n (precisionFactor * val - precisionFactor * props.step) / precisionFactor\n )\n }\n const increase = () => {\n if (inputNumberDisabled.value || maxDisabled.value) return\n const value = props.modelValue || 0\n const newVal = _increase(value)\n setCurrentValue(newVal)\n }\n const decrease = () => {\n if (inputNumberDisabled.value || minDisabled.value) return\n const value = props.modelValue || 0\n const newVal = _decrease(value)\n setCurrentValue(newVal)\n }\n const setCurrentValue = (newVal: number | string) => {\n const oldVal = data.currentValue\n if (typeof newVal === 'number' && props.precision !== undefined) {\n newVal = toPrecision(newVal, props.precision)\n }\n if (newVal !== undefined && newVal >= props.max) newVal = props.max\n if (newVal !== undefined && newVal <= props.min) newVal = props.min\n if (oldVal === newVal) return\n if (!isNumber(newVal)) {\n newVal = undefined\n }\n data.userInput = null\n emit('update:modelValue', newVal)\n emit('input', newVal)\n emit('change', newVal, oldVal)\n formItem?.validate?.('change')\n data.currentValue = newVal\n }\n const handleInput = (value: string) => {\n return (data.userInput = value)\n }\n const handleInputChange = (value: string) => {\n const newVal = value !== '' ? Number(value) : ''\n if ((isNumber(newVal) && !Number.isNaN(newVal)) || value === '') {\n setCurrentValue(newVal)\n }\n data.userInput = null\n }\n\n const focus = () => {\n input.value?.focus?.()\n }\n\n const blur = () => {\n input.value?.blur?.()\n }\n\n const handleFocus = (event: MouseEvent) => {\n emit('focus', event)\n }\n\n const handleBlur = (event: MouseEvent) => {\n emit('blur', event)\n formItem?.validate?.('blur')\n }\n\n watch(\n () => props.modelValue,\n (value) => {\n let newVal = Number(value)\n if (value === null) {\n newVal = Number.NaN\n }\n if (!isNaN(newVal)) {\n if (props.stepStrictly) {\n const stepPrecision = getPrecision(props.step)\n const precisionFactor = Math.pow(10, stepPrecision)\n newVal =\n (Math.round(newVal / props.step) * precisionFactor * props.step) /\n precisionFactor\n }\n if (props.precision !== undefined) {\n newVal = toPrecision(newVal, props.precision)\n }\n\n if (newVal > props.max) {\n newVal = props.max\n emit('update:modelValue', newVal)\n }\n if (newVal < props.min) {\n newVal = props.min\n emit('update:modelValue', newVal)\n }\n }\n data.currentValue = newVal\n data.userInput = null\n },\n { immediate: true }\n )\n onMounted(() => {\n const innerInput = input.value?.input as HTMLInputElement\n innerInput.setAttribute('role', 'spinbutton')\n innerInput.setAttribute('aria-valuemax', String(props.max))\n innerInput.setAttribute('aria-valuemin', String(props.min))\n innerInput.setAttribute('aria-valuenow', String(data.currentValue))\n innerInput.setAttribute(\n 'aria-disabled',\n String(inputNumberDisabled.value)\n )\n if (!isNumber(props.modelValue)) {\n let val: number | undefined = Number(props.modelValue)\n if (isNaN(val)) {\n val = undefined\n }\n emit('update:modelValue', val)\n }\n })\n onUpdated(() => {\n const innerInput = input.value?.input\n innerInput?.setAttribute('aria-valuenow', data.currentValue)\n })\n return {\n input,\n displayValue,\n handleInput,\n handleInputChange,\n controlsAtRight,\n decrease,\n increase,\n inputNumberSize,\n inputNumberDisabled,\n maxDisabled,\n minDisabled,\n focus,\n blur,\n handleFocus,\n handleBlur,\n\n ns,\n }\n },\n})\n</script>\n"],"names":[],"mappings":"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"}