diff --git a/src/components/inputs/NumberInput.jsx b/src/components/inputs/NumberInput.jsx index 2be980b..b46fe6b 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, }) } @@ -87,11 +92,13 @@ class NumberInput extends React.Component { } // If set value is invalid fall back to the last valid value from props or at last resort the default value - if(!this.isValid(this.state.value)) { + if (!this.isValid(this.state.value)) { if(this.isValid(this.props.value)) { this.changeValue(this.props.value) + this.setState({dirtyValue: this.props.value}); } else { this.changeValue(undefined); + this.setState({dirtyValue: undefined}); } } } @@ -144,8 +151,15 @@ 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; + const defaultValue = this.props.default === undefined ? "" : this.props.default; + 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} />