Extends existing [Bootstrap Select] implementations by adding the ability to search via AJAX requests as you type. Originally for CROSCON.
npm install ajax-bootstrap-select* Getting Started
* Requirements
* Options
* Locale Strings
* JSON Results
* Usage Example
* License
[Bootstrap Select] must either be be initialized with liveSearch enabled in the passed options or the select element must have the data-live-search="true" attribute.
This plugin must be initialized __after__ [Bootstrap Select] has been initialized. For a more detailed explanation on implementation, see usage example.
__Suggested requirements:__
* [Bootstrap 3.2.0+]
* [jQuery 1.9+] - [Bootstrap prerequisite]
Options can be passed via data attributes or through the JavaScript options object. For data attributes, append the option name to the data-abs- prefix. Options names (and any nested options) are always lower case and separated by -, such as in data-abs-ajax-url="..." or data-abs-locale-search-placeholder="...".
#### ~~options.ajaxResultsPreHook~~
> __Deprecated:__ Since version 1.2.0, see: options.preprocessData.
>
> __Type:__ Function
>
*
#### options.ajax
> __Required__
>
> __Type:__ Object
>
> __Data Attribute:__ data-abs-ajax[-*]="..."
>
> The options to pass to the jQuery AJAX request.
> ``js`
> {
> url: null, // Required.
> type: 'POST',
> dataType: 'json',
> data: {
> q: '{{{q}}}'
> }
> }
>
*
#### options.minLength
> __Type:__ Number0
>
> __Default:__ data-abs-min-length="..."
>
> __Data Attribute:__
>
> Invoke a request for empty search values.
*
#### ~~options.ajaxSearchUrl~~
> __Deprecated:__ Since version 1.2.0, see: options.ajax.String
>
> __Type:__
>
*
#### options.bindEvent
> __Type:__ String"keyup"
>
> __Default:__ data-abs-bind-event="..."
>
> __Data Attribute:__
>
> The event to bind on the search input element to fire a request.
*
#### options.cache
> __Type:__ Booleantrue
>
> __Default:__ data-abs-cache="..."
>
> __Data Attribute:__
>
> Cache previous requests. If enabled, the "enter" key (13) is enabled to
> allow users to force a refresh of the request.
*
#### options.clearOnEmpty
> __Type:__ Booleantrue
>
> __Default:__ data-abs-clear-on-empty="..."
>
> __Data Attribute:__
>
> Clears the previous results when the search input has no value.
*
#### options.clearOnError
> __Type:__ Booleantrue
>
> __Default:__ data-abs-clear-on-error="..."
>
> __Data Attribute:__
>
> Clears the select list when the request returned with an error.
*
#### ~~options.debug~~
> __Deprecated:__ Since version 1.2.0, see: options.log.Boolean
>
> __Type:__
>
*
#### options.emptyRequest
> __Type:__ Booleanfalse
>
> __Default:__ data-abs-empty-request="..."
>
> __Data Attribute:__
>
> Invoke a request for empty search values.
*
#### options.ignoredKeys
> __Type:__ Objectdata-abs-ignored-keys[-*]="..."
>
> __Data Attribute:__ `
>
> Key codes to ignore so a request is not invoked with bindEvent. The
> "enter" key (13) will always be dynamically added to any list provided
> unless the "cache" option above is set to "true".
> js`
> {
> 9: "tab",
> 16: "shift",
> 17: "ctrl",
> 18: "alt",
> 27: "esc",
> 37: "left",
> 39: "right",
> 38: "up",
> 40: "down",
> 91: "meta"
> }
>
*
#### options.langCode
> __Type:__ Stringnull
>
> __Default:__ data-abs-lang-code="..."
>
> __Data Attribute:__
>
> The language code to use for string translation. By default this value
> is determined by the browser, however it is not entirely reliable. If
> you encounter inconsistencies, you may need to manually set this option.
*
#### options.locale
> __Type:__ Objectnull
>
> __Default:__ data-abs-locale[-*]="..."
>
> __Data Attribute:__ `
>
> Provide specific overrides for locale string translations. Values
> set here will cause the plugin to completely ignore defined locale string
> translations provided by the set language code. This is useful when
> needing to change a single value or when being used in a system that
> provides its own translations, like a CMS.
> js`
> locale: {
> searchPlaceholder: Drupal.t('Find...')
> }
>
*
#### options.log
> __Type:__ String|Number|Number'error'
>
> __Default:__ data-abs-log="..."
>
> __Data Attribute:__
>
> Determines the amount of logging that is displayed:
> - __0, false:__ Display no information from the plugin.
> - __1, 'error':__ Fatal errors that prevent the plugin from working.
> - __2, 'warn':__ Warnings that may impact the display of request data, but does not prevent the plugin from functioning.
> - __3, 'info':__ Provides additional information, generally regarding the from request data and callbacks.
> - __4, true, 'debug':__ Display all possible information. This will likely be highly verbose and is only recommended for development purposes or tracing an error with a request.
*
#### ~~options.mixWithCurrents~~
> __Deprecated:__ Since version 1.2.0, see: options.preserveSelected.Boolean
>
> __Type:__
>
*
#### ~~options.placeHolderOption~~
> __Deprecated:__ Since version 1.2.0, see: locale.emptyTitle.
>
*
#### options.preprocessData
> __Type:__ Function|nullfunction(){}
>
> __Default:__ Array
>
> Process the raw data returned from a request.
> The following arguments are passed to this callback:
> - __data__ - The raw data returned from the request, passed by reference.Array
> This callback must return one of the following:
> - - A new array of items. This will replace the passed data.undefined|null|false
> - - Stops the callback and will use whatever modifications have been made to data.`
> js`
> function (data) {
> var new = [], old = [], other = [];
> for (var i = 0; i < data.length; i++) {
> // Add items flagged as "new" to the correct array.
> if (data[i].new) {
> new.push(data[i]);
> }
> // Add items flagged as "old" to the correct array.
> else if (data[i].old) {
> old.push(data[i]);
> }
> // Something out of the ordinary happened, put these last.
> else {
> other.push(data[i]);
> }
> }
> // Sort the data according to the order of these arrays.
> return [].concat(new, old, other).
> }
>
*
#### options.preserveSelected
> __Type:__ Booleantrue
>
> __Default:__ data-abs-preserve-selected="..."
>
> __Data Attribute:__
>
> Preserve selected items(s) between requests. When enabled, they will be
> placed in an
*
#### options.preserveSelectedPosition
> __Type:__ String'after'
>
> __Default:__ data-abs-preserve-selected-position="..."
>
> __Data Attribute:__ 'before'
>
> Place the currently selected options or 'after' the options
> returned from the request.
*
#### options.processData
> __Type:__ Function|nullfunction(){}
>
> __Default:__
>
> Process the data returned after this plugin, but before the list is built.
*
#### options.requestDelay
> __Type:__ Number300
>
> __Default:__ data-abs-request-delay="..."
>
> __Data Attribute:__
>
> The amount of time, in milliseconds, that must pass before a request
> is initiated. Each time the options.bindEvent is fired, it will cancel the
> current delayed request and start a new one.
*
#### options.restoreOnError
> __Type:__ Booleanfalse
>
> __Default:__ data-abs-restore-on-error="..."
>
> __Data Attribute:__
>
> Restores the select list with the previous results when the request
> returns with an error.
*
#### options.templates
> __Type:__ Objectdata-abs-templates[-*]="..."
>
> __Data Attribute:__ `
>
> The DOM templates used in this plugin.
> js`
> templates: {
> // The placeholder for status updates pertaining to the list and request.
> status: '',
> }
>
*
See: options.locale
#### locale.currentlySelected
> __Type:__ String'Currently Selected'
>
> __Default:__
>
> The text to use for the label of the option group when currently selected options are preserved.
*
#### locale.emptyTitle
> __Type:__ String'Select and begin typing'
>
> __Default:__
>
> The text to use as the title for the select element when there are no items to display.
*
#### locale.errorText
> __Type:__ String''Unable to retrieve results'
>
> __Default:__
>
> The text to use in the status container when a request returns with an error.
*
#### locale.searchPlaceholder
> __Type:__ String'Search...'
>
> __Default:__
>
> The text to use for the search input placeholder attribute.
*
#### locale.statusInitialized
> __Type:__ String'Start typing a search query'
>
> __Default:__
>
> The text used in the status container when it is initialized.
*
#### locale.statusNoResults
> __Type:__ String'No Results'
>
> __Default:__
>
> The text used in the status container when the request returns no results.
*
#### locale.statusSearching
> __Type:__ String'Searching...'
>
> __Default:__
>
> The text to use in the status container when a request is being initiated.
*
#### locale.statusTooShort
> __Type:__ String'Please enter more characters'
>
> __Default:__
>
> The text used in the status container when the request returns no results.
*
`js
[
{
value: 'string', // Required.
text: 'string', // If not set, it will use the value as the text.
class: 'string', // The CSS class(es) to apply to the option element.
disabled: false, // {Boolean} true|false
// NOTE: If "divider" is present as a property, the entire item is
// considered a divider and the rest of the item value/data is
// ignored. Alternatively, this can be set in the data property as well.
divider: true,
// Data attributes that you would set on the option tag, these will be
// set on the newly created options tags and the selectpicker plugin
// will process them accordingly.
data: {
divider: true,
subtext: 'string',
icon: 'class-name', // Icon class name ex: icon-glass
content: '
$3
`js
$('.select-picker')
.selectpicker({
liveSearch: true
})
.ajaxSelectPicker({
ajax: {
url: '/server/path/to/ajax/results',
data: function () {
var params = {
q: '{{{q}}}'
};
if(gModel.selectedGroup().hasOwnProperty('ContactGroupID')){
params.GroupID = gModel.selectedGroup().ContactGroupID;
}
return params;
}
},
locale: {
emptyTitle: 'Search for contact...'
},
preprocessData: function(data){
var contacts = [];
if(data.hasOwnProperty('Contacts')){
var len = data.Contacts.length;
for(var i = 0; i < len; i++){
var curr = data.Contacts[i];
contacts.push(
{
'value': curr.ContactID,
'text': curr.FirstName + ' ' + curr.LastName,
'data': {
'icon': 'icon-person',
'subtext': 'Internal'
},
'disabled': false
}
);
}
}
return contacts;
},
preserveSelected: false
});
``
*
[Bootstrap 3.2.0+]: http://getbootstrap.com/getting-started/#download
[Bootstrap prerequisite]: http://getbootstrap.com/getting-started/#whats-included
[Bootstrap]: http://getbootstrap.com
[Bootstrap Select 1.6.3+]: https://github.com/silviomoreto/bootstrap-select/releases/tag/v1.6.3
[Bootstrap Select]: https://github.com/silviomoreto/bootstrap-select
[jQuery 1.9+]: http://jquery.com/download/
[jQuery]: http://jquery.com
