ajax-datatables-rails 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +23 -1132
  3. data/.travis.yml +36 -24
  4. data/Appraisals +14 -8
  5. data/CHANGELOG.md +32 -7
  6. data/Gemfile +2 -0
  7. data/README.md +400 -335
  8. data/Rakefile +2 -1
  9. data/ajax-datatables-rails.gemspec +8 -6
  10. data/doc/webpack.md +50 -0
  11. data/gemfiles/{rails_4.1.15.gemfile → rails_4.1.16.gemfile} +1 -1
  12. data/gemfiles/{rails_4.2.8.gemfile → rails_4.2.10.gemfile} +2 -1
  13. data/gemfiles/{rails_5.0.3.gemfile → rails_5.0.7.gemfile} +1 -1
  14. data/gemfiles/{rails_5.1.1.gemfile → rails_5.1.6.gemfile} +1 -1
  15. data/gemfiles/rails_5.2.0.gemfile +13 -0
  16. data/lib/ajax-datatables-rails.rb +3 -11
  17. data/lib/ajax-datatables-rails/base.rb +44 -24
  18. data/lib/ajax-datatables-rails/config.rb +3 -0
  19. data/lib/ajax-datatables-rails/datatable/column.rb +33 -125
  20. data/lib/ajax-datatables-rails/datatable/column/date_filter.rb +77 -0
  21. data/lib/ajax-datatables-rails/datatable/column/order.rb +29 -0
  22. data/lib/ajax-datatables-rails/datatable/column/search.rb +88 -0
  23. data/lib/ajax-datatables-rails/datatable/datatable.rb +10 -7
  24. data/lib/ajax-datatables-rails/datatable/simple_order.rb +17 -2
  25. data/lib/ajax-datatables-rails/datatable/simple_search.rb +3 -0
  26. data/lib/ajax-datatables-rails/orm/active_record.rb +14 -5
  27. data/lib/ajax-datatables-rails/version.rb +3 -1
  28. data/lib/ajax_datatables_rails.rb +15 -0
  29. data/lib/generators/datatable/config_generator.rb +2 -0
  30. data/lib/generators/datatable/templates/ajax_datatables_rails_config.rb +5 -0
  31. data/lib/generators/rails/datatable_generator.rb +6 -5
  32. data/lib/generators/rails/templates/datatable.rb +1 -15
  33. data/spec/ajax-datatables-rails/base_spec.rb +23 -26
  34. data/spec/ajax-datatables-rails/datatable/column_spec.rb +68 -23
  35. data/spec/ajax-datatables-rails/datatable/datatable_spec.rb +1 -1
  36. data/spec/ajax-datatables-rails/datatable/simple_order_spec.rb +29 -2
  37. data/spec/ajax-datatables-rails/datatable/simple_search_spec.rb +1 -1
  38. data/spec/ajax-datatables-rails/extended_spec.rb +3 -3
  39. data/spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb +94 -35
  40. data/spec/ajax-datatables-rails/orm/active_record_paginate_records_spec.rb +6 -6
  41. data/spec/ajax-datatables-rails/orm/active_record_sort_records_spec.rb +43 -0
  42. data/spec/ajax-datatables-rails/orm/active_record_spec.rb +1 -1
  43. data/spec/factories/user.rb +1 -1
  44. data/spec/install_oracle.sh +2 -2
  45. data/spec/spec_helper.rb +8 -3
  46. data/spec/support/datatable_cond_date.rb +5 -0
  47. data/spec/support/datatable_cond_numeric.rb +41 -0
  48. data/spec/support/datatable_cond_proc.rb +11 -0
  49. data/spec/support/datatable_cond_string.rb +23 -0
  50. data/spec/support/datatable_order_nulls_last.rb +5 -0
  51. data/spec/support/test_helpers.rb +13 -88
  52. metadata +28 -13
  53. data/lib/ajax-datatables-rails/datatable/column_date_filter.rb +0 -41
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe AjaxDatatablesRails::ORM::ActiveRecord do
4
4
 
5
5
  let(:view) { double('view', params: sample_params) }
6
- let(:datatable) { SampleDatatable.new(view) }
6
+ let(:datatable) { ComplexDatatable.new(view) }
7
7
  let(:records) { User.all }
8
8
 
9
9
  before(:each) do
@@ -18,7 +18,7 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
18
18
 
19
19
  it 'paginates records properly' do
20
20
  if AjaxDatatablesRails.config.db_adapter.in? %i[oracle oracleenhanced]
