Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed broken callback, and the default value for chosenOptions should…

… be an object rather than a function
  • Loading branch information...
commit 18e593e1d5fbaa183f43dea76af4bfadcf8a960f 1 parent cd97514
@fredwu fredwu authored
View
7 lib/ajax-chosen.js
@@ -6,11 +6,8 @@
if (settings == null) {
settings = {};
}
- if (callback == null) {
- callback = {};
- }
if (chosenOptions == null) {
- chosenOptions = function() {};
+ chosenOptions = {};
}
defaultOptions = {
minTermLength: 3,
@@ -65,7 +62,7 @@
select.find('optgroup:empty').each(function() {
return $(this).remove();
});
- items = callback(data);
+ items = callback != null ? callback(data) : data;
nbItems = 0;
$.each(items, function(i, element) {
var group, text, value;
View
5 lib/ajax-chosen.min.js
@@ -1,14 +1,13 @@
(function($){return $.fn.ajaxChosen=function(settings,callback,chosenOptions){var chosenXhr,defaultOptions,options,select;if(settings==null){settings={};}
-if(callback==null){callback={};}
-if(chosenOptions==null){chosenOptions=function(){};}
+if(chosenOptions==null){chosenOptions={};}
defaultOptions={minTermLength:3,afterTypeDelay:500,jsonTermKey:"term",keepTypingMsg:"Keep typing...",lookingForMsg:"Looking for"};select=this;chosenXhr=null;options=$.extend({},defaultOptions,$(select).data(),settings);this.chosen(chosenOptions?chosenOptions:{});return this.each(function(){return $(this).next('.chzn-container').find(".search-field > input, .chzn-search > input").bind('keyup',function(){var field,msg,success,untrimmed_val,val;untrimmed_val=$(this).val();val=$.trim($(this).val());msg=val.length<options.minTermLength?options.keepTypingMsg:options.lookingForMsg+(" '"+val+"'");select.next('.chzn-container').find('.no-results').text(msg);if(val===$(this).data('prevVal')){return false;}
$(this).data('prevVal',val);if(this.timer){clearTimeout(this.timer);}
if(val.length<options.minTermLength){return false;}
field=$(this);if(!(options.data!=null)){options.data={};}
options.data[options.jsonTermKey]=val;if(options.dataCallback!=null){options.data=options.dataCallback(options.data);}
success=options.success;options.success=function(data){var items,nbItems,selected_values;if(!(data!=null)){return;}
-selected_values=[];select.find('option').each(function(){if(!$(this).is(":selected")){return $(this).remove();}else{return selected_values.push($(this).val()+"-"+$(this).text());}});select.find('optgroup:empty').each(function(){return $(this).remove();});items=callback(data);nbItems=0;$.each(items,function(i,element){var group,text,value;nbItems++;if(element.group){group=select.find("optgroup[label='"+element.text+"']");if(!group.size()){group=$("<optgroup />");}
+selected_values=[];select.find('option').each(function(){if(!$(this).is(":selected")){return $(this).remove();}else{return selected_values.push($(this).val()+"-"+$(this).text());}});select.find('optgroup:empty').each(function(){return $(this).remove();});items=callback!=null?callback(data):data;nbItems=0;$.each(items,function(i,element){var group,text,value;nbItems++;if(element.group){group=select.find("optgroup[label='"+element.text+"']");if(!group.size()){group=$("<optgroup />");}
group.attr('label',element.text).appendTo(select);return $.each(element.items,function(i,element){var text,value;if(typeof element==="string"){value=i;text=element;}else{value=element.value;text=element.text;}
if($.inArray(value+"-"+text,selected_values)===-1){return $("<option />").attr('value',value).html(text).appendTo(group);}});}else{if(typeof element==="string"){value=i;text=element;}else{value=element.value;text=element.text;}
if($.inArray(value+"-"+text,selected_values)===-1){return $("<option />").attr('value',value).html(text).appendTo(select);}}});if(nbItems){select.trigger("liszt:updated");}else{select.data().chosen.no_results_clear();select.data().chosen.no_results(field.val());}
View
48 src/ajax-chosen.coffee
@@ -1,6 +1,6 @@
do ($ = jQuery) ->
- $.fn.ajaxChosen = (settings = {}, callback = {}, chosenOptions = ->) ->
+ $.fn.ajaxChosen = (settings = {}, callback, chosenOptions = {}) ->
defaultOptions =
minTermLength: 3
afterTypeDelay: 500
@@ -10,9 +10,9 @@ do ($ = jQuery) ->
# This will come in handy later.
select = @
-
+
chosenXhr = null
-
+
# Merge options with defaults
options = $.extend {}, defaultOptions, $(select).data(), settings
@@ -20,7 +20,7 @@ do ($ = jQuery) ->
# of using the .chzn-autoselect class to specify input elements
# we want to use with ajax autocomplete.
@chosen(if chosenOptions then chosenOptions else {})
-
+
@each ->
# Now that chosen is loaded normally, we can bootstrap it with
# our ajax autocomplete code.
@@ -29,7 +29,7 @@ do ($ = jQuery) ->
.bind 'keyup', ->
# This code will be executed every time the user types a letter
# into the input form that chosen has created
-
+
# Retrieve the current value of the input form
untrimmed_val = $(@).val()
val = $.trim $(@).val()
@@ -38,49 +38,49 @@ do ($ = jQuery) ->
# if they need to keep typing or if we are looking for their data
msg = if val.length < options.minTermLength then options.keepTypingMsg else options.lookingForMsg + " '#{val}'"
select.next('.chzn-container').find('.no-results').text(msg)
-
+
# If input text has not changed ... do nothing
return false if val is $(@).data('prevVal')
# Set the current search term so we don't execute the ajax call if
# the user hits a key that isn't an input letter/number/symbol
$(@).data('prevVal', val)
-
+
# At this point, we have a new term/query ... the old timer
# is no longer valid. Clear it.
# We delay searches by a small amount so that we don't flood the
# server with ajax requests.
clearTimeout(@timer) if @timer
-
+
# Some simple validation so we don't make excess ajax calls. I am
# assuming you don't want to perform a search with less than 3
# characters.
return false if val.length < options.minTermLength
-
+
# This is a useful reference for later
field = $(@)
-
+
# Default term key is `term`. Specify alternative in options.options.jsonTermKey
options.data = {} if not options.data?
options.data[options.jsonTermKey] = val
- options.data = options.dataCallback(options.data) if options.dataCallback?
-
+ options.data = options.dataCallback(options.data) if options.dataCallback?
+
# If the user provided an ajax success callback, store it so we can
# call it after our bootstrapping is finished.
success = options.success
-
+
# Create our own callback that will be executed when the ajax call is
# finished.
options.success = (data) ->
# Exit if the data we're given is invalid
return if not data?
-
+
# Go through all of the <option> elements in the <select> and remove
# ones that have not been selected by the user. For those selected
# by the user, add them to a list to filter from the results later.
selected_values = []
- select.find('option').each ->
+ select.find('option').each ->
if not $(@).is(":selected")
$(@).remove()
else
@@ -88,11 +88,11 @@ do ($ = jQuery) ->
select.find('optgroup:empty').each ->
$(@).remove()
-
+
# Send the ajax results to the user callback so we can get an object of
# value => text pairs to inject as <option> elements.
- items = callback data
-
+ items = if callback? then callback(data) else data
+
nbItems = 0
@@ -151,19 +151,19 @@ do ($ = jQuery) ->
field.val(untrimmed_val)
# Because non-ajax Chosen isn't constantly re-building results, when it
- # DOES rebuild results (during liszt:updated above, it clears the input
- # search field before scaling it. This causes the input field width to be
- # at it's minimum, which is about 25px.
+ # DOES rebuild results (during liszt:updated above, it clears the input
+ # search field before scaling it. This causes the input field width to be
+ # at it's minimum, which is about 25px.
# The proper way to fix this would be create a new method in chosen for
- # rebuilding results without clearing the input field. Or to call
+ # rebuilding results without clearing the input field. Or to call
# Chosen.search_field_scale() after resetting the value above. This isn't
# possible with the current state of Chosen. The quick fix is to simply reset
# the width of the field after we reset the value of the input text.
# field.css('width','auto')
-
+
# Execute the ajax call to search for autocomplete data with a timer
- @timer = setTimeout ->
+ @timer = setTimeout ->
chosenXhr.abort() if chosenXhr
chosenXhr = $.ajax(options)
, options.afterTypeDelay
Please sign in to comment.
Something went wrong with that request. Please try again.