rc-input-number
Advanced tools
Comparing version 7.3.4 to 7.3.5
@@ -10,11 +10,19 @@ import _extends from "@babel/runtime/helpers/esm/extends"; | ||
import KeyCode from "rc-util/es/KeyCode"; | ||
import { useLayoutUpdateEffect } from "rc-util/es/hooks/useLayoutEffect"; | ||
import { composeRef } from "rc-util/es/ref"; | ||
import getMiniDecimal, { toFixed } from './utils/MiniDecimal'; | ||
import getMiniDecimal, { roundDownUnsignedDecimal, roundUpUnsignedDecimal, toFixed } from './utils/MiniDecimal'; | ||
import StepHandler from './StepHandler'; | ||
import { getNumberPrecision, num2str, validateNumber } from './utils/numberUtil'; | ||
import { getNumberPrecision, num2str, getDecupleSteps, trimNumber, validateNumber } from './utils/numberUtil'; | ||
import useCursor from './hooks/useCursor'; | ||
import useUpdateEffect from './hooks/useUpdateEffect'; | ||
import useFrame from './hooks/useFrame'; | ||
/** | ||
* We support `stringMode` which need handle correct type when user call in onChange | ||
* format max or min value | ||
* 1. if isInvalid return null | ||
* 2. if precision is undefined, return decimal | ||
* 3. format with precision | ||
* I. if max > 0, round down with precision. Example: max= 3.5, precision=0 afterFormat: 3 | ||
* II. if max < 0, round up with precision. Example: max= -3.5, precision=0 afterFormat: -4 | ||
* III. if min > 0, round up with precision. Example: min= 3.5, precision=0 afterFormat: 4 | ||
* IV. if min < 0, round down with precision. Example: max= -3.5, precision=0 afterFormat: -3 | ||
*/ | ||
@@ -30,5 +38,26 @@ | ||
var getDecimalIfValidate = function getDecimalIfValidate(value) { | ||
var getDecimalIfValidate = function getDecimalIfValidate(value, precision, isMax) { | ||
var decimal = getMiniDecimal(value); | ||
return decimal.isInvalidate() ? null : decimal; | ||
if (decimal.isInvalidate()) { | ||
return null; | ||
} | ||
if (precision === undefined) { | ||
return decimal; | ||
} | ||
var _trimNumber = trimNumber(decimal.toString()), | ||
negative = _trimNumber.negative, | ||
integerStr = _trimNumber.integerStr, | ||
decimalStr = _trimNumber.decimalStr, | ||
negativeStr = _trimNumber.negativeStr; | ||
var unSignedNumberStr = integerStr + '.' + decimalStr; | ||
if (isMax && !negative || !isMax && negative) { | ||
return getMiniDecimal(negativeStr + roundDownUnsignedDecimal(unSignedNumberStr, precision)); | ||
} else { | ||
return getMiniDecimal(negativeStr + roundUpUnsignedDecimal(unSignedNumberStr, precision)); | ||
} | ||
}; | ||
@@ -76,3 +105,4 @@ | ||
var userTypingRef = React.useRef(false); | ||
var compositionRef = React.useRef(false); // ============================ Value ============================= | ||
var compositionRef = React.useRef(false); | ||
var shiftKeyRef = React.useRef(false); // ============================ Value ============================= | ||
// Real value control | ||
@@ -193,7 +223,7 @@ | ||
var maxDecimal = React.useMemo(function () { | ||
return getDecimalIfValidate(max); | ||
}, [max]); | ||
return getDecimalIfValidate(max, precision, true); | ||
}, [max, precision]); | ||
var minDecimal = React.useMemo(function () { | ||
return getDecimalIfValidate(min); | ||
}, [min]); | ||
return getDecimalIfValidate(min, precision, false); | ||
}, [min, precision]); | ||
var upDisabled = React.useMemo(function () { | ||
@@ -352,3 +382,3 @@ if (!maxDecimal || !decimalValue || decimalValue.isInvalidate()) { | ||
userTypingRef.current = false; | ||
var stepDecimal = getMiniDecimal(step); | ||
var stepDecimal = getMiniDecimal(shiftKeyRef.current ? getDecupleSteps(step) : step); | ||
@@ -362,3 +392,3 @@ if (!up) { | ||
onStep === null || onStep === void 0 ? void 0 : onStep(getDecimalValue(stringMode, updatedValue), { | ||
offset: step, | ||
offset: shiftKeyRef.current ? getDecupleSteps(step) : step, | ||
type: up ? 'up' : 'down' | ||
@@ -396,5 +426,12 @@ }); | ||
var onKeyDown = function onKeyDown(event) { | ||
var which = event.which; | ||
var which = event.which, | ||
shiftKey = event.shiftKey; | ||
userTypingRef.current = true; | ||
if (shiftKey) { | ||
shiftKeyRef.current = true; | ||
} else { | ||
shiftKeyRef.current = false; | ||
} | ||
if (which === KeyCode.ENTER) { | ||
@@ -422,2 +459,3 @@ if (!compositionRef.current) { | ||
userTypingRef.current = false; | ||
shiftKeyRef.current = false; | ||
}; // >>> Focus & Blur | ||
@@ -434,3 +472,3 @@ | ||
useUpdateEffect(function () { | ||
useLayoutUpdateEffect(function () { | ||
if (!decimalValue.isInvalidate()) { | ||
@@ -441,3 +479,3 @@ setInputValue(decimalValue, false); | ||
useUpdateEffect(function () { | ||
useLayoutUpdateEffect(function () { | ||
var newValue = getMiniDecimal(value); | ||
@@ -454,3 +492,3 @@ setDecimalValue(newValue); | ||
useUpdateEffect(function () { | ||
useLayoutUpdateEffect(function () { | ||
if (formatter) { | ||
@@ -457,0 +495,0 @@ restoreCursor(); |
@@ -65,4 +65,12 @@ export declare type ValueType = string | number; | ||
/** | ||
* round up an unsigned number str, like: 1.4 -> 2, 1.5 -> 2 | ||
*/ | ||
export declare function roundUpUnsignedDecimal(numStr: string, precision: number): any; | ||
/** | ||
* round up an unsigned number str, like: 1.4 -> 1, 1.5 -> 1 | ||
*/ | ||
export declare function roundDownUnsignedDecimal(numStr: string, precision: number): string; | ||
/** | ||
* Align the logic of toFixed to around like 1.5 => 2 | ||
*/ | ||
export declare function toFixed(numStr: string, separatorStr: string, precision?: number): any; |
@@ -275,2 +275,32 @@ import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck"; | ||
/** | ||
* round up an unsigned number str, like: 1.4 -> 2, 1.5 -> 2 | ||
*/ | ||
export function roundUpUnsignedDecimal(numStr, precision) { | ||
var _trimNumber2 = trimNumber(numStr), | ||
integerStr = _trimNumber2.integerStr, | ||
decimalStr = _trimNumber2.decimalStr; | ||
var advancedDecimal = getMiniDecimal(integerStr + '.' + decimalStr).add("0.".concat('0'.repeat(precision), 5)); | ||
return toFixed(advancedDecimal.toString(), '.', precision); | ||
} | ||
/** | ||
* round up an unsigned number str, like: 1.4 -> 1, 1.5 -> 1 | ||
*/ | ||
export function roundDownUnsignedDecimal(numStr, precision) { | ||
var _trimNumber3 = trimNumber(numStr), | ||
negativeStr = _trimNumber3.negativeStr, | ||
integerStr = _trimNumber3.integerStr, | ||
decimalStr = _trimNumber3.decimalStr; | ||
var numberWithoutDecimal = "".concat(negativeStr).concat(integerStr); | ||
if (precision === 0) { | ||
return integerStr; | ||
} | ||
return "".concat(numberWithoutDecimal, ".").concat(decimalStr.padEnd(precision, '0').slice(0, precision)); | ||
} | ||
/** | ||
* Align the logic of toFixed to around like 1.5 => 2 | ||
@@ -284,6 +314,6 @@ */ | ||
var _trimNumber2 = trimNumber(numStr), | ||
negativeStr = _trimNumber2.negativeStr, | ||
integerStr = _trimNumber2.integerStr, | ||
decimalStr = _trimNumber2.decimalStr; | ||
var _trimNumber4 = trimNumber(numStr), | ||
negativeStr = _trimNumber4.negativeStr, | ||
integerStr = _trimNumber4.integerStr, | ||
decimalStr = _trimNumber4.decimalStr; | ||
@@ -290,0 +320,0 @@ var precisionDecimalStr = "".concat(separatorStr).concat(decimalStr); |
@@ -23,1 +23,2 @@ /** | ||
export declare function validateNumber(num: string | number): boolean; | ||
export declare function getDecupleSteps(step: string | number): string; |
@@ -103,2 +103,12 @@ import { supportBigInt } from './supportUtil'; | ||
); | ||
} | ||
export 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; | ||
} |
@@ -28,2 +28,4 @@ "use strict"; | ||
var _useLayoutEffect = require("rc-util/lib/hooks/useLayoutEffect"); | ||
var _ref = require("rc-util/lib/ref"); | ||
@@ -39,4 +41,2 @@ | ||
var _useUpdateEffect = _interopRequireDefault(require("./hooks/useUpdateEffect")); | ||
var _useFrame = _interopRequireDefault(require("./hooks/useFrame")); | ||
@@ -48,2 +48,10 @@ | ||
* We support `stringMode` which need handle correct type when user call in onChange | ||
* format max or min value | ||
* 1. if isInvalid return null | ||
* 2. if precision is undefined, return decimal | ||
* 3. format with precision | ||
* I. if max > 0, round down with precision. Example: max= 3.5, precision=0 afterFormat: 3 | ||
* II. if max < 0, round up with precision. Example: max= -3.5, precision=0 afterFormat: -4 | ||
* III. if min > 0, round up with precision. Example: min= 3.5, precision=0 afterFormat: 4 | ||
* IV. if min < 0, round down with precision. Example: max= -3.5, precision=0 afterFormat: -3 | ||
*/ | ||
@@ -58,5 +66,26 @@ var getDecimalValue = function getDecimalValue(stringMode, decimalValue) { | ||
var getDecimalIfValidate = function getDecimalIfValidate(value) { | ||
var getDecimalIfValidate = function getDecimalIfValidate(value, precision, isMax) { | ||
var decimal = (0, _MiniDecimal.default)(value); | ||
return decimal.isInvalidate() ? null : decimal; | ||
if (decimal.isInvalidate()) { | ||
return null; | ||
} | ||
if (precision === undefined) { | ||
return decimal; | ||
} | ||
var _trimNumber = (0, _numberUtil.trimNumber)(decimal.toString()), | ||
negative = _trimNumber.negative, | ||
integerStr = _trimNumber.integerStr, | ||
decimalStr = _trimNumber.decimalStr, | ||
negativeStr = _trimNumber.negativeStr; | ||
var unSignedNumberStr = integerStr + '.' + decimalStr; | ||
if (isMax && !negative || !isMax && negative) { | ||
return (0, _MiniDecimal.default)(negativeStr + (0, _MiniDecimal.roundDownUnsignedDecimal)(unSignedNumberStr, precision)); | ||
} else { | ||
return (0, _MiniDecimal.default)(negativeStr + (0, _MiniDecimal.roundUpUnsignedDecimal)(unSignedNumberStr, precision)); | ||
} | ||
}; | ||
@@ -103,3 +132,4 @@ | ||
var userTypingRef = React.useRef(false); | ||
var compositionRef = React.useRef(false); // ============================ Value ============================= | ||
var compositionRef = React.useRef(false); | ||
var shiftKeyRef = React.useRef(false); // ============================ Value ============================= | ||
// Real value control | ||
@@ -220,7 +250,7 @@ | ||
var maxDecimal = React.useMemo(function () { | ||
return getDecimalIfValidate(max); | ||
}, [max]); | ||
return getDecimalIfValidate(max, precision, true); | ||
}, [max, precision]); | ||
var minDecimal = React.useMemo(function () { | ||
return getDecimalIfValidate(min); | ||
}, [min]); | ||
return getDecimalIfValidate(min, precision, false); | ||
}, [min, precision]); | ||
var upDisabled = React.useMemo(function () { | ||
@@ -379,3 +409,3 @@ if (!maxDecimal || !decimalValue || decimalValue.isInvalidate()) { | ||
userTypingRef.current = false; | ||
var stepDecimal = (0, _MiniDecimal.default)(step); | ||
var stepDecimal = (0, _MiniDecimal.default)(shiftKeyRef.current ? (0, _numberUtil.getDecupleSteps)(step) : step); | ||
@@ -389,3 +419,3 @@ if (!up) { | ||
onStep === null || onStep === void 0 ? void 0 : onStep(getDecimalValue(stringMode, updatedValue), { | ||
offset: step, | ||
offset: shiftKeyRef.current ? (0, _numberUtil.getDecupleSteps)(step) : step, | ||
type: up ? 'up' : 'down' | ||
@@ -423,5 +453,12 @@ }); | ||
var onKeyDown = function onKeyDown(event) { | ||
var which = event.which; | ||
var which = event.which, | ||
shiftKey = event.shiftKey; | ||
userTypingRef.current = true; | ||
if (shiftKey) { | ||
shiftKeyRef.current = true; | ||
} else { | ||
shiftKeyRef.current = false; | ||
} | ||
if (which === _KeyCode.default.ENTER) { | ||
@@ -449,2 +486,3 @@ if (!compositionRef.current) { | ||
userTypingRef.current = false; | ||
shiftKeyRef.current = false; | ||
}; // >>> Focus & Blur | ||
@@ -461,3 +499,3 @@ | ||
(0, _useUpdateEffect.default)(function () { | ||
(0, _useLayoutEffect.useLayoutUpdateEffect)(function () { | ||
if (!decimalValue.isInvalidate()) { | ||
@@ -468,3 +506,3 @@ setInputValue(decimalValue, false); | ||
(0, _useUpdateEffect.default)(function () { | ||
(0, _useLayoutEffect.useLayoutUpdateEffect)(function () { | ||
var newValue = (0, _MiniDecimal.default)(value); | ||
@@ -481,3 +519,3 @@ setDecimalValue(newValue); | ||
(0, _useUpdateEffect.default)(function () { | ||
(0, _useLayoutEffect.useLayoutUpdateEffect)(function () { | ||
if (formatter) { | ||
@@ -484,0 +522,0 @@ restoreCursor(); |
@@ -65,4 +65,12 @@ export declare type ValueType = string | number; | ||
/** | ||
* round up an unsigned number str, like: 1.4 -> 2, 1.5 -> 2 | ||
*/ | ||
export declare function roundUpUnsignedDecimal(numStr: string, precision: number): any; | ||
/** | ||
* round up an unsigned number str, like: 1.4 -> 1, 1.5 -> 1 | ||
*/ | ||
export declare function roundDownUnsignedDecimal(numStr: string, precision: number): string; | ||
/** | ||
* Align the logic of toFixed to around like 1.5 => 2 | ||
*/ | ||
export declare function toFixed(numStr: string, separatorStr: string, precision?: number): any; |
@@ -10,2 +10,4 @@ "use strict"; | ||
exports.default = getMiniDecimal; | ||
exports.roundDownUnsignedDecimal = roundDownUnsignedDecimal; | ||
exports.roundUpUnsignedDecimal = roundUpUnsignedDecimal; | ||
exports.toFixed = toFixed; | ||
@@ -292,2 +294,34 @@ | ||
/** | ||
* round up an unsigned number str, like: 1.4 -> 2, 1.5 -> 2 | ||
*/ | ||
function roundUpUnsignedDecimal(numStr, precision) { | ||
var _trimNumber2 = (0, _numberUtil.trimNumber)(numStr), | ||
integerStr = _trimNumber2.integerStr, | ||
decimalStr = _trimNumber2.decimalStr; | ||
var advancedDecimal = getMiniDecimal(integerStr + '.' + decimalStr).add("0.".concat('0'.repeat(precision), 5)); | ||
return toFixed(advancedDecimal.toString(), '.', precision); | ||
} | ||
/** | ||
* round up an unsigned number str, like: 1.4 -> 1, 1.5 -> 1 | ||
*/ | ||
function roundDownUnsignedDecimal(numStr, precision) { | ||
var _trimNumber3 = (0, _numberUtil.trimNumber)(numStr), | ||
negativeStr = _trimNumber3.negativeStr, | ||
integerStr = _trimNumber3.integerStr, | ||
decimalStr = _trimNumber3.decimalStr; | ||
var numberWithoutDecimal = "".concat(negativeStr).concat(integerStr); | ||
if (precision === 0) { | ||
return integerStr; | ||
} | ||
return "".concat(numberWithoutDecimal, ".").concat(decimalStr.padEnd(precision, '0').slice(0, precision)); | ||
} | ||
/** | ||
* Align the logic of toFixed to around like 1.5 => 2 | ||
@@ -302,6 +336,6 @@ */ | ||
var _trimNumber2 = (0, _numberUtil.trimNumber)(numStr), | ||
negativeStr = _trimNumber2.negativeStr, | ||
integerStr = _trimNumber2.integerStr, | ||
decimalStr = _trimNumber2.decimalStr; | ||
var _trimNumber4 = (0, _numberUtil.trimNumber)(numStr), | ||
negativeStr = _trimNumber4.negativeStr, | ||
integerStr = _trimNumber4.integerStr, | ||
decimalStr = _trimNumber4.decimalStr; | ||
@@ -308,0 +342,0 @@ var precisionDecimalStr = "".concat(separatorStr).concat(decimalStr); |
@@ -23,1 +23,2 @@ /** | ||
export declare function validateNumber(num: string | number): boolean; | ||
export declare function getDecupleSteps(step: string | number): string; |
@@ -6,2 +6,3 @@ "use strict"; | ||
}); | ||
exports.getDecupleSteps = getDecupleSteps; | ||
exports.getNumberPrecision = getNumberPrecision; | ||
@@ -119,2 +120,13 @@ exports.isE = isE; | ||
); | ||
} | ||
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; | ||
} |
{ | ||
"name": "rc-input-number", | ||
"version": "7.3.4", | ||
"version": "7.3.5", | ||
"description": "React input-number component", | ||
@@ -43,9 +43,11 @@ "keywords": [ | ||
"classnames": "^2.2.5", | ||
"rc-util": "^5.9.8" | ||
"rc-util": "^5.23.0" | ||
}, | ||
"devDependencies": { | ||
"@testing-library/jest-dom": "^5.16.4", | ||
"@testing-library/react": "13.3.0", | ||
"@types/classnames": "^2.2.9", | ||
"@types/enzyme": "^3.10.8", | ||
"@types/jest": "^26.0.0", | ||
"@types/react": "^16.9.2", | ||
"@types/react": "^17.0.37", | ||
"@types/react-dom": "^17.0.9", | ||
@@ -55,5 +57,2 @@ "@umijs/fabric": "^2.0.0", | ||
"dumi": "^1.1.0", | ||
"enzyme": "^3.1.1", | ||
"enzyme-adapter-react-16": "^1.0.1", | ||
"enzyme-to-json": "^3.6.1", | ||
"eslint": "^7.1.0", | ||
@@ -67,4 +66,4 @@ "expect.js": "~0.3.1", | ||
"rc-tooltip": "^5.0.2", | ||
"react": "^16.0.0", | ||
"react-dom": "^16.0.0", | ||
"react": "^18.2.0", | ||
"react-dom": "^18.2.0", | ||
"regenerator-runtime": "^0.13.7", | ||
@@ -71,0 +70,0 @@ "typescript": "^4.0.2" |
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
102888
22
2421
37
Updatedrc-util@^5.23.0