table_sortable 0.1.8 → 0.2.0

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
2
  SHA1:
3
- metadata.gz: ea868dab316c188a2e54ad685f06a17675b8cccd
4
- data.tar.gz: c065b1ce4568a2db812ba5805685a8d1c5efe7d8
3
+ metadata.gz: 3a484255d4071117e14633714581e5392da418bd
4
+ data.tar.gz: 063b9bcd1e5dab7c85b8473f06d9b9349351df36
5
5
  SHA512:
6
- metadata.gz: 2d15f0e1053f207597d19bba44b49adb2cd758cbcb216ac5f461d7dd99dd34f4fe0bab78f2031baf0f933c85e4a2566fd07a8e1dc30e5fc0ba66066d04024132
7
- data.tar.gz: 3000f22be7c289aa9b6e07f71a6538bddea58eb60f2a1b4ea5af0da1fa3013ba84616f09722d19d2e55a934c8795a4bb32387199c5d98ec94b76fe6834def5e9
6
+ metadata.gz: cff13059ff3aa2f36bed53861db9ce00eef623b90a7fc18a233c4523cba19a724ed5b3fc803fcf5687d4ddc2476f5c8356b7af10ceb42d1438a045aed7db177d
7
+ data.tar.gz: 847dabaa7a749389d95c0a945e2de623d974732ddcc2a357f0d1ecf7f47f9bba9faf1590fec9121b29208aa02bee1b88f9ef53944b0eefc605711eea92b88554
data/.idea/.rakeTasks CHANGED
@@ -4,4 +4,4 @@ You are allowed to:
4
4
  1. Remove rake task
5
5
  2. Add existing rake tasks
6
6
  To add existing rake tasks automatically delete this file and reload the project.
7
- --><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build table_sortable-0.1.1.gem into the pkg directory" fullCmd="build" taksId="build" /><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated files" fullCmd="clobber" taksId="clobber" /><RakeTask description="Build and install table_sortable-0.1.1.gem into system gems" fullCmd="install" taksId="install" /><RakeGroup description="" fullCmd="" taksId="install"><RakeTask description="Build and install table_sortable-0.1.1.gem into system gems without network access" fullCmd="install:local" taksId="local" /></RakeGroup><RakeTask description="Create tag v0.1.1 and build and push table_sortable-0.1.1.gem to Rubygems" fullCmd="release[remote]" taksId="release[remote]" /><RakeTask description="Run tests" fullCmd="test" taksId="test" /><RakeTask description="" fullCmd="default" taksId="default" /><RakeTask description="" fullCmd="release" taksId="release" /><RakeGroup description="" fullCmd="" taksId="release"><RakeTask description="" fullCmd="release:guard_clean" taksId="guard_clean" /><RakeTask description="" fullCmd="release:rubygem_push" taksId="rubygem_push" /><RakeTask description="" fullCmd="release:source_control_push" taksId="source_control_push" /></RakeGroup></RakeGroup></Settings>
7
+ --><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build table_sortable-0.1.8.gem into the pkg directory" fullCmd="build" taksId="build" /><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated files" fullCmd="clobber" taksId="clobber" /><RakeTask description="Build and install table_sortable-0.1.8.gem into system gems" fullCmd="install" taksId="install" /><RakeGroup description="" fullCmd="" taksId="install"><RakeTask description="Build and install table_sortable-0.1.8.gem into system gems without network access" fullCmd="install:local" taksId="local" /></RakeGroup><RakeTask description="Create tag v0.1.8 and build and push table_sortable-0.1.8.gem to Rubygems" fullCmd="release[remote]" taksId="release[remote]" /><RakeTask description="Run tests" fullCmd="test" taksId="test" /><RakeTask description="" fullCmd="default" taksId="default" /><RakeTask description="" fullCmd="release" taksId="release" /><RakeGroup description="" fullCmd="" taksId="release"><RakeTask description="" fullCmd="release:guard_clean" taksId="guard_clean" /><RakeTask description="" fullCmd="release:rubygem_push" taksId="rubygem_push" /><RakeTask description="" fullCmd="release:source_control_push" taksId="source_control_push" /></RakeGroup></RakeGroup></Settings>
@@ -34,7 +34,7 @@
34
34
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
35
35
  <method />
36
36
  </configuration>
37
- <configuration default="false" name="Run spec 'test_controller_spec': table_sortable" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true">
37
+ <configuration default="false" name="Run spec 'proc_spec': table_sortable" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true">
38
38
  <predefined_log_file id="RUBY_RSPEC" enabled="true" />
39
39
  <module name="table_sortable" />
40
40
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="-e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift)" />
@@ -53,7 +53,7 @@
53
53
  </COVERAGE_PATTERN>
54
54
  </EXTENSION>
55
55
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
56
- <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/controllers/test_controller_spec.rb" />
56
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/lib/table_sortable/concerns/proc_spec.rb" />
57
57
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
58
58
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="**/*_spec.rb" />
59
59
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="" />
@@ -67,7 +67,7 @@
67
67
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
68
68
  <method />
69
69
  </configuration>
70
- <configuration default="false" name="Run spec 'proc_spec': table_sortable" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true">
70
+ <configuration default="false" name="Run spec 'filter_spec': table_sortable" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true">
71
71
  <predefined_log_file id="RUBY_RSPEC" enabled="true" />
