rails-jquery-autocomplete 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 5a1346b1232c8b075f528ed7febe0ad71acfe963
4
- data.tar.gz: 8c520a4fd5310b32717974bc85631ae943187a55
2
+ SHA256:
3
+ metadata.gz: e21bc924451dba3cd1ccc4a3da6ec66e3b9eddacd534cd6a32a3fe6909472bad
4
+ data.tar.gz: 4de8ba96113b9358f3f9da751e0c5d834e62cc894d38de8be686f4e4696f9839
5
5
  SHA512:
6
- metadata.gz: a8366b4f9a586efc35cafc47270bb0588f6f1e4083931c2ca8279a8e27ac35585c0f7b61a321f75d0521a3e0579e56b743903555e69c2541771dfba644ab4bed
7
- data.tar.gz: e09d682607f6999ede171e01c69e4376554ea17e4bb3c4a6122fdb16e1325c93b6c2b7b98bfd36516e8e86650e8f27cf962f3c4c64c5ead617352f6bdada07e3
6
+ metadata.gz: 97dbdb5a5f5c046354bcae02e454dc02f3edee15df554f4868e8f18591951443289182d15cd599574f1bf6ed5b6385c3ca18028a751eb0e38bf5f8fc5ee58ba7
7
+ data.tar.gz: 38e820dcf8ac26a62bfd02d1ac2ad528508f17af473b181c8dbf4a6336e9484be9a8619b164eccad5a3602300480278d4556c66665c47bb640c72b9bffd6bd2d
@@ -1,5 +1,8 @@
1
1
  # Changelog
2
2
 
3
+ * 1.0.4
4
+ * Add data-min-length attribute (alias to min-length attribute) for better consistency.
5
+ * Added railsAutocomplete.init trigger
3
6
  * 1.0.3
4
7
  * Fixes issue with SQLITE to support schemas
5
8
  * 1.0.2
data/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  An easy way to use jQuery's autocomplete with Rails.
13
13
 
