From 26f695d40134327db783fdce8d6b574a9dd169c7 Mon Sep 17 00:00:00 2001 From: pkupczyk <piotr.kupczyk@id.ethz.ch> Date: Tue, 22 Dec 2020 11:12:52 +0100 Subject: [PATCH] NG_UI : plugins evaluation : SSDM-10431 - refactor autocompleter and fix automated tests --- .../common/form/AutocompleterField.jsx | 49 +++++++++++-------- .../common/form/EntityAutocompleterField.jsx | 33 +++---------- .../tools/form/query/QueryFormParameters.jsx | 1 + .../types/form/TypeFormParametersProperty.jsx | 3 +- 4 files changed, 38 insertions(+), 48 deletions(-) diff --git a/openbis_ng_ui/src/js/components/common/form/AutocompleterField.jsx b/openbis_ng_ui/src/js/components/common/form/AutocompleterField.jsx index f526082d1eb..56e1313a3e4 100644 --- a/openbis_ng_ui/src/js/components/common/form/AutocompleterField.jsx +++ b/openbis_ng_ui/src/js/components/common/form/AutocompleterField.jsx @@ -31,11 +31,6 @@ const styles = theme => ({ } }, adornment: { - marginRight: '-32px', - marginTop: '-16px', - color: '#0000008a' - }, - adornmentFreeSolo: { marginRight: '-4px', marginTop: '-16px', color: '#0000008a' @@ -54,7 +49,8 @@ class AutocompleterFormField extends React.PureComponent { this.state = { open: false, - focused: false + focused: false, + inputValue: '' } this.reference = React.createRef() @@ -100,18 +96,13 @@ class AutocompleterFormField extends React.PureComponent { } handleChange(event, value) { - this.setState({ - open: true - }) - this.handleEvent(event, value, this.props.onChange) } handleInputChange(event, value) { this.setState({ - open: true + inputValue: value }) - this.handleEvent(event, value, this.props.onInputChange) } @@ -119,7 +110,7 @@ class AutocompleterFormField extends React.PureComponent { this.setState({ focused: true }) - this.handleEvent(event, null, this.props.onFocus) + this.handleEvent(event, event.target.value, this.props.onFocus) } handleBlur(event) { @@ -130,8 +121,28 @@ class AutocompleterFormField extends React.PureComponent { event.persist() + const { freeSolo, getOptionLabel } = this.props + const { inputValue } = this.state + + const value = getOptionLabel + ? getOptionLabel(this.props.value) + : this.props.value + + const valueTrimmed = value ? value.trim() : '' + const inputValueTrimmed = inputValue ? inputValue.trim() : '' + + if (inputValueTrimmed.length === 0 && valueTrimmed.length !== 0) { + this.handleChange(event, null) + } else if (inputValueTrimmed !== valueTrimmed) { + if (freeSolo) { + this.handleChange(event, inputValue) + } else { + this.handleInputChange(event, value) + } + } + setTimeout(() => { - this.handleEvent(event, null, this.props.onBlur) + this.handleEvent(event, this.state.value, this.props.onBlur) }, 0) } @@ -174,8 +185,6 @@ class AutocompleterFormField extends React.PureComponent { name, description, value, - inputValue, - freeSolo, disabled, error, metadata, @@ -189,7 +198,7 @@ class AutocompleterFormField extends React.PureComponent { getOptionDisabled } = this.props - const { open, focused } = this.state + const { open, inputValue, focused } = this.state return ( <FormFieldContainer @@ -201,7 +210,7 @@ class AutocompleterFormField extends React.PureComponent { > <Autocomplete disableClearable - freeSolo={freeSolo} + freeSolo={true} name={name} disabled={disabled} options={this.getOptions()} @@ -268,13 +277,13 @@ class AutocompleterFormField extends React.PureComponent { renderAdornment() { const { open } = this.state - const { loading, freeSolo, classes } = this.props + const { loading, classes } = this.props return ( <InputAdornment position='end' classes={{ - root: freeSolo ? classes.adornmentFreeSolo : classes.adornment + root: classes.adornment }} > {loading ? <CircularProgress color='inherit' size={20} /> : null} diff --git a/openbis_ng_ui/src/js/components/common/form/EntityAutocompleterField.jsx b/openbis_ng_ui/src/js/components/common/form/EntityAutocompleterField.jsx index c5dcee8ec66..7a7133b4f21 100644 --- a/openbis_ng_ui/src/js/components/common/form/EntityAutocompleterField.jsx +++ b/openbis_ng_ui/src/js/components/common/form/EntityAutocompleterField.jsx @@ -19,7 +19,6 @@ class EntityAutocompleterField extends React.PureComponent { this.state = { loading: false, - inputValue: this.getOptionLabel(props.value), options: [] } } @@ -316,34 +315,15 @@ class EntityAutocompleterField extends React.PureComponent { } } - handleFocus() { - this.load(this.state.inputValue) + handleFocus(event) { + this.load(event.target.value) } handleInputChange(event) { - this.setState({ - inputValue: event.target.value - }) this.load(event.target.value) } - handleBlur(event) { - const { value, onChange } = this.props - const { inputValue } = this.state - - const valueTrimmed = value ? this.getOptionLabel(value).trim() : '' - const inputValueTrimmed = inputValue ? inputValue.trim() : '' - - if (inputValueTrimmed.length === 0 && valueTrimmed.length !== 0) { - if (onChange) { - onChange(event) - } - } else if (inputValueTrimmed !== valueTrimmed) { - this.setState({ - inputValue: this.getOptionLabel(value) - }) - } - + handleBlur() { this.cancelScheduledLoad() this.setState({ @@ -381,22 +361,21 @@ class EntityAutocompleterField extends React.PureComponent { } getOptionDisabled(option) { - return !option.entityId + return !option || !option.entityId } render() { logger.log(logger.DEBUG, 'EntityAutocompleterField.render') const { value } = this.props - const { loading, inputValue, options } = this.state + const { loading, options } = this.state return ( <AutocompleterField {...this.props} loading={loading} - freeSolo={true} + freeSolo={false} value={value} - inputValue={inputValue} renderOption={this.renderOption} filterOptions={this.filterOptions} getOptionLabel={this.getOptionLabel} diff --git a/openbis_ng_ui/src/js/components/tools/form/query/QueryFormParameters.jsx b/openbis_ng_ui/src/js/components/tools/form/query/QueryFormParameters.jsx index 83c5f2b7979..b6aedb7f28a 100644 --- a/openbis_ng_ui/src/js/components/tools/form/query/QueryFormParameters.jsx +++ b/openbis_ng_ui/src/js/components/tools/form/query/QueryFormParameters.jsx @@ -294,6 +294,7 @@ class QueryFormParameters extends React.PureComponent { error={error} disabled={!enabled} value={value} + freeSolo={true} mode={mode} onChange={this.handleChange} onFocus={this.handleFocus} diff --git a/openbis_ng_ui/src/js/components/types/form/TypeFormParametersProperty.jsx b/openbis_ng_ui/src/js/components/types/form/TypeFormParametersProperty.jsx index 830a3b2b4b0..db911be6c3e 100644 --- a/openbis_ng_ui/src/js/components/types/form/TypeFormParametersProperty.jsx +++ b/openbis_ng_ui/src/js/components/types/form/TypeFormParametersProperty.jsx @@ -298,8 +298,9 @@ class TypeFormParametersProperty extends React.PureComponent { error={error} disabled={!enabled} value={value} + freeSolo={true} mode={mode} - onInputChange={this.handleChange} + onChange={this.handleChange} onFocus={this.handleFocus} onBlur={this.handleBlur} /> -- GitLab