72
72
  <module name="table_sortable" />
73
73
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="-e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift)" />
@@ -86,7 +86,7 @@
86
86
  </COVERAGE_PATTERN>
87
87
  </EXTENSION>
88
88
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
89
- <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/lib/table_sortable/concerns/proc_spec.rb" />
89
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/lib/table_sortable/column/filter_spec.rb" />
90
90
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
91
91
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="**/*_spec.rb" />
92
92
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="" />
@@ -100,7 +100,7 @@
100
100
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
101
101
  <method />
102
102
  </configuration>
103
- <configuration default="false" name="Run spec 'filter_spec': table_sortable" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true">
103
+ <configuration default="false" name="TableSortable::Controller filter_and_sort filters using a single filter: table_sortable" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true">
104
104
  <predefined_log_file id="RUBY_RSPEC" enabled="true" />
105
105
  <module name="table_sortable" />
106
106
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="-e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift)" />
@@ -118,11 +118,44 @@
118
118
  <PATTERN REGEXPS="/.rvm/" INCLUDED="false" />
119
119
  </COVERAGE_PATTERN>
120
120
  </EXTENSION>
121
- <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
122
- <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/lib/table_sortable/column/filter_spec.rb" />
121
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="$MODULE_DIR$/spec" />
122
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/lib/table_sortable/controller_spec.rb" />
123
123
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
124
124
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="**/*_spec.rb" />
125
- <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="" />
125
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="TableSortable::Controller filter_and_sort filters using a single filter" />
126
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="TEST_SCRIPT" />
127
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_ARGS" VALUE="" />
128
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
129
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="USE_CUSTOM_SPEC_RUNNER" VALUE="false" />
130
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
131
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
132
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPRING" VALUE="false" />
133
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
134
+ <method />
135
+ </configuration>
136
+ <configuration default="false" name="TableSortable::Controller filter_and_sort sorts a record set based on the column to sort: table_sortable" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true">
137
+ <predefined_log_file id="RUBY_RSPEC" enabled="true" />
138
+ <module name="table_sortable" />
139
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="-e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift)" />
140
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="WORK DIR" VALUE="$MODULE_DIR$" />
141
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SHOULD_USE_SDK" VALUE="false" />
142
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ALTERN_SDK_NAME" VALUE="" />
143
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="myPassParentEnvs" VALUE="true" />
144
+ <envs>
145
+ <env name="JRUBY_OPTS" value="-X+O" />
146
+ </envs>
147
+ <EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="true" />
148
+ <EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
149
+ <EXTENSION ID="RubyCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" track_test_folders="true" runner="rcov">
150
+ <COVERAGE_PATTERN ENABLED="true">
151
+ <PATTERN REGEXPS="/.rvm/" INCLUDED="false" />
152
+ </COVERAGE_PATTERN>
153
+ </EXTENSION>
154
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="$MODULE_DIR$/spec" />
155
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/lib/table_sortable/controller_spec.rb" />
156
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
157
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="**/*_spec.rb" />
158
+ <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="TableSortable::Controller filter_and_sort sorts a record set based on the column to sort" />
126
159
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="TEST_SCRIPT" />
127
160
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_ARGS" VALUE="" />
128
161
  <RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
@@ -155,6 +188,8 @@
155
188
  <orderEntry type="library" scope="PROVIDED" name="concurrent-ruby (v1.0.5, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
156
189
  <orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.3, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
157
190
  <orderEntry type="library" scope="PROVIDED" name="erubi (v1.6.0, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
191
+ <orderEntry type="library" scope="PROVIDED" name="factory_girl (v4.8.0, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
192
+ <orderEntry type="library" scope="PROVIDED" name="factory_girl_rails (v4.8.0, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
158
193
  <orderEntry type="library" scope="PROVIDED" name="globalid (v0.4.0, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
159
194
  <orderEntry type="library" scope="PROVIDED" name="i18n (v0.8.1, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
160
195
  <orderEntry type="library" scope="PROVIDED" name="loofah (v2.0.3, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
@@ -180,6 +215,7 @@
180
215
  <orderEntry type="library" scope="PROVIDED" name="rspec-support (v3.6.0, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
181
216
  <orderEntry type="library" scope="PROVIDED" name="sprockets (v3.7.1, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
182
217
  <orderEntry type="library" scope="PROVIDED" name="sprockets-rails (v3.2.0, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
218
+ <orderEntry type="library" scope="PROVIDED" name="sqlite3 (v1.3.13, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
183
219
  <orderEntry type="library" scope="PROVIDED" name="thor (v0.19.4, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
184
220
  <orderEntry type="library" scope="PROVIDED" name="thread_safe (v0.3.6, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
185
221
  <orderEntry type="library" scope="PROVIDED" name="tzinfo (v1.2.3, RVM: ruby-2.4.1 [tablesortable]) [gem]" level="application" />
