@@ -3,6 +3,7 @@ import { debounce, TextField } from '@mui/material';
33import Autocomplete from '@mui/material/Autocomplete' ;
44import { ParameterSelectProps } from './ParameterSelect' ;
55import { RenderSubValue } from '../../../report/ReportRecordProcessing' ;
6+ import { SelectionConfirmationButton } from './SelectionConfirmationButton' ;
67
78const NodePropertyParameterSelectComponent = ( props : ParameterSelectProps ) => {
89 const suggestionsUpdateTimeout =
@@ -20,14 +21,17 @@ const NodePropertyParameterSelectComponent = (props: ParameterSelectProps) => {
2021 }
2122 return multi ? [ ] : value ;
2223 } ;
23- const { multiSelector } = props ;
24+ const { multiSelector, setManual } = props ;
2425 const allParameters = props . allParameters ? props . allParameters : { } ;
2526 const [ extraRecords , setExtraRecords ] = React . useState ( [ ] ) ;
2627 const [ inputDisplayText , setInputDisplayText ] = React . useState (
2728 props . parameterDisplayValue && multiSelector ? '' : props . parameterDisplayValue
2829 ) ;
2930 const [ inputValue , setInputValue ] = React . useState ( getInitialValue ( props . parameterDisplayValue , multiSelector ) ) ;
3031
32+ const [ paramValueTemp , setParamValueTemp ] = React . useState ( null ) ;
33+ const [ paramValueDisplayTemp , setParamValueDisplayTemp ] = React . useState ( null ) ;
34+
3135 const debouncedQueryCallback = useCallback ( debounce ( props . queryCallback , suggestionsUpdateTimeout ) , [ ] ) ;
3236 const label = props . settings && props . settings . entityType ? props . settings . entityType : '' ;
3337 const propertyType = props . settings && props . settings . propertyType ? props . settings . propertyType : '' ;
@@ -42,38 +46,51 @@ const NodePropertyParameterSelectComponent = (props: ParameterSelectProps) => {
4246
4347 const realValueRowIndex = props . compatibilityMode ? 0 : 1 - displayValueRowIndex ;
4448
49+ const manualHandleParameters = ( ) => {
50+ handleParameters ( paramValueTemp , paramValueDisplayTemp , false ) ;
51+ } ;
52+ const handleParameters = ( value , displayValue , manual = false ) => {
53+ setParamValueTemp ( value ) ;
54+ setParamValueDisplayTemp ( displayValue ) ;
55+
56+ if ( manual ) {
57+ return ;
58+ }
59+
60+ props . setParameterValue ( value ) ;
61+ props . setParameterDisplayValue ( displayValue ) ;
62+ } ;
4563 const handleCrossClick = ( isMulti , value ) => {
4664 if ( isMulti ) {
4765 if ( value . length == 0 && clearParameterOnFieldClear ) {
4866 setInputValue ( [ ] ) ;
49- props . setParameterValue ( undefined ) ;
50- props . setParameterDisplayValue ( undefined ) ;
51- return ;
67+ handleParameters ( undefined , undefined , setManual ) ;
68+ return true ;
5269 }
5370 if ( value . length == 0 ) {
5471 setInputValue ( [ ] ) ;
55- props . setParameterValue ( [ ] ) ;
56- props . setParameterDisplayValue ( [ ] ) ;
57-
72+ handleParameters ( [ ] , [ ] , setManual ) ;
73+ return true ;
5874 }
5975 } else {
6076 if ( value && clearParameterOnFieldClear ) {
6177 setInputValue ( null ) ;
62- props . setParameterValue ( undefined ) ;
63- props . setParameterDisplayValue ( undefined ) ;
64- return ;
78+ handleParameters ( undefined , undefined , setManual ) ;
79+ return true ;
6580 }
6681 if ( value == null ) {
6782 setInputValue ( null ) ;
68- props . setParameterValue ( defaultValue ) ;
69- props . setParameterDisplayValue ( defaultValue ) ;
70-
83+ handleParameters ( defaultValue , defaultValue , setManual ) ;
84+ return true ;
7185 }
86+ return false ;
7287 }
7388 } ;
7489 const propagateSelection = ( event , newDisplay ) => {
7590 const isMulti = Array . isArray ( newDisplay ) ;
76- handleCrossClick ( isMulti , newDisplay ) ;
91+ if ( handleCrossClick ( isMulti , newDisplay ) ) {
92+ return ;
93+ }
7794 let newValue ;
7895 // Multiple and new entry
7996 if ( isMulti && inputValue . length < newDisplay . length ) {
@@ -86,9 +103,8 @@ const NodePropertyParameterSelectComponent = (props: ParameterSelectProps) => {
86103
87104 newValue . push ( val ?. low ?? val ) ;
88105 } else if ( ! isMulti ) {
89- newValue = extraRecords . filter ( ( r ) => r . _fields [ displayValueRowIndex ] . toString ( ) == newDisplay ) [ 0 ] . _fields [
90- realValueRowIndex
91- ] ;
106+ newValue = extraRecords . filter ( ( r ) => ( r ?. _fields ?. [ displayValueRowIndex ] ?. toString ( ) || null ) == newDisplay ) [ 0 ]
107+ . _fields [ realValueRowIndex ] ;
92108
93109 newValue = newValue ?. low || newValue ;
94110 } else {
@@ -100,36 +116,42 @@ const NodePropertyParameterSelectComponent = (props: ParameterSelectProps) => {
100116 setInputDisplayText ( isMulti ? '' : newDisplay ) ;
101117 setInputValue ( newDisplay ) ;
102118
103- props . setParameterValue ( newValue ) ;
104- props . setParameterDisplayValue ( newDisplay ) ;
119+ handleParameters ( newValue , newDisplay , setManual ) ;
105120 } ;
106121 return (
107- < Autocomplete
108- id = 'autocomplete'
109- multiple = { multiSelector }
110- options = { extraRecords . map ( ( r ) => r ?. _fields ?. [ displayValueRowIndex ] || '(no data)' ) . sort ( ) }
111- style = { { maxWidth : 'calc(100% - 30px)' , marginLeft : '15px' , marginTop : '5px' } }
112- inputValue = { inputDisplayText }
113- onInputChange = { ( event , value ) => {
114- setInputDisplayText ( value ) ;
115- debouncedQueryCallback ( props . query , { input : `${ value } ` , ...allParameters } , setExtraRecords ) ;
116- } }
117- isOptionEqualToValue = { ( option , value ) => {
118- return ( option && option . toString ( ) ) === ( value && value . toString ( ) ) ;
119- } }
120- value = { inputValue }
121- onChange = { propagateSelection }
122- renderInput = { ( params ) => (
123- < TextField
124- { ...params }
125- InputLabelProps = { { shrink : true } }
126- placeholder = 'Start typing...'
127- label = { helperText ? helperText : `${ label } ${ propertyType } ` }
128- variant = 'outlined'
129- />
122+ < div >
123+ < Autocomplete
124+ id = 'autocomplete'
125+ multiple = { multiSelector }
126+ options = { extraRecords . map ( ( r ) => r ?. _fields ?. [ displayValueRowIndex ] || '(no data)' ) . sort ( ) }
127+ style = { { maxWidth : 'calc(100% - 30px)' , marginLeft : '15px' , marginTop : '5px' } }
128+ inputValue = { inputDisplayText || '' }
129+ onInputChange = { ( event , value ) => {
130+ setInputDisplayText ( value ) ;
131+ debouncedQueryCallback ( props . query , { input : `${ value } ` , ...allParameters } , setExtraRecords ) ;
132+ } }
133+ isOptionEqualToValue = { ( option , value ) => {
134+ return ( option && option . toString ( ) ) === ( value && value . toString ( ) ) ;
135+ } }
136+ value = { inputValue }
137+ onChange = { propagateSelection }
138+ renderInput = { ( params ) => (
139+ < TextField
140+ { ...params }
141+ InputLabelProps = { { shrink : true } }
142+ placeholder = 'Start typing...'
143+ label = { helperText ? helperText : `${ label } ${ propertyType } ` }
144+ variant = 'outlined'
145+ />
146+ ) }
147+ getOptionLabel = { ( option ) => RenderSubValue ( option ) }
148+ />
149+ { setManual ? (
150+ < SelectionConfirmationButton onClick = { ( ) => manualHandleParameters ( ) } key = { `selectionConfirmation` } />
151+ ) : (
152+ < > </ >
130153 ) }
131- getOptionLabel = { ( option ) => RenderSubValue ( option ) }
132- />
154+ </ div >
133155 ) ;
134156} ;
135157
0 commit comments