21
- if Rails.version.in? %w[4.0.13 4.1.15 4.2.8]
21
+ if Rails.version.in? %w[4.0.13 4.1.16 4.2.10]
22
22
  expect(datatable.paginate_records(records).to_sql).to include(
23
23
  'rownum <= 10'
24
24
  )
@@ -36,18 +36,18 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
36
36
  datatable.params[:start] = '26'
37
37
  datatable.params[:length] = '25'
38
38
  if AjaxDatatablesRails.config.db_adapter.in? %i[oracle oracleenhanced]
39
- if Rails.version.in? %w[4.0.13 4.1.15 4.2.8]
39
+ if Rails.version.in? %w[4.0.13 4.1.16 4.2.10]
40
40
  expect(datatable.paginate_records(records).to_sql).to include(
41
- 'rownum <= 50'
41
+ 'rownum <= 51'
42
42
  )
43
43
  else
44
44
  expect(datatable.paginate_records(records).to_sql).to include(
45
- 'rownum <= (25 + 25)'
45
+ 'rownum <= (26 + 25)'
46
46
  )
47
47
  end
48
48
  else
49
49
  expect(datatable.paginate_records(records).to_sql).to include(
50
- 'LIMIT 25 OFFSET 25'
50
+ 'LIMIT 25 OFFSET 26'
51
51
  )
52
52
  end
53
53
  end
@@ -4,6 +4,7 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
4
4
 
5
5
  let(:view) { double('view', params: sample_params) }
6
6
  let(:datatable) { ComplexDatatable.new(view) }
7
+ let(:nulls_last_datatable) { DatatableOrderNullsLast.new(view) }
7
8
  let(:records) { User.all }
8
9
 
9
10
  before(:each) do
@@ -29,6 +30,48 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
29
30
  'ORDER BY users.username ASC, users.email DESC'
30
31
  )
31
32
  end
33
+
34
+ it 'should not sort a column which is not orderable' do
35
+ datatable.params[:order]['0'] = { column: '0', dir: 'asc' }
36
+ datatable.params[:order]['1'] = { column: '4', dir: 'desc' }
37
+
38
+ expect(datatable.sort_records(records).to_sql).to include(
39
+ 'ORDER BY users.username ASC'
40
+ )
41
+
42
+ expect(datatable.sort_records(records).to_sql).to_not include(
43
+ 'users.post_id DESC'
44
+ )
45
+ end
46
+ end
47
+
48
+ describe '#sort_records with nulls last using global config' do
49
+ before { AjaxDatatablesRails.config.nulls_last = true }
50
+ after { AjaxDatatablesRails.config.nulls_last = false }
51
+
52
+ it 'can handle multiple sorting columns' do
53
+ # set to order by Users username in ascending order, and
54
+ # by Users email in descending order
55
+ datatable.params[:order]['0'] = { column: '0', dir: 'asc' }
56
+ datatable.params[:order]['1'] = { column: '1', dir: 'desc' }
57
+ expect(datatable.sort_records(records).to_sql).to include(
58
+ 'ORDER BY CASE WHEN users.username IS NULL THEN 1 ELSE 0 END, users.username ASC, ' +
59
+ 'CASE WHEN users.email IS NULL THEN 1 ELSE 0 END, users.email DESC'
60
+ )
61
+ end
62
+ end
63
+
64
+ describe '#sort_records with nulls last using column config' do
65
+ it 'can handle multiple sorting columns' do
66
+ # set to order by Users username in ascending order, and
67
+ # by Users email in descending order
68
+ nulls_last_datatable.params[:order]['0'] = { column: '0', dir: 'asc' }
69
+ nulls_last_datatable.params[:order]['1'] = { column: '1', dir: 'desc' }
70
+ expect(nulls_last_datatable.sort_records(records).to_sql).to include(
71
+ 'ORDER BY users.username ASC, ' +
72
+ 'CASE WHEN users.email IS NULL THEN 1 ELSE 0 END, users.email DESC'
73
+ )
74
+ end
32
75
  end
33
76
 
34
77
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe AjaxDatatablesRails::ORM::ActiveRecord do
4
4
  context 'Private API' do
5
5
  let(:view) { double('view', params: sample_params) }
6
- let(:datatable) { SampleDatatable.new(view) }
6
+ let(:datatable) { ComplexDatatable.new(view) }
7
7
 
8
8
  before(:each) do
9
9
  create(:user, username: 'johndoe', email: 'johndoe@example.com')
@@ -1,4 +1,4 @@
1
- FactoryGirl.define do
1
+ FactoryBot.define do
2
2
  factory :user do |f|
3
3
  f.username { Faker::Internet.user_name }
4
4
  f.email { Faker::Internet.email }
@@ -1,8 +1,8 @@
1
1
  #!/bin/bash
