filterrific 5.2.2 → 5.2.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: 5226106f7944a5b6c08d8f568185d4e6fcf0c561
4
- data.tar.gz: 2e4b24d697de15d10a5dddf6a7b444b5564950ed
2
+ SHA256:
3
+ metadata.gz: a63c202db5dce43d16d986ad31a50abc21752cb7bd66771fce52c2ddc7a2614d
4
+ data.tar.gz: '090e98ad1d561910bbefd0095be81e8b0c622e29cd8cba5b12471379b9023b65'
5
5
  SHA512:
6
- metadata.gz: 7829c794eb5e1a2e19a95cbb2e9651550f8c6cb5c123709a78c5fd5658c569a2c78963144f68b07cb30de9d28372ad3bfaf0087499a91f48f2e5c0597ed09d02
7
- data.tar.gz: 4c7894ba6c9c1e9e5cde222bd69a088761dda82ccc01c0a1c12a1db4ed9e489b1f03b008bdc09dad8563355d95f138491cc17bd5c78174f1b9f6b46c3a4f0ec9
6
+ metadata.gz: 2d74dc358e308d4d84f04c6637bcd7c682b2ff671d9e11b36d9c9384434b4670d963e945ba80314e6e6e497fc54f7873b37e674bd5794d7f1b298c3912ac2190
7
+ data.tar.gz: b8731da2f59b0d70838c412fdacc1cbf103c76c1eba8668df5253a4d35948e7b60dd9f9bfbb8a021c1c11efe5ab7b945dca3f6490c0b58b66847a3a09dde717c
data/CHANGELOG.md CHANGED
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
7
7
 
8
8
  Filterrific major versions match the Ruby on Rails major versions they work with.
9
9
 
10
+ ## [5.2.4] - Jan 30, 2023
11
+
12
+ * Remove JS dependency on jquery
13
+ * Make code compliant with standard.rb rules
14
+
15
+ ## [5.2.3] - Mar. 18, 2022
16
+
17
+ * Added support for Rails 7
18
+
10
19
  ## [5.2.2] - Jul. 11, 2021
11
20
 
12
21
  * Fixed Ruby 2.7 deprecated warning when trying to regex match an Integer.
data/README.md CHANGED
@@ -39,13 +39,13 @@ to find out more!
39
39
 
40
40
  Every commit to Filterrific is automatically tested against the following scenarios:
41
41
 
