From 10b9c09192566c9f62cf3e22bd5623885171f10a Mon Sep 17 00:00:00 2001 From: MaysWind Date: Sun, 23 Nov 2025 01:44:40 +0800 Subject: [PATCH] insert the pasted content after the cursor when pasting numbers or amounts --- src/components/base/CommonNumberInputBase.ts | 34 ++++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/components/base/CommonNumberInputBase.ts b/src/components/base/CommonNumberInputBase.ts index 7e24c431..e40fec8b 100644 --- a/src/components/base/CommonNumberInputBase.ts +++ b/src/components/base/CommonNumberInputBase.ts @@ -160,12 +160,40 @@ export function useCommonNumberInputBase(props: CommonNumberInputProps, maxDecim return; } - const value = parseNumber(text); + const parsedText = parseNumber(text); + + if (Number.isNaN(parsedText) || !Number.isFinite(parsedText)) { + e.preventDefault(); + return; + } + + const inputEl = e.target as HTMLInputElement; + const start = inputEl.selectionStart ?? 0; + const end = inputEl.selectionEnd ?? 0; + const fullText = currentValue.value.slice(0, start) + text + currentValue.value.slice(end); + + const value = parseNumber(fullText); const textualValue = formatNumber(value); const decimalSeparator = getCurrentDecimalSeparator(); - const hasDecimalSeparator = text.indexOf(decimalSeparator) >= 0; + const hasDecimalSeparator = fullText.indexOf(decimalSeparator) >= 0; + const pastedAmount = getValidFormattedValue(value, textualValue, hasDecimalSeparator); + let newPos: number = start + text.length; - currentValue.value = getValidFormattedValue(value, textualValue, hasDecimalSeparator); + if (pastedAmount.length !== fullText.length) { + if (newPos > pastedAmount.length) { + newPos = pastedAmount.length; + } else { + newPos = start; + } + } + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(() => { + inputEl.selectionStart = inputEl.selectionEnd = newPos; + }); + } + + currentValue.value = pastedAmount; e.preventDefault(); }