From c58ae0f8956d969995aacb5da874171f8d1ed3ec Mon Sep 17 00:00:00 2001 From: orangemug Date: Mon, 6 Apr 2020 09:55:07 +0100 Subject: [PATCH] Fix to allow for decimal numbers. --- src/components/inputs/NumberInput.jsx | 57 +++++++++++++++++++-------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/src/components/inputs/NumberInput.jsx b/src/components/inputs/NumberInput.jsx index 2be980b..d575d53 100644 --- a/src/components/inputs/NumberInput.jsx +++ b/src/components/inputs/NumberInput.jsx @@ -31,7 +31,7 @@ class NumberInput extends React.Component { } static getDerivedStateFromProps(props, state) { - if (!state.editing) { + if (!state.editing && props.value !== state.value) { return { value: props.value, dirtyValue: props.value, @@ -49,12 +49,17 @@ class NumberInput extends React.Component { if(this.isValid(value) && hasChanged) { this.props.onChange(value) this.setState({ - dirtyValue: newValue, + value: newValue, + }); + } + else if (!this.isValid(value) && hasChanged) { + this.setState({ + value: undefined, }); } this.setState({ - value: newValue, + dirtyValue: newValue === "" ? undefined : newValue, }) } @@ -144,8 +149,14 @@ class NumberInput extends React.Component { this.props.min !== undefined && this.props.max !== undefined && this.props.allowRange ) { - const dirtyValue = this.state.dirtyValue === undefined ? this.props.default : this.state.dirtyValue - const value = this.state.value === undefined ? "" : this.state.value; + const value = this.state.editing ? this.state.dirtyValue : this.state.value; + let inputValue; + if (this.state.editingRange) { + inputValue = this.state.value; + } + else { + inputValue = value; + } return
{ this._keyboardEvent = true; }} onPointerDown={() => { - this.setState({editing: true}); + this.setState({editing: true, editingRange: true}); }} onPointerUp={() => { // Safari doesn't get onBlur event - this.setState({editing: false}); + this.setState({editing: false, editingRange: false}); }} onBlur={() => { - this.setState({editing: false}); + this.setState({ + editing: false, + editingRange: false, + dirtyValue: this.state.value, + }); }} /> { - if (!this.state.editing) { - this.changeValue(e.target.value); - } + value={inputValue === undefined ? "" : inputValue} + onFocus={e => { + this.setState({editing: true}); + }} + onChange={e => { + this.changeValue(e.target.value); + }} + onBlur={e => { + this.setState({editing: false}); + this.resetValue() }} - onBlur={this.resetValue} />
} else { - const value = this.state.value === undefined ? "" : this.state.value; + const value = this.state.editing ? this.state.dirtyValue : this.state.value; return this.changeValue(e.target.value)} + onFocus={() => { + this.setState({editing: true}); + }} onBlur={this.resetValue} required={this.props.required} />