42
- |Filterrific version | Rails version | Ruby environments | Database adapters | Build status |
43
- |--------------------|----------------|--------------------------------|------------------------------------|--------------|
44
- | 5.x | Rails 5.x, 6.x | MRI 2.0.0, 2.1.7, 2.2.3, 2.3.1 | mysql2, postgresql |[![Build Status](https://travis-ci.org/jhund/filterrific_demo.svg?branch=rails-5.x)](https://travis-ci.org/jhund/filterrific_demo)|
45
- | 4.x | Rails 4.x | MRI 2.0.0, 2.1.7, 2.2.3, 2.3.1 | mysql, mysql2, postgresql, sqlite3 |[![Build Status](https://travis-ci.org/jhund/filterrific_demo.svg?branch=rails-4.x)](https://travis-ci.org/jhund/filterrific_demo)|
46
- | 3.x | Rails 3.2 | MRI 2.0.0, 2.1.7 | mysql, mysql2, postgresql, sqlite3 | Not tested|
47
- | 2.x | Rails 3.2 | MRI 1.9.3 | mysql, mysql2, postgresql, sqlite3 | Not tested|
48
- | 1.x | < 3.2 | MRI <= 1.9.3 | mysql, mysql2, postgresql, sqlite3 | Not tested|
42
+ |Filterrific version | Rails version | Ruby environments | Database adapters | Build status |
43
+ |--------------------|---------------------|--------------------------------|------------------------------------|--------------|
44
+ | 5.x | Rails 5.x, 6.x, 7.x | MRI 2.0.0, 2.1.7, 2.2.3, 2.3.1 | mysql2, postgresql |[![Build Status](https://travis-ci.org/jhund/filterrific_demo.svg?branch=rails-5.x)](https://travis-ci.org/jhund/filterrific_demo)|
45
+ | 4.x | Rails 4.x | MRI 2.0.0, 2.1.7, 2.2.3, 2.3.1 | mysql, mysql2, postgresql, sqlite3 |[![Build Status](https://travis-ci.org/jhund/filterrific_demo.svg?branch=rails-4.x)](https://travis-ci.org/jhund/filterrific_demo)|
46
+ | 3.x | Rails 3.2 | MRI 2.0.0, 2.1.7 | mysql, mysql2, postgresql, sqlite3 | Not tested|
47
+ | 2.x | Rails 3.2 | MRI 1.9.3 | mysql, mysql2, postgresql, sqlite3 | Not tested|
48
+ | 1.x | < 3.2 | MRI <= 1.9.3 | mysql, mysql2, postgresql, sqlite3 | Not tested|
49
49
 
50
50
  ### Guidelines for submitting issues
51
51
 
data/Rakefile CHANGED
@@ -1,17 +1,17 @@
1
1
  begin
2
- require 'bundler/setup'
2
+ require "bundler/setup"
3
3
  rescue LoadError
4
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
4
+ puts "You must `gem install bundler` and `bundle install` to run rake tasks"
5
5
  end
6
6
 
7
7
  Bundler::GemHelper.install_tasks
8
8
 
9
- require 'rake/testtask'
9
+ require "rake/testtask"
10
10
  Rake::TestTask.new do |test|
11
- test.libs << 'spec'
12
- test.pattern = 'spec/**/*_spec.rb'
11
+ test.libs << "spec"
12
+ test.pattern = "spec/**/*_spec.rb"
13
13
  test.verbose = true
14
14
  end
15
15
 
16
- require 'wwtd/tasks'
17
- task default: 'wwtd:local'
16
+ require "wwtd/tasks"
17
+ task default: "wwtd:local"
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Javascript behaviors for Filterrific.
3
+ * http://filterrific.clearcove.ca
4
+ *
5
+ * Released under the MIT license
6
+ *
7
+ */
8
+
9
+ // Create global Filterrific namespace
10
+ if (typeof Filterrific === 'undefined') {
11
+ var Filterrific = {};
12
+ }
13
+
14
+ // Define function to submit Filterrific filter form
15
+ Filterrific.submitFilterForm = function() {
16
+ var form = Filterrific.findParents(this, '#filterrific_filter')[0];
17
+
18
+ // send before event
19
+ form.dispatchEvent(new Event('loadingFilterrificResults'));
20
+
21
+ // turn on spinner
22
+ document.querySelector('.filterrific_spinner').style.display = 'block';
23
+
24
+ // Abort previous XMLHttpRequest request
25
+ if (Filterrific.lastRequest && Filterrific.lastRequest.readyState != 4) {
26
+ Filterrific.lastRequest.abort();
27
+ }
28
+
29
+ // Submit XMLHttpRequest request
30
+ Filterrific.lastRequest = Filterrific.prepareRequest(form);
31
+ Filterrific.lastRequest.send();
32
+ };
33
+
34
+ Filterrific.prepareRequest = function(form) {
35
+ var url = form.getAttribute('action'),
36
+ formData = new FormData(form),
37
+ params = new URLSearchParams(formData),
38
+ xhr = new XMLHttpRequest();
39
+
40
+ if (url.indexOf('?') < 0) {
41
+ url += '?' + params;
42
+ } else {
43
+ url += '&' + params;
44
+ }
45
+
46
+ xhr.open("GET", url, true);
47
+ xhr.setRequestHeader('Accept', 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01');
48
+ xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
49
+ xhr.onreadystatechange = function() {
50
+ if (xhr.readyState === XMLHttpRequest.DONE) {
51
+ return Filterrific.processResponse(form, xhr);
52
+ }
53
+ }
54
+
55
+ return xhr;
56
+ }
57
+
58
+ Filterrific.processResponse = function(form, xhr) {
59
+ var rawResponse = (_ref = xhr.response) != null ? _ref : xhr.responseText,
60
+ type = xhr.getResponseHeader('Content-Type'),
61
+ response;
62
+
63
+ if (typeof rawResponse === 'string' && typeof type === 'string') {
64
+ if (type.match(/\bjson\b/)) {
65
+ try {
66
+ response = JSON.parse(rawResponse);
67
+ } catch (_error) {}
68
+ } else if (type.match(/\b(?:java|ecma)script\b/)) {
69
+ script = document.createElement('script');
70
+ script.setAttribute('nonce', Filterrific.cspNonce());
71
+ script.text = rawResponse;
72
+ document.head.appendChild(script).parentNode.removeChild(script);
73
+ } else if (type.match(/\b(xml|html|svg)\b/)) {
74
+ parser = new DOMParser();
75
+ type = type.replace(/;.+/, '');
76
+ try {
77
+ response = parser.parseFromString(rawResponse, type);
78
+ } catch (_error) {}
79
+ }
80
+ }
81
+
82
+ // send after event
83
+ form.dispatchEvent(new Event('loadedFilterrificResults'));
84
+ document.querySelector('.filterrific_spinner').style.display = 'none';
85
+
86
+ return response;
87
+ }
88
+
89
+ Filterrific.cspNonce = function() {
90
+ return document.querySelector("meta[name=csp-nonce]")?.content
91
+ }
92
+
93
+ Filterrific.findParents = function(elem, selector) {
94
+ var elements = [];
95
+ var ishaveselector = selector !== undefined;
96
+
97
+ while ((elem = elem.parentElement) !== null) {
98
+ if (elem.nodeType !== Node.ELEMENT_NODE) {
99
+ continue;
100
+ }
101
+
102
+ if (!ishaveselector || elem.matches(selector)) {
103
+ elements.push(elem);
104
+ }
105
+ }
106
+
107
+ return elements;
108
+ };
109
+
110
+ Filterrific.observe_field = function(inputs_selector, frequency, callback) {
111
+ frequency = frequency * 1000;
112
+
113
+ document.querySelectorAll(inputs_selector).forEach(input => {
114
+ var prev = input.value;
115
+ var check = function() {
116
+ // if removed clear the interval and don't fire the callback
117
+ if (removed()) {
118
+ if(ti) clearInterval(ti);
119
+ return;
120
+ }
121
+ var val = input.value;
122
+ if (prev != val) {
123
+ prev = val;
124
+
125
+ // invokes the callback on $this
126
+ if (callback && typeof callback === 'function') {
127
+ callback.call(input);
128
+ }
129
+ }
130
+ };
131
+
132
+ var removed = function() {
133
+ return input.closest('html').length == 0
134
+ };
135
+
136
+ var reset = function() {
137
+ if (ti) {
138
+ clearInterval(ti);
139
+ ti = setInterval(check, frequency);
140
+ }
141
+ };
142
+ check();
143
+ var ti = setInterval(check, frequency); // invoke check periodically
144
+ // reset counter after user interaction
145
+ // mousemove is for selects
146
+ input.addEventListener('keyup', reset);
147
+ input.addEventListener('click', reset);
148
+ input.addEventListener('mousemove', reset);
149
+ })
150
+ };
151
+
152
+
153
+ Filterrific.init = function() {
154
+ // Add change event handler to all Filterrific filter inputs.
155
+ var filterrificForm = document.querySelector('#filterrific_filter');
156
+ filterrificForm.querySelectorAll('input, textarea, select, textarea').forEach(input => {
157
+ input.addEventListener('change', Filterrific.submitFilterForm)
158
+ })
159
+
160
+ // Add periodic observer to selected inputs.
161
+ // Use this for text fields you want to observe for change, e.g., a search input.
162
+ Filterrific.observe_field(
163
+ ".filterrific-periodically-observed",
164
+ 0.5,
165
+ Filterrific.submitFilterForm
166
+ );
167
+ };
168
+
169
+
170
+ // Initialize event observers on document ready and turbolinks page:load
171
+ document.addEventListener('turbolinks:load', Filterrific.init);
172
+ document.addEventListener('DOMContentLoaded', Filterrific.init)
data/doc/meta.md CHANGED
@@ -5,7 +5,6 @@ I use the gem-release gem
5
5
  For more info see: https://github.com/svenfuchs/gem-release#usage
6
6
 
7
7
 
8
-
9
8
  ## Steps for an update
10
9
 
11
10
  1. Update code and commit it.
@@ -22,11 +21,26 @@ For more info see: https://github.com/svenfuchs/gem-release#usage
22
21
  `gem tag`
23
22
 
24
23
 
25
-
26
24
  ## How to run specs
27
25
 
28
- `bundle exec rake`
26
+ `bundle exec rake` in the filterrific repo
27
+
28
+
29
+ ## How to support a new major Rails version
30
+
31
+ Follow these steps when starting support for a new Rails major version:
32
+
33
+ * In `filterrific`
34
+ * Archive the current major rails version into a new branch off of master, e.g., when starting to support Rails 6, create a new branch for `5.x` from current master. This will be the branch used for ongoing 5.x support, and all new development for Rails 6 will happen in the `master` branch.
35
+ * Make all changes required to support a new version of Rails.
36
+ * Release the first `filterrific` version for Rails 6: `6.0.0`.
29
37
 
38
+ * In `filterrific_demo`
39
+ * Following the same example for Rails 6:
40
+ * Make sure that the `5.x` branch is up-to-date with master, and with current filterrific.
41
+ * Create a new `6.x` branch. In that branch create a brand new rails app using a current version of Rails 6.
42
+ * Make sure that the app works with the relevant version of `filterrific`.
43
+ * Deploy demo app to heroku.
30
44
 
31
45
 
32
46
  ## Travis CI
data/doc/scratchpad.md CHANGED
@@ -2,36 +2,8 @@
2
2
 
3
3
  ## 2021 Initiative
4
4
 
5
- * Update for Rails 6
6
- * Implement API only version (no frontend)
7
- * Update scope docs to use AREL
8
- * Implement/document various front end scenarios:
9
- * React
10
- * Stimulus
11
- * jQuery
12
- * sprockets/webpacker
13
- * Thoughts: Support the rails defaults (webpacker or sprockets?) out of the box, batteries included. Document how to do everything else.
14
- * Work through issues and pull requests
15
-
16
- improve the filterrific frontend handling:
17
-
18
- * Remove invocation of init, document for devs to do it manually
19
- https://github.com/jhund/filterrific/issues/199
20
- * Replace jquery with vanilla JS
21
- * Provide filterrific API version
22
- * Make compatible with Rails 6
23
- * Remove jquery dependency, make it easier to use with webpacker, document how to do init
24
- https://github.com/jhund/filterrific/issues/198
25
-
26
- * Support the following js scenarios:
27
- * Sprockets
28
- * Webpacker
29
- * API only (e.g., for React)
30
-
31
-
32
5
  ## TODO
33
6
 
34
- * add check that no filter_name conflicts with existing methods on included ActiveRecord class (See https://github.com/jhund/filterrific/issues/17)
35
7
  * Update SW architecture and documentation according to Osterhuis Philosophy of software architecture/design book (mark advanced controller options as such to keep interface to learn simple)
36
8
 
37
9
  ## Travis
@@ -1,13 +1,11 @@
1
- # -*- coding: utf-8 -*-
2
1
  #
3
2
  # Adds Filterrific methods ActionController instances
4
3
  #
5
4
  module Filterrific
6
5
  module ActionControllerExtension
7
-
8
6
  include HasResetFilterrificUrlMixin
9
7
 
10
- protected
8
+ protected
11
9
 
12
10
  # @param model_class [Class]
13
11
  # @param filterrific_params [ActionController::Params, Hash] typically the
@@ -33,29 +31,29 @@ module Filterrific
33
31
  def initialize_filterrific(model_class, filterrific_params, opts = {})
34
32
  f_params = (filterrific_params || {}).stringify_keys
35
33
  opts = opts.stringify_keys
36
- pers_id = if false == opts['persistence_id']
34
+ pers_id = if opts["persistence_id"] == false
37
35
  nil
38
36
  else
39
- opts['persistence_id'] || compute_default_persistence_id
37
+ opts["persistence_id"] || compute_default_persistence_id
40
38
  end
41
39
 
42
- if (f_params.delete('reset_filterrific'))
40
+ if f_params.delete("reset_filterrific")
43
41
  # Reset query and session_persisted params
44
- session[pers_id] = nil if pers_id
45
- redirect_to url_for({}) and return false # requires `or return` in calling action.
42
+ session[pers_id] = nil if pers_id
43
+ redirect_to url_for({}) and return false # requires `or return` in calling action.
46
44
  end
47
45
 
48
46
  f_params = compute_filterrific_params(model_class, f_params, opts, pers_id)
49
47
 
50
48
  filterrific = Filterrific::ParamSet.new(model_class, f_params)
51
- filterrific.select_options = opts['select_options']
52
- session[pers_id] = filterrific.to_hash if pers_id
49
+ filterrific.select_options = opts["select_options"]
50
+ session[pers_id] = filterrific.to_hash if pers_id
53
51
  filterrific
54
52
  end
55
53
 
56
54
  # Computes a default persistence id based on controller and action name
57
55
  def compute_default_persistence_id
58
- [controller_name, action_name].join('#')
56
+ [controller_name, action_name].join("#")
59
57
  end
60
58
 
61
59
  # Computes filterrific params using a number of strategies. Limits params
@@ -68,17 +66,17 @@ module Filterrific
68
66
  # Defaults to true.
69
67
  # @param persistence_id [String, nil]
70
68
  def compute_filterrific_params(model_class, filterrific_params, opts, persistence_id)
71
- opts = { "sanitize_params" => true }.merge(opts.stringify_keys)
69
+ opts = {"sanitize_params" => true}.merge(opts.stringify_keys)
72
70
  r = (
73
71
  filterrific_params.presence || # start with passed in params
74
72
  (persistence_id && session[persistence_id].presence) || # then try session persisted params if persistence_id is present
75
- opts['default_filter_params'] || # then use passed in opts
73
+ opts["default_filter_params"] || # then use passed in opts
76
74
  model_class.filterrific_default_filter_params # finally use model_class defaults
77
75
  ).stringify_keys
78
- r.slice!(*opts['available_filters'].map(&:to_s)) if opts['available_filters']
76
+ r.slice!(*opts["available_filters"].map(&:to_s)) if opts["available_filters"]
79
77
  # Sanitize params to prevent reflected XSS attack
80
78
  if opts["sanitize_params"]
81
- r.each { |k,v| r[k] = sanitize_filterrific_param(r[k]) }
79
+ r.each { |k, v| r[k] = sanitize_filterrific_param(r[k]) }
82
80
  end
83
81
  r
84
82
  end
@@ -94,7 +92,7 @@ module Filterrific
94
92
  val.map { |e| sanitize_filterrific_param(e) }
95
93
  when Hash
96
94
  # Return Hash
97
- val.inject({}) { |m, (k,v)| m[k] = sanitize_filterrific_param(v); m }
95
+ val.each_with_object({}) { |(k, v), m| m[k] = sanitize_filterrific_param(v); }
98
96
  when NilClass
99
97
  # Nothing to do, use val as is
100
98
  val
@@ -105,6 +103,5 @@ module Filterrific
105
103
  val
106
104
  end
107
105
  end
108
-
109
106
  end
110
107
  end
@@ -1,10 +1,8 @@
1
- # -*- coding: utf-8 -*-
2
1
  #
3
2
  # Adds Filterrific view helpers to ActionView instances
4
3
  #
5
4
  module Filterrific
6
5
  module ActionViewExtension
7
-
8
6
  include HasResetFilterrificUrlMixin
9
7
 
10
8
  # Sets all options on form_for to defaults that work with Filterrific
@@ -17,8 +15,8 @@ module Filterrific
17
15
  options[:html][:method] ||= :get
18
16
  options[:html][:id] ||= :filterrific_filter
19
17
  options[:url] ||= url_for(
20
- :controller => controller.controller_name,
21
- :action => controller.action_name
18
+ controller: controller.controller_name,
19
+ action: controller.action_name
22
20
  )
23
21
  form_for(record, options, &block)
24
22
  end
@@ -27,7 +25,7 @@ module Filterrific
27
25
  def render_filterrific_spinner
28
26
  %(
29
27
  <span class="filterrific_spinner" style="display:none;">
30
- #{ image_tag('filterrific/filterrific-spinner.gif', alt: '', role: 'presentation') }
28
+ #{image_tag("filterrific/filterrific-spinner.gif", alt: "", role: "presentation")}
31
29
  </span>
32
30
  ).html_safe
33
31
  end
@@ -65,23 +63,25 @@ module Filterrific
65
63
  # Override the target URL attributes to be used for `url_for`. Default: {} (current URL).
66
64
  def filterrific_sorting_link(filterrific, sort_key, opts = {})
67
65
  opts = {
68
- :active_column_class => 'filterrific_current_sort_column',
69
- :inactive_column_class => 'filterrific_sort_column',
70
- :ascending_indicator => '',
71
- :default_sort_direction => 'asc',
72
- :descending_indicator => '',
73
- :html_attrs => {},
74
- :label => sort_key.to_s.humanize,
75
- :sorting_scope_name => :sorted_by,
76
- :url_for_attrs => {},
77
- :as => :filterrific
66
+ active_column_class: "filterrific_current_sort_column",
67
+ inactive_column_class: "filterrific_sort_column",
68
+ ascending_indicator: "",
69
+ default_sort_direction: "asc",
70
+ descending_indicator: "",
71
+ html_attrs: {},
72
+ label: sort_key.to_s.humanize,
73
+ sorting_scope_name: :sorted_by,
74
+ url_for_attrs: {},
75
+ as: :filterrific
78
76
  }.merge(opts)
79
77
  opts.merge!(
80
- :html_attrs => opts[:html_attrs].with_indifferent_access,
81
- :current_sorting => (current_sorting = filterrific.send(opts[:sorting_scope_name])),
82
- :current_sort_key => current_sorting ? current_sorting.gsub(/_asc|_desc/, '') : nil,
83
- :current_sort_direction => current_sorting ? (current_sorting =~ /_desc\z/ ? 'desc' : 'asc') : nil,
84
- :current_sort_direction_indicator => (current_sorting =~ /_desc\z/ ? opts[:descending_indicator] : opts[:ascending_indicator]),
78
+ html_attrs: opts[:html_attrs].with_indifferent_access,
79
+ current_sorting: (current_sorting = filterrific.send(opts[:sorting_scope_name])),
80
+ current_sort_key: current_sorting ? current_sorting.gsub(/_asc|_desc/, "") : nil,
81
+ current_sort_direction: if current_sorting
82
+ current_sorting.end_with?("_desc") ? "desc" : "asc"
83
+ end,
84
+ current_sort_direction_indicator: (current_sorting.end_with?("_desc") ? opts[:descending_indicator] : opts[:ascending_indicator])
85
85
  )
86
86
  new_sort_key = sort_key.to_s
87
87
  if new_sort_key == opts[:current_sort_key]
@@ -93,7 +93,7 @@ module Filterrific
93
93
  end
94
94
  end
95
95
 
96
- protected
96
+ protected
97
97
 
98
98
  # Renders HTML to reverse sort order on currently sorted column.
99
99
  # @param filterrific [Filterrific::ParamSet]
@@ -102,20 +102,20 @@ module Filterrific
102
102
  # @return [String] an HTML fragment
103
103
  def filterrific_sorting_link_reverse_order(filterrific, new_sort_key, opts)
104
104
  # current sort column, toggle search_direction
105
- new_sort_direction = 'asc' == opts[:current_sort_direction] ? 'desc' : 'asc'
106
- new_sorting = safe_join([new_sort_key, new_sort_direction], '_')
105
+ new_sort_direction = opts[:current_sort_direction] == "asc" ? "desc" : "asc"
106
+ new_sorting = safe_join([new_sort_key, new_sort_direction], "_")
107
107
  css_classes = safe_join([
108
108
  opts[:active_column_class],
109
109
  opts[:html_attrs].delete(:class)
110
- ].compact, ' ')
110
+ ].compact, " ")
111
111
  new_filterrific_params = filterrific.to_hash
112
- .with_indifferent_access
113
- .merge(opts[:sorting_scope_name] => new_sorting)
112
+ .with_indifferent_access
113
+ .merge(opts[:sorting_scope_name] => new_sorting)
114
114
  url_for_attrs = opts[:url_for_attrs].merge(opts[:as] => new_filterrific_params)
115
115
  link_to(
116
- safe_join([opts[:label], opts[:current_sort_direction_indicator]], ' '),
116
+ safe_join([opts[:label], opts[:current_sort_direction_indicator]], " "),
117
117
  url_for(url_for_attrs),
118
- opts[:html_attrs].reverse_merge(:class => css_classes, :method => :get, :remote => true)
118
+ opts[:html_attrs].reverse_merge(class: css_classes, method: :get, remote: true)
119
119
  )
120
120
  end
121
121
 
@@ -126,21 +126,20 @@ module Filterrific
126
126
  # @return [String] an HTML fragment
127
127
  def filterrific_sorting_link_new_column(filterrific, new_sort_key, opts)
128
128
  new_sort_direction = opts[:default_sort_direction]
129
- new_sorting = safe_join([new_sort_key, new_sort_direction], '_')
129
+ new_sorting = safe_join([new_sort_key, new_sort_direction], "_")
130
130
  css_classes = safe_join([
131
131
  opts[:inactive_column_class],
132
132
  opts[:html_attrs].delete(:class)
133
- ].compact, ' ')
133
+ ].compact, " ")
134
134
  new_filterrific_params = filterrific.to_hash
135
- .with_indifferent_access
136
- .merge(opts[:sorting_scope_name] => new_sorting)
135
+ .with_indifferent_access
136
+ .merge(opts[:sorting_scope_name] => new_sorting)
137
137
  url_for_attrs = opts[:url_for_attrs].merge(opts[:as] => new_filterrific_params)
138
138
  link_to(
139
139
  opts[:label],
140
140
  url_for(url_for_attrs),
141
- opts[:html_attrs].reverse_merge(:class => css_classes, :method => :get, :remote => true)
141
+ opts[:html_attrs].reverse_merge(class: css_classes, method: :get, remote: true)
142
142
  )
143
143
  end
144
-
145
144
  end
146
145
  end
@@ -1,12 +1,10 @@
1
- # -*- coding: utf-8 -*-
2
1
  #
3
2
  # Adds Filterrific methods to ActiveRecord::Base model_class.
4
3
  #
5
- require 'filterrific/param_set'
4
+ require "filterrific/param_set"
6
5
 
7
6
  module Filterrific
8
7
  module ActiveRecordExtension
9
-
10
8
  # Adds Filterrific behavior to class when called like so:
11
9
  #
12
10
  # filterrific(
@@ -34,7 +32,6 @@ module Filterrific
34
32
  validate_filterrific_available_filters
35
33
  assign_filterrific_default_filter_params(opts)
36
34
  validate_filterrific_default_filter_params
37
-
38
35
  end
39
36
 
40
37
  # Returns ActiveRecord relation based on filterrific_param_set.
@@ -46,7 +43,7 @@ module Filterrific
46
43
  unless filterrific_param_set.is_a?(Filterrific::ParamSet)
47
44
  raise(
48
45
  ArgumentError,
49
- "Invalid Filterrific::ParamSet: #{ filterrific_param_set.inspect }"
46
+ "Invalid Filterrific::ParamSet: #{filterrific_param_set.inspect}"
50
47
  )
51
48
  end
52
49
 
@@ -69,7 +66,7 @@ module Filterrific
69
66
  ar_rel
70
67
  end
71
68
 
72
- protected
69
+ protected
73
70
 
74
71
  # Defines a :sorted_by scope based on attrs
75
72
  # @param attrs [Hash] with keys as
@@ -83,7 +80,7 @@ module Filterrific
83
80
  # @return [void]
84
81
  def assign_filterrific_available_filters(opts)
85
82
  self.filterrific_available_filters = (
86
- filterrific_available_filters + (opts['available_filters'] || [])
83
+ filterrific_available_filters + (opts["available_filters"] || [])
87
84
  ).map(&:to_s).uniq.sort
88
85
  end
89
86
 
@@ -97,7 +94,7 @@ module Filterrific
97
94
 
98
95
  def assign_filterrific_default_filter_params(opts)
99
96
  self.filterrific_default_filter_params = (
100
- opts['default_filter_params'] || {}
97
+ opts["default_filter_params"] || {}
101
98
  ).stringify_keys
102
99
  end
103
100
 
@@ -106,9 +103,8 @@ module Filterrific
106
103
  if (
107
104
  inv_fdfps = filterrific_default_filter_params.keys - filterrific_available_filters
108
105
  ).any?
109
- raise(ArgumentError, "Invalid default filter params: #{ inv_fdfps.inspect }")
106
+ raise(ArgumentError, "Invalid default filter params: #{inv_fdfps.inspect}")
110
107
  end
111
108
  end
112
-
113
109
  end
114
110
  end
@@ -1,16 +1,13 @@
1
- # -*- coding: utf-8 -*-
1
+ require "filterrific/param_set"
2
2
 
3
- require 'filterrific/param_set'
3
+ require "filterrific/has_reset_filterrific_url_mixin"
4
4
 
5
- require 'filterrific/has_reset_filterrific_url_mixin'
6
-
7
- require 'filterrific/action_controller_extension'
8
- require 'filterrific/action_view_extension'
9
- require 'filterrific/active_record_extension'
5
+ require "filterrific/action_controller_extension"
6
+ require "filterrific/action_view_extension"
7
+ require "filterrific/active_record_extension"
10
8
 
11
9
  module Filterrific
12
10
  class Engine < ::Rails::Engine
13
-
14
11
  # It's an engine so that we can add javascript and image assets
15
12
  # to the asset pipeline.
16
13
 
@@ -27,6 +24,5 @@ module Filterrific
27
24
  ActiveSupport.on_load :active_record do
28
25
  extend Filterrific::ActiveRecordExtension
29
26
  end
30
-
31
27
  end
32
28
  end
@@ -1,16 +1,13 @@
1
- # -*- coding: utf-8 -*-
2
1
  #
3
2
  # Adds reset_filterrific_url to controllers and views
4
3
  #
5
4
  module Filterrific
6
5
  module HasResetFilterrificUrlMixin
7
-
8
6
  # Returns a url that can be used to reset the Filterrific params
9
7
  def reset_filterrific_url(opts = {})
10
8
  url_for(
11
- { filterrific: { reset_filterrific: true } }.merge(opts)
9
+ {filterrific: {reset_filterrific: true}}.merge(opts)
12
10
  )
13
11
  end
14
-
15
12
  end
16
13
  end