2
2
 
3
- wget 'https://github.com/cbandy/travis-oracle/archive/v2.0.2.tar.gz'
3
+ wget 'https://github.com/cbandy/travis-oracle/archive/v2.0.3.tar.gz'
4
4
  mkdir -p ~/.travis/oracle
5
- tar xz --strip-components 1 -C ~/.travis/oracle -f v2.0.2.tar.gz
5
+ tar xz --strip-components 1 -C ~/.travis/oracle -f v2.0.3.tar.gz
6
6
 
7
7
  ~/.travis/oracle/download.sh
8
8
  ~/.travis/oracle/install.sh
@@ -1,7 +1,7 @@
1
1
  require 'simplecov'
2
2
  require 'rspec'
3
3
  require 'database_cleaner'
4
- require 'factory_girl'
4
+ require 'factory_bot'
5
5
  require 'faker'
6
6
  require 'pry'
7
7
  require 'rails'
@@ -15,10 +15,10 @@ end
15
15
 
16
16
  # Configure RSpec
17
17
  RSpec.configure do |config|
18
- config.include FactoryGirl::Syntax::Methods
18
+ config.include FactoryBot::Syntax::Methods
19
19
 
20
20
  config.before(:suite) do
21
- FactoryGirl.find_definitions
21
+ FactoryBot.find_definitions
22
22
  end
23
23
 
24
24
  config.after(:each) do
@@ -78,4 +78,9 @@ end
78
78
 
79
79
  load File.dirname(__FILE__) + '/support/schema.rb'
80
80
  load File.dirname(__FILE__) + '/support/test_helpers.rb'
81
+ load File.dirname(__FILE__) + '/support/datatable_cond_date.rb'
82
+ load File.dirname(__FILE__) + '/support/datatable_cond_numeric.rb'
83
+ load File.dirname(__FILE__) + '/support/datatable_cond_proc.rb'
84
+ load File.dirname(__FILE__) + '/support/datatable_cond_string.rb'
85
+ load File.dirname(__FILE__) + '/support/datatable_order_nulls_last.rb'
81
86
  require File.dirname(__FILE__) + '/support/test_models.rb'
@@ -0,0 +1,5 @@
1
+ class DatatableCondDate < ComplexDatatable
2
+ def view_columns
3
+ super.deep_merge(created_at: { cond: :date_range })
4
+ end
5
+ end
@@ -0,0 +1,41 @@
1
+ class DatatableCondEq < ComplexDatatable
2
+ def view_columns
3
+ super.deep_merge(post_id: { cond: :eq })
4
+ end
5
+ end
6
+
7
+ class DatatableCondNotEq < ComplexDatatable
8
+ def view_columns
9
+ super.deep_merge(post_id: { cond: :not_eq })
10
+ end
11
+ end
12
+
13
+ class DatatableCondLt < ComplexDatatable
14
+ def view_columns
15
+ super.deep_merge(post_id: { cond: :lt })
16
+ end
17
+ end
18
+
19
+ class DatatableCondGt < ComplexDatatable
20
+ def view_columns
21
+ super.deep_merge(post_id: { cond: :gt })
22
+ end
23
+ end
24
+
25
+ class DatatableCondLteq < ComplexDatatable
26
+ def view_columns
27
+ super.deep_merge(post_id: { cond: :lteq })
28
+ end
29
+ end
30
+
31
+ class DatatableCondGteq < ComplexDatatable
32
+ def view_columns
33
+ super.deep_merge(post_id: { cond: :gteq })
34
+ end
35
+ end
36
+
37
+ class DatatableCondIn < ComplexDatatable
38
+ def view_columns
39
+ super.deep_merge(post_id: { cond: :in })
40
+ end
41
+ end
@@ -0,0 +1,11 @@
1
+ class DatatableCondProc < ComplexDatatable
2
+ def view_columns
3
+ super.deep_merge(username: { cond: custom_filter })
4
+ end
5
+
6
+ private
7
+
8
+ def custom_filter
9
+ ->(column, value) { ::Arel::Nodes::SqlLiteral.new(column.field.to_s).matches("#{value}%") }
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ class DatatableCondStartWith < ComplexDatatable
2
+ def view_columns
3
+ super.deep_merge(first_name: { cond: :start_with })
4
+ end
5
+ end
6
+
7
+ class DatatableCondEndWith < ComplexDatatable
8
+ def view_columns
9
+ super.deep_merge(last_name: { cond: :end_with })
10
+ end
11
+ end
12
+
13
+ class DatatableCondNullValue < ComplexDatatable
14
+ def view_columns
15
+ super.deep_merge(email: { cond: :null_value })
16
+ end
17
+ end
18
+
19
+ class DatatableWithFormater < ComplexDatatable
20
+ def view_columns
21
+ super.deep_merge(last_name: { formater: -> (o) { o.upcase } })
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ class DatatableOrderNullsLast < ComplexDatatable
2
+ def view_columns
3
+ super.deep_merge(email: { nulls_last: true })
4
+ end
5
+ end
@@ -53,27 +53,15 @@ def sample_params
53
53
  end
