Customizable autocomplete for really large collections
See examples here!
Use it as an npm package:
npm install bonanza --save
Or just download it from bower
bower install bonanza --save
Just use this package instead
You just need an input to work on and a function (a.k.a. callback) that returns your favorite data
element
(required): aHTMLInput
Javascript element that will be used for autocompletionoptions
(optional): a set of parameters to customizebonanza
as neededcallback | list
(required):bonanza
doesn't know how to get your data, so it needs a function that receives a query, and returns the rows as anArray
that will be used to fill the autocomplete info, or even an array with all the results that you need to display.
The example below shows you how to easily set up bonanza
for an input
element:
bonanza(element, function (query, callback) {
get('/someApi?query=' + query.search + '&offset=' + query.offset + '&limit=' + query.limit, function (err, data) {
if (err) {
callback(err);
return;
}
callback(null, data);
});
});
The options
are detailed below:
An object with a set of functions. Here you have a detailed table with all that you need to replace:
Property | Default | Usage |
---|---|---|
itemLabel | (obj) => obj |
List items |
item | ...customCode |
Custom HTML for list item |
label | (obj) => obj |
Input value when user selects some item |
isDisabled | (obj) => false |
Marks an item as disabled |
noResults | (search) => \ No results for "${search}"`` |
Showed when query returns no results |
loadMore | ... |
Showed at bottom when there is more data to show |
loading | Loading ... |
Showed at bottom when loading more data |
An object with a set of CSS class names. The detailed list of css classes by default can be found below:
Property | Default | Purpose |
---|---|---|
container | bz-container |
The div class for the main container |
hide | bz-hide |
Class to hide the container |
list | bz-list |
The class for the ul inside the container |
item | bz-list-item |
Every li element for the results |
disabled | bz-list-item-disabled |
A disabled element in the list |
selected | bz-list-item-selected |
When an item is being selected |
loading | bz-list-loading |
The "loading" li item |
loadMore | bz-list-load-more |
The "load more" li item |
noResults | bz-list-no-results |
The li item showed when no results for last search |
inputLoading | bz-loading |
A class for the input element when loading |
match | bz-text-match |
A class when the search matches the text on an item |
A boolean that decides whatever the list will be open on focus event or not. true
by default.
If true
it will show a loading text when bonanza
does the first search (with the list empty). true
by defualt.
If true
it will show a "load more" legend text when bonanza
has more items to show. true
by defualt.
The max number of rows expected, 10
by default.
The distance in px before the bottom that will make bonanza
start loading more items. 0
by default.
A function that helps to decide whatever the list being accesed has more items to display or not. By default is this function:
function (result) { return !!result.length && result.length === this.limit; }
This will be used to parse what you send from your callback, to the array that bonanza
expects as a result. It contains the following function by default:
function (result) { return result; }
The object being returned after initializing bonanza
is an EventEmitter
instance. bonanza
emits a set of events detailed below:
Event | Definition |
---|---|
focus | When the user made focus on the input element |
change | Every time the user picks an option |
select | Every time the user selects an option, usually navigating the list with the arrow keys |
cancel | Every time the user cancels the operation, usually touching the esc key |
open | When something opens the items list |
close | When the user or an event closes the list |
search | When starting to do a search |
success | When the search returns data |
error | Every time an error sadly occurs |
The dist
folder as well as the version in the package.json
file should not be modified. Create a PR with your changes and if needed a test asserting them. Once merged a new version will be uploaded to bower and npm with the dist
folder updated.
MIT