From 020677c3218f62826b048d71a68249cd5f7bfb3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Tue, 10 Mar 2026 16:28:01 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[journal]=20CurrencyInput=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=9D=8C=EC=88=98=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 포커스 시 쉼표 제거하여 순수 숫자 편집 모드 - 타이핑 중 포맷팅 제거하여 커서 점프 방지 - 블러 시에만 천단위 쉼표 포맷 적용 - minus + 숫자만 허용하는 단순 필터링 --- .../views/finance/journal-entries.blade.php | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/resources/views/finance/journal-entries.blade.php b/resources/views/finance/journal-entries.blade.php index 9c4b2a1b..128cd544 100644 --- a/resources/views/finance/journal-entries.blade.php +++ b/resources/views/finance/journal-entries.blade.php @@ -78,33 +78,39 @@ }; // 음수 입력을 지원하는 통화 입력 컴포넌트 +// - 포커스: 쉼표 제거하여 순수 숫자만 표시 (편집 용이) +// - 타이핑: minus + 숫자만 허용, 포맷팅 없음 (커서 점프 방지) +// - 블러: 천단위 쉼표 포맷 적용 const CurrencyInput = ({ value, onChange, disabled, placeholder, id, onKeyDown, className }) => { - const [displayVal, setDisplayVal] = React.useState(() => value ? formatInputCurrency(value) : ''); - const typing = React.useRef(false); + const [raw, setRaw] = useState(''); + const focused = useRef(false); - React.useEffect(() => { - if (!typing.current) { - setDisplayVal(value ? formatInputCurrency(value) : ''); + useEffect(() => { + if (!focused.current) { + setRaw(value ? formatInputCurrency(value) : ''); } }, [value]); return React.createElement('input', { type: 'text', id, disabled, placeholder, className, onKeyDown, - value: displayVal, - onFocus: () => { typing.current = true; }, + value: raw, + onFocus: () => { + focused.current = true; + setRaw(prev => prev.replace(/,/g, '')); + }, onChange: (e) => { - const raw = e.target.value.replace(/[^\d\-,]/g, ''); - setDisplayVal(raw); - if (raw !== '-' && raw !== '') { - onChange(parseInputCurrency(raw)); - } else if (raw === '') { + const input = e.target.value.replace(/[^\d-]/g, ''); + setRaw(input); + if (input !== '-' && input !== '') { + onChange(parseInputCurrency(input)); + } else if (input === '') { onChange(0); } }, onBlur: () => { - typing.current = false; - const parsed = parseInputCurrency(displayVal); - setDisplayVal(parsed ? formatInputCurrency(parsed) : ''); + focused.current = false; + const parsed = parseInputCurrency(raw); + setRaw(parsed ? formatInputCurrency(parsed) : ''); onChange(parsed); }, });