jquery-tablesorter-rails-utils 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 78cbade05c4684cc14f69a730fef1e7dd40ec1b1
4
+ data.tar.gz: dc91520ae73b330131ff2e2c8adf1f659f7e6b77
5
+ SHA512:
6
+ metadata.gz: d813e7bcdae763cd440088a3d71d37164d9758f5f8f23d11c8dff9328f1811c6dbce53f28771bb592c43bc31748199b84a77e93658460ec2c29c1d51fc8af39c
7
+ data.tar.gz: f5eaae71f1dc5fe2e92ec1e2273108ba187dd0c481e8ad84bd5122998e26d17bd9d022358614546afb9b8b1a0fc4b95706d6a7acd8951e86a773a9ddfed5e467
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ # Change Log
2
+
3
+ ## 0.1.0 (2016-09-30) (initial release)
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in jquery-tablesorter-rails-utils.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2016 Erik-B. Ernst
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,133 @@
1
+ # Jquery::Tablesorter::Rails::Utils
2
+
3
+ Helpful (hopefully! ;-) ) additions for jQuery tablesorter (only support for [Mottie's fork] targeted) when working with rails.
4
+
5
+ While still in early development - which might bring breaking changes with new releases - it is meant to provide helpful utilities for jquery-tablesorter in rails. At the current state of development it only supports a mechanism to help to work with Ajax based tables.
6
+ You have a helpful idea/code snippet for something which makes it easier to work with tablesorter and rails? Cool, feel free to create a pull request!
7
+
8
+ For further information how to work with jQuery tablesorter I recommend the excellent [documentation] in [Mottie's fork].
9
+
10
+
11
+ ## Installation
12
+
13
+ Please note: Tablesorter has to be installed separately from this gem. You may use my packaged version ([jquery-tablesorter-gem]) or any other way to add it to your project.
14
+
15
+ Add this line to your application's Gemfile:
16
+
17
+ ~~~ruby
18
+ gem 'jquery-tablesorter-rails-utils'
19
+ ~~~
20
+
21
+ And then execute:
22
+
23
+ $ bundle
24
+
25
+ Or install it yourself as:
26
+
27
+ $ gem install jquery-tablesorter-rails-utils
28
+
29
+ ## Usage
30
+
31
+ ### Module: Ajax
32
+
33
+ The following sections shows an example how to use the Ajax module. It currently only supports PostgreSQL.
34
+
35
+ So, to query rendered HTML rows of your Foo model you may do:
36
+
37
+ In your controller (don't forget to add your routes!):
38
+
39
+ ~~~ruby
40
+
41
+ class FooController < ApplicationController
42
+ include JqueryTablesorter::RailsUtils::Ajax::ActionController
43
+
44
+ # Ajax query for the foo list rows
45
+ def query_list
46
+ base_query = Foo.my_scope
47
+
48
+ foo_columns()
49
+ resp = create_query_response(base_query, partial: 'my_partial_foo_row')
50
+
51
+ render json: resp
52
+ end
53
+
54
+ private
55
+
56
+ def foo_columns
57
+ ts_ajax_handler.create_filter_info(:name, Foo)
58
+ ts_ajax_handler.create_filter_info(:other_attribute_name_of_foo, Foo)
59
+ # Let's say, there is a global filter, too. The position is the param
60
+ # tablesorter submits on an request.
61
+ ts_ajax_handler.create_filter_info(:all, Foo, { global_filter: true, position: 5 })
62
+ end
63
+
64
+ end
65
+ ~~~
66
+
67
+ In the .coffee file you prepare your tablesorter instance and may add code like this:
68
+
69
+ ~~~coffee
70
+
71
+ $('#my_ajax_table').tablesorter(
72
+ # ...
73
+ ).tablesorterPager(
74
+ # your pager settings..
75
+ # if data tag is given, handle this table as ajax table
76
+ if query_url = current_table.data('query-url')
77
+ ajax_pager =
78
+ processAjaxOnInit: true
79
+ ajaxUrl: query_url
80
+ ajaxError: null
81
+ ajaxObject:
82
+ dataType: 'json'
83
+ ajaxProcessing: (result, table, xhr) ->
84
+ if result
85
+ result.total = result['total_rows']
86
+ result.filteredRows = result['filtered_rows']
87
+ if result.hasOwnProperty('data')
88
+ result.rows = $(result.data) # rendered <tr>s
89
+ return result
90
+ )
91
+ ~~~
92
+
93
+ In your view, the table partials could look like:
94
+
95
+ ~~~haml
96
+
97
+ %table#my_ajax_table{ 'data-query-url': 'foo/query?&page={page}&size={size}&{sortList:sort}&{filterList:filter}' }
98
+ %thead
99
+ %tr
100
+ %th= name
101
+ %th= other_attribute_name_of_foo
102
+ %tfoot
103
+ = render partial: 'your_footer_partial'
104
+ %tbody
105
+ ~~~
106
+
107
+ And the partial for the table rows:
108
+
109
+ ~~~haml
110
+
111
+ = records.each do |foo|
112
+ %tr
113
+ %td= foo.name
114
+ %td= foo.other_attribute_name_of_foo
115
+ ~~~
116
+
117
+
118
+ ## Licensing
119
+
120
+ * Licensed under the [MIT](http://www.opensource.org/licenses/mit-license.php) license.
121
+
122
+ ## Contributing
123
+
124
+ 1. Fork it
125
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
126
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
127
+ 4. Push to the branch (`git push origin my-new-feature`)
128
+ 5. Create new Pull Request
129
+
130
+
131
+ [Mottie's fork]: https://github.com/Mottie/tablesorter
132
+ [documentation]: http://mottie.github.com/tablesorter/docs/index.html
133
+ [jquery-tablesorter-gem]: https://github.com/themilkman/jquery-tablesorter-rails
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task default: :spec
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'jquery-tablesorter/rails-utils/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'jquery-tablesorter-rails-utils'
8
+ spec.version = JqueryTablesorter::RailsUtils::VERSION
9
+ spec.authors = ['Erik-B. Ernst', 'Thomas Halter']
10
+ spec.email = ['github@black-milk.de']
11
+
12
+ spec.summary = %q{Some helpers to work with jQuery tablesorter and Ruby on Rails}
13
+ spec.description = %q{Some helpers to work with jQuery tablesorter and Ruby on Rails.}
14
+ spec.homepage = 'https://github.com/themilkman/jquery-tablesorter-rails-utils'
15
+ spec.license = 'MIT'
16
+
17
+ spec.required_ruby_version = '>= 1.9.3'
18
+
19
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
+ f.match(%r{^(test|spec|features)/})
21
+ end
22
+
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.add_dependency 'activerecord', '>= 4.0', '< 6.0'
26
+ spec.add_dependency 'activesupport', '>= 4.0', '< 6.0'
27
+ spec.add_dependency 'actionview', '>= 4.0', '< 6.0'
28
+ spec.add_dependency 'pg'
29
+
30
+ spec.add_development_dependency 'bundler', '~> 1.13'
31
+ spec.add_development_dependency 'rake', '~> 10.0'
32
+ end
@@ -0,0 +1,2 @@
1
+ require 'jquery-tablesorter/rails-utils/version'
2
+ require 'jquery-tablesorter/rails-utils/ajax'
@@ -0,0 +1,26 @@
1
+ # Adds mechanisms to work with Ajax based tables and tablesorter.
2
+ # Current limitions (extract ;-P):
3
+ # * It does not support sorting by multiple columns.
4
+ # * Currently only PostgreSQL is supported
5
+ #
6
+ # Usage:
7
+ # Includet this module in your controller and call methods in your query-action,
8
+ # where the results can be used to build the response.
9
+ #
10
+ # Further ToDos/plans/ideas/dreams:
11
+ # * There might be a possibility to pass a block for each column-operation such
12
+ # as filtering or sorting and allow more dynamic work. This might happen before or better
13
+ # instead the standard processing. (partly done with the filter_mapping filter-parameter)
14
+ # * Maybe it'd be possible to allow multi-column sorting somehow.
15
+ # * In some cases it could make sense not to cast all columns to strings/varchars. So, an optionally passed
16
+ # type for a column might get evaluated/used in a different manner. (done for DateTime)
17
+
18
+ module JqueryTablesorter
19
+ module RailsUtils
20
+ module Ajax
21
+ require 'jquery-tablesorter/rails-utils/ajax/filter'
22
+ require 'jquery-tablesorter/rails-utils/ajax/handler'
23
+ require 'jquery-tablesorter/rails-utils/ajax/action_controller'
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,52 @@
1
+ # Controller concern to help with ajax jquery tablesorter requests.
2
+ # It handles sorting and filtering.
3
+
4
+ module JqueryTablesorter
5
+ module RailsUtils
6
+ module Ajax
7
+ module ActionController
8
+ extend ActiveSupport::Concern
9
+
10
+
11
+ # A generalized method to handle tablesorter queries. It's meant to be used in the corresponding
12
+ # Controller action. Params:
13
+ # clazz: The model's primary class
14
+ # base_query: If there are any relevant joins or so -> pass the AR relation here
15
+ # partial (optional): path to the partial to be rendered
16
+ def create_query_html_response(base_query, partial: 'row')
17
+ resp_data = ts_ajax_handler.query_data(base_query)
18
+
19
+ records = resp_data.delete(:records)
20
+ resp_data[:data] = render_response_html(records, partial: partial)
21
+
22
+ return resp_data
23
+ end
24
+
25
+ private
26
+
27
+ # Render the html rows for the given records and an optional named partial.
28
+ # Returns HTML string or nil
29
+ def render_response_html(records, partial: 'row' )
30
+ output = render_to_string partial: partial, locals: { records: records }
31
+
32
+ unless records.any? # if the query had 0 results, it will return a string which has let jquery crash
33
+ output = nil
34
+ end
35
+
36
+ return output
37
+ end
38
+
39
+ def ts_ajax_handler
40
+ @_ts_ajax_handler ||= Handler.new(tablesorter_params)
41
+ end
42
+
43
+ def tablesorter_params
44
+ params.permit(:page, :size, :controller, :action, :query, :sort, :filter,
45
+ { sort: params[:sort].try(:keys) },
46
+ { filter: params[:filter].try(:keys) })
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,61 @@
1
+ module JqueryTablesorter
2
+ module RailsUtils
3
+ module Ajax
4
+ # Represents a table sorting Filter. In most cases this is also a column
5
+ # in your table, but might als be a global/external filter.
6
+ class Filter
7
+ # Name of the column in the DB. Used for queries, but may also be :all for glob. filters.
8
+ attr_accessor :column_name
9
+ # Class of the base model.
10
+ attr_accessor :model
11
+ # If you need to join, this is your relation table
12
+ attr_accessor :join_rel
13
+ # An external table column to be used with join.
14
+ attr_accessor :external_column
15
+ # If a having clase is required, pass it here. This will change the controll flow on
16
+ # filter-/sorting.
17
+ attr_accessor :having_clause
18
+ # Optional data type of the column. This might be used to make queries more flexible.
19
+ # For examaple, if DateTime is passed, it will strip away milliseconds from query.
20
+ attr_accessor :data_type
21
+ # Optional boolean filter if the given filter is a global filter or not.
22
+ attr_accessor :global_filter
23
+ # Optional index requested by tablesorter, needed for glob. filters.
24
+ attr_accessor :position
25
+ # Optional block to modify the real input of filters to match UI (e.g. Input: 'Iceland' => DB: 'is')
26
+ # This block has to return an array which will be used for an IN-Query. Thus, the current implementation
27
+ # depends on an 1:1 match.
28
+ attr_accessor :filter_mapping
29
+
30
+ def initialize(column_name, model_clazz, opts = {})
31
+ @column_name = column_name
32
+ @model = model_clazz
33
+ @position = opts[:position]
34
+ @join_rel = opts[:join_rel]
35
+ @external_column = opts[:external_column]
36
+ @having_clause = opts[:having_clause]
37
+ @data_type = opts[:data_type]
38
+ @global_filter = opts[:global_filter]
39
+ @filter_mapping = opts[:filter_mapping]
40
+ end
41
+
42
+ def global_filter?
43
+ @global_filter || false
44
+ end
45
+
46
+ def name
47
+ self.column_name
48
+ end
49
+
50
+ def model_class
51
+ self.model
52
+ end
53
+
54
+ def external?
55
+ external_column.present?
56
+ end
57
+
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,248 @@
1
+ module JqueryTablesorter
2
+ module RailsUtils
3
+ module Ajax
4
+ # Class used by ActionController concern. Encapsulates query logic.
5
+ # For further documentation see ajax-module.
6
+ class Handler
7
+
8
+ def initialize(tablesorter_params)
9
+ @ts_params = tablesorter_params
10
+ end
11
+
12
+ # Define the table structure
13
+ def create_filter_info(column_name, model_clazz, filter_opts = {})
14
+ filter = Filter.new(column_name, model_clazz, filter_opts)
15
+ ajax_filters << filter
16
+ return filter
17
+ end
18
+
19
+ # Load data for the given tablesorter params in a controller action
20
+ # Params:
21
+ # base_query: If there are any relevant joins or so -> pass the AR relation here
22
+ # Returns a hash with:
23
+ # total_rows: How many records are there available
24
+ # filtered_rows: How many records are left after filtering
25
+ # records: An collection with the resulting records
26
+ def query_data(base_query)
27
+ @query = base_query
28
+
29
+ result = Hash.new
30
+
31
+ # Filters
32
+ @query = apply_filters(@query, tablesorter_params)
33
+
34
+ # Calculate row counts
35
+ rec_counts = record_counts(base_query, @query)
36
+ result[:filtered_rows] = rec_counts[:filtered_rows]
37
+ result[:total_rows] = rec_counts[:total_rows]
38
+
39
+ # Handle paging afterwards
40
+ @query = handle_pagination(@query, tablesorter_params, result)
41
+
42
+ # Sorting
43
+ @query = apply_sorting(@query, tablesorter_params)
44
+
45
+ result[:records] = @query
46
+
47
+ return result
48
+ end
49
+
50
+ # Calulate count of all and filtered records
51
+ # Params:
52
+ # model_query: The base query of the current selection
53
+ # filtered_query: The filtered query (relation with applied tablesorter filters)
54
+ def record_counts(model_query, filtered_query)
55
+ counts = Hash.new
56
+ total = model_query.distinct.count(:id)
57
+
58
+ if total.is_a?(Hash) # Handle results of joined queries. This feels a little bit hacky.
59
+ total = total.keys.length
60
+ end
61
+
62
+ counts[:total_rows] = total
63
+
64
+ if tablesorter_params[:filter]
65
+ # Count again if additional filters were applied (fires a query)
66
+ cnt = filtered_query.count("#{model_query.table_name}.id")
67
+
68
+ if cnt.is_a?(Hash) # Handle results of having-queries. This feels a little bit hacky.
69
+ cnt = cnt.keys.length
70
+ end
71
+ counts[:filtered_rows] = cnt
72
+ else
73
+ counts[:filtered_rows] = total # There wasn't any reduction.
74
+ end
75
+
76
+ return counts
77
+ end
78
+
79
+
80
+ # let every special case be handled within that block.
81
+ # block should remove the values from the params parameter to allow regular processing.
82
+ def apply_filters(record_relation, filter_params)
83
+ splat_global_filter(filter_params)
84
+ record_relation = apply_global_filters(record_relation, filter_params)
85
+
86
+ # iterate over all filter inputs
87
+ (filter_params[:filter] || {}).each do |filter_index, filter_value|
88
+ sel_col = ajax_filters[filter_index.to_i]
89
+ next if sel_col.blank?
90
+
91
+ clazz = sel_col.model
92
+ selected_column = sel_col.name
93
+
94
+ if sel_col.external? # query an external model
95
+ ext_query = "LOWER(#{sel_col.join_rel}.#{sel_col.external_column}::varchar) LIKE LOWER(?)"
96
+ record_relation = record_relation.where(ext_query, "%#{filter_value}%")
97
+
98
+ elsif sel_col.having_clause
99
+ clause = sel_col.having_clause
100
+ record_relation = record_relation.having("LOWER((#{clause})::varchar) LIKE ?", "%#{filter_value}%")
101
+
102
+ elsif sel_col.filter_mapping # there were modifications on the query
103
+ target_col = "#{clazz.table_name}.#{selected_column}"
104
+ values = sel_col.filter_mapping.call(filter_value)
105
+ # Maybe we could use an SIMILAR TO query for this.
106
+ record_relation = record_relation.where("LOWER(#{target_col}::varchar) IN (?)", values )
107
+
108
+ else # directly on current model
109
+ target_col = "#{clazz.table_name}.#{selected_column}"
110
+ if sel_col.data_type == DateTime
111
+ target_col = "date_trunc('minute', #{target_col})"
112
+ end
113
+ record_relation = record_relation.where("LOWER(#{target_col}::varchar) LIKE LOWER(?)", "%#{filter_value}%" )
114
+ end
115
+
116
+ end
117
+
118
+ return record_relation
119
+ end
120
+
121
+ # Sort the passed relation by the tablesorter-sorting.
122
+ def apply_sorting(record_relation, sort_params)
123
+ (sort_params[:sort] || {}).each do |sort_index, order|
124
+ order = (order.to_i % 2 == 0) ? :asc : :desc
125
+ sel_col = ajax_filters[sort_index.to_i]
126
+
127
+ if sel_col.external?
128
+ order_query = [sel_col.join_rel, sel_col.external_column].compact.join('.')
129
+ record_relation = record_relation.order("#{order_query} #{order}")
130
+
131
+ elsif sel_col.having_clause
132
+ # If there is a having_clause, use the column name w/o tablename
133
+ record_relation = record_relation.order("#{sel_col.name} #{order} NULLS LAST")
134
+
135
+ else
136
+ order_query = [sel_col.model.table_name, sel_col.name].compact.join('.')
137
+ record_relation = record_relation.order("#{order_query} #{order} NULLS LAST")
138
+ end
139
+
140
+ end
141
+
142
+ return record_relation
143
+ end
144
+
145
+ # Paginiation/the amount of visible rows in the table (per page)
146
+ def handle_pagination(query, ts_params, result)
147
+ # Tablesorter submits row count or simply 'all'. If user requests more rows
148
+ # than available do nothing.
149
+ return query if ( (ts_params[:size] == 'all') || (ts_params[:size].to_i >= result[:total_rows]) )
150
+
151
+ query = query
152
+ .limit(ts_params[:size].to_i)
153
+ .offset(ts_params[:size].to_i * ts_params[:page].to_i)
154
+
155
+ return query
156
+ end
157
+
158
+ # Array with all currently configured Filter-Objects
159
+ def ajax_filters
160
+ @_ajax_table_filters ||= []
161
+ end
162
+
163
+ private
164
+
165
+ def tablesorter_params
166
+ @ts_params
167
+ end
168
+
169
+ # Iterate over all columns with the (previous in *splat_global_filter* initialized)
170
+ # global filter value
171
+ def apply_global_filters(record_relation, filter_params)
172
+ # TODO Wouldn't it be smarter to make query an array and join it by ' OR '?
173
+ query = ''
174
+ filter_values = []
175
+
176
+ (filter_params[:global_filter] || {}).each do |filter_index, filter_value|
177
+ sel_col = ajax_filters[filter_index.to_i]
178
+ next if sel_col.blank?
179
+
180
+ clazz = sel_col.model
181
+ selected_column = sel_col.name
182
+ table_name = clazz.table_name
183
+
184
+ if sel_col.external? # Query an external model
185
+ query << "LOWER(#{sel_col.join_rel}.#{sel_col.external_column}::varchar) LIKE LOWER(?) OR "
186
+ filter_values << "%#{filter_value}%"
187
+
188
+ elsif sel_col.filter_mapping # there were modifications on the query
189
+ target_col = "#{clazz.table_name}.#{selected_column}"
190
+ values = sel_col.filter_mapping.call(filter_value)
191
+ # Maybe we could use an SIMILAR TO query for this.
192
+ query << "LOWER(#{target_col}::varchar) IN (?) OR "
193
+ filter_values << values
194
+
195
+ elsif sel_col.having_clause
196
+ # Having clauses will create an extra query to select IDs of base-table records
197
+ # an add them into the main query as IN <ids>.
198
+ # If there is a having_clause, use the column name only w/o tablename.
199
+ clause = "LOWER(#{sel_col.having_clause}::varchar) LIKE LOWER(?)"
200
+ filter_values << record_relation.having(clause, "%#{filter_value}%")
201
+ .pluck(:id)
202
+ query << "#{table_name}.id IN (?) OR "
203
+
204
+ else
205
+ target_col = "#{table_name}.#{selected_column}"
206
+
207
+ if sel_col.data_type == DateTime # Special handling for Dates -> strip away millisecs
208
+ target_col = "date_trunc('second', #{target_col})"
209
+ end
210
+
211
+ query << "LOWER(#{target_col}::varchar) LIKE LOWER(?) OR "
212
+ filter_values << "%#{filter_value}%"
213
+ end
214
+ end
215
+
216
+ query = query.chomp(' OR ') # remove the last OR
217
+
218
+ return record_relation.where(query, *filter_values)
219
+
220
+ end
221
+
222
+ # If any global filter value (the user input) is found (which currently is asumed to the last),
223
+ # take this input and add it to a global_filter subkey with the corresponding index of each
224
+ # not global-filter column. Thus, later the may be used to check all coulmns for the given
225
+ # input.
226
+ def splat_global_filter(filter_params)
227
+ # Global filter params is assumed to be at the last index
228
+ global_filter = ajax_filters.find { |c| c.global_filter? }
229
+ return unless global_filter
230
+
231
+ global_filter_value = filter_params.dig(:filter, global_filter.position.to_s)
232
+ return if global_filter_value.nil?
233
+
234
+ filter_params[:global_filter] ||= {}
235
+ ajax_filters.each_with_index do |col, idx|
236
+ next if (col.nil? || col.global_filter?)
237
+ # Add search query for each (non-global) value
238
+ filter_params[:global_filter][idx.to_s] = global_filter_value
239
+ end
240
+
241
+ # Remove the global filter from the params
242
+ filter_params[:filter].delete(global_filter.position.to_s)
243
+ end
244
+
245
+ end
246
+ end
247
+ end
248
+ end
@@ -0,0 +1,9 @@
1
+ module JqueryTablesorter
2
+ module RailsUtils
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ TINY = 1
6
+
7
+ VERSION = [MAJOR, MINOR, TINY].compact.join('.')
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jquery-tablesorter-rails-utils
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Erik-B. Ernst
8
+ - Thomas Halter
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-09-30 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activerecord
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '4.0'
21
+ - - "<"
22
+ - !ruby/object:Gem::Version
23
+ version: '6.0'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ version: '4.0'
31
+ - - "<"
32
+ - !ruby/object:Gem::Version
33
+ version: '6.0'
34
+ - !ruby/object:Gem::Dependency
35
+ name: activesupport
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
41
+ - - "<"
42
+ - !ruby/object:Gem::Version
43
+ version: '6.0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: '4.0'
51
+ - - "<"
52
+ - !ruby/object:Gem::Version
53
+ version: '6.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: actionview
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '4.0'
61
+ - - "<"
62
+ - !ruby/object:Gem::Version
63
+ version: '6.0'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '4.0'
71
+ - - "<"
72
+ - !ruby/object:Gem::Version
73
+ version: '6.0'
74
+ - !ruby/object:Gem::Dependency
75
+ name: pg
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ type: :runtime
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ - !ruby/object:Gem::Dependency
89
+ name: bundler
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '1.13'
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '1.13'
102
+ - !ruby/object:Gem::Dependency
103
+ name: rake
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '10.0'
109
+ type: :development
110
+ prerelease: false
111
+ version_requirements: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '10.0'
116
+ description: Some helpers to work with jQuery tablesorter and Ruby on Rails.
117
+ email:
118
+ - github@black-milk.de
119
+ executables: []
120
+ extensions: []
121
+ extra_rdoc_files: []
122
+ files:
123
+ - CHANGELOG.md
124
+ - Gemfile
125
+ - LICENSE
126
+ - README.md
127
+ - Rakefile
128
+ - jquery-tablesorter-rails-utils.gemspec
129
+ - lib/jquery-tablesorter-rails-utils.rb
130
+ - lib/jquery-tablesorter/rails-utils/ajax.rb
131
+ - lib/jquery-tablesorter/rails-utils/ajax/action_controller.rb
132
+ - lib/jquery-tablesorter/rails-utils/ajax/filter.rb
133
+ - lib/jquery-tablesorter/rails-utils/ajax/handler.rb
134
+ - lib/jquery-tablesorter/rails-utils/version.rb
135
+ homepage: https://github.com/themilkman/jquery-tablesorter-rails-utils
136
+ licenses:
137
+ - MIT
138
+ metadata: {}
139
+ post_install_message:
140
+ rdoc_options: []
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: 1.9.3
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ requirements: []
154
+ rubyforge_project:
155
+ rubygems_version: 2.5.1
156
+ signing_key:
157
+ specification_version: 4
158
+ summary: Some helpers to work with jQuery tablesorter and Ruby on Rails
159
+ test_files: []