react-searchable-input
A react based text input with search/select/multi-select build in
example usage
; const handleSelect = { // do something with the selected items array (the returned value is alway an array even we have only one item selected)} const handleSearch = { // do something with the input search value // EX: perfect place to ajax fetch} //what ever you like, just don't forget the `key`//for validated html structure, better use span as wrapper elementconst renderListItem = <span key=itemid> <img src=itemimg alt=itemlabel /> <span>` = `</span> </span> const someComponent = <wrapper> <SearchableInput name='sample' onListItemClick=handleSelect asyncSearch=handleSearch collection=collection placeholder='search for something' theme= disabledColor: "#DDDDDD" inputHeight: '34px' listMaxHeight: "500px" listPadding: '20px' listWidth: '100%' listTop: '30px' listLeft: '0px' listBg: 'transparent' renderListItem=renderListItem /> </wrapper>
Props:
Name | type | default | description |
---|---|---|---|
collection | array | The only required props, can be an array of string, or an array of object. In later case, each object should contain minimum an id and a label |
|
placeholder | string | "Choose an item" | placeholder text for input field |
isDisabled | boolean | false | disable the search input all together |
onListItemClick | function | a callback function takes an array of the current selected items as argument, to trigger further actions | |
asyncSearch | function | a callback function to trigger ajax search when current input changed | |
enableCache | boolean | false | allow local cache for search result, useful when you have ayncSearch but don't use advanced async flow control solution like rx.js or redux-saga , it will throttle onChange event to prevent fetch on every keystroke, and cache a maximum of 10 queries results to be retrieved directly instead of calling the server again |
showLabelText | boolean | false | Label Text is a text overlay after you selected some items in search result, without modifying the underlying search input. It would display n selected for multi selection (where n is the number of items selected), or the label of item for single selection |
multi | boolean | false | enable multiple item selection, turn the result list to checkbox items |
closeOnSelect | boolean | true | control if the search list should be hidden after selected an item, always false for multi-selection |
enableSelectAll | boolean | false | used when active multi option, add an option on top of search list, to select/deselect all avaiable items on the list |
selectAll | object | { |
text to display for select/deselect all when enableSelectAll is true |
theme | object | { |
theme variables allow to custom the appearance of list) |
renderListItem | function | a render function allows to customize the list items, it takes the shape of item inside collection props, and should return a validated DOM node/ react node |
|
onPressEnter | function | function to call with current input value when user typed enter key |
|
onBlur | function | additional function to call when the whole component lost focus | |
onFocus | function | addtional function when the input field is focused | |
showError | boolean | to display an error message if something went wrong (EX: ajax fetch failed) | |
defaultError | string or nodes | "please select a valid label" | if showError is true , display it |
TODO:
- SSR support (ClickOutside component)
- Better cache strategy (attach unique id to a given request to associate response)
- More customization options for elements (multi-selections, etc)
- TypeScript