54
54
  # rubocop:enable Metrics/MethodLength
55
55
 
56
- class SampleDatatable < AjaxDatatablesRails::Base
57
- def view_columns
58
- @view_columns ||= ['User.username', 'User.email', 'User.first_name', 'User.last_name']
59
- end
60
-
61
- def data
62
- [{}, {}]
63
- end
64
-
65
- def get_raw_records
66
- User.all
67
- end
68
- end
69
-
70
- class ComplexDatatable < SampleDatatable
56
+ class ComplexDatatable < AjaxDatatablesRails::Base
71
57
  def view_columns
72
58
  @view_columns ||= {
73
- username: { source: 'User.username' },
74
- email: { source: 'User.email' },
59
+ username: { source: 'User.username' },
60
+ email: { source: 'User.email' },
75
61
  first_name: { source: 'User.first_name' },
76
- last_name: { source: 'User.last_name', formater: -> (o) { o.upcase } },
62
+ last_name: { source: 'User.last_name' },
63
+ post_id: { source: 'User.post_id', orderable: false },
64
+ created_at: { source: 'User.created_at' },
77
65
  }
78
66
  end
79
67
 
@@ -84,12 +72,15 @@ class ComplexDatatable < SampleDatatable
84
72
  email: record.email,
85
73
  first_name: record.first_name,
86
74
  last_name: record.last_name,
75
+ post_id: record.post_id,
76
+ created_at: record.created_at,
87
77
  }
88
78
  end
89
79
  end
90
- end
91
80
 
92
- class ComplexDatatableHash < ComplexDatatable
81
+ def get_raw_records
82
+ User.all
83
+ end
93
84
  end
94
85
 
95
86
  class ComplexDatatableArray < ComplexDatatable
@@ -100,75 +91,9 @@ class ComplexDatatableArray < ComplexDatatable
100
91
  record.email,
101
92
  record.first_name,
102
93
  record.last_name,
94
+ record.post_id,
95
+ record.created_at,
103
96
  ]
104
97
  end
105
98
  end
106
99
  end
107
-
108
- class ReallyComplexDatatable < SampleDatatable
109
- def view_columns
110
- @view_columns ||= {
111
- username: { source: 'User.username' },
112
- email: { source: 'User.email', cond: :null_value },
113
- first_name: { source: 'User.first_name', cond: :start_with },
114
- last_name: { source: 'User.last_name', cond: :end_with, formater: -> (o) { o.upcase } },
115
- post_id: { source: 'User.post_id' },
116
- created_at: { source: 'User.created_at', cond: :date_range },
117
- }
118
- end
119
-
120
- def data
121
- records.map do |record|
122
- {
123
- username: record.username,
124
- email: record.email,
125
- first_name: record.first_name,
126
- last_name: record.last_name,
127
- post_id: record.post_id,
128
- created_at: record.created_at,
129
- }
130
- end
131
- end
132
- end
133
-
134
- class ReallyComplexDatatableEq < ReallyComplexDatatable
135
- def view_columns
136
- super.deep_merge(post_id: { cond: :eq })
137
- end
138
- end
139
-
140
- class ReallyComplexDatatableNotEq < ReallyComplexDatatable
141
- def view_columns
142
- super.deep_merge(post_id: { cond: :not_eq })
143
- end
144
- end
145
-
146
- class ReallyComplexDatatableLt < ReallyComplexDatatable
147
- def view_columns
148
- super.deep_merge(post_id: { cond: :lt })
149
- end
150
- end
151
-
152
- class ReallyComplexDatatableGt < ReallyComplexDatatable
153
- def view_columns
154
- super.deep_merge(post_id: { cond: :gt })
155
- end
156
- end
157
-
158
- class ReallyComplexDatatableLteq < ReallyComplexDatatable
159
- def view_columns
160
- super.deep_merge(post_id: { cond: :lteq })
161
- end
162
- end
163
-
164
- class ReallyComplexDatatableGteq < ReallyComplexDatatable
165
- def view_columns
166
- super.deep_merge(post_id: { cond: :gteq })
167
- end
168
- end
169
-
170
- class ReallyComplexDatatableIn < ReallyComplexDatatable
171
- def view_columns
172
- super.deep_merge(post_id: { cond: :in })
173
- end
174
- end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ajax-datatables-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Quenneville
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-05-21 00:00:00.000000000 Z
12
+ date: 2018-05-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
@@ -57,16 +57,16 @@ dependencies:
57
57
  name: pg
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ">="
60
+ - - "<"
61
61
  - !ruby/object:Gem::Version