14
- Supports both ActiveRecord, [mongoid](http://github.com/mongoid/mongoid), and [MongoMapper](https://github.com/jnunemaker/mongomapper).
14
+ Supports both ActiveRecord, [mongoid](https://github.com/mongodb/mongoid), and [MongoMapper](https://github.com/jnunemaker/mongomapper).
15
15
 
16
16
  Works with [Formtastic](http://github.com/justinfrench/formtastic)
17
17
  and [SimpleForm](https://github.com/plataformatec/simple_form)
@@ -80,7 +80,7 @@ Just add it to your app/assets/javascripts/application.js file
80
80
 
81
81
  //= require jquery
82
82
  //= require jquery_ujs
83
- //= require jquery-ui/autocomplete
83
+ //= require jquery-ui/widgets/autocomplete
84
84
  //= require autocomplete-rails
85
85
 
86
86
  ## Usage
@@ -95,7 +95,7 @@ A live demo can be seen
95
95
 
96
96
  As a new developer, I had some issues getting this to work by following the documentation. However after trying some things and reading [Yoni Weisbrod](http://www.yoniweisbrod.com/autocomplete-magic-with-rails/)'s blog post, I was able to make the autocomplete work and implement a few useful features.
97
97
 
98
- ##Some implemented features
98
+ ## Some implemented features
99
99
 
100
100
  1. The css has been changed such that the results show up better against the box of suggestions. See `<app/assets/stylesheets/food.scss>` for details. I obtained this from a gist(forgive me I don't remember who the author is at the moment, please contact me if you do and I'll give credit). Upon mouseover/arrowkey presses, the selection will be highlighted.
101
101
 
@@ -149,7 +149,7 @@ The following terms would match the query 'un':
149
149
 
150
150
  #### :full => false (default behavior)
151
151
 
152
- Only the following terms mould match the query 'un':
152
+ Only the following terms would match the query 'un':
153
153
 
154
154
  * Unacceptable
155
155
 
@@ -209,6 +209,11 @@ e.g `:scopes => [:scope1, :scope2]`
209
209
  By default autocomplete uses method name as column name. Now it can be specified using column_name options
210
210
  `:column_name => 'name'`
211
211
 
212
+ #### :case_sensitive
213
+
214
+ Normally autocomplete performs a case insensitive search. In cases where this is not desirable, or causes too high
215
+ a performance penalty, search can be made case sensitive by specifying `:case_sensitive => true`
216
+
212
217
  #### json encoder
213
218
 
214
219
  Autocomplete uses Yajl as JSON encoder/decoder, but you can specify your own
@@ -17,14 +17,17 @@
17
17
  (function(jQuery)
18
18
  {
19
19
  var self = null;
20
- jQuery.fn.railsAutocomplete = function() {
20
+ jQuery.fn.railsAutocomplete = function(selector) {
21
21
  var handler = function() {
22
22
  if (!this.railsAutoCompleter) {
23
23
  this.railsAutoCompleter = new jQuery.railsAutocomplete(this);
24
24
  }
25
25
  };
26
26
  if (jQuery.fn.on !== undefined) {
27
- return jQuery(document).on('focus',this.selector,handler);
27
+ if (!selector) {
28
+ return;
29
+ }
30
+ return jQuery(document).on('focus',selector,handler);
28
31
  }
29
32
  else {
30
33
  return this.live('focus',handler);
@@ -48,7 +51,7 @@
48
51
  jQuery.railsAutocomplete.fn.extend({
49
52
  init: function(e) {
50
53
  e.delimiter = jQuery(e).attr('data-delimiter') || null;
51
- e.min_length = jQuery(e).attr('min-length') || 2;
54
+ e.min_length = jQuery(e).attr('data-min-length') || jQuery(e).attr('min-length') || 2;
52
55
  e.append_to = jQuery(e).attr('data-append-to') || null;
53
56
  e.autoFocus = jQuery(e).attr('data-auto-focus') || false;
54
57
  function split( val ) {
@@ -79,7 +82,7 @@
79
82
  options[key] = attrVal ? attrVal : value;
80
83
  }
81
84
  });
82
- if(arguments[0].length == 0 && jQuery.inArray(options.showNoMatches, [true, 'true'])) {
85
+ if(arguments[0].length == 0 && jQuery.inArray(options.showNoMatches, [true, 'true']) >= 0) {
83
86
  arguments[0] = [];
84
87
  arguments[0][0] = { id: "", label: options.noMatchesLabel };
85
88
  }
@@ -184,10 +187,11 @@
184
187
  return false;
185
188
  }
186
189
  });
190
+ jQuery(e).trigger('railsAutocomplete.init');
187
191
  }
188
192
  });
189
193
 
190
194
  jQuery(document).ready(function(){
191
- jQuery('input[data-autocomplete]').railsAutocomplete();
195
+ jQuery('input[data-autocomplete]').railsAutocomplete('input[data-autocomplete]');
192
196
  });
193
197
  })(jQuery);
@@ -1 +1 @@
1
- !function(t){t.fn.railsAutocomplete=function(){var e=function(){this.railsAutoCompleter||(this.railsAutoCompleter=new t.railsAutocomplete(this))};return void 0!==t.fn.on?t(document).on("focus",this.selector,e):this.live("focus",e)},t.railsAutocomplete=function(t){var e=t;this.init(e)},t.railsAutocomplete.options={showNoMatches:!0,noMatchesLabel:"no existing match"},t.railsAutocomplete.fn=t.railsAutocomplete.prototype={railsAutocomplete:"0.0.1"},t.railsAutocomplete.fn.extend=t.railsAutocomplete.extend=t.extend,t.railsAutocomplete.fn.extend({init:function(e){function a(t){return t.split(e.delimiter)}function i(t){return a(t).pop().replace(/^\s+/,"")}e.delimiter=t(e).attr("data-delimiter")||null,e.min_length=t(e).attr("min-length")||2,e.append_to=t(e).attr("data-append-to")||null,e.autoFocus=t(e).attr("data-auto-focus")||!1,t(e).autocomplete({appendTo:e.append_to,autoFocus:e.autoFocus,delay:t(e).attr("delay")||0,source:function(a,r){var n=this.element[0],o={term:i(a.term)};t(e).attr("data-autocomplete-fields")&&t.each(t.parseJSON(t(e).attr("data-autocomplete-fields")),function(e,a){o[e]=t(a).val()}),t.getJSON(t(e).attr("data-autocomplete"),o,function(){var a={};t.extend(a,t.railsAutocomplete.options),t.each(a,function(i,r){if(a.hasOwnProperty(i)){var n=t(e).attr("data-"+i);a[i]=n?n:r}}),0==arguments[0].length&&t.inArray(a.showNoMatches,[!0,"true"])&&(arguments[0]=[],arguments[0][0]={id:"",label:a.noMatchesLabel}),t(arguments[0]).each(function(a,i){var r={};r[i.id]=i,t(e).data(r)}),r.apply(null,arguments),t(n).trigger("railsAutocomplete.source",arguments)})},change:function(e,a){if(t(this).is("[data-id-element]")&&""!==t(t(this).attr("data-id-element")).val()&&(t(t(this).attr("data-id-element")).val(a.item?a.item.id:"").trigger("change"),t(this).attr("data-update-elements"))){var i=t.parseJSON(t(this).attr("data-update-elements")),r=a.item?t(this).data(a.item.id.toString()):{};if(i&&""===t(i.id).val())return;for(var n in i){var o=t(i[n]);o.is(":checkbox")?null!=r[n]&&o.prop("checked",r[n]):o.val(a.item?r[n]:"").trigger("change")}}},search:function(){var t=i(this.value);return t.length<e.min_length?!1:void 0},focus:function(){return!1},select:function(i,r){if(r.item.value=r.item.value.toString(),-1!=r.item.value.toLowerCase().indexOf("no match")||-1!=r.item.value.toLowerCase().indexOf("too many results"))return t(this).trigger("railsAutocomplete.noMatch",r),!1;var n=a(this.value);if(n.pop(),n.push(r.item.value),null!=e.delimiter)n.push(""),this.value=n.join(e.delimiter);else if(this.value=n.join(""),t(this).attr("data-id-element")&&t(t(this).attr("data-id-element")).val(r.item.id).trigger("change"),t(this).attr("data-update-elements")){var o=r.item,l=-1!=r.item.value.indexOf("Create New")?!0:!1,u=t.parseJSON(t(this).attr("data-update-elements"));for(var s in u)"checkbox"===t(u[s]).attr("type")?o[s]===!0||1===o[s]?t(u[s]).attr("checked","checked"):t(u[s]).removeAttr("checked"):l&&o[s]&&-1==o[s].indexOf("Create New")||!l?t(u[s]).val(o[s]).trigger("change"):t(u[s]).val("").trigger("change")}var c=this.value;return t(this).bind("keyup.clearId",function(){t.trim(t(this).val())!=t.trim(c)&&(t(t(this).attr("data-id-element")).val("").trigger("change"),t(this).unbind("keyup.clearId"))}),t(e).trigger("railsAutocomplete.select",r),!1}})}}),t(document).ready(function(){t("input[data-autocomplete]").railsAutocomplete()})}(jQuery);
1
+ !function(t){t.fn.railsAutocomplete=function(e){var a=function(){this.railsAutoCompleter||(this.railsAutoCompleter=new t.railsAutocomplete(this))};if(void 0!==t.fn.on){if(!e)return;return t(document).on("focus",e,a)}return this.live("focus",a)},t.railsAutocomplete=function(t){var e=t;this.init(e)},t.railsAutocomplete.options={showNoMatches:!0,noMatchesLabel:"no existing match"},t.railsAutocomplete.fn=t.railsAutocomplete.prototype={railsAutocomplete:"0.0.1"},t.railsAutocomplete.fn.extend=t.railsAutocomplete.extend=t.extend,t.railsAutocomplete.fn.extend({init:function(e){function a(t){return t.split(e.delimiter)}function i(t){return a(t).pop().replace(/^\s+/,"")}e.delimiter=t(e).attr("data-delimiter")||null,e.min_length=t(e).attr("data-min-length")||t(e).attr("min-length")||2,e.append_to=t(e).attr("data-append-to")||null,e.autoFocus=t(e).attr("data-auto-focus")||!1,t(e).autocomplete({appendTo:e.append_to,autoFocus:e.autoFocus,delay:t(e).attr("delay")||0,source:function(a,r){var n=this.element[0],o={term:i(a.term)};t(e).attr("data-autocomplete-fields")&&t.each(t.parseJSON(t(e).attr("data-autocomplete-fields")),function(e,a){o[e]=t(a).val()}),t.getJSON(t(e).attr("data-autocomplete"),o,function(){var a={};t.extend(a,t.railsAutocomplete.options),t.each(a,function(i,r){if(a.hasOwnProperty(i)){var n=t(e).attr("data-"+i);a[i]=n?n:r}}),0==arguments[0].length&&t.inArray(a.showNoMatches,[!0,"true"])>=0&&(arguments[0]=[],arguments[0][0]={id:"",label:a.noMatchesLabel}),t(arguments[0]).each(function(a,i){var r={};r[i.id]=i,t(e).data(r)}),r.apply(null,arguments),t(n).trigger("railsAutocomplete.source",arguments)})},change:function(e,a){if(t(this).is("[data-id-element]")&&""!==t(t(this).attr("data-id-element")).val()&&(t(t(this).attr("data-id-element")).val(a.item?a.item.id:"").trigger("change"),t(this).attr("data-update-elements"))){var i=t.parseJSON(t(this).attr("data-update-elements")),r=a.item?t(this).data(a.item.id.toString()):{};if(i&&""===t(i.id).val())return;for(var n in i){var o=t(i[n]);o.is(":checkbox")?null!=r[n]&&o.prop("checked",r[n]):o.val(a.item?r[n]:"").trigger("change")}}},search:function(){var t=i(this.value);return t.length<e.min_length?!1:void 0},focus:function(){return!1},select:function(i,r){if(r.item.value=r.item.value.toString(),-1!=r.item.value.toLowerCase().indexOf("no match")||-1!=r.item.value.toLowerCase().indexOf("too many results"))return t(this).trigger("railsAutocomplete.noMatch",r),!1;var n=a(this.value);if(n.pop(),n.push(r.item.value),null!=e.delimiter)n.push(""),this.value=n.join(e.delimiter);else if(this.value=n.join(""),t(this).attr("data-id-element")&&t(t(this).attr("data-id-element")).val(r.item.id).trigger("change"),t(this).attr("data-update-elements")){var o=r.item,l=-1!=r.item.value.indexOf("Create New")?!0:!1,u=t.parseJSON(t(this).attr("data-update-elements"));for(var s in u)"checkbox"===t(u[s]).attr("type")?o[s]===!0||1===o[s]?t(u[s]).attr("checked","checked"):t(u[s]).removeAttr("checked"):l&&o[s]&&-1==o[s].indexOf("Create New")||!l?t(u[s]).val(o[s]).trigger("change"):t(u[s]).val("").trigger("change")}var c=this.value;return t(this).bind("keyup.clearId",function(){t.trim(t(this).val())!=t.trim(c)&&(t(t(this).attr("data-id-element")).val("").trigger("change"),t(this).unbind("keyup.clearId"))}),t(e).trigger("railsAutocomplete.select",r),!1}}),t(e).trigger("railsAutocomplete.init")}}),t(document).ready(function(){t("input[data-autocomplete]").railsAutocomplete("input[data-autocomplete]")})}(jQuery);
@@ -98,7 +98,7 @@ module RailsJQueryAutocomplete
98
98
  #
99
99
  def json_for_autocomplete(items, method, extra_data=[])
100
100
  items = items.collect do |item|
101
- hash = {"id" => item.id.to_s, "label" => item.send(method), "value" => item.send(method)}
101
+ hash = HashWithIndifferentAccess.new({"id" => item.id.to_s, "label" => item.send(method), "value" => item.send(method)})
102
102
  extra_data.each do |datum|
103
103
  hash[datum] = item.send(datum)
104
104
  end if extra_data
@@ -50,13 +50,16 @@ module RailsJQueryAutocomplete
50
50
  def get_autocomplete_where_clause(model, term, method, options)
51
51
  table_name = model.table_name
52
52
  is_full_search = options[:full]
53
- like_clause = (postgres?(model) ? 'ILIKE' : 'LIKE')
53
+ is_case_sensitive_search = options[:case_sensitive]
54
+ like_clause = (postgres?(model) && !is_case_sensitive_search ? 'ILIKE' : 'LIKE')
55
+ column_transform = is_case_sensitive_search ? '' : 'LOWER'
56
+ term = "#{(is_full_search ? '%' : '')}#{term.gsub(/([_%\\])/, '\\\\\1')}%"
54
57
  if options[:hstore]
55
- ["LOWER(#{table_name}.#{method} -> '#{options[:hstore][:key]}') LIKE ?", "#{(is_full_search ? '%' : '')}#{term.downcase}%"]
58
+ ["#{column_transform}(#{table_name}.#{method} -> '#{options[:hstore][:key]}') LIKE #{column_transform}(?)", term]
56
59
  elsif sqlite?
57
- ["LOWER(#{method}) #{like_clause} ?", "#{(is_full_search ? '%' : '')}#{term.downcase}%"]
60
+ ["#{column_transform}(#{method}) #{like_clause} #{column_transform}(?)", term]
58
61
  else
59
- ["LOWER(#{table_name}.#{method}) #{like_clause} ?", "#{(is_full_search ? '%' : '')}#{term.downcase}%"]
62
+ ["#{column_transform}(#{table_name}.#{method}) #{like_clause} #{column_transform}(?)", term]
60
63
  end
61
64
  end
62
65
 
@@ -18,12 +18,14 @@ module RailsJQueryAutocomplete
18
18
  method = parameters[:method]
19
19
  options = parameters[:options]
20
20
  is_full_search = options[:full]
21
+ is_case_sensitive_search = options[:case_sensitive]
21
22
  term = parameters[:term]
22
23
  limit = get_autocomplete_limit(options)
23
24
  order = mongo_mapper_get_autocomplete_order(method, options)
24
25
 
25
26
  search = (is_full_search ? '.*' : '^') + term + '.*'
26
- items = model.where(method.to_sym => /#{search}/i).limit(limit).sort(order)
27
+ search = Regexp.new(search, !is_case_sensitive_search)
28
+ items = model.where(method.to_sym => search).limit(limit).sort(order)
27
29
  end
28
30
  end
29
31
  end
@@ -18,6 +18,7 @@ module RailsJQueryAutocomplete
18
18
  method = parameters[:method]
19
19
  options = parameters[:options]
20
20
  is_full_search = options[:full]
21
+ is_case_sensitive_search = options[:case_sensitive]
21
22
  term = parameters[:term]
22
23
  limit = get_autocomplete_limit(options)
23
24
  order = mongoid_get_autocomplete_order(method, options)
@@ -27,7 +28,8 @@ module RailsJQueryAutocomplete
27
28
  else
28
29
  search = '^' + Regexp.escape(term)
29
30
  end
30
- items = model.where(method.to_sym => /#{search}/i).limit(limit).order_by(order)
31
+ search = Regexp.new(search, !is_case_sensitive_search)
32
+ items = model.where(method.to_sym => search).limit(limit).order_by(order)
31
33
  end
32
34
  end
33
35
  end
@@ -1,3 +1,3 @@
1
1
  module RailsJQueryAutocomplete
2
- VERSION = '1.0.3'
2
+ VERSION = '1.0.4'
3
3
  end
@@ -62,6 +62,17 @@ module RailsJQueryAutocomplete
62
62
  assert_equal response["label"], "Object Name"
63
63
  end
64
64
 
65
+ should 'return an instance of HashWithIndifferentAccess' do
66
+ item = mock(Object)
67
+ mock(item).send(:name).times(2) { 'Object Name' }
68
+ mock(item).id { 1 }
69
+ items = [item]
70
+ response = self.json_for_autocomplete(items, :name).first
71
+ assert_equal response.is_a?(HashWithIndifferentAccess), true
72
+ assert_equal response["id"], "1"
73
+ assert_equal response[:id], "1"
74
+ end
75
+
65
76
  context 'with extra data' do
66
77
  should 'add that extra data to result' do
67
78
  item = mock(Object)
@@ -130,14 +130,14 @@ module RailsJQueryAutocomplete
130
130
  context 'Not Postgres' do
131
131
  should 'return options for where' do
132
132
  mock(self).postgres?(@model) { false }
133
- assert_equal ["LOWER(table_name.method) LIKE ?", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
133
+ assert_equal ["LOWER(table_name.method) LIKE LOWER(?)", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
134
134
  end
135
135
  end
136
136
 
137
137
  context 'Postgres' do
138
138
  should 'return options for where with ILIKE' do
139
139
  mock(self).postgres?(@model) { true }
140
- assert_equal ["LOWER(table_name.method) ILIKE ?", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
140
+ assert_equal ["LOWER(table_name.method) ILIKE LOWER(?)", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
141
141
  end
142
142
  end
143
143
 
@@ -146,7 +146,7 @@ module RailsJQueryAutocomplete
146
146
  mock(self).postgres?(@model) { true }
147
147
  @options[:hstore] = {method: :hsmethod, key: :hskey}
148
148
  @method = :hsmethod
149
- assert_equal ["LOWER(table_name.hsmethod -> 'hskey') LIKE ?", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
149
+ assert_equal ["LOWER(table_name.hsmethod -> 'hskey') LIKE LOWER(?)", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
150
150
  end
151
151
  end
152
152
 
@@ -154,7 +154,7 @@ module RailsJQueryAutocomplete
154
154
  should 'return options for where with the term sourrounded by %%' do
155
155
  mock(self).postgres?(@model) { false }
156
156
  @options[:full] = true
157
- assert_equal ["LOWER(table_name.method) LIKE ?", "%query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
157
+ assert_equal ["LOWER(table_name.method) LIKE LOWER(?)", "%query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
158
158
  end
159
159
  end
160
160
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-jquery-autocomplete
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Padilla
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-10-27 00:00:00.000000000 Z
13
+ date: 2018-07-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
@@ -253,7 +253,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
253
253
  version: '0'
254
254
  requirements: []
255
255
  rubyforge_project:
256
- rubygems_version: 2.4.5.1
256
+ rubygems_version: 2.7.7
257
257
  signing_key:
258
258
  specification_version: 4
259
259
  summary: Use jQuery's autocomplete plugin with Rails 4+.