diff --git a/packages/forma-36-react-components/src/components/Autocomplete/Autocomplete.tsx b/packages/forma-36-react-components/src/components/Autocomplete/Autocomplete.tsx index 08b41dc07e..ad19315521 100644 --- a/packages/forma-36-react-components/src/components/Autocomplete/Autocomplete.tsx +++ b/packages/forma-36-react-components/src/components/Autocomplete/Autocomplete.tsx @@ -1,4 +1,4 @@ -import React, { useReducer, useMemo, useRef } from 'react'; +import React, { useMemo, useReducer, useRef } from 'react'; import TextInput from '../TextInput'; import Dropdown, { DropdownProps } from '../Dropdown'; @@ -17,6 +17,19 @@ const NAVIGATED_ITEMS = 'NAVIGATED_ITEMS'; const QUERY_CHANGED = 'QUERY_CHANGED'; const ITEM_SELECTED = 'ITEM_SELECTED'; +interface RenderToggleElementProps { + query?: string; + onChange: (value: string) => void; + onFocus: () => void; + onKeyDown: (event: React.KeyboardEvent) => void; + onToggle: () => void; + disabled?: boolean; + placeholder?: string; + width?: 'small' | 'medium' | 'large' | 'full'; + inputRef: React.RefObject; + name?: string; +} + export interface AutocompleteProps { children: (items: T[]) => React.ReactNode[]; items: T[]; @@ -33,6 +46,7 @@ export interface AutocompleteProps { noMatchesMessage?: string; willClearQueryOnClose?: boolean; dropdownProps?: DropdownProps; + renderToggleElement?: (props: RenderToggleElementProps) => React.ReactElement; } interface State { @@ -102,6 +116,7 @@ export const Autocomplete = ({ noMatchesMessage = 'No matches', willClearQueryOnClose, dropdownProps, + renderToggleElement, }: AutocompleteProps) => { const listRef: React.MutableRefObject = useRef(); const inputRef: React.MutableRefObject< @@ -174,6 +189,51 @@ export const Autocomplete = ({ const dropdownClassNames = cn(styles.autocompleteDropdown, className); + function renderDefaultToggleElement(toggleProps: RenderToggleElementProps) { + return ( +
+ toggleProps.onChange(e.target.value)} + onFocus={toggleProps.onFocus} + onKeyDown={toggleProps.onKeyDown} + disabled={toggleProps.disabled} + placeholder={toggleProps.placeholder} + width={toggleProps.width} + inputRef={toggleProps.inputRef} + testId="autocomplete.input" + type="search" + autoComplete="off" + aria-label={toggleProps.name} + /> + +
+ ); + } + + const toggleProps = { + name, + query, + disabled, + placeholder, + width, + onChange: updateQuery, + onFocus: () => toggleList(true), + onKeyDown: handleKeyDown, + onToggle: handleInputButtonClick, + inputRef: inputRef as React.RefObject, + }; + + const renderToggleElementFunction = + renderToggleElement || renderDefaultToggleElement; + return ( ({ willClearQueryOnClose && updateQuery(''); dispatch({ type: TOGGLED_LIST }); }} - toggleElement={ -
- updateQuery(e.target.value)} - onFocus={() => toggleList(true)} - onKeyDown={handleKeyDown} - disabled={disabled} - placeholder={placeholder} - width={width} - inputRef={inputRef as React.RefObject} - testId="autocomplete.input" - type="search" - autoComplete="off" - aria-label={name} - /> - -
- } + toggleElement={renderToggleElementFunction(toggleProps)} {...dropdownProps} >