data/README.md CHANGED
@@ -2,17 +2,21 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/odedd/table_sortable.svg?branch=master)](https://travis-ci.org/odedd/table_sortable)
4
4
 
5
- TableSortable is a Rails complementation of The **tableSorter jQuery plugin**.
5
+ TableSortable adds multi-column, **server-side** filtering, sorting and pagination
6
+ to the **tableSorter jQuery plugin**, so you don't have to worry about interpreting the query parameters,
7
+ combining multiple queries, columns to sort by, or figuring out how to send the correct page back to the client.
6
8
 
7
- The tableSorter jQuery plugin is an excellent tool for filtering and sorting tables.
8
- When dealing with lots of rows, we usually want to split the table into multiple pages. tableSorter has a nifty [widget](https://mottie.github.io/tablesorter/docs/example-pager-ajax.html) for that, which requires using [mottie's fork](https://mottie.github.io/tablesorter/docs/index.html) of tableSorter.
9
+ It is a Rails backend complementation to the frontend tableSorter.js.
9
10
 
10
- Usually this is a scenario where we don't want to send our entire set of records to the front end,
11
- which consequently means that the front end no longer knows the entire set of records to filter and sort through.
12
- This requires our *server* to handle all that stuff, plus the pagination of the results.
11
+ ### The Problem
12
+ The jQuery tableSorter plugin is an excellent tool for filtering and sorting tables.
13
+ Often, when dealing with lots of rows, we may want to split the table into multiple pages. tableSorter.js has a nifty [widget](https://mottie.github.io/tablesorter/docs/example-pager-ajax.html) for that, which requires using [mottie's fork](https://mottie.github.io/tablesorter/docs/index.html) of tableSorter.
13
14
 
14
- #### That's where TableSortable comes in!
15
+ Usually this is a scenario where we don't want to send our entire set of records to the frontend,
16
+ which consequently means that the frontend no longer knows the entire set of records to filter and sort through,
17
+ which eventually requires our *server* to handle all that stuff as well as the pagination of the results.
15
18
 
19
+ ### The Solution: TableSortable
16
20
  TableSortable will handle all the backend filtering, sorting and pagination for you.
17
21
 
18
22
  NOTICE: This gem is in very early stages of development, and is not yet fully documented. Any input will be more than welcome.
@@ -28,13 +32,13 @@ gem 'table_sortable'
28
32
  Then run `bundle install` and you're ready to start
29
33
 
30
34
  You should also probably be using jquery-tablesorter.
31
- For information regarding integration or tableSorter into your Rails project,
35
+ For information regarding integration or tableSorter.js into your Rails project,
32
36
  please see the [jQuery tablesorter plugin for Rails](https://github.com/themilkman/jquery-tablesorter-rails) page.
33
37
 
34
38
  ## Usage
35
39
 
36
- First, we need to setup our controller.
37
- Let's say we have our users controller. Let's include TableSortable so that we can use its methods.
40
+ First, we need to setup our controller. For this example this will be a users controller.
41
+ Let's `include TableSortable` so that we can use its methods.
38
42
 
39
43
  ```ruby
40
44
  #controllers/users_controller.rb
@@ -50,7 +54,7 @@ class UsersController < ApplicationController
50
54
 
51
55
  define_colunns :first_name, :last_name, :email, :created_at
52
56
  ```
53
- That's the basic setup of columns. For more configuration options, please see [advanced configuration](#advanced-configuration).
57
+ That's just the basic setup of columns. For more configuration options, please see [advanced configuration](#advanced-configuration).
54
58
 
55
59
  Now we need to make sure our `index` action filters, sorts and paginates the records.
56
60
  We can do that using the `filter_and_sort` method.
@@ -61,27 +65,50 @@ def index
61
65
  @users = filter_and_sort(User.all)
62
66
 
63
67
  respond_to do |format|
64
- format.html {}
65
- format.json {render layout: false}
68
+ format.html {}
69
+ format.json {render layout: false}
66
70
  end
67
71
  end
68
72
  ```
69
73
 
70
- In our view we can use TableSortable's [view helpers](#view-helpers) to render our table.
74
+ Let's write the `index` view. We can use TableSortable's [view helpers](#view-helpers) to render our table.
71
75
  ```erb
72
- #views/users/index.html.erb
73
- <div id="usersPager"><%= table_sortable_pager %></div>
76
+ <!-- views/users/index.html.erb -->
77
+ <div id="usersPager">
78
+ <%= table_sortable_pager %>
79
+ </div>
80
+
74
81
  <table id="usersTable" data-query="<%= users_path %>">
75
82
  <thead>
76
83
  <tr>
77
84
  <%= table_sortable_headers %>
78
85
  </tr>
79
86
  </thead>
87
+ <tbody>
88
+ </tbody>
80
89
  </table>
81
90
  ```
91
+ Notice how `index.html` doesn't render the actual rows. They will later be polled via ajax by tableSorter.js.
82
92
 
83
- Let's say we have a tableSorter table which poll's the database for data. Here's a simple configuration example for that:
93
+ Let's create `index.json.jbuilder` to send the users' info back to the frontend.
94
+ ```ruby
95
+ # views/users/index.json.jbuilder
96
+ # Since we only send out the current page of users,
97
+ # we must also send the total number of records.
98
+ # We'll use TableSortable's total_count method for that.
99
+ json.total @users.total_count
100
+ json.rows @users.map{|user| render partial: 'user_row.html.erb', locals: {user: user}}.join
101
+ json.pager_output 'Users {startRow} to {endRow} of {totalRows}'
102
+ ```
103
+ We should also create the _user_row.html partial. In it, we may also use TableSortable's [helpers](#view-helpers).
104
+ ```erb
105
+ <!-- views/users/_user_row.html.erb -->
106
+ <tr>
107
+ <%= table_sortable_columns user %>
108
+ </tr>
109
+ ```
84
110
 
111
+ Now that we are done configuring the backend - let's continue to frontend. Here's a simple tableSorter.js configuration example:
85
112
  ```javascript
86
113
  var table = $('#usersTable');
87
114
  table.tablesorter({
@@ -89,9 +116,7 @@ table.tablesorter({
89
116
  widgetOptions: {
90
117
  // show 10 records at a time
91
118
  pager_size: 10,
92
- // Poll our users_index_path.
93
- // A better practice would be to use the table's
94
- // data-query attribute instead, but more on that later)
119
+ // Poll our users_index_path, which we receive from the table's data-query attribute.
95
120
  pager_ajaxUrl: table.data('query') + '?pagesize={size}&page={page}&{filterList:fcol}&{sortList:scol}',
96
121
  // Parse the incoming result
97
122
  pager_ajaxProcessing: function (data) {
@@ -100,15 +125,15 @@ table.tablesorter({
100
125
  this.pager_output = data.pager_output;
101
126
  // return total records, the rows HTML data,
102
127
  // and the headers information.
103
- return [data.total, $(data.rows), data.headers];
128
+ return [data.total, $(data.rows)];
104
129
  }
105
130
  }
106
131
  }
107
132
  });
108
133
  ```
109
- For full documentation regarding the usage of tableSorter please go [here](https://mottie.github.io/tablesorter/docs/index.html) for the very popular fork by mottie, or [here](http://tablesorter.com/docs/) for the original version of the plugin.
134
+ That's it! The results fetched from the server are now filtered, sorted and paginated by TableSortable.
110
135
 
111
- Now, the results fetched from the server would be filtered, sorter and paginated by TableSortable.
136
+ For full documentation of the usage of tableSorter.js please go [here](https://mottie.github.io/tablesorter/docs/index.html) for the very popular fork by mottie, or [here](http://tablesorter.com/docs/) for the original version of the plugin.
112
137
 
113
138
  Of course there are many more configuration options that make TableSortable flexible and adaptable. For those, please see [advanced configuration](#advanced-configuration)
114
139
 
@@ -3,8 +3,10 @@ module TableSortable
3
3
  class Filter
4
4
  include TableSortable::Concerns::Proc
5
5
 
6
- def initialize(*options)
7
- super :filter, *options
6
+ attr_accessor :query
7
+
8
+ def initialize(*args)
9
+ super :filter, *args
8
10
  end
9
11
 
10
12
  def array_proc
@@ -12,8 +14,21 @@ module TableSortable
12
14
  end
13
15
 
14
16
  def sql_proc
15
- -> (value, col=nil) { where("? LIKE (?)", filter.to_s.underscore, "%#{value}%") }
17
+ -> (value, col=nil) { where("LOWER(?) LIKE (?)", filter.to_s.underscore, "%#{value.to_s.downcase}%") }
18
+ end
19
+
20
+ def proc_wrapper(proc)
21
+ -> (value, col=nil) { instance_exec(value, &proc) }
22
+ end
23
+
24
+ def run(records)
25
+ records.instance_exec(query, column, &proc)
26
+ end
27
+
28
+ def used?
29
+ !query.nil?
16
30
  end
31
+
17
32
  end
18
33
  end
19
34
  end
@@ -3,16 +3,30 @@ module TableSortable
3
3
  class Sorter
4
4
  include TableSortable::Concerns::Proc
5
5
 
6
- def initialize(*options)
7
- super :sort, *options
6
+ attr_accessor :sort_order
7
+
8
+ def initialize(*args)
9
+ super :sort, *args
8
10
  end
9
11
 
10
12
  def array_proc
11
- -> (col=nil) { sort{ |a,b| col.value(a) <=> col.value(b) }}
13
+ -> (sort_order, col=nil) { sort{ |a,b| col.value(sort_order == :asc ? a : b) <=> col.value(sort_order == :asc ? b : a) } }
12
14
  end
13
15
 
14
16
  def sql_proc
15
- -> (col=nil) { order(sorter) }
17
+ -> (sort_order, col=nil) { order(sorter => sort_order) }
18
+ end
19
+
20
+ def proc_wrapper(proc)
21
+ -> (sort_order, col=nil) { instance_exec(sort_order , &proc) }
22
+ end
23
+
24
+ def run(records)
25
+ records.instance_exec(sort_order, column, &proc)
26
+ end
27
+
28
+ def used?
29
+ !sort_order.nil?
16
30
  end
17
31
 
18
32
  end
@@ -16,8 +16,8 @@ module TableSortable
16
16
  @label = label
17
17
  @placeholder = placeholder
18
18
  @template = template
19
- @filter = TableSortable::Column::Filter.new(options.merge(:column_name => @name) )
20
- @sorter = TableSortable::Column::Sorter.new(options.merge(:column_name => @name) )
19
+ @filter = TableSortable::Column::Filter.new(options.merge(:column => self) )
20
+ @sorter = TableSortable::Column::Sorter.new(options.merge(:column => self) )
21
21
 
22
22
  end
23
23
 
@@ -1,26 +1,22 @@
1
1
  module TableSortable
2
- class Columns
2
+ class Columns < Array
3
3
 
4
4
  def initialize
5
- @columns = []
5
+ super
6
6
  end
7
7
 
8
8
  def add(col_name, *options)
9
9
  options = options.extract_options!
10
- @columns << TableSortable::Column.new(col_name, options)
10
+ self << TableSortable::Column.new(col_name, options)
11
11
  end
12
12
 
13
13
  def sort_by(sort_key)
14
14
  if sort_key
15
- sort_key.map{|c| @columns.find{|col| (c.is_a?(String) ? (col.label == c) : col.name == c)}}
15
+ sort_key.map{|c| self.find{|col| (c.is_a?(String) ? (col.label == c) : col.name == c)}}
16
16
  else
17
- @columns
17
+ self
18
18
  end
19
19
  end
20
20
 
21
- def sort(&sort_proc)
22
- @columns.sort(&sort_proc)
23
- end
24
-
25
21
  end
26
22
  end
@@ -4,18 +4,20 @@ module TableSortable
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
7
- attr_reader :proc, :method
7
+ attr_reader :proc, :method, :column, :type
8
8
  end
9
9
 
10
10
  def initialize(option_name, *options)
11
11
  options = options.extract_options!
12
12
  unless options[option_name] == false
13
- filter = options[option_name] || options[:column_name]
13
+ @type = option_name
14
+ @column = options[:column]
15
+ the_proc = options[option_name] || @column.name if @column
14
16
  @method = options["#{option_name.to_s}_method".to_sym] || :array
15
- if filter.respond_to? :call
16
- @proc = -> (records, col=nil) { instance_exec(records, &filter) }
17
+ if the_proc.respond_to? :call
18
+ @proc = proc_wrapper(the_proc)
17
19
  @method = detect_method(@proc)
18
- elsif !filter.nil?
20
+ elsif !the_proc.nil?
19
21
  case @method
20
22
  when :array
21
23
  @proc = array_proc
@@ -27,8 +29,13 @@ module TableSortable
27
29
  end
28
30
 
29
31
  def detect_method(proc)
30
- method = [].instance_exec('', &proc) rescue :failed
31
- method == :failed ? :sql : :array
32
+ begin
33
+ [].instance_exec('', &proc)
34
+ method = :array
35
+ rescue NoMethodError
36
+ method = :sql
37
+ end
38
+ method
32
39
  end
33
40
 
34
41
  def disabled?
@@ -43,6 +50,17 @@ module TableSortable
43
50
  raise NotImplementedError
44
51
  end
45
52
 
53
+ def proc_wrapper(proc)
54
+ raise NotImplementedError
55
+ end
56
+
57
+ def run(records)
58
+ raise NotImplementedError
59
+ end
60
+
61
+ def used?
62
+ raise NotImplementedError
63
+ end
46
64
  end
47
65
  end
48
66
  end
@@ -36,52 +36,38 @@ module TableSortable
36
36
 
37
37
  private
38
38
 
39
- def filter_and_sort(scope)
40
- cols = @columns.sort_by(display_order)
41
-
42
- page = params[:page].to_i
43
- page_size = params[:pagesize].to_i
44
- sort_by_col_data = params[SCOL] ? params[SCOL].keys.first : column_offset
45
- sort_order = params[SCOL] ? params[SCOL].values.first : SORT_ASC
46
-
47
- sort_column = cols.at(sort_by_col_data.to_i - column_offset)
48
- sort_proc = ->(records) { records.instance_exec(sort_column, &sort_column.sorter.proc)}
49
- ordered_sort_proc = ->(records) {sort_order == SORT_ASC ? sort_proc.call(records) : sort_proc.call(records).reverse}
50
-
51
- filters = [->(records) { ordered_sort_proc.call(records) }]
52
-
53
- # a filter exists
54
- if params[FCOL]
55
- @columns.sort_by(filter_order.reverse).each_with_index do |col, i|
56
- column_index = cols.index(col) + column_offset
57
- filter_value = params[FCOL][column_index.to_s]
58
- filters << ->(records){ filter_value.nil? ? filters[i].call(records) : filters[i].call(records.instance_exec(filter_value, col, &col.filter.proc)) }
59
- end
39
+ def filter_and_sort(scope, params = nil)
40
+ populate_params(params)
41
+
42
+ actions = [->(records) { records }]
43
+ ordered_actions.reverse.each_with_index do |action, i|
44
+ actions << ->(records) { action.used? ? actions[i].call(action.run(records)) : actions[i].call(records) }
60
45
  end
61
- scope = filters.last.call(scope)
62
- if page
63
- scope = Result.new(scope, page, page_size)
46
+ scope = actions.last.call(scope)
47
+ if @query_params.page
48
+ scope = Result.new(scope, @query_params.page, @query_params.page_size)
64
49
  end
50
+
65
51
  scope
66
52
  end
67
53
 
68
54
  def initialize_table_sortable
69
-
70
- @columns ||= TableSortable::Columns.new
55
+ @columns = TableSortable::Columns.new
71
56
  self.column_offset = 0
72
-
73
57
  end
74
58
 
75
- def columns(record = nil)
59
+ def columns
76
60
  @columns.sort_by(display_order)
77
61
  end
78
62
 
79
- def filter_order
80
- @filter_order || @columns.sort{ |a,b| a.filter.method && b.filter.method ? b.filter.method <=> a.filter.method : a.filter.method ? 1 : -1 }.compact.map{|col| col.name}
63
+ def ordered_actions
64
+ filter_actions = @columns.map{|col| col.filter }
65
+ sort_actions = @columns.map{|col| col.sorter }
66
+ (filter_actions+sort_actions).sort{ |a,b| (a.method && b.method) ? (b.method <=> a.method) : a.method ? 1 : -1 }
81
67
  end
82
68
 
83
- def sort_order
84
- @sort_order || @columns.sort{ |a,b| a.sorter.method && b.sorter.method ? b.sorter.method <=> a.sorter.method : a.filter.method ? 1 : -1 }.compact.map{|col| col.name}
69
+ def populate_params(params = nil)
70
+ @query_params = QueryParams.new(params || self.params, columns, column_offset)
85
71
  end
86
72
 
87
73
  public
@@ -0,0 +1,5 @@
1
+ module TableSortable
2
+ class Process
3
+
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ module TableSortable
2
+ class QueryParams
3
+
4
+ attr_reader :page, :page_size
5
+ def initialize(params, columns, column_offset = 0)
6
+ @page = params[PAGE].to_i
7
+ @page_size = params[PAGESIZE].to_i
8
+
9
+ # reset column filters and sorters
10
+ columns.each do |col|
11
+ col_index = (columns.find_index(col) + column_offset)
12
+ col.filter.query = params[FCOL] ? params[FCOL][col_index.to_s] : nil
13
+ col.sorter.sort_order = params[SCOL] && params[SCOL][col_index.to_s] ? ((params[SCOL][col_index.to_s] == SORT_ASC) ? :asc : :desc) : nil
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module TableSortable
2
- VERSION = "0.1.8"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -8,6 +8,8 @@ module TableSortable
8
8
  SCOL = 'scol'
9
9
  SORT_ASC = '0'
10
10
  SORT_DESC = '1'
11
+ PAGE = 'page'
12
+ PAGESIZE = 'pagesize'
11
13
 
12
14
  class Engine < Rails::Engine; end
13
15
 
@@ -23,4 +25,5 @@ require 'table_sortable/column'
23
25
  require 'table_sortable/result'
24
26
  require 'table_sortable/columns'
25
27
  require 'table_sortable/version'
26
- require 'table_sortable/controller'
28
+ require 'table_sortable/controller'
29
+ require 'table_sortable/query_params'
@@ -6,8 +6,11 @@ shared_examples_for 'proc_class' do |parameter_name|
6
6
  it 'includes TableSortable::Concerns::Proc' do
7
7
  expect(described_class.included_modules).to include TableSortable::Concerns::Proc
8
8
  end
9
- it 'defines array_proc and sql_proc that return a proc' do
9
+ it 'defines methods of its own' do
10
10
  expect(dummy_class.array_proc).to respond_to :call
11
11
  expect(dummy_class.sql_proc).to respond_to :call
12
+ expect(dummy_class.send(:proc_wrapper, -> {x})).to respond_to :call
13
+ expect(dummy_class).to respond_to :run
14
+ expect(dummy_class).to respond_to :used?
12
15
  end
13
16
  end
@@ -12,23 +12,27 @@ describe TableSortable::Concerns::Proc do
12
12
  def sql_proc
13
13
  -> (x) {x * 3}
14
14
  end
15
+
16
+ def proc_wrapper(proc)
17
+ proc
18
+ end
15
19
  end
16
20
  end
17
21
 
18
22
  let :dummy_proc do
19
- proc_class.new(:proc, proc: dummy_col)
23
+ proc_class.new(:proc, column: TableSortable::Column.new(:proc), proc: dummy_col)
20
24
  end
21
25
 
22
26
  context 'on initialization' do
23
27
  context 'given a proc' do
24
28
  it 'should keep it' do
25
29
  example_proc = -> (x) { x * 100 }
26
- proc = proc_class.new(:proc, proc: example_proc )
30
+ proc = proc_class.new(:proc, column: TableSortable::Column.new(:proc),proc: example_proc )
27
31
  expect(5.instance_eval(&proc.proc)).to eq 500
28
32
  end
29
33
  context 'it is an sql proc' do
30
34
  it 'should detect it as sql' do
31
- proc = proc_class.new(:proc, proc: -> (value) { where(name: value) } )
35
+ proc = proc_class.new(:proc, column: TableSortable::Column.new(:proc), proc: -> (value) { where(name: value) } )
32
36
  expect(proc.method).to eq :sql
33
37
  end
34
38
  end
@@ -51,13 +55,13 @@ describe TableSortable::Concerns::Proc do
51
55
  end
52
56
  context '== :sql' do
53
57
  it 'should replace it with sql_proc' do
54
- dummy_proc = proc_class.new(:proc, column_name: :proc, proc_method: :sql)
58
+ dummy_proc = proc_class.new(:proc, column: TableSortable::Column.new(:proc), proc_method: :sql)
55
59
  expect(5.instance_eval(&dummy_proc.proc)).to eq 5.instance_eval(&dummy_proc.sql_proc)
56
60
  end
57
61
  end
58
62
  context '== :array' do
59
63
  it 'should replace it with sql_proc' do
60
- dummy_proc = proc_class.new(:proc, column_name: :proc, proc_method: :array)
64
+ dummy_proc = proc_class.new(:proc, column: TableSortable::Column.new(:proc), proc_method: :array)
61
65
  expect(5.instance_eval(&dummy_proc.proc)).to eq 5.instance_eval(&dummy_proc.array_proc)
62
66
  end
63
67
  end
@@ -6,22 +6,33 @@ describe TableSortable::Controller do
6
6
  controller.instance_eval('initialize_table_sortable')
7
7
  controller
8
8
  end
9
- let :populated_controller do
9
+ let :controller_with_columns do
10
+
10
11
  controller.send(:define_column,
11
- :column_with_sql_procs_a,
12
- filter: -> (value) { where(column: value)},
13
- sort: -> { order(:column)})
12
+ :first_name,
13
+ filter: -> (value) { where('UPPER(first_name) LIKE (?)', "%#{value.upcase}%") },
14
+ sort: -> (sort_order) { order(:first_name => sort_order) })
15
+
14
16
  controller.send(:define_column,
15
- :column_with_array_procs,
16
- filter: -> (value) { select{|record| record == value}},
17
- sort: -> (col) { sort{ |a,b| col.value(a) <=> col.value(b) }})
17
+ :last_name,
18
+ filter: -> (value) { select{|record| value.downcase.in? record.last_name.downcase }},
19
+ sort: -> (sort_order) { sort{ |a,b| (sort_order == :asc ? a : b).last_name <=> (sort_order == :asc ? b : a).last_name }})
20
+
18
21
  controller.send(:define_column,
19
- :column_with_sql_procs_b,
20
- filter: -> (value) { where(last_name: value)},
21
- sort: -> { order(:column)})
22
+ :email,
23
+ filter: -> (value) { where('UPPER(email) LIKE (?)', "%#{value.upcase}%") },
24
+ sort: -> (sort_order) { order(:email => sort_order) })
25
+
22
26
  controller
23
27
  end
24
28
 
29
+ before(:all) do
30
+ create :user, first_name: 'Bob', last_name: 'Doe', email: 'misterbob@gmail.com'
31
+ create :user, first_name: 'David', last_name: 'Copperfield', email: 'alphadavid@gmail.com'
32
+ create :user, first_name: 'Aaron', last_name: 'Marks', email: 'super_aaron@gmail.com'
33
+ create :user, first_name: 'Jim', last_name: 'Jones', email: 'aaron_is_not_my_name@gmail.com'
34
+ end
35
+
25
36
  context 'initialization' do
26
37
  it 'creates a columns collection' do
27
38
  expect(controller.instance_eval('@columns')).to be_a TableSortable::Columns
@@ -37,20 +48,34 @@ describe TableSortable::Controller do
37
48
  end
38
49
  end
39
50
 
40
- context 'filter_order' do
41
- it 'orders sql filters before array filters' do
42
- expect(populated_controller.send(:filter_order)).to eq [:column_with_sql_procs_a, :column_with_sql_procs_b, :column_with_array_procs]
51
+ context 'ordered_actions' do
52
+ it 'orders sql actions before array filters' do
53
+ expect(controller_with_columns.send(:ordered_actions).map{|action| action.method}).to eq [:sql, :sql, :sql, :sql, :array, :array]
43
54
  end
44
55
  end
45
56
 
46
- context 'sort_order' do
47
- it 'orders sql filters before array filters' do
48
- expect(populated_controller.send(:sort_order)).to eq [:column_with_sql_procs_a, :column_with_sql_procs_b, :column_with_array_procs]
57
+ context 'filter_and_sort' do
58
+ it 'filters using a single filter' do
59
+ filter_by_first_name = controller_with_columns.send(:filter_and_sort, User.all, {TableSortable::PAGESIZE => '10', TableSortable::PAGE => '0', TableSortable::FCOL => {'0' => 'a'}, TableSortable::SCOL => {'0' => TableSortable::SORT_ASC}})
60
+ expect(filter_by_first_name.pluck(:first_name)).to eq %w(Aaron David)
61
+ end
62
+ it 'filters using multiple filters' do
63
+ filter_by_first_name = controller_with_columns.send(:filter_and_sort, User.all, {TableSortable::PAGESIZE => '10', TableSortable::PAGE => '0', TableSortable::FCOL => {'0' => 'a', '1' => 'c'}, TableSortable::SCOL => {'0' => TableSortable::SORT_ASC}})
64
+ expect(filter_by_first_name.pluck(:first_name)).to eq %w(David)
65
+ end
66
+ it 'sorts a record set based on the column to sort' do
67
+ sort_by_first_name = controller_with_columns.send(:filter_and_sort, User.all, {TableSortable::PAGESIZE => '10', TableSortable::PAGE => '0', TableSortable::SCOL => {'0' => TableSortable::SORT_ASC}})
68
+ expect(sort_by_first_name.pluck(:first_name)).to eq %w(Aaron Bob David Jim)
69
+
70
+ sort_by_email = controller_with_columns.send(:filter_and_sort, User.all, {TableSortable::PAGESIZE => '10', TableSortable::PAGE => '0', TableSortable::SCOL => {'2' => TableSortable::SORT_ASC}})
71
+ expect(sort_by_email.pluck(:first_name)).to eq %w(Jim David Bob Aaron)
72
+ end
73
+ context "sort order parameter equals #{TableSortable::SORT_DESC}" do
74
+ it 'sorts in descending order' do
75
+ sort_by_last_name_desc = controller_with_columns.send(:filter_and_sort, User.all, {TableSortable::PAGESIZE => '10', TableSortable::PAGE => '0', TableSortable::SCOL => {'1' => TableSortable::SORT_DESC}})
76
+ expect(sort_by_last_name_desc.pluck(:first_name)).to eq %w(Aaron Jim Bob David)
77
+ end
49
78
  end
50
- end
51
79
 
52
- context 'filter_and_sort' do
53
- it 'should filter a record_set based on its filters'
54
- it 'should sort a record_set based on its filters'
55
80
  end
56
81
  end
@@ -0,0 +1,7 @@
1
+ # describe TableSortable::Process do
2
+ # context 'initialize'
3
+ #
4
+ # context 'filter' do
5
+ # it 'should filter a result based on filter options'
6
+ # end
7
+ # end
data/spec/spec_helper.rb CHANGED
@@ -15,9 +15,23 @@
15
15
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
16
16
 
17
17
  require 'table_sortable'
18
- require 'support/controller_macros'
19
- require 'support/matchers/have_filters'
20
- require 'support/shared_stuff'
18
+ require 'factory_girl'
19
+ require 'active_record'
20
+
21
+ Dir['spec/support/**/*.rb'].each {|f| require f.gsub('spec/', '')}
22
+ # Dir['spec/models/**/*.rb'].each {|f| require f.gsub('spec/', '')}
23
+ # Dir['spec/factories/**/*.rb'].each {|f| require f.gsub('spec/', '')}
24
+
25
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
26
+ ActiveRecord::Schema.define do
27
+ self.verbose = false
28
+
29
+ create_table :users, :force => true do |t|
30
+ t.string :first_name
31
+ t.string :last_name
32
+ t.string :email
33
+ end
34
+ end
21
35
 
22
36
  RSpec.configure do |config|
23
37
 
@@ -0,0 +1,7 @@
1
+ FactoryGirl.define do
2
+ factory :user do |f|
3
+ f.first_name 'John'
4
+ f.last_name 'Doe'
5
+ f.email 'johndoe@gmail.com'
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ # spec/support/factory_girl.rb
2
+ RSpec.configure do |config|
3
+ config.include FactoryGirl::Syntax::Methods
4
+ end
@@ -0,0 +1 @@
1
+ class User < ActiveRecord::Base ; end
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
 
12
12
  spec.summary = 'Use jquery-tablesorter.js with server side filtering, pagination and sorting'
13
13
  spec.description = 'Use jquery-tablesorter.js with server side filtering, pagination and sorting'
14
- # spec.homepage = "TODO: Put your gem's website or public repo URL here."
14
+ spec.homepage = 'https://github.com/odedd/table_sortable'
15
15
  spec.license = "MIT"
16
16
 
17
17
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
@@ -32,5 +32,7 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency "bundler", "~> 1.15"
33
33
  spec.add_development_dependency "rake", "~> 10.0"
34
34
  spec.add_development_dependency "rspec", "~> 3.4"
35
+ spec.add_development_dependency "sqlite3", "~> 1.3"
36
+ spec.add_development_dependency "factory_girl_rails", "~> 4.8"
35
37
  spec.add_dependency "rails", '~> 5.1', '>= 5.1.1'
36
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: table_sortable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oded Davidov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-30 00:00:00.000000000 Z
11
+ date: 2017-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: sqlite3
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: factory_girl_rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.8'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.8'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: rails
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -110,6 +138,8 @@ files:
110
138
  - lib/table_sortable/columns.rb
111
139
  - lib/table_sortable/concerns/proc.rb
112
140
  - lib/table_sortable/controller.rb
141
+ - lib/table_sortable/process.rb
142
+ - lib/table_sortable/query_params.rb
113
143
  - lib/table_sortable/result.rb
114
144
  - lib/table_sortable/version.rb
115
145
  - spec/concerns/proc_class_spec.rb
@@ -118,12 +148,16 @@ files:
118
148
  - spec/lib/table_sortable/column/sorter_spec.rb
119
149
  - spec/lib/table_sortable/concerns/proc_spec.rb
120
150
  - spec/lib/table_sortable/controller_spec.rb
151
+ - spec/lib/table_sortable/process_spec.rb
121
152
  - spec/spec_helper.rb
122
153
  - spec/support/controller_macros.rb
154
+ - spec/support/factories/user.rb
155
+ - spec/support/factory_girl.rb
123
156
  - spec/support/matchers/have_filters.rb
157
+ - spec/support/models/user.rb
124
158
  - spec/support/shared_stuff.rb
125
159
  - table_sortable.gemspec
126
- homepage:
160
+ homepage: https://github.com/odedd/table_sortable
127
161
  licenses:
128
162
  - MIT
129
163
  metadata: {}
@@ -154,7 +188,11 @@ test_files:
154
188
  - spec/lib/table_sortable/column/sorter_spec.rb
155
189
  - spec/lib/table_sortable/concerns/proc_spec.rb
156
190
  - spec/lib/table_sortable/controller_spec.rb
191
+ - spec/lib/table_sortable/process_spec.rb
157
192
  - spec/spec_helper.rb
158
193
  - spec/support/controller_macros.rb
194
+ - spec/support/factories/user.rb
195
+ - spec/support/factory_girl.rb
159
196
  - spec/support/matchers/have_filters.rb
197
+ - spec/support/models/user.rb
160
198
  - spec/support/shared_stuff.rb