tdesign-react
Version:
TDesign Component for React
509 lines (500 loc) • 19.2 kB
JavaScript
/**
* tdesign v1.15.1
* (c) 2025 tdesign
* @license MIT
*/
;
Object.defineProperty(exports, '__esModule', { value: true });
var defineProperty = require('../_chunks/dep-0006fcfa.js');
var slicedToArray = require('../_chunks/dep-8e4d656d.js');
var React = require('react');
var classNames = require('classnames');
var largeNumber = require('../_chunks/dep-e75d22fc.js');
var log = require('../_chunks/dep-59671c87.js');
var isString = require('../_chunks/dep-4ed9eda4.js');
var isUndefined = require('../_chunks/dep-221787fe.js');
var isNumber = require('../_chunks/dep-2ffa3ff1.js');
var hooks_useConfig = require('../hooks/useConfig.js');
var hooks_useControlled = require('../hooks/useControlled.js');
var hooks_useCommonClassName = require('../hooks/useCommonClassName.js');
require('../_chunks/dep-667ac7af.js');
require('../_chunks/dep-00b49251.js');
require('../_chunks/dep-fc596d16.js');
require('../_chunks/dep-25585736.js');
require('../_chunks/dep-64577888.js');
require('../_chunks/dep-62e73936.js');
require('../config-provider/ConfigContext.js');
require('../_chunks/dep-1df1dad8.js');
require('../_chunks/dep-5b5ab11b.js');
require('dayjs');
require('../_chunks/dep-f32c03f1.js');
require('../_chunks/dep-31c4bc3d.js');
require('../_chunks/dep-eea2872a.js');
require('../_chunks/dep-71455db7.js');
require('../_chunks/dep-9e5a468d.js');
require('../_chunks/dep-ec8d2dca.js');
require('../_chunks/dep-f26edb7b.js');
require('../_chunks/dep-f33c1939.js');
require('../_chunks/dep-21ece627.js');
require('../_chunks/dep-25e4aa84.js');
require('../_chunks/dep-e1fbe1c3.js');
require('../_chunks/dep-df2b541f.js');
require('../_chunks/dep-edd366db.js');
require('../_chunks/dep-a56c4939.js');
require('../_chunks/dep-6c297e20.js');
require('../_chunks/dep-b7ad4d54.js');
require('../_chunks/dep-a2cb9299.js');
require('../_chunks/dep-f981815b.js');
require('../_util/noop.js');
require('../_chunks/dep-66114ce9.js');
require('../_chunks/dep-62d1dd66.js');
require('../_chunks/dep-7a148045.js');
require('../_chunks/dep-255ceed8.js');
require('../_chunks/dep-79629634.js');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var classNames__default = /*#__PURE__*/_interopDefaultLegacy(classNames);
function canAddNumber(num, max) {
var largeNumber$1 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
if (!num && num !== 0) return true;
if (largeNumber$1 && isString.isString(num)) {
return largeNumber.compareNumber(num, max, largeNumber$1) < 0;
}
return num < max;
}
function canReduceNumber(num, min) {
var largeNumber$1 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
if (!num && num !== 0) return true;
if (largeNumber$1 && isString.isString(num)) {
return largeNumber.compareNumber(num, min, largeNumber$1) > 0;
}
return num > min;
}
function putInRangeNumber(val, params) {
if (val === "") return void 0;
var max = params.max,
min = params.min,
lastValue = params.lastValue,
largeNumber$1 = params.largeNumber;
if (!largeNumber.isInputNumber(val)) return lastValue;
if (largeNumber$1 && (isString.isString(max) || max === Infinity) && (isString.isString(min) || min === -Infinity)) {
if (largeNumber.compareNumber(max, val, largeNumber$1) < 0) return max;
if (largeNumber.compareNumber(min, val, largeNumber$1) > 0) return min;
return val;
}
return Math.max(Number(min), Math.min(Number(max), Number(val)));
}
function positiveAdd(num1, num2) {
var _num1$toString$split$, _num2$toString$split$;
if (!num1 || !num2) return (num1 || 0) + (num2 || 0);
var r1 = ((_num1$toString$split$ = num1.toString().split(".")[1]) === null || _num1$toString$split$ === void 0 ? void 0 : _num1$toString$split$.length) || 0;
var r2 = ((_num2$toString$split$ = num2.toString().split(".")[1]) === null || _num2$toString$split$ === void 0 ? void 0 : _num2$toString$split$.length) || 0;
if (!r1 && !r2) return num1 + num2;
var newNumber1 = num1;
var newNumber2 = num2;
var diff = Math.abs(r1 - r2);
var digit = Math.pow(10, Math.max(r1, r2));
if (diff > 0) {
var cm = Math.pow(10, diff);
if (r1 > r2) {
newNumber1 = Number(num1.toString().replace(".", ""));
newNumber2 = Number(num2.toString().replace(".", "")) * cm;
} else {
newNumber1 = Number(num1.toString().replace(".", "")) * cm;
newNumber2 = Number(num2.toString().replace(".", ""));
}
} else {
newNumber1 = Number(num1.toString().replace(".", ""));
newNumber2 = Number(num2.toString().replace(".", ""));
}
return (newNumber1 + newNumber2) / digit;
}
function positiveSubtract(num1, num2) {
var _num1$toString$split$2, _num2$toString$split$2;
if (!num1 || !num2) return (num1 || 0) - (num2 || 0);
var r1 = ((_num1$toString$split$2 = num1.toString().split(".")[1]) === null || _num1$toString$split$2 === void 0 ? void 0 : _num1$toString$split$2.length) || 0;
var r2 = ((_num2$toString$split$2 = num2.toString().split(".")[1]) === null || _num2$toString$split$2 === void 0 ? void 0 : _num2$toString$split$2.length) || 0;
var digit = Math.pow(10, Math.max(r1, r2));
var n = r1 >= r2 ? r1 : r2;
return Number(((num1 * digit - num2 * digit) / digit).toFixed(n));
}
function add(num1, num2) {
if (num1 < 0 && num2 > 0) return positiveSubtract(num2, Math.abs(num1));
if (num1 < 0 && num2 < 0) return positiveAdd(Math.abs(num1), Math.abs(num2)) * -1;
if (num1 > 0 && num2 < 0) return positiveSubtract(num1, Math.abs(num2));
return positiveAdd(num1, num2);
}
function subtract(num1, num2) {
if (num1 < 0 && num2 > 0) return positiveAdd(Math.abs(num1), num2) * -1;
if (num1 < 0 && num2 < 0) return positiveSubtract(Math.abs(num2), Math.abs(num1));
if (num1 > 0 && num2 < 0) return positiveAdd(num1, Math.abs(num2));
return positiveSubtract(num1, num2);
}
function getStepValue(p) {
var op = p.op,
step = p.step,
lastValue = p.lastValue,
max = p.max,
min = p.min,
largeNumber$1 = p.largeNumber;
if (Number(step) <= 0) {
log.log.error("InputNumber", "step must be larger than 0.");
return lastValue;
}
var tStep = isNumber.isNumber(step) ? String(step) : step;
var newVal;
if (op === "add") {
if (largeNumber$1 && isString.isString(lastValue)) {
newVal = largeNumber.largeNumberAdd(String(lastValue), String(tStep));
} else {
newVal = add(Number(lastValue || 0), Number(step));
}
} else if (op === "reduce") {
if (largeNumber$1 && isString.isString(lastValue)) {
newVal = largeNumber.largeNumberSubtract(String(lastValue), String(tStep));
} else {
newVal = subtract(Number(lastValue || 0), Number(step));
}
}
if (isUndefined.isUndefined(lastValue)) {
newVal = putInRangeNumber(newVal, {
max: max,
min: min,
lastValue: lastValue,
largeNumber: largeNumber$1
});
}
return largeNumber$1 ? newVal : Number(newVal);
}
function getMaxOrMinValidateResult(p) {
var largeNumber$1 = p.largeNumber,
value = p.value,
max = p.max,
min = p.min;
if (isUndefined.isUndefined(value) || isUndefined.isUndefined(largeNumber$1)) return void 0;
if (largeNumber$1 && isNumber.isNumber(value)) {
log.log.warn("InputNumber", "largeNumber value must be a string.");
}
var error;
if (largeNumber.compareNumber(value, max, largeNumber$1) > 0) {
error = "exceed-maximum";
} else if (largeNumber.compareNumber(value, min, largeNumber$1) < 0) {
error = "below-minimum";
} else {
error = void 0;
}
return error;
}
var specialCode$1 = ["-", ".", "e", "E", "+"];
function canInputNumber(number, largeNumber$1) {
var _number$match, _number$match2;
if (["", null, void 0].includes(number)) return true;
if (number.slice(0, 2) === "00") return false;
if (number.match(/\s/g)) return false;
if (((_number$match = number.match(/\./g)) === null || _number$match === void 0 ? void 0 : _number$match.length) > 1) return false;
if (((_number$match2 = number.match(/e/g)) === null || _number$match2 === void 0 ? void 0 : _number$match2.length) > 1) return false;
var tmpNumber = number.slice(1);
var tmpMatched = tmpNumber.match(/(\+|-)/g);
if (tmpMatched && (!/e(\+|-)/i.test(tmpNumber) || tmpMatched.length > 1)) return false;
var isNumber2 = largeNumber$1 && largeNumber.isInputNumber(number) || !Number.isNaN(Number(number));
if (!isNumber2 && !specialCode$1.includes(number.slice(-1))) return false;
if (/e/i.test(number) && (!/\de/i.test(number) || /e\./.test(number))) return false;
return true;
}
function canSetValue(number, lastNumber) {
return parseFloat(number) !== lastNumber && !Number.isNaN(Number(number));
}
function formatUnCompleteNumber(number) {
var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (["", null, void 0].includes(number) || !/\d+/.test(number)) return void 0;
var decimalPlaces = extra.decimalPlaces,
largeNumber$1 = extra.largeNumber,
isToFixed = extra.isToFixed;
var newNumber = number.replace(/[.|+|\-|e]$/, "");
if (largeNumber$1) {
newNumber = largeNumber.formatENumber(newNumber);
}
if (decimalPlaces !== void 0) {
newNumber = largeNumber.largeNumberToFixed(newNumber, decimalPlaces, largeNumber$1);
}
if (largeNumber$1) return newNumber;
return isToFixed ? newNumber : parseFloat(newNumber);
}
function formatThousandths(number) {
var thousandthsRegExp = /^[-+]?\d{1,3}(,\d{3})*(\.(\d*))?$/;
if (thousandthsRegExp.test(number)) return number.replace(/,/g, "");
return number;
}
var specialCode = ["-", ".", "e", "E"];
function useInputNumber(props) {
var _useCommonClassName = hooks_useCommonClassName["default"](),
SIZE = _useCommonClassName.SIZE,
STATUS = _useCommonClassName.STATUS;
var _useConfig = hooks_useConfig["default"](),
classPrefix = _useConfig.classPrefix;
var _useControlled = hooks_useControlled["default"](props, "value", props.onChange),
_useControlled2 = slicedToArray._slicedToArray(_useControlled, 2),
tValue = _useControlled2[0],
onChange = _useControlled2[1];
var _useState = React.useState(""),
_useState2 = slicedToArray._slicedToArray(_useState, 2),
userInput = _useState2[0],
setUserInput = _useState2[1];
var _useState3 = React.useState(),
_useState4 = slicedToArray._slicedToArray(_useState3, 2),
isError = _useState4[0],
setIsError = _useState4[1];
var inputRef = React.useRef(null);
var max = props.max,
min = props.min,
largeNumber$1 = props.largeNumber,
decimalPlaces = props.decimalPlaces,
allowInputOverLimit = props.allowInputOverLimit,
onValidate = props.onValidate;
var disabledReduce = props.disabled || !canReduceNumber(tValue, props.min, props.largeNumber);
var disabledAdd = props.disabled || !canAddNumber(tValue, props.max, props.largeNumber);
var wrapClasses = classNames__default["default"]("".concat(classPrefix, "-input-number"), SIZE[props.size], defineProperty._defineProperty(defineProperty._defineProperty(defineProperty._defineProperty(defineProperty._defineProperty({}, STATUS.disabled, props.disabled), "".concat(classPrefix, "-is-controls-right"), props.theme === "column"), "".concat(classPrefix, "-input-number--").concat(props.theme), props.theme), "".concat(classPrefix, "-input-number--auto-width"), props.autoWidth));
var reduceClasses = classNames__default["default"]("".concat(classPrefix, "-input-number__decrease"), defineProperty._defineProperty({}, STATUS.disabled, disabledReduce));
var addClasses = classNames__default["default"]("".concat(classPrefix, "-input-number__increase"), defineProperty._defineProperty({}, STATUS.disabled, disabledAdd));
var getUserInput = function getUserInput(value) {
var _inputRef$current$cur, _inputRef$current$cur2;
if (!value && value !== 0) return "";
var inputStr = value || value === 0 ? String(value) : "";
if (!((_inputRef$current$cur = (_inputRef$current$cur2 = inputRef.current.currentElement).contains) !== null && _inputRef$current$cur !== void 0 && _inputRef$current$cur.call(_inputRef$current$cur2, document.activeElement))) {
var num = formatUnCompleteNumber(inputStr, {
decimalPlaces: decimalPlaces,
largeNumber: largeNumber$1,
isToFixed: true
});
inputStr = num || num === 0 ? String(num) : "";
if (props.format) {
inputStr = String(props.format(value, {
fixedNumber: inputStr
}));
}
}
return inputStr;
};
React.useEffect(function () {
var inputValue = [void 0, null].includes(tValue) ? "" : String(tValue);
if (!largeNumber$1 && !Number.isNaN(userInput)) {
if (parseFloat(userInput) !== tValue) {
setUserInput(getUserInput(inputValue));
}
var fixedNumber = Number(largeNumber.largeNumberToFixed(inputValue, decimalPlaces, largeNumber$1));
if (decimalPlaces !== void 0 && ![void 0, null].includes(tValue) && Number(fixedNumber) !== Number(tValue)) {
onChange(fixedNumber, {
type: "props",
e: void 0
});
}
}
if (largeNumber$1) {
var tmpUserInput = getUserInput(inputValue);
setUserInput(tmpUserInput);
if (decimalPlaces !== void 0 && largeNumber.largeNumberToFixed(inputValue, decimalPlaces, largeNumber$1) !== tValue) {
onChange(tmpUserInput, {
type: "props",
e: void 0
});
}
}
}, [tValue]);
React.useEffect(function () {
if ([void 0, "", null].includes(tValue)) return;
var error = getMaxOrMinValidateResult({
value: tValue,
max: max,
min: min,
largeNumber: largeNumber$1
});
setIsError(error);
onValidate === null || onValidate === void 0 || onValidate({
error: error
});
}, [tValue, max, min, largeNumber$1, onValidate]);
var handleStepValue = function handleStepValue(op) {
var newValue = getStepValue({
op: op,
step: props.step,
max: props.max,
min: props.min,
lastValue: tValue,
largeNumber: props.largeNumber
});
var largeNumber2 = props.largeNumber,
max2 = props.max,
min2 = props.min;
var overLimit = getMaxOrMinValidateResult({
value: newValue,
largeNumber: largeNumber2,
max: max2,
min: min2
});
return {
overLimit: overLimit,
newValue: newValue
};
};
var handleReduce = function handleReduce(e) {
if (disabledReduce || props.readonly) return;
var r = handleStepValue("reduce");
if (r.overLimit && !allowInputOverLimit) return;
onChange(r.newValue, {
type: "reduce",
e: e
});
};
var handleAdd = function handleAdd(e) {
if (disabledAdd || props.readonly) return;
var r = handleStepValue("add");
if (r.overLimit && !allowInputOverLimit) return;
onChange(r.newValue, {
type: "add",
e: e
});
};
var onInnerInputChange = function onInnerInputChange(inputValue, _ref) {
var e = _ref.e;
var val = formatThousandths(inputValue);
if (!canInputNumber(val, largeNumber$1)) return;
setUserInput(val);
if (largeNumber$1) {
onChange(val, {
type: "input",
e: e
});
return;
}
if (canSetValue(String(val), Number(tValue))) {
var newVal = val === "" ? void 0 : Number(val);
onChange(newVal, {
type: "input",
e: e
});
}
};
var handleBlur = function handleBlur(value, ctx) {
var _props$onBlur;
if (!props.allowInputOverLimit && value !== void 0) {
var r = getMaxOrMinValidateResult({
value: tValue,
largeNumber: largeNumber$1,
max: max,
min: min
});
if (r === "below-minimum") {
onChange(min, {
type: "blur",
e: ctx.e
});
return;
}
if (r === "exceed-maximum") {
onChange(max, {
type: "blur",
e: ctx.e
});
return;
}
}
var newValue = formatUnCompleteNumber(value, {
decimalPlaces: decimalPlaces,
largeNumber: largeNumber$1
});
setUserInput(getUserInput(newValue));
if (newValue !== tValue) {
setUserInput(tValue);
onChange(newValue, {
type: "blur",
e: ctx.e
});
}
(_props$onBlur = props.onBlur) === null || _props$onBlur === void 0 || _props$onBlur.call(props, newValue, ctx);
};
var handleFocus = function handleFocus(_, ctx) {
var _props$onFocus;
setUserInput(tValue);
(_props$onFocus = props.onFocus) === null || _props$onFocus === void 0 || _props$onFocus.call(props, tValue, ctx);
};
var handleKeydown = function handleKeydown(value, ctx) {
var _props$onKeydown;
var e = ctx.e;
var keyEvent = {
ArrowUp: handleAdd,
ArrowDown: handleReduce
};
if (keyEvent[e.key] !== void 0) {
keyEvent[e.key](e);
}
(_props$onKeydown = props.onKeydown) === null || _props$onKeydown === void 0 || _props$onKeydown.call(props, value, ctx);
};
var handleKeyup = function handleKeyup(value, ctx) {
var _props$onKeyup;
(_props$onKeyup = props.onKeyup) === null || _props$onKeyup === void 0 || _props$onKeyup.call(props, value, ctx);
};
var handleKeypress = function handleKeypress(value, ctx) {
var _props$onKeypress;
(_props$onKeypress = props.onKeypress) === null || _props$onKeypress === void 0 || _props$onKeypress.call(props, value, ctx);
};
var handleEnter = function handleEnter(value, ctx) {
var _props$onEnter;
setUserInput(getUserInput(value));
var newValue = formatUnCompleteNumber(value, {
decimalPlaces: props.decimalPlaces,
largeNumber: props.largeNumber
});
if (newValue !== value && String(newValue) !== value) {
onChange(newValue, {
type: "enter",
e: ctx.e
});
}
(_props$onEnter = props.onEnter) === null || _props$onEnter === void 0 || _props$onEnter.call(props, newValue, ctx);
};
var handleClear = function handleClear(_ref2) {
var e = _ref2.e;
onChange(void 0, {
type: "clear",
e: e
});
setUserInput("");
};
var focus = function focus() {
inputRef.current.focus();
};
var blur = function blur() {
inputRef.current.blur();
};
var listeners = {
onBlur: handleBlur,
onFocus: handleFocus,
onKeydown: handleKeydown,
onKeyup: handleKeyup,
onKeypress: handleKeypress,
onEnter: handleEnter,
onClick: focus,
onClear: handleClear
};
return {
classPrefix: classPrefix,
wrapClasses: wrapClasses,
reduceClasses: reduceClasses,
addClasses: addClasses,
inputRef: inputRef,
listeners: listeners,
isError: isError,
setIsError: setIsError,
userInput: userInput,
setUserInput: setUserInput,
tValue: tValue,
focus: focus,
blur: blur,
onChange: onChange,
handleReduce: handleReduce,
handleAdd: handleAdd,
onInnerInputChange: onInnerInputChange
};
}
exports["default"] = useInputNumber;
exports.specialCode = specialCode;
//# sourceMappingURL=useInputNumber.js.map