Skip to content

Commit 5e30154

Browse files
authored
feat: introduce formatValueOnBlur flag (#339)
Co-authored-by: Selmir Nedzibi <[email protected]>
1 parent 6cfc64a commit 5e30154

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed

src/components/CurrencyInput.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export const CurrencyInput: FC<CurrencyInputProps> = forwardRef<
5858
onKeyDown,
5959
onKeyUp,
6060
transformRawValue,
61+
formatValueOnBlur = true,
6162
...props
6263
}: CurrencyInputProps,
6364
ref
@@ -231,7 +232,7 @@ export const CurrencyInput: FC<CurrencyInputProps> = forwardRef<
231232
value: newValue,
232233
});
233234

234-
if (onValueChange) {
235+
if (onValueChange && formatValueOnBlur) {
235236
onValueChange(newValue, name, {
236237
float: numberValue,
237238
formatted: formattedValue,

src/components/CurrencyInputProps.ts

+7
Original file line numberDiff line numberDiff line change
@@ -183,5 +183,12 @@ export type CurrencyInputProps = Overwrite<
183183
* Transform the raw value form the input before parsing
184184
*/
185185
transformRawValue?: (rawValue: string) => string;
186+
187+
/**
188+
* When set to false, the formatValueOnBlur flag disables the application of the __onValueChange__ function
189+
* specifically on blur events. If disabled or set to false, the onValueChange will not trigger on blur.
190+
* Default = true
191+
*/
192+
formatValueOnBlur?: boolean;
186193
}
187194
>;

src/components/__tests__/CurrencyInput-onBlur.spec.tsx

+25-4
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ describe('<CurrencyInput/> onBlur', () => {
2929
userEvent.type(screen.getByRole('textbox'), '123');
3030
fireEvent.focusOut(screen.getByRole('textbox'));
3131

32-
expect(onBlurSpy).toBeCalled();
32+
expect(onBlurSpy).toHaveBeenCalled();
3333

3434
expect(onValueChangeSpy).toHaveBeenLastCalledWith('123.00', name, {
3535
float: 123,
@@ -40,13 +40,34 @@ describe('<CurrencyInput/> onBlur', () => {
4040
expect(screen.getByRole('textbox')).toHaveValue('$123.00');
4141
});
4242

43+
it('should call onBlur, but not onValueChange', () => {
44+
render(
45+
<CurrencyInput
46+
name={name}
47+
prefix="$"
48+
onBlur={onBlurSpy}
49+
onValueChange={onValueChangeSpy}
50+
formatValueOnBlur={false}
51+
decimalScale={2}
52+
/>
53+
);
54+
55+
userEvent.type(screen.getByRole('textbox'), '123');
56+
fireEvent.focusOut(screen.getByRole('textbox'));
57+
58+
expect(onBlurSpy).toHaveBeenCalled();
59+
60+
expect(onValueChangeSpy).toHaveBeenCalledTimes(3);
61+
expect(screen.getByRole('textbox')).toHaveValue('$123.00');
62+
});
63+
4364
it('should call onBlur for 0', () => {
4465
render(<CurrencyInput name={name} prefix="$" onBlur={onBlurSpy} />);
4566

4667
userEvent.type(screen.getByRole('textbox'), '0');
4768
fireEvent.focusOut(screen.getByRole('textbox'));
4869

49-
expect(onBlurSpy).toBeCalled();
70+
expect(onBlurSpy).toHaveBeenCalled();
5071

5172
expect(screen.getByRole('textbox')).toHaveValue('$0');
5273
});
@@ -56,7 +77,7 @@ describe('<CurrencyInput/> onBlur', () => {
5677

5778
fireEvent.focusOut(screen.getByRole('textbox'));
5879

59-
expect(onBlurSpy).toBeCalled();
80+
expect(onBlurSpy).toHaveBeenCalled();
6081

6182
expect(screen.getByRole('textbox')).toHaveValue('');
6283
});
@@ -67,7 +88,7 @@ describe('<CurrencyInput/> onBlur', () => {
6788
userEvent.type(screen.getByRole('textbox'), '-');
6889
fireEvent.focusOut(screen.getByRole('textbox'));
6990

70-
expect(onBlurSpy).toBeCalled();
91+
expect(onBlurSpy).toHaveBeenCalled();
7192

7293
expect(screen.getByRole('textbox')).toHaveValue('');
7394
});

0 commit comments

Comments
 (0)