# Ajax-Chosen This project is an addition to the excellent [Chosen jQuery plugin](https://github.com/harvesthq/chosen) that makes HTML input forms more friendly. Chosen adds search boxes to `select` HTML elements, so I felt it could use the addition of ajax autocomplete for awesomely dynamic forms. This script bootstraps the existing Chosen plugin without making any modifications to the original code. Eventually, I would love to see this functionality built-in to the library, but until then, this seems to work pretty well. ## Note about this fork This fork introduces compatibility for Chosen 1.x and a new plugin structure closer to the default jQuery plugin structure. Merge requests are still open on the main Ajax Chosen repository but haven't been merged. ## How to Use This plugin exposes a new jQuery function named `ajaxChosen` that we call on a `select` element. The first argument consists of the options passed to the jQuery $.ajax function. The `data` parameter is optional, and the `success` callback is also optional. The second argument is a callback that tells the plugin what HTML `option` elements to make. It is passed the data returned from the ajax call, and you have to return an array of objects for which each item has a `value` property corresponding to the HTML `option` elements' `value` attribute, and a `text` property corresponding to the text to display for each option. In other words: [{"value": 3, "text": "Ohio"}] becomes: or for grouping: [{ group: true, text: "Europe", items: [ { "value": "10", "text": "Stockholm" }, { "value": "23", "text": "London" } ] }, { group: true, text: "Asia", items: [ { "value": "36", "text": "Beijing" }, { "value": "20", "text": "Tokyo" } ] }] becomes: Note: Due to a bug in Chosen, it is necessary to change `choosen.css`. Add display: list-item; to .chzn-container .chzn-results .group-result { class ### Options There are some additional ajax-chosen specific options you can pass into the first argument to control its behavior. * `minTermLength`: minimum number of characters that must be typed before an ajax call is fired * `afterTypeDelay`: how many milliseconds to wait after typing stops to fire the ajax call * `jsonTermKey`: the ajax request key to use for the search query (defaults to `term`) ## Example Code ``` js $("#example-input").ajaxChosen({ type: 'GET', url: '/ajax-chosen/data.php', dataType: 'json' }, function (data) { var results = []; $.each(data, function (i, val) { results.push({ value: val.value, text: val.text }); }); return results; }); ``` To have the results grouped in `optgroup` elements, have the function return a list of group objects instead: ``` js $("#example-input").ajaxChosen({ type: 'GET', url: '/ajax-chosen/grouped.php', dataType: 'json' }, function (data) { var results = []; $.each(data, function (i, val) { var group = { // here's a group object: group: true, text: val.name, // label for the group items: [] // individual options within the group }; $.each(val.items, function (i1, val1) { group.items.push({value: val1.value, text: val1.text}); }); results.push(group); }); return results; }); ``` ## Developing ajax-chosen In order to install development dependencies, you can run in the ajax-chosen directory: ``` npm install -d ``` ajax-chosen is written in Coffeescript, so there is a Cakefile provided that will perform all necessary tasks for you. Simply run `cake` to see all available commands.