62
- version: '0'
62
+ version: '1.0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - ">="
67
+ - - "<"
68
68
  - !ruby/object:Gem::Version
69
- version: '0'
69
+ version: '1.0'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: mysql2
72
72
  requirement: !ruby/object:Gem::Requirement
@@ -180,7 +180,7 @@ dependencies:
180
180
  - !ruby/object:Gem::Version
181
181
  version: '0'
182
182
  - !ruby/object:Gem::Dependency
183
- name: factory_girl
183
+ name: factory_bot
184
184
  requirement: !ruby/object:Gem::Requirement
185
185
  requirements:
186
186
  - - ">="
@@ -242,21 +242,26 @@ files:
242
242
  - README.md
243
243
  - Rakefile
244
244
  - ajax-datatables-rails.gemspec
245
+ - doc/webpack.md
245
246
  - gemfiles/rails_4.0.13.gemfile
246
- - gemfiles/rails_4.1.15.gemfile
247
- - gemfiles/rails_4.2.8.gemfile
248
- - gemfiles/rails_5.0.3.gemfile
249
- - gemfiles/rails_5.1.1.gemfile
247
+ - gemfiles/rails_4.1.16.gemfile
248
+ - gemfiles/rails_4.2.10.gemfile
249
+ - gemfiles/rails_5.0.7.gemfile
250
+ - gemfiles/rails_5.1.6.gemfile
251
+ - gemfiles/rails_5.2.0.gemfile
250
252
  - lib/ajax-datatables-rails.rb
251
253
  - lib/ajax-datatables-rails/base.rb
252
254
  - lib/ajax-datatables-rails/config.rb
253
255
  - lib/ajax-datatables-rails/datatable/column.rb
254
- - lib/ajax-datatables-rails/datatable/column_date_filter.rb
256
+ - lib/ajax-datatables-rails/datatable/column/date_filter.rb
257
+ - lib/ajax-datatables-rails/datatable/column/order.rb
258
+ - lib/ajax-datatables-rails/datatable/column/search.rb
255
259
  - lib/ajax-datatables-rails/datatable/datatable.rb
256
260
  - lib/ajax-datatables-rails/datatable/simple_order.rb
257
261
  - lib/ajax-datatables-rails/datatable/simple_search.rb
258
262
  - lib/ajax-datatables-rails/orm/active_record.rb
259
263
  - lib/ajax-datatables-rails/version.rb
264
+ - lib/ajax_datatables_rails.rb
260
265
  - lib/generators/datatable/config_generator.rb
261
266
  - lib/generators/datatable/templates/ajax_datatables_rails_config.rb
262
267
  - lib/generators/rails/datatable_generator.rb
@@ -275,6 +280,11 @@ files:
275
280
  - spec/factories/user.rb
276
281
  - spec/install_oracle.sh
277
282
  - spec/spec_helper.rb
283
+ - spec/support/datatable_cond_date.rb
284
+ - spec/support/datatable_cond_numeric.rb
285
+ - spec/support/datatable_cond_proc.rb
286
+ - spec/support/datatable_cond_string.rb
287
+ - spec/support/datatable_order_nulls_last.rb
278
288
  - spec/support/schema.rb
279
289
  - spec/support/test_helpers.rb
280
290
  - spec/support/test_models.rb
@@ -298,7 +308,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
298
308
  version: '0'
299
309
  requirements: []
300
310
  rubyforge_project:
301
- rubygems_version: 2.6.11
311
+ rubygems_version: 2.7.6
302
312
  signing_key:
303
313
  specification_version: 4
304
314
  summary: A gem that simplifies using datatables and hundreds of records via ajax
@@ -317,6 +327,11 @@ test_files:
317
327
  - spec/factories/user.rb
318
328
  - spec/install_oracle.sh
319
329
  - spec/spec_helper.rb
330
+ - spec/support/datatable_cond_date.rb
331
+ - spec/support/datatable_cond_numeric.rb
332
+ - spec/support/datatable_cond_proc.rb
333
+ - spec/support/datatable_cond_string.rb
334
+ - spec/support/datatable_order_nulls_last.rb
320
335
  - spec/support/schema.rb
321
336
  - spec/support/test_helpers.rb
322
337
  - spec/support/test_models.rb