Skip to content

Commit 00181cd

Browse files
committed
fix(tables): pick arrow-highlighted option on Enter in select editor even with empty filter
1 parent a7b78af commit 00181cd

1 file changed

Lines changed: 12 additions & 9 deletions

File tree

  • apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-grid/cells

apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-grid/cells/inline-editors.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)