ajax-datatables-rails 0.4.0 → 0.4.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.
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