rails-jquery-autocomplete 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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+.