1- import { useCallback , useEffect , useMemo , useRef , useState } from 'react' ;
1+ import { useEffect , useMemo , useRef , useState } from 'react' ;
22import Fuse from 'fuse.js' ;
33import { OverlayTrigger } from 'react-bootstrap' ;
4- import { TextInput , UnstyledButton } from '@mantine/core' ;
4+ import { Textarea , UnstyledButton } from '@mantine/core' ;
55
66import { useQueryHistory } from '@/utils' ;
77
@@ -27,7 +27,7 @@ export default function AutocompleteInput({
2727 queryHistoryType,
2828 'data-testid' : dataTestId ,
2929} : {
30- inputRef : React . RefObject < HTMLInputElement > ;
30+ inputRef : React . RefObject < HTMLTextAreaElement > ;
3131 value ?: string ;
3232 onChange : ( value : string ) => void ;
3333 onSubmit ?: ( ) => void ;
@@ -236,14 +236,19 @@ export default function AutocompleteInput({
236236 } }
237237 trigger = { [ ] }
238238 >
239- < TextInput
239+ < Textarea
240240 ref = { inputRef }
241- type = "text"
242- style = { { flexGrow : 1 } }
243241 placeholder = { placeholder }
244- className = "border-0 fs-8"
242+ className = "fs-8"
245243 value = { value }
246244 size = { size }
245+ autosize
246+ minRows = { 1 }
247+ maxRows = { 4 }
248+ style = { {
249+ flexGrow : 1 ,
250+ resize : 'none' ,
251+ } }
247252 data-testid = { dataTestId }
248253 onChange = { e => onChange ( e . target . value ) }
249254 onFocus = { ( ) => {
@@ -257,12 +262,12 @@ export default function AutocompleteInput({
257262 setIsSearchInputFocused ( false ) ;
258263 } }
259264 onKeyDown = { e => {
260- if ( e . key === 'Escape' && e . target instanceof HTMLInputElement ) {
265+ if ( e . key === 'Escape' && e . target instanceof HTMLTextAreaElement ) {
261266 e . target . blur ( ) ;
262267 }
263268
264269 // Autocomplete Navigation/Acceptance Keys
265- if ( e . key === 'Tab' && e . target instanceof HTMLInputElement ) {
270+ if ( e . key === 'Tab' && e . target instanceof HTMLTextAreaElement ) {
266271 if (
267272 suggestedProperties . length > 0 &&
268273 selectedAutocompleteIndex < suggestedProperties . length &&
@@ -274,23 +279,31 @@ export default function AutocompleteInput({
274279 ) ;
275280 }
276281 }
277- if ( e . key === 'Enter' && e . target instanceof HTMLInputElement ) {
282+ if ( e . key === 'Enter' && e . target instanceof HTMLTextAreaElement ) {
278283 if (
279284 suggestedProperties . length > 0 &&
280285 selectedAutocompleteIndex < suggestedProperties . length &&
281286 selectedAutocompleteIndex >= 0
282287 ) {
288+ e . preventDefault ( ) ;
283289 onAcceptSuggestion (
284290 suggestedProperties [ selectedAutocompleteIndex ] . value ,
285291 ) ;
286292 } else {
287- if ( queryHistoryType && value ) {
288- setQueryHistory ( value ) ;
293+ // Allow shift+enter to still create new lines
294+ if ( ! e . shiftKey ) {
295+ e . preventDefault ( ) ;
296+ if ( queryHistoryType && value ) {
297+ setQueryHistory ( value ) ;
298+ }
299+ onSubmit ?.( ) ;
289300 }
290- onSubmit ?.( ) ;
291301 }
292302 }
293- if ( e . key === 'ArrowDown' && e . target instanceof HTMLInputElement ) {
303+ if (
304+ e . key === 'ArrowDown' &&
305+ e . target instanceof HTMLTextAreaElement
306+ ) {
294307 if ( suggestedProperties . length > 0 ) {
295308 setSelectedAutocompleteIndex (
296309 Math . min (
@@ -301,7 +314,7 @@ export default function AutocompleteInput({
301314 ) ;
302315 }
303316 }
304- if ( e . key === 'ArrowUp' && e . target instanceof HTMLInputElement ) {
317+ if ( e . key === 'ArrowUp' && e . target instanceof HTMLTextAreaElement ) {
305318 if ( suggestedProperties . length > 0 ) {
306319 setSelectedAutocompleteIndex (
307320 Math . max ( selectedAutocompleteIndex - 1 , 0 ) ,
@@ -311,15 +324,15 @@ export default function AutocompleteInput({
311324 } }
312325 rightSectionWidth = { ref . current ?. clientWidth ?? 'auto' }
313326 rightSection = {
314- < div ref = { ref } >
315- { language != null && onLanguageChange != null && (
327+ language != null && onLanguageChange != null ? (
328+ < div ref = { ref } >
316329 < InputLanguageSwitch
317330 showHotkey = { showHotkey && isSearchInputFocused }
318331 language = { language }
319332 onLanguageChange = { onLanguageChange }
320333 />
321- ) }
322- </ div >
334+ </ div >
335+ ) : undefined
323336 }
324337 />
325338 </ OverlayTrigger >
0 commit comments