rc-input-number
Advanced tools
Comparing version 7.3.9 to 7.3.11
@@ -7,6 +7,4 @@ import { useRef } from 'react'; | ||
*/ | ||
export default function useCursor(input, focused) { | ||
var selectionRef = useRef(null); | ||
function recordCursor() { | ||
@@ -16,4 +14,4 @@ // Record position | ||
var start = input.selectionStart, | ||
end = input.selectionEnd, | ||
value = input.value; | ||
end = input.selectionEnd, | ||
value = input.value; | ||
var beforeTxt = value.substring(0, start); | ||
@@ -28,3 +26,4 @@ var afterTxt = value.substring(end); | ||
}; | ||
} catch (e) {// Fix error in Chrome: | ||
} catch (e) { | ||
// Fix error in Chrome: | ||
// Failed to read the 'selectionStart' property from 'HTMLInputElement' | ||
@@ -39,4 +38,2 @@ // http://stackoverflow.com/q/21177489/3040605 | ||
*/ | ||
function restoreCursor() { | ||
@@ -47,7 +44,6 @@ if (input && selectionRef.current && focused) { | ||
var _selectionRef$current = selectionRef.current, | ||
beforeTxt = _selectionRef$current.beforeTxt, | ||
afterTxt = _selectionRef$current.afterTxt, | ||
start = _selectionRef$current.start; | ||
beforeTxt = _selectionRef$current.beforeTxt, | ||
afterTxt = _selectionRef$current.afterTxt, | ||
start = _selectionRef$current.start; | ||
var startPos = value.length; | ||
if (value.endsWith(afterTxt)) { | ||
@@ -60,3 +56,2 @@ startPos = value.length - selectionRef.current.afterTxt.length; | ||
var newIndex = value.indexOf(beforeLastChar, start - 1); | ||
if (newIndex !== -1) { | ||
@@ -66,3 +61,2 @@ startPos = newIndex + 1; | ||
} | ||
input.setSelectionRange(startPos, startPos); | ||
@@ -74,4 +68,3 @@ } catch (e) { | ||
} | ||
return [recordCursor, restoreCursor]; | ||
} |
@@ -6,10 +6,7 @@ import { useRef, useEffect } from 'react'; | ||
*/ | ||
export default (function () { | ||
var idRef = useRef(0); | ||
var cleanUp = function cleanUp() { | ||
raf.cancel(idRef.current); | ||
}; | ||
useEffect(function () { | ||
@@ -16,0 +13,0 @@ return cleanUp; |
import InputNumber, { InputNumberProps } from './InputNumber'; | ||
export { InputNumberProps }; | ||
export type { InputNumberProps }; | ||
export default InputNumber; |
@@ -28,3 +28,2 @@ import _extends from "@babel/runtime/helpers/esm/extends"; | ||
*/ | ||
var getDecimalValue = function getDecimalValue(stringMode, decimalValue) { | ||
@@ -34,6 +33,4 @@ if (stringMode || decimalValue.isEmpty()) { | ||
} | ||
return decimalValue.toNumber(); | ||
}; | ||
var getDecimalIfValidate = function getDecimalIfValidate(value) { | ||
@@ -43,54 +40,48 @@ var decimal = getMiniDecimal(value); | ||
}; | ||
var InputNumber = /*#__PURE__*/React.forwardRef(function (props, ref) { | ||
var _classNames; | ||
var _props$prefixCls = props.prefixCls, | ||
prefixCls = _props$prefixCls === void 0 ? 'rc-input-number' : _props$prefixCls, | ||
className = props.className, | ||
style = props.style, | ||
min = props.min, | ||
max = props.max, | ||
_props$step = props.step, | ||
step = _props$step === void 0 ? 1 : _props$step, | ||
defaultValue = props.defaultValue, | ||
value = props.value, | ||
disabled = props.disabled, | ||
readOnly = props.readOnly, | ||
upHandler = props.upHandler, | ||
downHandler = props.downHandler, | ||
keyboard = props.keyboard, | ||
_props$controls = props.controls, | ||
controls = _props$controls === void 0 ? true : _props$controls, | ||
stringMode = props.stringMode, | ||
parser = props.parser, | ||
formatter = props.formatter, | ||
precision = props.precision, | ||
decimalSeparator = props.decimalSeparator, | ||
onChange = props.onChange, | ||
onInput = props.onInput, | ||
onPressEnter = props.onPressEnter, | ||
onStep = props.onStep, | ||
inputProps = _objectWithoutProperties(props, _excluded); | ||
prefixCls = _props$prefixCls === void 0 ? 'rc-input-number' : _props$prefixCls, | ||
className = props.className, | ||
style = props.style, | ||
min = props.min, | ||
max = props.max, | ||
_props$step = props.step, | ||
step = _props$step === void 0 ? 1 : _props$step, | ||
defaultValue = props.defaultValue, | ||
value = props.value, | ||
disabled = props.disabled, | ||
readOnly = props.readOnly, | ||
upHandler = props.upHandler, | ||
downHandler = props.downHandler, | ||
keyboard = props.keyboard, | ||
_props$controls = props.controls, | ||
controls = _props$controls === void 0 ? true : _props$controls, | ||
stringMode = props.stringMode, | ||
parser = props.parser, | ||
formatter = props.formatter, | ||
precision = props.precision, | ||
decimalSeparator = props.decimalSeparator, | ||
onChange = props.onChange, | ||
onInput = props.onInput, | ||
onPressEnter = props.onPressEnter, | ||
onStep = props.onStep, | ||
inputProps = _objectWithoutProperties(props, _excluded); | ||
var inputClassName = "".concat(prefixCls, "-input"); | ||
var inputRef = React.useRef(null); | ||
var _React$useState = React.useState(false), | ||
_React$useState2 = _slicedToArray(_React$useState, 2), | ||
focus = _React$useState2[0], | ||
setFocus = _React$useState2[1]; | ||
_React$useState2 = _slicedToArray(_React$useState, 2), | ||
focus = _React$useState2[0], | ||
setFocus = _React$useState2[1]; | ||
var userTypingRef = React.useRef(false); | ||
var compositionRef = React.useRef(false); | ||
var shiftKeyRef = React.useRef(false); // ============================ Value ============================= | ||
var shiftKeyRef = React.useRef(false); | ||
// ============================ Value ============================= | ||
// Real value control | ||
var _React$useState3 = React.useState(function () { | ||
return getMiniDecimal(value !== null && value !== void 0 ? value : defaultValue); | ||
}), | ||
_React$useState4 = _slicedToArray(_React$useState3, 2), | ||
decimalValue = _React$useState4[0], | ||
setDecimalValue = _React$useState4[1]; | ||
return getMiniDecimal(value !== null && value !== void 0 ? value : defaultValue); | ||
}), | ||
_React$useState4 = _slicedToArray(_React$useState3, 2), | ||
decimalValue = _React$useState4[0], | ||
setDecimalValue = _React$useState4[1]; | ||
function setUncontrolledDecimalValue(newDecimal) { | ||
@@ -100,4 +91,4 @@ if (value === undefined) { | ||
} | ||
} // ====================== Parser & Formatter ====================== | ||
} | ||
// ====================== Parser & Formatter ====================== | ||
/** | ||
@@ -114,4 +105,2 @@ * `precision` is used for formatter & onChange. | ||
*/ | ||
var getPrecision = React.useCallback(function (numStr, userTyping) { | ||
@@ -121,27 +110,21 @@ if (userTyping) { | ||
} | ||
if (precision >= 0) { | ||
return precision; | ||
} | ||
return Math.max(getNumberPrecision(numStr), getNumberPrecision(step)); | ||
}, [precision, step]); // >>> Parser | ||
}, [precision, step]); | ||
// >>> Parser | ||
var mergedParser = React.useCallback(function (num) { | ||
var numStr = String(num); | ||
if (parser) { | ||
return parser(numStr); | ||
} | ||
var parsedStr = numStr; | ||
if (decimalSeparator) { | ||
parsedStr = parsedStr.replace(decimalSeparator, '.'); | ||
} // [Legacy] We still support auto convert `$ 123,456` to `123456` | ||
} | ||
// [Legacy] We still support auto convert `$ 123,456` to `123456` | ||
return parsedStr.replace(/[^\w.-]+/g, ''); | ||
}, [parser, decimalSeparator]); // >>> Formatter | ||
}, [parser, decimalSeparator]); | ||
// >>> Formatter | ||
var inputValueRef = React.useRef(''); | ||
@@ -155,8 +138,6 @@ var mergedFormatter = React.useCallback(function (number, userTyping) { | ||
} | ||
var str = typeof number === 'number' ? num2str(number) : number; // User typing will not auto format with precision directly | ||
var str = typeof number === 'number' ? num2str(number) : number; | ||
// User typing will not auto format with precision directly | ||
if (!userTyping) { | ||
var mergedPrecision = getPrecision(str, userTyping); | ||
if (validateNumber(str) && (decimalSeparator || mergedPrecision >= 0)) { | ||
@@ -168,6 +149,5 @@ // Separator | ||
} | ||
return str; | ||
}, [formatter, getPrecision, decimalSeparator]); // ========================== InputValue ========================== | ||
}, [formatter, getPrecision, decimalSeparator]); | ||
// ========================== InputValue ========================== | ||
/** | ||
@@ -182,26 +162,22 @@ * Input text value control | ||
*/ | ||
var _React$useState5 = React.useState(function () { | ||
var initValue = defaultValue !== null && defaultValue !== void 0 ? defaultValue : value; | ||
if (decimalValue.isInvalidate() && ['string', 'number'].includes(_typeof(initValue))) { | ||
return Number.isNaN(initValue) ? '' : initValue; | ||
} | ||
return mergedFormatter(decimalValue.toString(), false); | ||
}), | ||
_React$useState6 = _slicedToArray(_React$useState5, 2), | ||
inputValue = _React$useState6[0], | ||
setInternalInputValue = _React$useState6[1]; | ||
inputValueRef.current = inputValue; // Should always be string | ||
var initValue = defaultValue !== null && defaultValue !== void 0 ? defaultValue : value; | ||
if (decimalValue.isInvalidate() && ['string', 'number'].includes(_typeof(initValue))) { | ||
return Number.isNaN(initValue) ? '' : initValue; | ||
} | ||
return mergedFormatter(decimalValue.toString(), false); | ||
}), | ||
_React$useState6 = _slicedToArray(_React$useState5, 2), | ||
inputValue = _React$useState6[0], | ||
setInternalInputValue = _React$useState6[1]; | ||
inputValueRef.current = inputValue; | ||
// Should always be string | ||
function setInputValue(newValue, userTyping) { | ||
setInternalInputValue(mergedFormatter( // Invalidate number is sometime passed by external control, we should let it go | ||
setInternalInputValue(mergedFormatter( | ||
// Invalidate number is sometime passed by external control, we should let it go | ||
// Otherwise is controlled by internal interactive logic which check by userTyping | ||
// You can ref 'show limited value when input is not focused' test for more info. | ||
newValue.isInvalidate() ? newValue.toString(false) : newValue.toString(!userTyping), userTyping)); | ||
} // >>> Max & Min limit | ||
} | ||
// >>> Max & Min limit | ||
var maxDecimal = React.useMemo(function () { | ||
@@ -217,3 +193,2 @@ return getDecimalIfValidate(max); | ||
} | ||
return maxDecimal.lessEquals(decimalValue); | ||
@@ -225,11 +200,10 @@ }, [maxDecimal, decimalValue]); | ||
} | ||
return decimalValue.lessEquals(minDecimal); | ||
}, [minDecimal, decimalValue]); // Cursor controller | ||
}, [minDecimal, decimalValue]); | ||
// Cursor controller | ||
var _useCursor = useCursor(inputRef.current, focus), | ||
_useCursor2 = _slicedToArray(_useCursor, 2), | ||
recordCursor = _useCursor2[0], | ||
restoreCursor = _useCursor2[1]; // ============================= Data ============================= | ||
_useCursor2 = _slicedToArray(_useCursor, 2), | ||
recordCursor = _useCursor2[0], | ||
restoreCursor = _useCursor2[1]; | ||
// ============================= Data ============================= | ||
/** | ||
@@ -242,4 +216,2 @@ * Find target value closet within range. | ||
*/ | ||
var getRangeValue = function getRangeValue(target) { | ||
@@ -249,9 +221,7 @@ // target > max | ||
return maxDecimal; | ||
} // target < min | ||
} | ||
// target < min | ||
if (minDecimal && !minDecimal.lessEquals(target)) { | ||
return minDecimal; | ||
} | ||
return null; | ||
@@ -262,4 +232,2 @@ }; | ||
*/ | ||
var isInRange = function isInRange(target) { | ||
@@ -272,10 +240,8 @@ return !getRangeValue(target); | ||
*/ | ||
var triggerValueUpdate = function triggerValueUpdate(newValue, userTyping) { | ||
var updateValue = newValue; | ||
var isRangeValidate = isInRange(updateValue) || updateValue.isEmpty(); // Skip align value when trigger value is empty. | ||
var isRangeValidate = isInRange(updateValue) || updateValue.isEmpty(); | ||
// Skip align value when trigger value is empty. | ||
// We just trigger onChange(null) | ||
// This should not block user typing | ||
if (!updateValue.isEmpty() && !userTyping) { | ||
@@ -286,21 +252,18 @@ // Revert value in range if needed | ||
} | ||
if (!readOnly && !disabled && isRangeValidate) { | ||
var numStr = updateValue.toString(); | ||
var mergedPrecision = getPrecision(numStr, userTyping); | ||
if (mergedPrecision >= 0) { | ||
updateValue = getMiniDecimal(toFixed(numStr, '.', mergedPrecision)); // When to fixed. The value may out of min & max range. | ||
updateValue = getMiniDecimal(toFixed(numStr, '.', mergedPrecision)); | ||
// When to fixed. The value may out of min & max range. | ||
// 4 in [0, 3.8] => 3.8 => 4 (toFixed) | ||
if (!isInRange(updateValue)) { | ||
updateValue = getMiniDecimal(toFixed(numStr, '.', mergedPrecision, true)); | ||
} | ||
} // Trigger event | ||
} | ||
// Trigger event | ||
if (!updateValue.equals(decimalValue)) { | ||
setUncontrolledDecimalValue(updateValue); | ||
onChange === null || onChange === void 0 ? void 0 : onChange(updateValue.isEmpty() ? null : getDecimalValue(stringMode, updateValue)); // Reformat input if value is not controlled | ||
onChange === null || onChange === void 0 ? void 0 : onChange(updateValue.isEmpty() ? null : getDecimalValue(stringMode, updateValue)); | ||
// Reformat input if value is not controlled | ||
if (value === undefined) { | ||
@@ -310,37 +273,30 @@ setInputValue(updateValue, userTyping); | ||
} | ||
return updateValue; | ||
} | ||
return decimalValue; | ||
}; // ========================== User Input ========================== | ||
var onNextPromise = useFrame(); // >>> Collect input value | ||
}; | ||
// ========================== User Input ========================== | ||
var onNextPromise = useFrame(); | ||
// >>> Collect input value | ||
var collectInputValue = function collectInputValue(inputStr) { | ||
recordCursor(); // Update inputValue incase input can not parse as number | ||
setInternalInputValue(inputStr); // Parse number | ||
recordCursor(); | ||
// Update inputValue incase input can not parse as number | ||
setInternalInputValue(inputStr); | ||
// Parse number | ||
if (!compositionRef.current) { | ||
var finalValue = mergedParser(inputStr); | ||
var finalDecimal = getMiniDecimal(finalValue); | ||
if (!finalDecimal.isNaN()) { | ||
triggerValueUpdate(finalDecimal, true); | ||
} | ||
} // Trigger onInput later to let user customize value if they want do handle something after onChange | ||
onInput === null || onInput === void 0 ? void 0 : onInput(inputStr); // optimize for chinese input experience | ||
} | ||
// Trigger onInput later to let user customize value if they want do handle something after onChange | ||
onInput === null || onInput === void 0 ? void 0 : onInput(inputStr); | ||
// optimize for chinese input experience | ||
// https://github.com/ant-design/ant-design/issues/8196 | ||
onNextPromise(function () { | ||
var nextInputStr = inputStr; | ||
if (!parser) { | ||
nextInputStr = inputStr.replace(/。/g, '.'); | ||
} | ||
if (nextInputStr !== inputStr) { | ||
@@ -350,37 +306,29 @@ collectInputValue(nextInputStr); | ||
}); | ||
}; // >>> Composition | ||
}; | ||
// >>> Composition | ||
var onCompositionStart = function onCompositionStart() { | ||
compositionRef.current = true; | ||
}; | ||
var onCompositionEnd = function onCompositionEnd() { | ||
compositionRef.current = false; | ||
collectInputValue(inputRef.current.value); | ||
}; // >>> Input | ||
}; | ||
// >>> Input | ||
var onInternalInput = function onInternalInput(e) { | ||
collectInputValue(e.target.value); | ||
}; // ============================= Step ============================= | ||
}; | ||
// ============================= Step ============================= | ||
var onInternalStep = function onInternalStep(up) { | ||
var _inputRef$current; | ||
// Ignore step since out of range | ||
if (up && upDisabled || !up && downDisabled) { | ||
return; | ||
} // Clear typing status since it may caused by up & down key. | ||
} | ||
// Clear typing status since it may caused by up & down key. | ||
// We should sync with input value. | ||
userTypingRef.current = false; | ||
var stepDecimal = getMiniDecimal(shiftKeyRef.current ? getDecupleSteps(step) : step); | ||
if (!up) { | ||
stepDecimal = stepDecimal.negate(); | ||
} | ||
var target = (decimalValue || getMiniDecimal(0)).add(stepDecimal.toString()); | ||
@@ -393,13 +341,10 @@ var updatedValue = triggerValueUpdate(target, false); | ||
(_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus(); | ||
}; // ============================ Flush ============================= | ||
}; | ||
// ============================ Flush ============================= | ||
/** | ||
* Flush current input content to trigger value change & re-formatter input if needed | ||
*/ | ||
var flushInputValue = function flushInputValue(userTyping) { | ||
var parsedValue = getMiniDecimal(mergedParser(inputValue)); | ||
var formatValue = parsedValue; | ||
if (!parsedValue.isNaN()) { | ||
@@ -412,3 +357,2 @@ // Only validate value or empty value can be re-fill to inputValue | ||
} | ||
if (value !== undefined) { | ||
@@ -422,8 +366,10 @@ // Reset back with controlled value first | ||
}; | ||
// Solve the issue of the event triggering sequence when entering numbers in chinese input (Safari) | ||
var onBeforeInput = function onBeforeInput() { | ||
userTypingRef.current = true; | ||
}; | ||
var onKeyDown = function onKeyDown(event) { | ||
var which = event.which, | ||
shiftKey = event.shiftKey; | ||
shiftKey = event.shiftKey; | ||
userTypingRef.current = true; | ||
if (shiftKey) { | ||
@@ -434,3 +380,2 @@ shiftKeyRef.current = true; | ||
} | ||
if (which === KeyCode.ENTER) { | ||
@@ -440,12 +385,9 @@ if (!compositionRef.current) { | ||
} | ||
flushInputValue(false); | ||
onPressEnter === null || onPressEnter === void 0 ? void 0 : onPressEnter(event); | ||
} | ||
if (keyboard === false) { | ||
return; | ||
} // Do step | ||
} | ||
// Do step | ||
if (!compositionRef.current && [KeyCode.UP, KeyCode.DOWN].includes(which)) { | ||
@@ -456,9 +398,7 @@ onInternalStep(KeyCode.UP === which); | ||
}; | ||
var onKeyUp = function onKeyUp() { | ||
userTypingRef.current = false; | ||
shiftKeyRef.current = false; | ||
}; // >>> Focus & Blur | ||
}; | ||
// >>> Focus & Blur | ||
var onBlur = function onBlur() { | ||
@@ -468,6 +408,5 @@ flushInputValue(false); | ||
userTypingRef.current = false; | ||
}; // ========================== Controlled ========================== | ||
}; | ||
// ========================== Controlled ========================== | ||
// Input by precision | ||
useLayoutUpdateEffect(function () { | ||
@@ -477,10 +416,10 @@ if (!decimalValue.isInvalidate()) { | ||
} | ||
}, [precision]); // Input by value | ||
}, [precision]); | ||
// Input by value | ||
useLayoutUpdateEffect(function () { | ||
var newValue = getMiniDecimal(value); | ||
setDecimalValue(newValue); | ||
var currentParsedValue = getMiniDecimal(mergedParser(inputValue)); // When user typing from `1.2` to `1.`, we should not convert to `1` immediately. | ||
var currentParsedValue = getMiniDecimal(mergedParser(inputValue)); | ||
// When user typing from `1.2` to `1.`, we should not convert to `1` immediately. | ||
// But let it go if user set `formatter` | ||
if (!newValue.equals(currentParsedValue) || !userTypingRef.current || formatter) { | ||
@@ -490,4 +429,4 @@ // Update value as effect | ||
} | ||
}, [value]); // ============================ Cursor ============================ | ||
}, [value]); | ||
// ============================ Cursor ============================ | ||
useLayoutUpdateEffect(function () { | ||
@@ -497,4 +436,4 @@ if (formatter) { | ||
} | ||
}, [inputValue]); // ============================ Render ============================ | ||
}, [inputValue]); | ||
// ============================ Render ============================ | ||
return /*#__PURE__*/React.createElement("div", { | ||
@@ -510,3 +449,4 @@ className: classNames(prefixCls, className, (_classNames = {}, _defineProperty(_classNames, "".concat(prefixCls, "-focused"), focus), _defineProperty(_classNames, "".concat(prefixCls, "-disabled"), disabled), _defineProperty(_classNames, "".concat(prefixCls, "-readonly"), readOnly), _defineProperty(_classNames, "".concat(prefixCls, "-not-a-number"), decimalValue.isNaN()), _defineProperty(_classNames, "".concat(prefixCls, "-out-of-range"), !decimalValue.isInvalidate() && !isInRange(decimalValue)), _classNames)), | ||
onCompositionStart: onCompositionStart, | ||
onCompositionEnd: onCompositionEnd | ||
onCompositionEnd: onCompositionEnd, | ||
onBeforeInput: onBeforeInput | ||
}, controls && /*#__PURE__*/React.createElement(StepHandler, { | ||
@@ -513,0 +453,0 @@ prefixCls: prefixCls, |
import _extends from "@babel/runtime/helpers/esm/extends"; | ||
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty"; | ||
/* eslint-disable react/no-unknown-property */ | ||
@@ -11,3 +10,2 @@ import * as React from 'react'; | ||
*/ | ||
var STEP_INTERVAL = 200; | ||
@@ -17,41 +15,36 @@ /** | ||
*/ | ||
var STEP_DELAY = 600; | ||
export default function StepHandler(_ref) { | ||
var prefixCls = _ref.prefixCls, | ||
upNode = _ref.upNode, | ||
downNode = _ref.downNode, | ||
upDisabled = _ref.upDisabled, | ||
downDisabled = _ref.downDisabled, | ||
onStep = _ref.onStep; | ||
upNode = _ref.upNode, | ||
downNode = _ref.downNode, | ||
upDisabled = _ref.upDisabled, | ||
downDisabled = _ref.downDisabled, | ||
onStep = _ref.onStep; | ||
// ======================== Step ======================== | ||
var stepTimeoutRef = React.useRef(); | ||
var onStepRef = React.useRef(); | ||
onStepRef.current = onStep; // We will interval update step when hold mouse down | ||
onStepRef.current = onStep; | ||
// We will interval update step when hold mouse down | ||
var onStepMouseDown = function onStepMouseDown(e, up) { | ||
e.preventDefault(); | ||
onStepRef.current(up); // Loop step for interval | ||
onStepRef.current(up); | ||
// Loop step for interval | ||
function loopStep() { | ||
onStepRef.current(up); | ||
stepTimeoutRef.current = setTimeout(loopStep, STEP_INTERVAL); | ||
} // First time press will wait some time to trigger loop step update | ||
} | ||
// First time press will wait some time to trigger loop step update | ||
stepTimeoutRef.current = setTimeout(loopStep, STEP_DELAY); | ||
}; | ||
var onStopStep = function onStopStep() { | ||
clearTimeout(stepTimeoutRef.current); | ||
}; | ||
React.useEffect(function () { | ||
return onStopStep; | ||
}, []); // ======================= Render ======================= | ||
}, []); | ||
// ======================= Render ======================= | ||
if (isMobile()) { | ||
return null; | ||
} | ||
var handlerClassName = "".concat(prefixCls, "-handler"); | ||
@@ -58,0 +51,0 @@ var upClassName = classNames(handlerClassName, "".concat(handlerClassName, "-up"), _defineProperty({}, "".concat(handlerClassName, "-up-disabled"), upDisabled)); |
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck"; | ||
import _createClass from "@babel/runtime/helpers/esm/createClass"; | ||
/* eslint-disable max-classes-per-file */ | ||
@@ -10,11 +9,8 @@ import { getNumberPrecision, isE, num2str, trimNumber, validateNumber } from './numberUtil'; | ||
*/ | ||
export var NumberDecimal = /*#__PURE__*/function () { | ||
function NumberDecimal(value) { | ||
_classCallCheck(this, NumberDecimal); | ||
this.origin = ''; | ||
this.number = void 0; | ||
this.empty = void 0; | ||
if (!value && value !== 0 || !String(value).trim()) { | ||
@@ -24,7 +20,5 @@ this.empty = true; | ||
} | ||
this.origin = String(value); | ||
this.number = Number(value); | ||
} | ||
_createClass(NumberDecimal, [{ | ||
@@ -41,19 +35,14 @@ key: "negate", | ||
} | ||
var target = Number(value); | ||
if (Number.isNaN(target)) { | ||
return this; | ||
} | ||
var number = this.number + target; // [Legacy] Back to safe integer | ||
var number = this.number + target; | ||
// [Legacy] Back to safe integer | ||
if (number > Number.MAX_SAFE_INTEGER) { | ||
return new NumberDecimal(Number.MAX_SAFE_INTEGER); | ||
} | ||
if (number < Number.MIN_SAFE_INTEGER) { | ||
return new NumberDecimal(Number.MIN_SAFE_INTEGER); | ||
} | ||
var maxPrecision = Math.max(getNumberPrecision(this.number), getNumberPrecision(target)); | ||
@@ -96,15 +85,11 @@ return new NumberDecimal(number.toFixed(maxPrecision)); | ||
var safe = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; | ||
if (!safe) { | ||
return this.origin; | ||
} | ||
if (this.isInvalidate()) { | ||
return ''; | ||
} | ||
return num2str(this.number); | ||
} | ||
}]); | ||
return NumberDecimal; | ||
@@ -114,5 +99,5 @@ }(); | ||
/** BigInt will convert `0009` to `9`. We need record the len of decimal */ | ||
function BigIntDecimal(value) { | ||
_classCallCheck(this, BigIntDecimal); | ||
this.origin = ''; | ||
@@ -125,3 +110,2 @@ this.negative = void 0; | ||
this.nan = void 0; | ||
if (!value && value !== 0 || !String(value).trim()) { | ||
@@ -131,5 +115,4 @@ this.empty = true; | ||
} | ||
this.origin = String(value); // Act like Number convert | ||
this.origin = String(value); | ||
// Act like Number convert | ||
if (value === '-') { | ||
@@ -139,11 +122,8 @@ this.nan = true; | ||
} | ||
var mergedValue = value; // We need convert back to Number since it require `toFixed` to handle this | ||
var mergedValue = value; | ||
// We need convert back to Number since it require `toFixed` to handle this | ||
if (isE(mergedValue)) { | ||
mergedValue = Number(mergedValue); | ||
} | ||
mergedValue = typeof mergedValue === 'string' ? mergedValue : num2str(mergedValue); | ||
if (validateNumber(mergedValue)) { | ||
@@ -161,3 +141,2 @@ var trimRet = trimNumber(mergedValue); | ||
} | ||
_createClass(BigIntDecimal, [{ | ||
@@ -182,3 +161,2 @@ key: "getMark", | ||
*/ | ||
}, { | ||
@@ -203,18 +181,14 @@ key: "alignDecimal", | ||
} | ||
var offset = new BigIntDecimal(value); | ||
if (offset.isInvalidate()) { | ||
return this; | ||
} | ||
var maxDecimalLength = Math.max(this.getDecimalStr().length, offset.getDecimalStr().length); | ||
var myAlignedDecimal = this.alignDecimal(maxDecimalLength); | ||
var offsetAlignedDecimal = offset.alignDecimal(maxDecimalLength); | ||
var valueStr = (myAlignedDecimal + offsetAlignedDecimal).toString(); // We need fill string length back to `maxDecimalLength` to avoid parser failed | ||
var valueStr = (myAlignedDecimal + offsetAlignedDecimal).toString(); | ||
// We need fill string length back to `maxDecimalLength` to avoid parser failed | ||
var _trimNumber = trimNumber(valueStr), | ||
negativeStr = _trimNumber.negativeStr, | ||
trimStr = _trimNumber.trimStr; | ||
negativeStr = _trimNumber.negativeStr, | ||
trimStr = _trimNumber.trimStr; | ||
var hydrateValueStr = "".concat(negativeStr).concat(trimStr.padStart(maxDecimalLength + 1, '0')); | ||
@@ -254,3 +228,2 @@ return new BigIntDecimal("".concat(hydrateValueStr.slice(0, -maxDecimalLength), ".").concat(hydrateValueStr.slice(-maxDecimalLength))); | ||
} | ||
return Number(this.toString()); | ||
@@ -262,15 +235,11 @@ } | ||
var safe = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; | ||
if (!safe) { | ||
return this.origin; | ||
} | ||
if (this.isInvalidate()) { | ||
return ''; | ||
} | ||
return trimNumber("".concat(this.getMark()).concat(this.getIntegerStr(), ".").concat(this.getDecimalStr())).fullStr; | ||
} | ||
}]); | ||
return BigIntDecimal; | ||
@@ -284,3 +253,2 @@ }(); | ||
} | ||
return new NumberDecimal(value); | ||
@@ -292,22 +260,16 @@ } | ||
*/ | ||
export function toFixed(numStr, separatorStr, precision) { | ||
var cutOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; | ||
if (numStr === '') { | ||
return ''; | ||
} | ||
var _trimNumber2 = trimNumber(numStr), | ||
negativeStr = _trimNumber2.negativeStr, | ||
integerStr = _trimNumber2.integerStr, | ||
decimalStr = _trimNumber2.decimalStr; | ||
negativeStr = _trimNumber2.negativeStr, | ||
integerStr = _trimNumber2.integerStr, | ||
decimalStr = _trimNumber2.decimalStr; | ||
var precisionDecimalStr = "".concat(separatorStr).concat(decimalStr); | ||
var numberWithoutDecimal = "".concat(negativeStr).concat(integerStr); | ||
if (precision >= 0) { | ||
// We will get last + 1 number to check if need advanced number | ||
var advancedNum = Number(decimalStr[precision]); | ||
if (advancedNum >= 5 && !cutOnly) { | ||
@@ -317,15 +279,11 @@ var advancedDecimal = getMiniDecimal(numStr).add("".concat(negativeStr, "0.").concat('0'.repeat(precision)).concat(10 - advancedNum)); | ||
} | ||
if (precision === 0) { | ||
return numberWithoutDecimal; | ||
} | ||
return "".concat(numberWithoutDecimal).concat(separatorStr).concat(decimalStr.padEnd(precision, '0').slice(0, precision)); | ||
} | ||
if (precisionDecimalStr === '.0') { | ||
return numberWithoutDecimal; | ||
} | ||
return "".concat(numberWithoutDecimal).concat(precisionDecimalStr); | ||
} |
@@ -5,20 +5,18 @@ import { supportBigInt } from './supportUtil'; | ||
*/ | ||
export function trimNumber(numStr) { | ||
var str = numStr.trim(); | ||
var negative = str.startsWith('-'); | ||
if (negative) { | ||
str = str.slice(1); | ||
} | ||
str = str // Remove decimal 0. `1.000` => `1.`, `1.100` => `1.1` | ||
.replace(/(\.\d*[^0])0*$/, '$1') // Remove useless decimal. `1.` => `1` | ||
.replace(/\.0*$/, '') // Remove integer 0. `0001` => `1`, 000.1' => `.1` | ||
str = str | ||
// Remove decimal 0. `1.000` => `1.`, `1.100` => `1.1` | ||
.replace(/(\.\d*[^0])0*$/, '$1') | ||
// Remove useless decimal. `1.` => `1` | ||
.replace(/\.0*$/, '') | ||
// Remove integer 0. `0001` => `1`, 000.1' => `.1` | ||
.replace(/^0+/, ''); | ||
if (str.startsWith('.')) { | ||
str = "0".concat(str); | ||
} | ||
var trimStr = str || '0'; | ||
@@ -28,7 +26,5 @@ var splitNumber = trimStr.split('.'); | ||
var decimalStr = splitNumber[1] || '0'; | ||
if (integerStr === '0' && decimalStr === '0') { | ||
negative = false; | ||
} | ||
var negativeStr = negative ? '-' : ''; | ||
@@ -52,17 +48,12 @@ return { | ||
*/ | ||
export function getNumberPrecision(number) { | ||
var numStr = String(number); | ||
if (isE(number)) { | ||
var precision = Number(numStr.slice(numStr.indexOf('e-') + 2)); | ||
var decimalMatch = numStr.match(/\.(\d+)/); | ||
if (decimalMatch === null || decimalMatch === void 0 ? void 0 : decimalMatch[1]) { | ||
precision += decimalMatch[1].length; | ||
} | ||
return precision; | ||
} | ||
return numStr.includes('.') && validateNumber(numStr) ? numStr.length - numStr.indexOf('.') - 1 : 0; | ||
@@ -73,6 +64,4 @@ } | ||
*/ | ||
export function num2str(number) { | ||
var numStr = String(number); | ||
if (isE(number)) { | ||
@@ -82,10 +71,7 @@ if (number > Number.MAX_SAFE_INTEGER) { | ||
} | ||
if (number < Number.MIN_SAFE_INTEGER) { | ||
return String(supportBigInt() ? BigInt(number).toString() : Number.MIN_SAFE_INTEGER); | ||
} | ||
numStr = number.toFixed(getNumberPrecision(numStr)); | ||
} | ||
return trimNumber(numStr).fullStr; | ||
@@ -96,12 +82,13 @@ } | ||
return !Number.isNaN(num); | ||
} // Empty | ||
} | ||
// Empty | ||
if (!num) { | ||
return false; | ||
} | ||
return (// Normal type: 11.28 | ||
/^\s*-?\d+(\.\d+)?\s*$/.test(num) || // Pre-number: 1. | ||
/^\s*-?\d+\.\s*$/.test(num) || // Post-number: .1 | ||
return ( | ||
// Normal type: 11.28 | ||
/^\s*-?\d+(\.\d+)?\s*$/.test(num) || | ||
// Pre-number: 1. | ||
/^\s*-?\d+\.\s*$/.test(num) || | ||
// Post-number: .1 | ||
/^\s*-?\.\d+\s*$/.test(num) | ||
@@ -113,8 +100,6 @@ ); | ||
var hasPoint = stepStr.includes('.'); | ||
if (!hasPoint) { | ||
return step + '0'; | ||
} | ||
return trimNumber(stepStr.replace(/(\d)\.(\d)/g, '$1$2.')).fullStr; | ||
} |
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
@@ -9,7 +8,4 @@ value: true | ||
exports.default = useCursor; | ||
var _react = require("react"); | ||
var _warning = _interopRequireDefault(require("rc-util/lib/warning")); | ||
/** | ||
@@ -21,3 +17,2 @@ * Keep input cursor in the correct position if possible. | ||
var selectionRef = (0, _react.useRef)(null); | ||
function recordCursor() { | ||
@@ -27,4 +22,4 @@ // Record position | ||
var start = input.selectionStart, | ||
end = input.selectionEnd, | ||
value = input.value; | ||
end = input.selectionEnd, | ||
value = input.value; | ||
var beforeTxt = value.substring(0, start); | ||
@@ -39,3 +34,4 @@ var afterTxt = value.substring(end); | ||
}; | ||
} catch (e) {// Fix error in Chrome: | ||
} catch (e) { | ||
// Fix error in Chrome: | ||
// Failed to read the 'selectionStart' property from 'HTMLInputElement' | ||
@@ -50,4 +46,2 @@ // http://stackoverflow.com/q/21177489/3040605 | ||
*/ | ||
function restoreCursor() { | ||
@@ -58,7 +52,6 @@ if (input && selectionRef.current && focused) { | ||
var _selectionRef$current = selectionRef.current, | ||
beforeTxt = _selectionRef$current.beforeTxt, | ||
afterTxt = _selectionRef$current.afterTxt, | ||
start = _selectionRef$current.start; | ||
beforeTxt = _selectionRef$current.beforeTxt, | ||
afterTxt = _selectionRef$current.afterTxt, | ||
start = _selectionRef$current.start; | ||
var startPos = value.length; | ||
if (value.endsWith(afterTxt)) { | ||
@@ -71,3 +64,2 @@ startPos = value.length - selectionRef.current.afterTxt.length; | ||
var newIndex = value.indexOf(beforeLastChar, start - 1); | ||
if (newIndex !== -1) { | ||
@@ -77,3 +69,2 @@ startPos = newIndex + 1; | ||
} | ||
input.setSelectionRange(startPos, startPos); | ||
@@ -85,4 +76,3 @@ } catch (e) { | ||
} | ||
return [recordCursor, restoreCursor]; | ||
} |
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
@@ -9,7 +8,4 @@ value: true | ||
exports.default = void 0; | ||
var _react = require("react"); | ||
var _raf = _interopRequireDefault(require("rc-util/lib/raf")); | ||
/** | ||
@@ -20,7 +16,5 @@ * Always trigger latest once when call multiple time | ||
var idRef = (0, _react.useRef)(0); | ||
var cleanUp = function cleanUp() { | ||
_raf.default.cancel(idRef.current); | ||
}; | ||
(0, _react.useEffect)(function () { | ||
@@ -36,3 +30,2 @@ return cleanUp; | ||
}; | ||
exports.default = _default; |
import InputNumber, { InputNumberProps } from './InputNumber'; | ||
export { InputNumberProps }; | ||
export type { InputNumberProps }; | ||
export default InputNumber; |
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
@@ -9,6 +8,4 @@ value: true | ||
exports.default = void 0; | ||
var _InputNumber = _interopRequireDefault(require("./InputNumber")); | ||
var _default = _InputNumber.default; | ||
exports.default = _default; |
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
var _typeof3 = require("@babel/runtime/helpers/typeof"); | ||
Object.defineProperty(exports, "__esModule", { | ||
@@ -11,39 +9,20 @@ value: true | ||
exports.default = void 0; | ||
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); | ||
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); | ||
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); | ||
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); | ||
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); | ||
var React = _interopRequireWildcard(require("react")); | ||
var _classnames = _interopRequireDefault(require("classnames")); | ||
var _KeyCode = _interopRequireDefault(require("rc-util/lib/KeyCode")); | ||
var _useLayoutEffect = require("rc-util/lib/hooks/useLayoutEffect"); | ||
var _ref = require("rc-util/lib/ref"); | ||
var _MiniDecimal = _interopRequireWildcard(require("./utils/MiniDecimal")); | ||
var _StepHandler = _interopRequireDefault(require("./StepHandler")); | ||
var _numberUtil = require("./utils/numberUtil"); | ||
var _useCursor3 = _interopRequireDefault(require("./hooks/useCursor")); | ||
var _useFrame = _interopRequireDefault(require("./hooks/useFrame")); | ||
var _excluded = ["prefixCls", "className", "style", "min", "max", "step", "defaultValue", "value", "disabled", "readOnly", "upHandler", "downHandler", "keyboard", "controls", "stringMode", "parser", "formatter", "precision", "decimalSeparator", "onChange", "onInput", "onPressEnter", "onStep"]; | ||
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } | ||
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
/** | ||
@@ -64,6 +43,4 @@ * We support `stringMode` which need handle correct type when user call in onChange | ||
} | ||
return decimalValue.toNumber(); | ||
}; | ||
var getDecimalIfValidate = function getDecimalIfValidate(value) { | ||
@@ -73,53 +50,48 @@ var decimal = (0, _MiniDecimal.default)(value); | ||
}; | ||
var InputNumber = /*#__PURE__*/React.forwardRef(function (props, ref) { | ||
var _classNames; | ||
var _props$prefixCls = props.prefixCls, | ||
prefixCls = _props$prefixCls === void 0 ? 'rc-input-number' : _props$prefixCls, | ||
className = props.className, | ||
style = props.style, | ||
min = props.min, | ||
max = props.max, | ||
_props$step = props.step, | ||
step = _props$step === void 0 ? 1 : _props$step, | ||
defaultValue = props.defaultValue, | ||
value = props.value, | ||
disabled = props.disabled, | ||
readOnly = props.readOnly, | ||
upHandler = props.upHandler, | ||
downHandler = props.downHandler, | ||
keyboard = props.keyboard, | ||
_props$controls = props.controls, | ||
controls = _props$controls === void 0 ? true : _props$controls, | ||
stringMode = props.stringMode, | ||
parser = props.parser, | ||
formatter = props.formatter, | ||
precision = props.precision, | ||
decimalSeparator = props.decimalSeparator, | ||
onChange = props.onChange, | ||
onInput = props.onInput, | ||
onPressEnter = props.onPressEnter, | ||
onStep = props.onStep, | ||
inputProps = (0, _objectWithoutProperties2.default)(props, _excluded); | ||
prefixCls = _props$prefixCls === void 0 ? 'rc-input-number' : _props$prefixCls, | ||
className = props.className, | ||
style = props.style, | ||
min = props.min, | ||
max = props.max, | ||
_props$step = props.step, | ||
step = _props$step === void 0 ? 1 : _props$step, | ||
defaultValue = props.defaultValue, | ||
value = props.value, | ||
disabled = props.disabled, | ||
readOnly = props.readOnly, | ||
upHandler = props.upHandler, | ||
downHandler = props.downHandler, | ||
keyboard = props.keyboard, | ||
_props$controls = props.controls, | ||
controls = _props$controls === void 0 ? true : _props$controls, | ||
stringMode = props.stringMode, | ||
parser = props.parser, | ||
formatter = props.formatter, | ||
precision = props.precision, | ||
decimalSeparator = props.decimalSeparator, | ||
onChange = props.onChange, | ||
onInput = props.onInput, | ||
onPressEnter = props.onPressEnter, | ||
onStep = props.onStep, | ||
inputProps = (0, _objectWithoutProperties2.default)(props, _excluded); | ||
var inputClassName = "".concat(prefixCls, "-input"); | ||
var inputRef = React.useRef(null); | ||
var _React$useState = React.useState(false), | ||
_React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), | ||
focus = _React$useState2[0], | ||
setFocus = _React$useState2[1]; | ||
_React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), | ||
focus = _React$useState2[0], | ||
setFocus = _React$useState2[1]; | ||
var userTypingRef = React.useRef(false); | ||
var compositionRef = React.useRef(false); | ||
var shiftKeyRef = React.useRef(false); // ============================ Value ============================= | ||
var shiftKeyRef = React.useRef(false); | ||
// ============================ Value ============================= | ||
// Real value control | ||
var _React$useState3 = React.useState(function () { | ||
return (0, _MiniDecimal.default)(value !== null && value !== void 0 ? value : defaultValue); | ||
}), | ||
_React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2), | ||
decimalValue = _React$useState4[0], | ||
setDecimalValue = _React$useState4[1]; | ||
return (0, _MiniDecimal.default)(value !== null && value !== void 0 ? value : defaultValue); | ||
}), | ||
_React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2), | ||
decimalValue = _React$useState4[0], | ||
setDecimalValue = _React$useState4[1]; | ||
function setUncontrolledDecimalValue(newDecimal) { | ||
@@ -129,4 +101,4 @@ if (value === undefined) { | ||
} | ||
} // ====================== Parser & Formatter ====================== | ||
} | ||
// ====================== Parser & Formatter ====================== | ||
/** | ||
@@ -143,4 +115,2 @@ * `precision` is used for formatter & onChange. | ||
*/ | ||
var getPrecision = React.useCallback(function (numStr, userTyping) { | ||
@@ -150,27 +120,21 @@ if (userTyping) { | ||
} | ||
if (precision >= 0) { | ||
return precision; | ||
} | ||
return Math.max((0, _numberUtil.getNumberPrecision)(numStr), (0, _numberUtil.getNumberPrecision)(step)); | ||
}, [precision, step]); // >>> Parser | ||
}, [precision, step]); | ||
// >>> Parser | ||
var mergedParser = React.useCallback(function (num) { | ||
var numStr = String(num); | ||
if (parser) { | ||
return parser(numStr); | ||
} | ||
var parsedStr = numStr; | ||
if (decimalSeparator) { | ||
parsedStr = parsedStr.replace(decimalSeparator, '.'); | ||
} // [Legacy] We still support auto convert `$ 123,456` to `123456` | ||
} | ||
// [Legacy] We still support auto convert `$ 123,456` to `123456` | ||
return parsedStr.replace(/[^\w.-]+/g, ''); | ||
}, [parser, decimalSeparator]); // >>> Formatter | ||
}, [parser, decimalSeparator]); | ||
// >>> Formatter | ||
var inputValueRef = React.useRef(''); | ||
@@ -184,8 +148,6 @@ var mergedFormatter = React.useCallback(function (number, userTyping) { | ||
} | ||
var str = typeof number === 'number' ? (0, _numberUtil.num2str)(number) : number; // User typing will not auto format with precision directly | ||
var str = typeof number === 'number' ? (0, _numberUtil.num2str)(number) : number; | ||
// User typing will not auto format with precision directly | ||
if (!userTyping) { | ||
var mergedPrecision = getPrecision(str, userTyping); | ||
if ((0, _numberUtil.validateNumber)(str) && (decimalSeparator || mergedPrecision >= 0)) { | ||
@@ -197,6 +159,5 @@ // Separator | ||
} | ||
return str; | ||
}, [formatter, getPrecision, decimalSeparator]); // ========================== InputValue ========================== | ||
}, [formatter, getPrecision, decimalSeparator]); | ||
// ========================== InputValue ========================== | ||
/** | ||
@@ -211,26 +172,22 @@ * Input text value control | ||
*/ | ||
var _React$useState5 = React.useState(function () { | ||
var initValue = defaultValue !== null && defaultValue !== void 0 ? defaultValue : value; | ||
if (decimalValue.isInvalidate() && ['string', 'number'].includes((0, _typeof2.default)(initValue))) { | ||
return Number.isNaN(initValue) ? '' : initValue; | ||
} | ||
return mergedFormatter(decimalValue.toString(), false); | ||
}), | ||
_React$useState6 = (0, _slicedToArray2.default)(_React$useState5, 2), | ||
inputValue = _React$useState6[0], | ||
setInternalInputValue = _React$useState6[1]; | ||
inputValueRef.current = inputValue; // Should always be string | ||
var initValue = defaultValue !== null && defaultValue !== void 0 ? defaultValue : value; | ||
if (decimalValue.isInvalidate() && ['string', 'number'].includes((0, _typeof2.default)(initValue))) { | ||
return Number.isNaN(initValue) ? '' : initValue; | ||
} | ||
return mergedFormatter(decimalValue.toString(), false); | ||
}), | ||
_React$useState6 = (0, _slicedToArray2.default)(_React$useState5, 2), | ||
inputValue = _React$useState6[0], | ||
setInternalInputValue = _React$useState6[1]; | ||
inputValueRef.current = inputValue; | ||
// Should always be string | ||
function setInputValue(newValue, userTyping) { | ||
setInternalInputValue(mergedFormatter( // Invalidate number is sometime passed by external control, we should let it go | ||
setInternalInputValue(mergedFormatter( | ||
// Invalidate number is sometime passed by external control, we should let it go | ||
// Otherwise is controlled by internal interactive logic which check by userTyping | ||
// You can ref 'show limited value when input is not focused' test for more info. | ||
newValue.isInvalidate() ? newValue.toString(false) : newValue.toString(!userTyping), userTyping)); | ||
} // >>> Max & Min limit | ||
} | ||
// >>> Max & Min limit | ||
var maxDecimal = React.useMemo(function () { | ||
@@ -246,3 +203,2 @@ return getDecimalIfValidate(max); | ||
} | ||
return maxDecimal.lessEquals(decimalValue); | ||
@@ -254,11 +210,10 @@ }, [maxDecimal, decimalValue]); | ||
} | ||
return decimalValue.lessEquals(minDecimal); | ||
}, [minDecimal, decimalValue]); // Cursor controller | ||
}, [minDecimal, decimalValue]); | ||
// Cursor controller | ||
var _useCursor = (0, _useCursor3.default)(inputRef.current, focus), | ||
_useCursor2 = (0, _slicedToArray2.default)(_useCursor, 2), | ||
recordCursor = _useCursor2[0], | ||
restoreCursor = _useCursor2[1]; // ============================= Data ============================= | ||
_useCursor2 = (0, _slicedToArray2.default)(_useCursor, 2), | ||
recordCursor = _useCursor2[0], | ||
restoreCursor = _useCursor2[1]; | ||
// ============================= Data ============================= | ||
/** | ||
@@ -271,4 +226,2 @@ * Find target value closet within range. | ||
*/ | ||
var getRangeValue = function getRangeValue(target) { | ||
@@ -278,9 +231,7 @@ // target > max | ||
return maxDecimal; | ||
} // target < min | ||
} | ||
// target < min | ||
if (minDecimal && !minDecimal.lessEquals(target)) { | ||
return minDecimal; | ||
} | ||
return null; | ||
@@ -291,4 +242,2 @@ }; | ||
*/ | ||
var isInRange = function isInRange(target) { | ||
@@ -301,10 +250,8 @@ return !getRangeValue(target); | ||
*/ | ||
var triggerValueUpdate = function triggerValueUpdate(newValue, userTyping) { | ||
var updateValue = newValue; | ||
var isRangeValidate = isInRange(updateValue) || updateValue.isEmpty(); // Skip align value when trigger value is empty. | ||
var isRangeValidate = isInRange(updateValue) || updateValue.isEmpty(); | ||
// Skip align value when trigger value is empty. | ||
// We just trigger onChange(null) | ||
// This should not block user typing | ||
if (!updateValue.isEmpty() && !userTyping) { | ||
@@ -315,21 +262,18 @@ // Revert value in range if needed | ||
} | ||
if (!readOnly && !disabled && isRangeValidate) { | ||
var numStr = updateValue.toString(); | ||
var mergedPrecision = getPrecision(numStr, userTyping); | ||
if (mergedPrecision >= 0) { | ||
updateValue = (0, _MiniDecimal.default)((0, _MiniDecimal.toFixed)(numStr, '.', mergedPrecision)); // When to fixed. The value may out of min & max range. | ||
updateValue = (0, _MiniDecimal.default)((0, _MiniDecimal.toFixed)(numStr, '.', mergedPrecision)); | ||
// When to fixed. The value may out of min & max range. | ||
// 4 in [0, 3.8] => 3.8 => 4 (toFixed) | ||
if (!isInRange(updateValue)) { | ||
updateValue = (0, _MiniDecimal.default)((0, _MiniDecimal.toFixed)(numStr, '.', mergedPrecision, true)); | ||
} | ||
} // Trigger event | ||
} | ||
// Trigger event | ||
if (!updateValue.equals(decimalValue)) { | ||
setUncontrolledDecimalValue(updateValue); | ||
onChange === null || onChange === void 0 ? void 0 : onChange(updateValue.isEmpty() ? null : getDecimalValue(stringMode, updateValue)); // Reformat input if value is not controlled | ||
onChange === null || onChange === void 0 ? void 0 : onChange(updateValue.isEmpty() ? null : getDecimalValue(stringMode, updateValue)); | ||
// Reformat input if value is not controlled | ||
if (value === undefined) { | ||
@@ -339,37 +283,30 @@ setInputValue(updateValue, userTyping); | ||
} | ||
return updateValue; | ||
} | ||
return decimalValue; | ||
}; // ========================== User Input ========================== | ||
var onNextPromise = (0, _useFrame.default)(); // >>> Collect input value | ||
}; | ||
// ========================== User Input ========================== | ||
var onNextPromise = (0, _useFrame.default)(); | ||
// >>> Collect input value | ||
var collectInputValue = function collectInputValue(inputStr) { | ||
recordCursor(); // Update inputValue incase input can not parse as number | ||
setInternalInputValue(inputStr); // Parse number | ||
recordCursor(); | ||
// Update inputValue incase input can not parse as number | ||
setInternalInputValue(inputStr); | ||
// Parse number | ||
if (!compositionRef.current) { | ||
var finalValue = mergedParser(inputStr); | ||
var finalDecimal = (0, _MiniDecimal.default)(finalValue); | ||
if (!finalDecimal.isNaN()) { | ||
triggerValueUpdate(finalDecimal, true); | ||
} | ||
} // Trigger onInput later to let user customize value if they want do handle something after onChange | ||
onInput === null || onInput === void 0 ? void 0 : onInput(inputStr); // optimize for chinese input experience | ||
} | ||
// Trigger onInput later to let user customize value if they want do handle something after onChange | ||
onInput === null || onInput === void 0 ? void 0 : onInput(inputStr); | ||
// optimize for chinese input experience | ||
// https://github.com/ant-design/ant-design/issues/8196 | ||
onNextPromise(function () { | ||
var nextInputStr = inputStr; | ||
if (!parser) { | ||
nextInputStr = inputStr.replace(/。/g, '.'); | ||
} | ||
if (nextInputStr !== inputStr) { | ||
@@ -379,37 +316,29 @@ collectInputValue(nextInputStr); | ||
}); | ||
}; // >>> Composition | ||
}; | ||
// >>> Composition | ||
var onCompositionStart = function onCompositionStart() { | ||
compositionRef.current = true; | ||
}; | ||
var onCompositionEnd = function onCompositionEnd() { | ||
compositionRef.current = false; | ||
collectInputValue(inputRef.current.value); | ||
}; // >>> Input | ||
}; | ||
// >>> Input | ||
var onInternalInput = function onInternalInput(e) { | ||
collectInputValue(e.target.value); | ||
}; // ============================= Step ============================= | ||
}; | ||
// ============================= Step ============================= | ||
var onInternalStep = function onInternalStep(up) { | ||
var _inputRef$current; | ||
// Ignore step since out of range | ||
if (up && upDisabled || !up && downDisabled) { | ||
return; | ||
} // Clear typing status since it may caused by up & down key. | ||
} | ||
// Clear typing status since it may caused by up & down key. | ||
// We should sync with input value. | ||
userTypingRef.current = false; | ||
var stepDecimal = (0, _MiniDecimal.default)(shiftKeyRef.current ? (0, _numberUtil.getDecupleSteps)(step) : step); | ||
if (!up) { | ||
stepDecimal = stepDecimal.negate(); | ||
} | ||
var target = (decimalValue || (0, _MiniDecimal.default)(0)).add(stepDecimal.toString()); | ||
@@ -422,13 +351,10 @@ var updatedValue = triggerValueUpdate(target, false); | ||
(_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus(); | ||
}; // ============================ Flush ============================= | ||
}; | ||
// ============================ Flush ============================= | ||
/** | ||
* Flush current input content to trigger value change & re-formatter input if needed | ||
*/ | ||
var flushInputValue = function flushInputValue(userTyping) { | ||
var parsedValue = (0, _MiniDecimal.default)(mergedParser(inputValue)); | ||
var formatValue = parsedValue; | ||
if (!parsedValue.isNaN()) { | ||
@@ -441,3 +367,2 @@ // Only validate value or empty value can be re-fill to inputValue | ||
} | ||
if (value !== undefined) { | ||
@@ -451,8 +376,10 @@ // Reset back with controlled value first | ||
}; | ||
// Solve the issue of the event triggering sequence when entering numbers in chinese input (Safari) | ||
var onBeforeInput = function onBeforeInput() { | ||
userTypingRef.current = true; | ||
}; | ||
var onKeyDown = function onKeyDown(event) { | ||
var which = event.which, | ||
shiftKey = event.shiftKey; | ||
shiftKey = event.shiftKey; | ||
userTypingRef.current = true; | ||
if (shiftKey) { | ||
@@ -463,3 +390,2 @@ shiftKeyRef.current = true; | ||
} | ||
if (which === _KeyCode.default.ENTER) { | ||
@@ -469,12 +395,9 @@ if (!compositionRef.current) { | ||
} | ||
flushInputValue(false); | ||
onPressEnter === null || onPressEnter === void 0 ? void 0 : onPressEnter(event); | ||
} | ||
if (keyboard === false) { | ||
return; | ||
} // Do step | ||
} | ||
// Do step | ||
if (!compositionRef.current && [_KeyCode.default.UP, _KeyCode.default.DOWN].includes(which)) { | ||
@@ -485,9 +408,7 @@ onInternalStep(_KeyCode.default.UP === which); | ||
}; | ||
var onKeyUp = function onKeyUp() { | ||
userTypingRef.current = false; | ||
shiftKeyRef.current = false; | ||
}; // >>> Focus & Blur | ||
}; | ||
// >>> Focus & Blur | ||
var onBlur = function onBlur() { | ||
@@ -497,6 +418,5 @@ flushInputValue(false); | ||
userTypingRef.current = false; | ||
}; // ========================== Controlled ========================== | ||
}; | ||
// ========================== Controlled ========================== | ||
// Input by precision | ||
(0, _useLayoutEffect.useLayoutUpdateEffect)(function () { | ||
@@ -506,10 +426,10 @@ if (!decimalValue.isInvalidate()) { | ||
} | ||
}, [precision]); // Input by value | ||
}, [precision]); | ||
// Input by value | ||
(0, _useLayoutEffect.useLayoutUpdateEffect)(function () { | ||
var newValue = (0, _MiniDecimal.default)(value); | ||
setDecimalValue(newValue); | ||
var currentParsedValue = (0, _MiniDecimal.default)(mergedParser(inputValue)); // When user typing from `1.2` to `1.`, we should not convert to `1` immediately. | ||
var currentParsedValue = (0, _MiniDecimal.default)(mergedParser(inputValue)); | ||
// When user typing from `1.2` to `1.`, we should not convert to `1` immediately. | ||
// But let it go if user set `formatter` | ||
if (!newValue.equals(currentParsedValue) || !userTypingRef.current || formatter) { | ||
@@ -519,4 +439,4 @@ // Update value as effect | ||
} | ||
}, [value]); // ============================ Cursor ============================ | ||
}, [value]); | ||
// ============================ Cursor ============================ | ||
(0, _useLayoutEffect.useLayoutUpdateEffect)(function () { | ||
@@ -526,4 +446,4 @@ if (formatter) { | ||
} | ||
}, [inputValue]); // ============================ Render ============================ | ||
}, [inputValue]); | ||
// ============================ Render ============================ | ||
return /*#__PURE__*/React.createElement("div", { | ||
@@ -539,3 +459,4 @@ className: (0, _classnames.default)(prefixCls, className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-focused"), focus), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-disabled"), disabled), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-readonly"), readOnly), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-not-a-number"), decimalValue.isNaN()), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-out-of-range"), !decimalValue.isInvalidate() && !isInRange(decimalValue)), _classNames)), | ||
onCompositionStart: onCompositionStart, | ||
onCompositionEnd: onCompositionEnd | ||
onCompositionEnd: onCompositionEnd, | ||
onBeforeInput: onBeforeInput | ||
}, controls && /*#__PURE__*/React.createElement(_StepHandler.default, { | ||
@@ -542,0 +463,0 @@ prefixCls: prefixCls, |
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
var _typeof = require("@babel/runtime/helpers/typeof"); | ||
Object.defineProperty(exports, "__esModule", { | ||
@@ -11,17 +9,9 @@ value: true | ||
exports.default = StepHandler; | ||
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); | ||
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); | ||
var React = _interopRequireWildcard(require("react")); | ||
var _classnames = _interopRequireDefault(require("classnames")); | ||
var _isMobile = _interopRequireDefault(require("rc-util/lib/isMobile")); | ||
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } | ||
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } | ||
/* eslint-disable react/no-unknown-property */ | ||
@@ -36,42 +26,36 @@ | ||
*/ | ||
var STEP_DELAY = 600; | ||
function StepHandler(_ref) { | ||
var prefixCls = _ref.prefixCls, | ||
upNode = _ref.upNode, | ||
downNode = _ref.downNode, | ||
upDisabled = _ref.upDisabled, | ||
downDisabled = _ref.downDisabled, | ||
onStep = _ref.onStep; | ||
upNode = _ref.upNode, | ||
downNode = _ref.downNode, | ||
upDisabled = _ref.upDisabled, | ||
downDisabled = _ref.downDisabled, | ||
onStep = _ref.onStep; | ||
// ======================== Step ======================== | ||
var stepTimeoutRef = React.useRef(); | ||
var onStepRef = React.useRef(); | ||
onStepRef.current = onStep; // We will interval update step when hold mouse down | ||
onStepRef.current = onStep; | ||
// We will interval update step when hold mouse down | ||
var onStepMouseDown = function onStepMouseDown(e, up) { | ||
e.preventDefault(); | ||
onStepRef.current(up); // Loop step for interval | ||
onStepRef.current(up); | ||
// Loop step for interval | ||
function loopStep() { | ||
onStepRef.current(up); | ||
stepTimeoutRef.current = setTimeout(loopStep, STEP_INTERVAL); | ||
} // First time press will wait some time to trigger loop step update | ||
} | ||
// First time press will wait some time to trigger loop step update | ||
stepTimeoutRef.current = setTimeout(loopStep, STEP_DELAY); | ||
}; | ||
var onStopStep = function onStopStep() { | ||
clearTimeout(stepTimeoutRef.current); | ||
}; | ||
React.useEffect(function () { | ||
return onStopStep; | ||
}, []); // ======================= Render ======================= | ||
}, []); | ||
// ======================= Render ======================= | ||
if ((0, _isMobile.default)()) { | ||
return null; | ||
} | ||
var handlerClassName = "".concat(prefixCls, "-handler"); | ||
@@ -78,0 +62,0 @@ var upClassName = (0, _classnames.default)(handlerClassName, "".concat(handlerClassName, "-up"), (0, _defineProperty2.default)({}, "".concat(handlerClassName, "-up-disabled"), upDisabled)); |
"use strict"; | ||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); | ||
Object.defineProperty(exports, "__esModule", { | ||
@@ -11,13 +10,7 @@ value: true | ||
exports.toFixed = toFixed; | ||
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); | ||
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); | ||
var _numberUtil = require("./numberUtil"); | ||
var _supportUtil = require("./supportUtil"); | ||
/* eslint-disable max-classes-per-file */ | ||
/** | ||
@@ -32,3 +25,2 @@ * We can remove this when IE not support anymore | ||
this.empty = void 0; | ||
if (!value && value !== 0 || !String(value).trim()) { | ||
@@ -38,7 +30,5 @@ this.empty = true; | ||
} | ||
this.origin = String(value); | ||
this.number = Number(value); | ||
} | ||
(0, _createClass2.default)(NumberDecimal, [{ | ||
@@ -55,19 +45,14 @@ key: "negate", | ||
} | ||
var target = Number(value); | ||
if (Number.isNaN(target)) { | ||
return this; | ||
} | ||
var number = this.number + target; // [Legacy] Back to safe integer | ||
var number = this.number + target; | ||
// [Legacy] Back to safe integer | ||
if (number > Number.MAX_SAFE_INTEGER) { | ||
return new NumberDecimal(Number.MAX_SAFE_INTEGER); | ||
} | ||
if (number < Number.MIN_SAFE_INTEGER) { | ||
return new NumberDecimal(Number.MIN_SAFE_INTEGER); | ||
} | ||
var maxPrecision = Math.max((0, _numberUtil.getNumberPrecision)(this.number), (0, _numberUtil.getNumberPrecision)(target)); | ||
@@ -110,11 +95,8 @@ return new NumberDecimal(number.toFixed(maxPrecision)); | ||
var safe = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; | ||
if (!safe) { | ||
return this.origin; | ||
} | ||
if (this.isInvalidate()) { | ||
return ''; | ||
} | ||
return (0, _numberUtil.num2str)(this.number); | ||
@@ -125,7 +107,6 @@ } | ||
}(); | ||
exports.NumberDecimal = NumberDecimal; | ||
var BigIntDecimal = /*#__PURE__*/function () { | ||
/** BigInt will convert `0009` to `9`. We need record the len of decimal */ | ||
function BigIntDecimal(value) { | ||
@@ -140,3 +121,2 @@ (0, _classCallCheck2.default)(this, BigIntDecimal); | ||
this.nan = void 0; | ||
if (!value && value !== 0 || !String(value).trim()) { | ||
@@ -146,5 +126,4 @@ this.empty = true; | ||
} | ||
this.origin = String(value); // Act like Number convert | ||
this.origin = String(value); | ||
// Act like Number convert | ||
if (value === '-') { | ||
@@ -154,11 +133,8 @@ this.nan = true; | ||
} | ||
var mergedValue = value; // We need convert back to Number since it require `toFixed` to handle this | ||
var mergedValue = value; | ||
// We need convert back to Number since it require `toFixed` to handle this | ||
if ((0, _numberUtil.isE)(mergedValue)) { | ||
mergedValue = Number(mergedValue); | ||
} | ||
mergedValue = typeof mergedValue === 'string' ? mergedValue : (0, _numberUtil.num2str)(mergedValue); | ||
if ((0, _numberUtil.validateNumber)(mergedValue)) { | ||
@@ -176,3 +152,2 @@ var trimRet = (0, _numberUtil.trimNumber)(mergedValue); | ||
} | ||
(0, _createClass2.default)(BigIntDecimal, [{ | ||
@@ -197,3 +172,2 @@ key: "getMark", | ||
*/ | ||
}, { | ||
@@ -218,18 +192,14 @@ key: "alignDecimal", | ||
} | ||
var offset = new BigIntDecimal(value); | ||
if (offset.isInvalidate()) { | ||
return this; | ||
} | ||
var maxDecimalLength = Math.max(this.getDecimalStr().length, offset.getDecimalStr().length); | ||
var myAlignedDecimal = this.alignDecimal(maxDecimalLength); | ||
var offsetAlignedDecimal = offset.alignDecimal(maxDecimalLength); | ||
var valueStr = (myAlignedDecimal + offsetAlignedDecimal).toString(); // We need fill string length back to `maxDecimalLength` to avoid parser failed | ||
var valueStr = (myAlignedDecimal + offsetAlignedDecimal).toString(); | ||
// We need fill string length back to `maxDecimalLength` to avoid parser failed | ||
var _trimNumber = (0, _numberUtil.trimNumber)(valueStr), | ||
negativeStr = _trimNumber.negativeStr, | ||
trimStr = _trimNumber.trimStr; | ||
negativeStr = _trimNumber.negativeStr, | ||
trimStr = _trimNumber.trimStr; | ||
var hydrateValueStr = "".concat(negativeStr).concat(trimStr.padStart(maxDecimalLength + 1, '0')); | ||
@@ -269,3 +239,2 @@ return new BigIntDecimal("".concat(hydrateValueStr.slice(0, -maxDecimalLength), ".").concat(hydrateValueStr.slice(-maxDecimalLength))); | ||
} | ||
return Number(this.toString()); | ||
@@ -277,11 +246,8 @@ } | ||
var safe = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; | ||
if (!safe) { | ||
return this.origin; | ||
} | ||
if (this.isInvalidate()) { | ||
return ''; | ||
} | ||
return (0, _numberUtil.trimNumber)("".concat(this.getMark()).concat(this.getIntegerStr(), ".").concat(this.getDecimalStr())).fullStr; | ||
@@ -292,5 +258,3 @@ } | ||
}(); | ||
exports.BigIntDecimal = BigIntDecimal; | ||
function getMiniDecimal(value) { | ||
@@ -302,3 +266,2 @@ // We use BigInt here. | ||
} | ||
return new NumberDecimal(value); | ||
@@ -310,23 +273,16 @@ } | ||
*/ | ||
function toFixed(numStr, separatorStr, precision) { | ||
var cutOnly = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; | ||
if (numStr === '') { | ||
return ''; | ||
} | ||
var _trimNumber2 = (0, _numberUtil.trimNumber)(numStr), | ||
negativeStr = _trimNumber2.negativeStr, | ||
integerStr = _trimNumber2.integerStr, | ||
decimalStr = _trimNumber2.decimalStr; | ||
negativeStr = _trimNumber2.negativeStr, | ||
integerStr = _trimNumber2.integerStr, | ||
decimalStr = _trimNumber2.decimalStr; | ||
var precisionDecimalStr = "".concat(separatorStr).concat(decimalStr); | ||
var numberWithoutDecimal = "".concat(negativeStr).concat(integerStr); | ||
if (precision >= 0) { | ||
// We will get last + 1 number to check if need advanced number | ||
var advancedNum = Number(decimalStr[precision]); | ||
if (advancedNum >= 5 && !cutOnly) { | ||
@@ -336,15 +292,11 @@ var advancedDecimal = getMiniDecimal(numStr).add("".concat(negativeStr, "0.").concat('0'.repeat(precision)).concat(10 - advancedNum)); | ||
} | ||
if (precision === 0) { | ||
return numberWithoutDecimal; | ||
} | ||
return "".concat(numberWithoutDecimal).concat(separatorStr).concat(decimalStr.padEnd(precision, '0').slice(0, precision)); | ||
} | ||
if (precisionDecimalStr === '.0') { | ||
return numberWithoutDecimal; | ||
} | ||
return "".concat(numberWithoutDecimal).concat(precisionDecimalStr); | ||
} |
@@ -12,5 +12,3 @@ "use strict"; | ||
exports.validateNumber = validateNumber; | ||
var _supportUtil = require("./supportUtil"); | ||
/** | ||
@@ -22,16 +20,15 @@ * Format string number to readable number | ||
var negative = str.startsWith('-'); | ||
if (negative) { | ||
str = str.slice(1); | ||
} | ||
str = str // Remove decimal 0. `1.000` => `1.`, `1.100` => `1.1` | ||
.replace(/(\.\d*[^0])0*$/, '$1') // Remove useless decimal. `1.` => `1` | ||
.replace(/\.0*$/, '') // Remove integer 0. `0001` => `1`, 000.1' => `.1` | ||
str = str | ||
// Remove decimal 0. `1.000` => `1.`, `1.100` => `1.1` | ||
.replace(/(\.\d*[^0])0*$/, '$1') | ||
// Remove useless decimal. `1.` => `1` | ||
.replace(/\.0*$/, '') | ||
// Remove integer 0. `0001` => `1`, 000.1' => `.1` | ||
.replace(/^0+/, ''); | ||
if (str.startsWith('.')) { | ||
str = "0".concat(str); | ||
} | ||
var trimStr = str || '0'; | ||
@@ -41,7 +38,5 @@ var splitNumber = trimStr.split('.'); | ||
var decimalStr = splitNumber[1] || '0'; | ||
if (integerStr === '0' && decimalStr === '0') { | ||
negative = false; | ||
} | ||
var negativeStr = negative ? '-' : ''; | ||
@@ -57,3 +52,2 @@ return { | ||
} | ||
function isE(number) { | ||
@@ -67,18 +61,12 @@ var str = String(number); | ||
*/ | ||
function getNumberPrecision(number) { | ||
var numStr = String(number); | ||
if (isE(number)) { | ||
var precision = Number(numStr.slice(numStr.indexOf('e-') + 2)); | ||
var decimalMatch = numStr.match(/\.(\d+)/); | ||
if (decimalMatch === null || decimalMatch === void 0 ? void 0 : decimalMatch[1]) { | ||
precision += decimalMatch[1].length; | ||
} | ||
return precision; | ||
} | ||
return numStr.includes('.') && validateNumber(numStr) ? numStr.length - numStr.indexOf('.') - 1 : 0; | ||
@@ -89,7 +77,4 @@ } | ||
*/ | ||
function num2str(number) { | ||
var numStr = String(number); | ||
if (isE(number)) { | ||
@@ -99,39 +84,33 @@ if (number > Number.MAX_SAFE_INTEGER) { | ||
} | ||
if (number < Number.MIN_SAFE_INTEGER) { | ||
return String((0, _supportUtil.supportBigInt)() ? BigInt(number).toString() : Number.MIN_SAFE_INTEGER); | ||
} | ||
numStr = number.toFixed(getNumberPrecision(numStr)); | ||
} | ||
return trimNumber(numStr).fullStr; | ||
} | ||
function validateNumber(num) { | ||
if (typeof num === 'number') { | ||
return !Number.isNaN(num); | ||
} // Empty | ||
} | ||
// Empty | ||
if (!num) { | ||
return false; | ||
} | ||
return (// Normal type: 11.28 | ||
/^\s*-?\d+(\.\d+)?\s*$/.test(num) || // Pre-number: 1. | ||
/^\s*-?\d+\.\s*$/.test(num) || // Post-number: .1 | ||
return ( | ||
// Normal type: 11.28 | ||
/^\s*-?\d+(\.\d+)?\s*$/.test(num) || | ||
// Pre-number: 1. | ||
/^\s*-?\d+\.\s*$/.test(num) || | ||
// Post-number: .1 | ||
/^\s*-?\.\d+\s*$/.test(num) | ||
); | ||
} | ||
function getDecupleSteps(step) { | ||
var stepStr = typeof step === 'number' ? num2str(step) : trimNumber(step).fullStr; | ||
var hasPoint = stepStr.includes('.'); | ||
if (!hasPoint) { | ||
return step + '0'; | ||
} | ||
return trimNumber(stepStr.replace(/(\d)\.(\d)/g, '$1$2.')).fullStr; | ||
} |
@@ -7,5 +7,4 @@ "use strict"; | ||
exports.supportBigInt = supportBigInt; | ||
function supportBigInt() { | ||
return typeof BigInt === 'function'; | ||
} |
{ | ||
"name": "rc-input-number", | ||
"version": "7.3.9", | ||
"version": "7.3.11", | ||
"description": "React input-number component", | ||
@@ -47,3 +47,3 @@ "keywords": [ | ||
"@testing-library/jest-dom": "^5.16.4", | ||
"@testing-library/react": "13.3.0", | ||
"@testing-library/react": "^13.3.0", | ||
"@types/classnames": "^2.2.9", | ||
@@ -50,0 +50,0 @@ "@types/enzyme": "^3.10.8", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
101170
2461