2018-07-16 20:02:12 +02:00
## Info
2018-07-21 20:08:33 +02:00
This package provides a single react component.
The component contains an input field with a drop down menu to pick a possible option based on the current input as a react component.
Following features describe and might distinguish the component from other npm packages that offer a similar react component:
< br >
- Hand over an array of options (items) with label and key properties
- Feel free to add additional properties to access those on selection within your callback function
2018-07-21 20:14:11 +02:00
- On selection the selected item will be passed to the callback function
2018-07-21 20:08:33 +02:00
- Define your own matching algorithm to restrict which options should be shown in the drop down menu based on the current user input
- Or do not pass an own matching algorithm and just use the default match function
- The current user input will be highlighted (bold) within each label in the drop down menu
- The callback function will be triggered only if the key property has changed since the last selection
- Selecting the same item twice in a row will trigger the callback function only once (on the first selection)
2018-07-16 20:02:12 +02:00
Have a look at [w3schools.com ](https://www.w3schools.com/howto/howto_js_autocomplete.asp ) to see how you can do the same thing with pure html, css, and js.
2018-07-19 13:11:01 +02:00
For more information about react and the ecosystem see this [guide ](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md ).
2018-07-16 20:02:12 +02:00
2018-07-19 13:48:08 +02:00
## Check it out yourself
Have a look at this [demo app ](https://stark-retreat-79786.herokuapp.com/ ) using the react-datalist-input component.
2018-07-21 20:08:33 +02:00
< br > The app is running on heroku for free, so I hope it is still up.
2018-07-19 13:48:08 +02:00
2018-07-16 20:02:12 +02:00
## Feedback
2018-07-21 20:08:33 +02:00
Feel free to get inspired and more importantly please provide [your feedback ](https://github.com/andrelandgraf/react-datalist-input/issues ) on structure and style. I'm more than happy to learn how to improve my code and architecture.
2018-07-16 20:02:12 +02:00
2018-07-19 13:11:01 +02:00
## Installation
2018-07-16 20:02:12 +02:00
2018-07-21 20:08:33 +02:00
**Installation via npm**
2018-07-16 20:02:12 +02:00
```
2018-07-19 13:11:01 +02:00
npm install react-datalist-input --save
```
***Basic Usage***
2018-07-16 20:02:12 +02:00
```
2018-07-19 13:11:01 +02:00
import DataListInput from 'react-datalist-input';
2018-07-16 20:02:12 +02:00
2018-07-21 20:08:33 +02:00
/**
* create your own match algorithm if you want to do so
* @param currentInput String (the current user input)
* @param item (one item of the items array)
* @returns {boolean}
*/
2018-07-19 13:11:01 +02:00
matchCurrentInput = (currentInput, item) => {
2018-07-21 20:08:33 +02:00
const yourLogic = item.someAdditionalValue;
return (yourLogic.substr(0, currentInput.length).toUpperCase() === currentInput.toUpperCase());
2018-07-19 13:11:01 +02:00
};
2018-07-16 20:02:12 +02:00
2018-07-21 20:08:33 +02:00
/**
* your callback function gets called if the user selects one option out of the drop down menu
* @param selectedItem object (the selected item / option)
* @returns {*}
*/
onSelect = (selectedItem) => {
this.doSomething(selectedItem);
2018-07-19 13:11:01 +02:00
};
render() {
// the array you want to pass to the react-data-list component
2018-07-21 20:08:33 +02:00
// each element at least needs a key and a label
2018-07-19 13:11:01 +02:00
const items = this.props.values.map((item, i) => {
return {
2018-07-21 20:08:33 +02:00
// what to show to the user
2018-07-19 13:11:01 +02:00
label: item.id + ": " + item.name,
2018-07-21 20:08:33 +02:00
// key to identify the item within the array
2018-07-19 13:11:01 +02:00
key: item.id,
2018-07-21 20:08:33 +02:00
// feel free to add your own app logic to access those properties later on
2018-07-19 13:11:01 +02:00
someAdditionalValue: item.someAdditionalValue,
}
});
2018-07-19 13:22:25 +02:00
return(
< div >
< DataListInput placeholder = {"Select an option from the drop down menu . . . " }
items={items} onSelect={this.onSelect} match={this.matchCurrentInput}/>
< / div >
2018-07-19 13:11:01 +02:00
);
2018-07-16 20:02:12 +02:00
```
2018-07-19 13:22:25 +02:00
## Properties
2018-07-19 13:11:01 +02:00
2018-07-19 13:22:25 +02:00
***items***
2018-07-19 13:11:01 +02:00
- < b > Required</ b > property!
- The array of options for the drop down menu.< br >
- Every item inside the array needs to have following properties:
- key : an id that identifies the item within the array
- label: the label that will be shown in the drop down menu
2018-07-19 13:22:25 +02:00
***onSelect***
2018-07-19 13:11:01 +02:00
- < b > Required</ b > property!
- The callback function that will be called if the user selects one item of the drop down menu.
- Gets only called if the item changes. Selecting the same item twice will only trigger the function once (the first time).
- Parameter: (selectedKey)
- selectedKey: the Key Property of the item that the user selected
2018-07-19 13:22:25 +02:00
***match***
2018-07-19 13:11:01 +02:00
- Pass a match function as stated above for creating your own matching algorithm for the autocomplete functionality.
- Parameter: (currentInput, item)
- currentInput: String, the current user input typed into the input field
- item: Object, the item of the items array (with key and label properties)
- Default:
2018-07-16 20:02:12 +02:00
```
2018-07-19 13:11:01 +02:00
/**
* default function for matching the current input value (needle) and the values of the items array
2018-07-21 20:08:33 +02:00
* @param currentInput String (the current user input)
* @param item (one item of the items array)
2018-07-19 13:11:01 +02:00
* @returns {boolean}
*/
match = (currentInput, item) => {
return item.label.substr(0, currentInput.length).toUpperCase() === currentInput.toUpperCase();
};
```
2018-07-19 13:22:25 +02:00
***placeholder***
2018-07-19 13:11:01 +02:00
- The placeholder that will be shown inside the input field.
2018-07-21 20:08:33 +02:00
- Default is an empty string
2018-07-19 13:11:01 +02:00
2019-06-12 21:15:40 +02:00
***itemClassName***
- Additional classes to style each input field in the dropdown menu.
- Default is an empty string
***activeItemClassName***
- Additional classes to style the active input field.
- Default is an empty string
***inputClassName***
- Additional classes to style the input field.
- Default is an empty string
***requiredInputLength***
- Number to specify the threshold until when the dropdown menu should appear.
- Example `requiredInputLength=3` , only if the user input is longer than 2 characters, the dropdown menu will appear.
- Default is zero.
2019-06-13 11:31:00 +02:00
***clearInputOnSelect***
- Should the input field be cleared on select on filled with selected item?
- Default is false.
***suppressReselect***
- If suppressReselect is set to false, selecting the same item again, it will trigger another onSelect callback call.
- Default is true.
2018-07-21 20:14:11 +02:00