@@ -161,11 +161,12 @@ function InlineSelectEditor({
161161 initialCharacter !== undefined ? initialCharacter : formatValueForInput ( value , column . type )
162162 )
163163 const [ highlightIndex , setHighlightIndex ] = useState ( 0 )
164- // Enter/Tab only auto-pick the highlighted option after the user has typed
165- // or arrow-navigated; a bare Enter on an untouched draft saves it verbatim,
166- // so confirming a cell never silently rewrites its value to an option's
167- // casing. Typeahead-opened editors start interacted (the char was typed).
168- const [ interacted , setInteracted ] = useState ( initialCharacter !== undefined )
164+ // Enter/Tab only auto-pick the highlighted option after the user has arrow-
165+ // navigated, or typed a non-empty filter; a bare Enter on an untouched draft
166+ // saves it verbatim, so confirming a cell never silently rewrites its value
167+ // to an option's casing. Typeahead-opened editors start typed.
168+ const [ typed , setTyped ] = useState ( initialCharacter !== undefined )
169+ const [ navigated , setNavigated ] = useState ( false )
169170
170171 const options = column . options ?? [ ]
171172 const query = draft . trim ( ) . toLowerCase ( )
@@ -202,21 +203,22 @@ function InlineSelectEditor({
202203 if ( e . key === 'ArrowDown' || e . key === 'ArrowUp' ) {
203204 e . preventDefault ( )
204205 if ( filtered . length === 0 ) return
205- setInteracted ( true )
206+ setNavigated ( true )
206207 const delta = e . key === 'ArrowDown' ? 1 : - 1
207208 setHighlightIndex ( ( i ) => ( i + delta + filtered . length ) % filtered . length )
208209 } else if ( e . key === 'Enter' || e . key === 'Tab' ) {
209210 e . preventDefault ( )
210211 const reason : SaveReason = e . key === 'Tab' ? ( e . shiftKey ? 'shift-tab' : 'tab' ) : 'enter'
211- doSave ( reason , interacted && query !== '' && highlighted ? highlighted : undefined )
212+ const pick = highlighted !== undefined && ( navigated || ( typed && query !== '' ) )
213+ doSave ( reason , pick ? highlighted : undefined )
212214 } else if ( e . key === 'Escape' ) {
213215 e . preventDefault ( )
214216 doneRef . current = true
215217 clearTimeout ( blurTimeoutRef . current )
216218 onCancel ( )
217219 }
218220 } ,
219- [ doSave , onCancel , filtered . length , highlighted , query , interacted ]
221+ [ doSave , onCancel , filtered . length , highlighted , query , typed , navigated ]
220222 )
221223
222224 const handleBlur = useCallback ( ( ) => {
@@ -233,7 +235,8 @@ function InlineSelectEditor({
233235 onChange = { ( e ) => {
234236 setDraft ( e . target . value )
235237 setHighlightIndex ( 0 )
236- setInteracted ( true )
238+ setTyped ( true )
239+ setNavigated ( false )
237240 } }
238241 onKeyDown = { handleKeyDown }
239242 onBlur = { handleBlur }
0 commit comments