Skip to content

Commit c2c2b3c

Browse files
committed
fix: normalize when enter is pressed
1 parent 6b30851 commit c2c2b3c

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

src/createNumericField.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ type NumberNormalizer = (value: ?(string | number)) => ?(string | number)
66
type Validator = (value: any, allValues: Object, props: Object) => ?any
77
const WHITESPACE = /^\s*$/
88

9+
910
function createNumericField<P: {validate?: Validator | Array<Validator>, normalizeOnBlur?: Function}>(
1011
Field: React.ComponentType<P>
1112
): React.ComponentType<P & {normalizeNumber?: NumberNormalizer}> {
@@ -45,16 +46,35 @@ function createNumericField<P: {validate?: Validator | Array<Validator>, normali
4546
}
4647
}
4748

49+
KeyDownHandler = ({input, onKeyDown, ...props}) => {
50+
const Comp = this.props.component
51+
52+
return (
53+
<Comp
54+
{...props}
55+
input={input}
56+
onKeyDown={(event: KeyEvent) => {
57+
const normalizeNumber = this.props.normalizeNumber || defaultNormalize
58+
if (event.keyCode === 13) {
59+
input.onChange(normalizeNumber(input.value))
60+
}
61+
if (onKeyDown) onKeyDown(event)
62+
}}
63+
/>
64+
)
65+
}
66+
4867
render(): React.Node {
4968
const {
50-
normalizeNumber, // eslint-disable-line no-unused-vars
69+
normalizeNumber, component, // eslint-disable-line no-unused-vars
5170
...props
5271
} = this.props
5372
return (
5473
<Field
5574
{...props}
5675
validate={this.validate}
5776
normalizeOnBlur={this.normalizeOnBlur}
77+
component={this.KeyDownHandler}
5878
/>
5979
)
6080
}

test/index.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {reduxForm as immutableReduxForm, reducer as immutableReducer} from 'redu
1212
import {NumericField} from '../src'
1313
import {NumericField as ImmutableNumericField} from '../src/immutable'
1414

15-
const Input = ({input: props}): React.Node => <input {...props} />
15+
const Input = ({input: inputProps, innerRef, ...props}): React.Node => <input {...inputProps} {...props} ref={innerRef} />
1616

1717
function min(threshold: number): (value: number) => ?string {
1818
return (value: number) => {
@@ -223,6 +223,31 @@ describe('NumericField', () => {
223223
comp.update().find(Input).simulate('blur')
224224
expect(comp.update().find('input').prop('value')).to.equal(46.8)
225225
})
226+
it('normalizes when enter is pressed', () => {
227+
const store = createStore(combineReducers({form: reducer}))
228+
229+
let input
230+
const Form = reduxForm({form: 'form'})(() => (
231+
<form>
232+
<NumericField
233+
name="hello"
234+
component={Input}
235+
innerRef={c => input = c}
236+
/>
237+
</form>
238+
))
239+
240+
const comp = mount(
241+
<Provider store={store}>
242+
<Form />
243+
</Provider>
244+
)
245+
246+
comp.find(Input).simulate('focus')
247+
comp.find(Input).simulate('change', {target: {value: ' 23.4 '}})
248+
comp.update().find(Input).simulate('keydown', {keyCode: 13})
249+
expect(comp.update().find('input').prop('value')).to.equal(23.4)
250+
})
226251
}
227252
describe('pojo', () => tests({NumericField, reducer, reduxForm}))
228253
describe('immutable', () => tests({

0 commit comments

Comments
 (0)