ajax-datatables-rails 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -3
- data/.travis.yml +23 -19
- data/Appraisals +23 -8
- data/CHANGELOG.md +12 -0
- data/Gemfile +0 -5
- data/README.md +59 -40
- data/Rakefile +1 -0
- data/ajax-datatables-rails.gemspec +12 -18
- data/doc/webpack.md +3 -1
- data/gemfiles/{rails_4.2.10.gemfile → rails_4.2.11.gemfile} +3 -6
- data/gemfiles/rails_5.0.7.gemfile +2 -4
- data/gemfiles/{rails_5.1.6.gemfile → rails_5.1.7.gemfile} +3 -5
- data/gemfiles/{rails_5.2.0.gemfile → rails_5.2.3.gemfile} +3 -5
- data/gemfiles/rails_6.0.1.gemfile +11 -0
- data/lib/ajax-datatables-rails/base.rb +11 -2
- data/lib/ajax-datatables-rails/datatable/column.rb +7 -5
- data/lib/ajax-datatables-rails/datatable/column/date_filter.rb +1 -0
- data/lib/ajax-datatables-rails/datatable/column/search.rb +2 -0
- data/lib/ajax-datatables-rails/datatable/datatable.rb +2 -0
- data/lib/ajax-datatables-rails/datatable/simple_order.rb +14 -5
- data/lib/ajax-datatables-rails/orm/active_record.rb +2 -2
- data/lib/ajax-datatables-rails/version.rb +1 -1
- data/spec/ajax-datatables-rails/base_spec.rb +21 -2
- data/spec/ajax-datatables-rails/datatable/column_spec.rb +7 -2
- data/spec/ajax-datatables-rails/datatable/simple_order_spec.rb +25 -6
- data/spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb +38 -4
- data/spec/ajax-datatables-rails/orm/active_record_paginate_records_spec.rb +4 -4
- data/spec/ajax-datatables-rails/orm/active_record_sort_records_spec.rb +6 -4
- data/spec/install_oracle.sh +7 -1
- data/spec/support/datatable_cond_string.rb +6 -0
- data/spec/support/test_helpers.rb +11 -0
- metadata +25 -75
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b690e6b2bd562caa937795e7aeab2a0cff933087cc48d6949a74feefe94b8715
|
4
|
+
data.tar.gz: 20c23647a4dfbc9d98e342d05d15a831af37aeba0b4ec3d1bba60353988a6c46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8eed46ec32eca34390aba3612445be363c20e576b451116c870c5f14dadffe6422c1956368e74f4d7a141e5f36f31c621390fa2299880988c1479f850c3d105c
|
7
|
+
data.tar.gz: 3ec8bbc383634e76dbce2df04f428cae377f9b26ca698ec71a7eae097c9156ba7fcd75eab90f18823660801600e39c75ef4bbdb91f65c13ae65802561f3d4d79
|
data/.rubocop.yml
CHANGED
@@ -9,7 +9,7 @@ AllCops:
|
|
9
9
|
Documentation:
|
10
10
|
Enabled: false
|
11
11
|
|
12
|
-
|
12
|
+
Layout/AlignHash:
|
13
13
|
Enabled: false
|
14
14
|
|
15
15
|
Layout/EmptyLines:
|
@@ -45,5 +45,8 @@ Metrics/ClassLength:
|
|
45
45
|
Naming/AccessorMethodName:
|
46
46
|
Enabled: false
|
47
47
|
|
48
|
-
Style/
|
49
|
-
|
48
|
+
Style/TrailingCommaInArrayLiteral:
|
49
|
+
EnforcedStyleForMultiline: comma
|
50
|
+
|
51
|
+
Style/TrailingCommaInHashLiteral:
|
52
|
+
EnforcedStyleForMultiline: comma
|
data/.travis.yml
CHANGED
@@ -1,31 +1,24 @@
|
|
1
|
-
dist: trusty
|
2
1
|
language: ruby
|
3
|
-
sudo: required
|
4
2
|
cache: bundler
|
3
|
+
sudo: required
|
5
4
|
rvm:
|
6
|
-
- 2.
|
7
|
-
- 2.
|
8
|
-
- 2.
|
5
|
+
- 2.6.5
|
6
|
+
- 2.5.7
|
7
|
+
- 2.4.9
|
8
|
+
- 2.3.8
|
9
|
+
- ruby-head
|
9
10
|
gemfile:
|
10
|
-
- gemfiles/rails_4.2.
|
11
|
+
- gemfiles/rails_4.2.11.gemfile
|
11
12
|
- gemfiles/rails_5.0.7.gemfile
|
12
|
-
- gemfiles/rails_5.1.
|
13
|
-
- gemfiles/rails_5.2.
|
14
|
-
|
15
|
-
- bundle exec codeclimate-test-reporter
|
13
|
+
- gemfiles/rails_5.1.7.gemfile
|
14
|
+
- gemfiles/rails_5.2.3.gemfile
|
15
|
+
- gemfiles/rails_6.0.1.gemfile
|
16
16
|
services:
|
17
17
|
- postgresql
|
18
18
|
- mysql
|
19
19
|
addons:
|
20
20
|
postgresql: '9.6'
|
21
|
-
apt:
|
22
|
-
packages:
|
23
|
-
- mysql-server-5.6
|
24
|
-
- mysql-client-core-5.6
|
25
|
-
- mysql-client-5.6
|
26
21
|
before_install:
|
27
|
-
- gem update --system
|
28
|
-
- gem install bundler
|
29
22
|
- sh -c "if [ '$DB_ADAPTER' = 'mysql2' ]; then mysql -e 'create database ajax_datatables_rails;'; fi"
|
30
23
|
- sh -c "if [ '$DB_ADAPTER' = 'postgresql' ]; then psql -c 'create database ajax_datatables_rails;' -U postgres; fi"
|
31
24
|
- sh -c "if [ '$DB_ADAPTER' = 'oracle_enhanced' ]; then ./spec/install_oracle.sh; fi"
|
@@ -41,5 +34,16 @@ env:
|
|
41
34
|
- DB_ADAPTER=sqlite3
|
42
35
|
- DB_ADAPTER=oracle_enhanced
|
43
36
|
matrix:
|
44
|
-
|
45
|
-
-
|
37
|
+
exclude:
|
38
|
+
- rvm: ruby-head
|
39
|
+
gemfile: gemfiles/rails_4.2.11.gemfile
|
40
|
+
- rvm: 2.3.8
|
41
|
+
gemfile: gemfiles/rails_6.0.1.gemfile
|
42
|
+
- rvm: 2.4.9
|
43
|
+
gemfile: gemfiles/rails_6.0.1.gemfile
|
44
|
+
before_script:
|
45
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
46
|
+
- chmod +x ./cc-test-reporter
|
47
|
+
- ./cc-test-reporter before-build
|
48
|
+
after_script:
|
49
|
+
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
data/Appraisals
CHANGED
@@ -1,21 +1,36 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
RAILS_VERSIONS = {
|
4
|
-
'4.2.
|
5
|
-
'activerecord-oracle_enhanced-adapter' => '~> 1.6.0'
|
4
|
+
'4.2.11' => {
|
5
|
+
'activerecord-oracle_enhanced-adapter' => '~> 1.6.0',
|
6
|
+
'sqlite3' => '~> 1.3.0',
|
7
|
+
'mysql2' => '0.4.10',
|
8
|
+
'ruby-oci8' => '',
|
6
9
|
},
|
7
10
|
'5.0.7' => {
|
8
11
|
'activerecord-oracle_enhanced-adapter' => '~> 1.7.0',
|
9
|
-
'
|
12
|
+
'sqlite3' => '~> 1.3.0',
|
13
|
+
'mysql2' => '',
|
14
|
+
'ruby-oci8' => '',
|
10
15
|
},
|
11
|
-
'5.1.
|
16
|
+
'5.1.7' => {
|
12
17
|
'activerecord-oracle_enhanced-adapter' => '~> 1.8.0',
|
13
|
-
'
|
18
|
+
'sqlite3' => '~> 1.3.0',
|
19
|
+
'mysql2' => '',
|
20
|
+
'ruby-oci8' => '',
|
14
21
|
},
|
15
|
-
'5.2.
|
22
|
+
'5.2.3' => {
|
16
23
|
'activerecord-oracle_enhanced-adapter' => '~> 5.2.0',
|
17
|
-
'
|
18
|
-
|
24
|
+
'sqlite3' => '~> 1.3.0',
|
25
|
+
'mysql2' => '',
|
26
|
+
'ruby-oci8' => '',
|
27
|
+
},
|
28
|
+
'6.0.1' => {
|
29
|
+
'activerecord-oracle_enhanced-adapter' => '~> 6.0.0',
|
30
|
+
'sqlite3' => '~> 1.4.0',
|
31
|
+
'mysql2' => '',
|
32
|
+
'ruby-oci8' => '',
|
33
|
+
},
|
19
34
|
}.freeze
|
20
35
|
|
21
36
|
RAILS_VERSIONS.each do |version, gems|
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 1.1.0 (to come)
|
4
|
+
|
5
|
+
* Add rudimentary support for Microsoft SQL Server
|
6
|
+
* Fixes errors when options[param] is nil [PR 315](https://github.com/jbox-web/ajax-datatables-rails/pull/315) (thanks @allard)
|
7
|
+
* Improve query performance when nulls_last option is enabled [PR 317](https://github.com/jbox-web/ajax-datatables-rails/pull/317) (thanks @natebird)
|
8
|
+
* Add :string_in cond [PR 323](https://github.com/jbox-web/ajax-datatables-rails/pull/323) (thanks @donnguyen)
|
9
|
+
* Rename `sanitize` private method [PR 326](https://github.com/jbox-web/ajax-datatables-rails/pull/326) (thanks @epipheus)
|
10
|
+
* Update documentation
|
11
|
+
* Test with latest Rails (6.x) and Ruby versions (2.6)
|
12
|
+
|
13
|
+
This is the last version to support Rails 4.x and Ruby 2.3.x.
|
14
|
+
|
3
15
|
## 1.0.0 (2018-08-28)
|
4
16
|
|
5
17
|
* Breaking change: Remove dependency on view_context [Issue #288](https://github.com/jbox-web/ajax-datatables-rails/issues/288)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
[![GitHub license](https://img.shields.io/github/license/jbox-web/ajax-datatables-rails.svg)](https://github.com/jbox-web/ajax-datatables-rails/blob/master/LICENSE)
|
4
4
|
[![Gem](https://img.shields.io/gem/v/ajax-datatables-rails.svg)](https://rubygems.org/gems/ajax-datatables-rails)
|
5
5
|
[![Gem](https://img.shields.io/gem/dtv/ajax-datatables-rails.svg)](https://rubygems.org/gems/ajax-datatables-rails)
|
6
|
-
[![Build Status](https://travis-ci.
|
6
|
+
[![Build Status](https://travis-ci.com/jbox-web/ajax-datatables-rails.svg?branch=master)](https://travis-ci.com/jbox-web/ajax-datatables-rails)
|
7
7
|
[![Code Climate](https://codeclimate.com/github/jbox-web/ajax-datatables-rails/badges/gpa.svg)](https://codeclimate.com/github/jbox-web/ajax-datatables-rails)
|
8
8
|
[![Test Coverage](https://codeclimate.com/github/jbox-web/ajax-datatables-rails/badges/coverage.svg)](https://codeclimate.com/github/jbox-web/ajax-datatables-rails/coverage)
|
9
9
|
|
@@ -11,8 +11,8 @@
|
|
11
11
|
|
12
12
|
It's tested against :
|
13
13
|
|
14
|
-
* Rails 4.2.
|
15
|
-
* Ruby 2.3.
|
14
|
+
* Rails 4.2.11 / 5.0.7 / 5.1.7 / 5.2.3 / 6.0.1
|
15
|
+
* Ruby 2.3.8 / 2.4.9 / 2.5.7 / 2.6.5
|
16
16
|
* Postgresql 9.6
|
17
17
|
* MySQL 5.6
|
18
18
|
* Oracle XE 11.2 (thanks to [travis-oracle](https://github.com/cbandy/travis-oracle))
|
@@ -215,7 +215,7 @@ end
|
|
215
215
|
|
216
216
|
`cond` can be :
|
217
217
|
|
218
|
-
* `:like`, `:start_with`, `:end_with`, `:string_eq` for string or full text search
|
218
|
+
* `:like`, `:start_with`, `:end_with`, `:string_eq`, `:string_in` for string or full text search
|
219
219
|
* `:eq`, `:not_eq`, `:lt`, `:gt`, `:lteq`, `:gteq`, `:in` for numeric
|
220
220
|
* `:date_range` for date range (only for Rails > 4.2.x, see [here](#daterange-search))
|
221
221
|
* `:null_value` for nil field
|
@@ -337,6 +337,8 @@ Don't forget to make sure the proper route has been added to `config/routes.rb`.
|
|
337
337
|
|
338
338
|
[See here](#pass-options-to-the-datatable-class) if you need to inject params in the `UserDatatable`.
|
339
339
|
|
340
|
+
**Note :** If you have more than **2** datatables in your application, don't forget to read [this](#use-http-post-method-medium).
|
341
|
+
|
340
342
|
### 5) Wire up the Javascript
|
341
343
|
|
342
344
|
Finally, the javascript to tie this all together. In the appropriate `coffee` file:
|
@@ -348,7 +350,8 @@ $ ->
|
|
348
350
|
$('#users-datatable').dataTable
|
349
351
|
processing: true
|
350
352
|
serverSide: true
|
351
|
-
ajax:
|
353
|
+
ajax:
|
354
|
+
url: $('#users-datatable').data('source')
|
352
355
|
pagingType: 'full_numbers'
|
353
356
|
columns: [
|
354
357
|
{data: 'id'}
|
@@ -371,7 +374,9 @@ jQuery(document).ready(function() {
|
|
371
374
|
$('#users-datatable').dataTable({
|
372
375
|
"processing": true,
|
373
376
|
"serverSide": true,
|
374
|
-
"ajax":
|
377
|
+
"ajax": {
|
378
|
+
"url": $('#users-datatable').data('source')
|
379
|
+
},
|
375
380
|
"pagingType": "full_numbers",
|
376
381
|
"columns": [
|
377
382
|
{"data": "id"},
|
@@ -451,7 +456,8 @@ It also helps in separating view/presentation logic from filtering logic (the on
|
|
451
456
|
Example :
|
452
457
|
|
453
458
|
```ruby
|
454
|
-
|
459
|
+
class UserDatatable < AjaxDatatablesRails::ActiveRecord
|
460
|
+
...
|
455
461
|
def data
|
456
462
|
records.map do |record|
|
457
463
|
{
|
@@ -464,7 +470,8 @@ Example :
|
|
464
470
|
}
|
465
471
|
end
|
466
472
|
end
|
467
|
-
...
|
473
|
+
...
|
474
|
+
end
|
468
475
|
|
469
476
|
class UserDecorator < ApplicationDecorator
|
470
477
|
delegate :last_name, :bio
|
@@ -653,7 +660,7 @@ This feature works with [yadcf](https://github.com/vedmack/yadcf).
|
|
653
660
|
|
654
661
|
To enable the date range search, for example `created_at` :
|
655
662
|
|
656
|
-
* add a
|
663
|
+
* add a `created_at` `<th>` in your html
|
657
664
|
* declare your column in `view_columns` : `created_at: { source: 'Post.created_at', cond: :date_range, delimiter: '-yadcf_delim-' }`
|
658
665
|
* add it in `data` : `created_at: record.decorate.created_at`
|
659
666
|
* setup yadcf to make `created_at` search field a range
|
@@ -680,9 +687,21 @@ In the end, it's up to the developer which model(s), scope(s), relationship(s)
|
|
680
687
|
(or else) to employ inside the datatable class to retrieve records from the
|
681
688
|
database.
|
682
689
|
|
690
|
+
## Tests
|
691
|
+
|
692
|
+
Datatables can be tested with Capybara provided you don't use Webrick during integration tests.
|
693
|
+
|
694
|
+
Long story short and as a rule of thumb : use the same webserver everywhere (dev, prod, staging, test, etc...).
|
695
|
+
|
696
|
+
If you use Puma (the Rails default webserver), use Puma everywhere, even in CI/test environment. The same goes for Thin.
|
697
|
+
|
698
|
+
You will avoid the usual story : it works in dev but not in test environment...
|
699
|
+
|
700
|
+
If you want to test datatables with a lot of data you might need this kind of tricks : https://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara. (thanks CharlieIGG)
|
701
|
+
|
683
702
|
## ProTips™
|
684
703
|
|
685
|
-
### Create a master parent class
|
704
|
+
### Create a master parent class (Easy)
|
686
705
|
|
687
706
|
In the same spirit of Rails `ApplicationController` and `ApplicationRecord`, you can create an `ApplicationDatatable` class (in `app/datatables/application_datatable.rb`)
|
688
707
|
that will be inherited from other classes :
|
@@ -698,34 +717,7 @@ end
|
|
698
717
|
|
699
718
|
This way it will be easier to DRY you datatables.
|
700
719
|
|
701
|
-
###
|
702
|
-
|
703
|
-
In order to speed up the `ILIKE` queries that are executed when using the default configuration, you might want to consider adding some indices.
|
704
|
-
For postgresql, you are advised to use the [gin/gist index type](http://www.postgresql.org/docs/current/interactive/pgtrgm.html).
|
705
|
-
This makes it necessary to enable the postgrsql extension `pg_trgm`. Double check that you have this extension installed before trying to enable it.
|
706
|
-
A migration for enabling the extension and creating the indices could look like this:
|
707
|
-
|
708
|
-
```ruby
|
709
|
-
def change
|
710
|
-
enable_extension :pg_trgm
|
711
|
-
TEXT_SEARCH_ATTRIBUTES = ['your', 'attributes']
|
712
|
-
TABLE = 'your_table'
|
713
|
-
|
714
|
-
TEXT_SEARCH_ATTRIBUTES.each do |attr|
|
715
|
-
reversible do |dir|
|
716
|
-
dir.up do
|
717
|
-
execute "CREATE INDEX #{TABLE}_#{attr}_gin ON #{TABLE} USING gin(#{attr} gin_trgm_ops)"
|
718
|
-
end
|
719
|
-
|
720
|
-
dir.down do
|
721
|
-
remove_index TABLE.to_sym, name: "#{TABLE}_#{attr}_gin"
|
722
|
-
end
|
723
|
-
end
|
724
|
-
end
|
725
|
-
end
|
726
|
-
```
|
727
|
-
|
728
|
-
### Speedup JSON rendering
|
720
|
+
### Speedup JSON rendering (Easy)
|
729
721
|
|
730
722
|
Install [yajl-ruby](https://github.com/brianmario/yajl-ruby), basically :
|
731
723
|
|
@@ -741,9 +733,9 @@ $ bundle install
|
|
741
733
|
|
742
734
|
That's all :) ([Automatically prefer Yajl or JSON backend over Yaml, if available](https://github.com/rails/rails/commit/63bb955a99eb46e257655c93dd64e86ebbf05651))
|
743
735
|
|
744
|
-
### Use HTTP `POST` method
|
736
|
+
### Use HTTP `POST` method (Medium)
|
745
737
|
|
746
|
-
Use HTTP `POST` method to avoid `414 Request-URI Too Large` error. See : [#278](https://github.com/jbox-web/ajax-datatables-rails/issues/278).
|
738
|
+
Use HTTP `POST` method to avoid `414 Request-URI Too Large` error. See : [#278](https://github.com/jbox-web/ajax-datatables-rails/issues/278) and [#308](https://github.com/jbox-web/ajax-datatables-rails/issues/308#issuecomment-424897335).
|
747
739
|
|
748
740
|
You can easily define a route concern in `config/routes.rb` and reuse it when you need it :
|
749
741
|
|
@@ -806,6 +798,33 @@ $ ->
|
|
806
798
|
# ...others options, see [here](#5-wire-up-the-javascript)
|
807
799
|
```
|
808
800
|
|
801
|
+
### Create indices for Postgresql (Expert)
|
802
|
+
|
803
|
+
In order to speed up the `ILIKE` queries that are executed when using the default configuration, you might want to consider adding some indices.
|
804
|
+
For postgresql, you are advised to use the [gin/gist index type](http://www.postgresql.org/docs/current/interactive/pgtrgm.html).
|
805
|
+
This makes it necessary to enable the postgrsql extension `pg_trgm`. Double check that you have this extension installed before trying to enable it.
|
806
|
+
A migration for enabling the extension and creating the indices could look like this:
|
807
|
+
|
808
|
+
```ruby
|
809
|
+
def change
|
810
|
+
enable_extension :pg_trgm
|
811
|
+
TEXT_SEARCH_ATTRIBUTES = ['your', 'attributes']
|
812
|
+
TABLE = 'your_table'
|
813
|
+
|
814
|
+
TEXT_SEARCH_ATTRIBUTES.each do |attr|
|
815
|
+
reversible do |dir|
|
816
|
+
dir.up do
|
817
|
+
execute "CREATE INDEX #{TABLE}_#{attr}_gin ON #{TABLE} USING gin(#{attr} gin_trgm_ops)"
|
818
|
+
end
|
819
|
+
|
820
|
+
dir.down do
|
821
|
+
remove_index TABLE.to_sym, name: "#{TABLE}_#{attr}_gin"
|
822
|
+
end
|
823
|
+
end
|
824
|
+
end
|
825
|
+
end
|
826
|
+
```
|
827
|
+
|
809
828
|
## Tutorial
|
810
829
|
|
811
830
|
You'll find a sample project [here](https://github.com/ajahongir/ajax-datatables-rails-v-0-4-0-how-to). Its real world example.
|
data/Rakefile
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
require 'ajax-datatables-rails/version'
|
3
|
+
require_relative 'lib/ajax-datatables-rails/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |s|
|
7
6
|
s.name = 'ajax-datatables-rails'
|
@@ -14,25 +13,20 @@ Gem::Specification.new do |s|
|
|
14
13
|
s.description = "A wrapper around datatable's ajax methods that allow synchronization with server-side pagination in a rails app"
|
15
14
|
s.license = 'MIT'
|
16
15
|
|
17
|
-
s.
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
|
18
|
+
s.add_runtime_dependency 'railties', '>= 4.2'
|
18
19
|
|
19
|
-
s.add_development_dependency 'rails', '>= 4.2'
|
20
|
-
s.add_development_dependency 'rake'
|
21
|
-
s.add_development_dependency 'pg', '< 1.0'
|
22
|
-
s.add_development_dependency 'mysql2'
|
23
|
-
s.add_development_dependency 'sqlite3'
|
24
20
|
s.add_development_dependency 'activerecord-oracle_enhanced-adapter'
|
25
|
-
s.add_development_dependency '
|
26
|
-
s.add_development_dependency 'generator_spec'
|
27
|
-
s.add_development_dependency 'pry'
|
28
|
-
s.add_development_dependency 'simplecov'
|
21
|
+
s.add_development_dependency 'appraisal'
|
29
22
|
s.add_development_dependency 'database_cleaner'
|
30
23
|
s.add_development_dependency 'factory_bot'
|
31
24
|
s.add_development_dependency 'faker'
|
32
|
-
s.add_development_dependency '
|
33
|
-
|
34
|
-
s.
|
35
|
-
s.
|
36
|
-
s.
|
37
|
-
s.
|
25
|
+
s.add_development_dependency 'generator_spec'
|
26
|
+
s.add_development_dependency 'pg', '< 1.0'
|
27
|
+
s.add_development_dependency 'pry'
|
28
|
+
s.add_development_dependency 'rails', '>= 4.2'
|
29
|
+
s.add_development_dependency 'rake'
|
30
|
+
s.add_development_dependency 'rspec'
|
31
|
+
s.add_development_dependency 'simplecov'
|
38
32
|
end
|
data/doc/webpack.md
CHANGED
@@ -5,7 +5,9 @@ We assume here that Bootstrap and FontAwesome are already installed with Webpack
|
|
5
5
|
Inspired by https://datatables.net/download and completed :
|
6
6
|
|
7
7
|
Add npm packages :
|
8
|
-
|
8
|
+
```sh
|
9
|
+
$ yarn add imports-loader
|
10
|
+
```
|
9
11
|
```sh
|
10
12
|
$ yarn add datatables.net
|
11
13
|
$ yarn add datatables.net-bs
|
@@ -2,13 +2,10 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "rails", "4.2.
|
6
|
-
gem "mysql2", "0.4.10"
|
5
|
+
gem "rails", "4.2.11"
|
7
6
|
gem "activerecord-oracle_enhanced-adapter", "~> 1.6.0"
|
7
|
+
gem "sqlite3", "~> 1.3.0"
|
8
|
+
gem "mysql2", "0.4.10"
|
8
9
|
gem "ruby-oci8" if ENV["DB_ADAPTER"] == "oracle_enhanced"
|
9
10
|
|
10
|
-
group :test do
|
11
|
-
gem "codeclimate-test-reporter", "~> 1.0.0"
|
12
|
-
end
|
13
|
-
|
14
11
|
gemspec path: "../"
|
@@ -4,10 +4,8 @@ source "https://rubygems.org"
|
|
4
4
|
|
5
5
|
gem "rails", "5.0.7"
|
6
6
|
gem "activerecord-oracle_enhanced-adapter", "~> 1.7.0"
|
7
|
+
gem "sqlite3", "~> 1.3.0"
|
8
|
+
gem "mysql2"
|
7
9
|
gem "ruby-oci8" if ENV["DB_ADAPTER"] == "oracle_enhanced"
|
8
10
|
|
9
|
-
group :test do
|
10
|
-
gem "codeclimate-test-reporter", "~> 1.0.0"
|
11
|
-
end
|
12
|
-
|
13
11
|
gemspec path: "../"
|
@@ -2,12 +2,10 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "rails", "5.1.
|
5
|
+
gem "rails", "5.1.7"
|
6
6
|
gem "activerecord-oracle_enhanced-adapter", "~> 1.8.0"
|
7
|
+
gem "sqlite3", "~> 1.3.0"
|
8
|
+
gem "mysql2"
|
7
9
|
gem "ruby-oci8" if ENV["DB_ADAPTER"] == "oracle_enhanced"
|
8
10
|
|
9
|
-
group :test do
|
10
|
-
gem "codeclimate-test-reporter", "~> 1.0.0"
|
11
|
-
end
|
12
|
-
|
13
11
|
gemspec path: "../"
|
@@ -2,12 +2,10 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "rails", "5.2.
|
5
|
+
gem "rails", "5.2.3"
|
6
6
|
gem "activerecord-oracle_enhanced-adapter", "~> 5.2.0"
|
7
|
+
gem "sqlite3", "~> 1.3.0"
|
8
|
+
gem "mysql2"
|
7
9
|
gem "ruby-oci8" if ENV["DB_ADAPTER"] == "oracle_enhanced"
|
8
10
|
|
9
|
-
group :test do
|
10
|
-
gem "codeclimate-test-reporter", "~> 1.0.0"
|
11
|
-
end
|
12
|
-
|
13
11
|
gemspec path: "../"
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# This file was generated by Appraisal
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
gem "rails", "6.0.1"
|
6
|
+
gem "activerecord-oracle_enhanced-adapter", "~> 6.0.0"
|
7
|
+
gem "sqlite3", "~> 1.4.0"
|
8
|
+
gem "mysql2"
|
9
|
+
gem "ruby-oci8" if ENV["DB_ADAPTER"] == "oracle_enhanced"
|
10
|
+
|
11
|
+
gemspec path: "../"
|
@@ -33,7 +33,7 @@ module AjaxDatatablesRails
|
|
33
33
|
{
|
34
34
|
recordsTotal: records_total_count,
|
35
35
|
recordsFiltered: records_filtered_count,
|
36
|
-
data:
|
36
|
+
data: sanitize_data(data),
|
37
37
|
}.merge(get_additional_data)
|
38
38
|
end
|
39
39
|
|
@@ -81,7 +81,7 @@ module AjaxDatatablesRails
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
-
def
|
84
|
+
def sanitize_data(data)
|
85
85
|
data.map do |record|
|
86
86
|
if record.is_a?(Array)
|
87
87
|
record.map { |td| ERB::Util.html_escape(td) }
|
@@ -111,6 +111,15 @@ module AjaxDatatablesRails
|
|
111
111
|
GLOBAL_SEARCH_DELIMITER
|
112
112
|
end
|
113
113
|
|
114
|
+
def column_id(name)
|
115
|
+
view_columns.keys.index(name.to_sym)
|
116
|
+
end
|
117
|
+
|
118
|
+
def column_data(column)
|
119
|
+
id = column_id(column)
|
120
|
+
params.dig('columns', id.to_s, 'search', 'value')
|
121
|
+
end
|
122
|
+
|
114
123
|
def raw_records_error_text
|
115
124
|
<<-ERROR
|
116
125
|
|
@@ -4,10 +4,11 @@ module AjaxDatatablesRails
|
|
4
4
|
module Datatable
|
5
5
|
class Column
|
6
6
|
|
7
|
-
TYPE_CAST_DEFAULT
|
8
|
-
TYPE_CAST_MYSQL
|
9
|
-
TYPE_CAST_SQLITE
|
10
|
-
TYPE_CAST_ORACLE
|
7
|
+
TYPE_CAST_DEFAULT = 'VARCHAR'
|
8
|
+
TYPE_CAST_MYSQL = 'CHAR'
|
9
|
+
TYPE_CAST_SQLITE = 'TEXT'
|
10
|
+
TYPE_CAST_ORACLE = 'VARCHAR2(4000)'
|
11
|
+
TYPE_CAST_SQLSERVER = 'VARCHAR(4000)'
|
11
12
|
|
12
13
|
DB_ADAPTER_TYPE_CAST = {
|
13
14
|
mysql: TYPE_CAST_MYSQL,
|
@@ -15,7 +16,8 @@ module AjaxDatatablesRails
|
|
15
16
|
sqlite: TYPE_CAST_SQLITE,
|
16
17
|
sqlite3: TYPE_CAST_SQLITE,
|
17
18
|
oracle: TYPE_CAST_ORACLE,
|
18
|
-
oracleenhanced: TYPE_CAST_ORACLE
|
19
|
+
oracleenhanced: TYPE_CAST_ORACLE,
|
20
|
+
sqlserver: TYPE_CAST_SQLSERVER,
|
19
21
|
}.freeze
|
20
22
|
|
21
23
|
attr_reader :datatable, :index, :options
|
@@ -14,11 +14,7 @@ module AjaxDatatablesRails
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def query(sort_column)
|
17
|
-
|
18
|
-
"CASE WHEN #{sort_column} IS NULL THEN 1 ELSE 0 END, #{sort_column} #{direction}"
|
19
|
-
else
|
20
|
-
"#{sort_column} #{direction}"
|
21
|
-
end
|
17
|
+
[sort_column, direction, nulls_last_sql].compact.join(" ")
|
22
18
|
end
|
23
19
|
|
24
20
|
def column
|
@@ -43,6 +39,19 @@ module AjaxDatatablesRails
|
|
43
39
|
column.nulls_last? || AjaxDatatablesRails.config.nulls_last == true
|
44
40
|
end
|
45
41
|
|
42
|
+
def nulls_last_sql
|
43
|
+
return unless sort_nulls_last?
|
44
|
+
|
45
|
+
case AjaxDatatablesRails.config.db_adapter
|
46
|
+
when :pg, :postgresql, :postgres, :oracle
|
47
|
+
"NULLS LAST"
|
48
|
+
when :mysql, :mysql2, :sqlite, :sqlite3
|
49
|
+
"IS NULL"
|
50
|
+
else
|
51
|
+
raise 'unsupported database adapter'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
46
55
|
end
|
47
56
|
end
|
48
57
|
end
|
@@ -12,7 +12,7 @@ module AjaxDatatablesRails
|
|
12
12
|
records.where(build_conditions)
|
13
13
|
end
|
14
14
|
|
15
|
-
# rubocop:disable Style/EachWithObject
|
15
|
+
# rubocop:disable Style/EachWithObject, Style/SafeNavigation
|
16
16
|
def sort_records(records)
|
17
17
|
sort_by = datatable.orders.inject([]) do |queries, order|
|
18
18
|
column = order.column
|
@@ -21,7 +21,7 @@ module AjaxDatatablesRails
|
|
21
21
|
end
|
22
22
|
records.order(Arel.sql(sort_by.join(', ')))
|
23
23
|
end
|
24
|
-
# rubocop:enable Style/EachWithObject
|
24
|
+
# rubocop:enable Style/EachWithObject, Style/SafeNavigation
|
25
25
|
|
26
26
|
def paginate_records(records)
|
27
27
|
records.offset(datatable.offset).limit(datatable.per_page)
|
@@ -54,7 +54,7 @@ describe AjaxDatatablesRails::Base do
|
|
54
54
|
|
55
55
|
it 'should html escape data' do
|
56
56
|
create(:user, first_name: 'Name "><img src=x onerror=alert("first_name")>', last_name: 'Name "><img src=x onerror=alert("last_name")>')
|
57
|
-
data = datatable.send(:
|
57
|
+
data = datatable.send(:sanitize_data, datatable.data)
|
58
58
|
item = data.first
|
59
59
|
expect(item[:first_name]).to eq 'Name "><img src=x onerror=alert("first_name")>'
|
60
60
|
expect(item[:last_name]).to eq 'Name "><img src=x onerror=alert("last_name")>'
|
@@ -74,7 +74,7 @@ describe AjaxDatatablesRails::Base do
|
|
74
74
|
|
75
75
|
it 'should html escape data' do
|
76
76
|
create(:user, first_name: 'Name "><img src=x onerror=alert("first_name")>', last_name: 'Name "><img src=x onerror=alert("last_name")>')
|
77
|
-
data = datatable.send(:
|
77
|
+
data = datatable.send(:sanitize_data, datatable.data)
|
78
78
|
item = data.first
|
79
79
|
expect(item[2]).to eq 'Name "><img src=x onerror=alert("first_name")>'
|
80
80
|
expect(item[3]).to eq 'Name "><img src=x onerror=alert("last_name")>'
|
@@ -222,6 +222,25 @@ describe AjaxDatatablesRails::Base do
|
|
222
222
|
expect(datatable.datatable.send(:per_page)).to eq(20)
|
223
223
|
end
|
224
224
|
end
|
225
|
+
|
226
|
+
describe '#column_id' do
|
227
|
+
let(:datatable) { ComplexDatatable.new(sample_params) }
|
228
|
+
|
229
|
+
it 'should return column id from view_columns hash' do
|
230
|
+
expect(datatable.send(:column_id, :username)).to eq(0)
|
231
|
+
expect(datatable.send(:column_id, 'username')).to eq(0)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
describe '#column_data' do
|
236
|
+
let(:datatable) { ComplexDatatable.new(sample_params) }
|
237
|
+
before { datatable.params[:columns]['0'][:search][:value] = 'doe' }
|
238
|
+
|
239
|
+
it 'should return column data from params' do
|
240
|
+
expect(datatable.send(:column_data, :username)).to eq('doe')
|
241
|
+
expect(datatable.send(:column_data, 'username')).to eq('doe')
|
242
|
+
end
|
243
|
+
end
|
225
244
|
end
|
226
245
|
end
|
227
246
|
end
|
@@ -167,12 +167,12 @@ describe AjaxDatatablesRails::Datatable::Column do
|
|
167
167
|
expect(column.send(:type_cast)).to eq('VARCHAR')
|
168
168
|
end
|
169
169
|
|
170
|
-
it 'returns
|
170
|
+
it 'returns VARCHAR2(4000) if :db_adapter is :oracle' do
|
171
171
|
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :oracle }
|
172
172
|
expect(column.send(:type_cast)).to eq('VARCHAR2(4000)')
|
173
173
|
end
|
174
174
|
|
175
|
-
it 'returns
|
175
|
+
it 'returns VARCHAR2(4000) if :db_adapter is :oracleenhanced' do
|
176
176
|
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :oracleenhanced }
|
177
177
|
expect(column.send(:type_cast)).to eq('VARCHAR2(4000)')
|
178
178
|
end
|
@@ -196,5 +196,10 @@ describe AjaxDatatablesRails::Datatable::Column do
|
|
196
196
|
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :sqlite3 }
|
197
197
|
expect(column.send(:type_cast)).to eq('TEXT')
|
198
198
|
end
|
199
|
+
|
200
|
+
it 'returns VARCHAR(4000) if :db_adapter is :sqlserver' do
|
201
|
+
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :sqlserver }
|
202
|
+
expect(column.send(:type_cast)).to eq('VARCHAR(4000)')
|
203
|
+
end
|
199
204
|
end
|
200
205
|
end
|
@@ -18,8 +18,10 @@ describe AjaxDatatablesRails::Datatable::SimpleOrder do
|
|
18
18
|
after { AjaxDatatablesRails.config.nulls_last = false }
|
19
19
|
|
20
20
|
it 'sql query' do
|
21
|
+
skip('unsupported database adapter') if ENV['DB_ADAPTER'] == 'oracle_enhanced'
|
22
|
+
|
21
23
|
expect(simple_order.query('email')).to eq(
|
22
|
-
|
24
|
+
"email DESC #{nulls_last_sql}"
|
23
25
|
)
|
24
26
|
end
|
25
27
|
end
|
@@ -28,12 +30,29 @@ describe AjaxDatatablesRails::Datatable::SimpleOrder do
|
|
28
30
|
let(:sorted_datatable) { DatatableOrderNullsLast.new(sample_params).datatable }
|
29
31
|
let(:nulls_last_order) { AjaxDatatablesRails::Datatable::SimpleOrder.new(sorted_datatable, options) }
|
30
32
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
context 'with postgres database adapter' do
|
34
|
+
before { AjaxDatatablesRails.config.db_adapter = :pg }
|
35
|
+
|
36
|
+
it 'sql query' do
|
37
|
+
expect(nulls_last_order.query('email')).to eq('email DESC NULLS LAST')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with sqlite database adapter' do
|
42
|
+
before { AjaxDatatablesRails.config.db_adapter = :sqlite }
|
43
|
+
|
44
|
+
it 'sql query' do
|
45
|
+
expect(nulls_last_order.query('email')).to eq('email DESC IS NULL')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'with mysql database adapter' do
|
50
|
+
before { AjaxDatatablesRails.config.db_adapter = :mysql }
|
51
|
+
|
52
|
+
it 'sql query' do
|
53
|
+
expect(nulls_last_order.query('email')).to eq('email DESC IS NULL')
|
54
|
+
end
|
35
55
|
end
|
36
56
|
end
|
37
57
|
end
|
38
|
-
|
39
58
|
end
|
@@ -126,7 +126,7 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
126
126
|
expect(result).to be_a(Arel::Nodes::And)
|
127
127
|
end
|
128
128
|
|
129
|
-
if
|
129
|
+
if ENV['DB_ADAPTER'] == 'postgresql'
|
130
130
|
context 'when db_adapter is postgresql' do
|
131
131
|
it 'can call #to_sql on returned object' do
|
132
132
|
result = datatable.build_conditions_for_selected_columns
|
@@ -138,7 +138,7 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
138
138
|
end
|
139
139
|
end
|
140
140
|
|
141
|
-
if
|
141
|
+
if ENV['DB_ADAPTER'] == 'oracle_enhanced'
|
142
142
|
context 'when db_adapter is oracle' do
|
143
143
|
it 'can call #to_sql on returned object' do
|
144
144
|
result = datatable.build_conditions_for_selected_columns
|
@@ -150,7 +150,7 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
150
150
|
end
|
151
151
|
end
|
152
152
|
|
153
|
-
if
|
153
|
+
if ENV['DB_ADAPTER'] == 'mysql2'
|
154
154
|
context 'when db_adapter is mysql2' do
|
155
155
|
it 'can call #to_sql on returned object' do
|
156
156
|
result = datatable.build_conditions_for_selected_columns
|
@@ -288,7 +288,7 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
288
288
|
create(:user, last_name: 'MARY')
|
289
289
|
end
|
290
290
|
|
291
|
-
if
|
291
|
+
if ENV['DB_ADAPTER'] == 'oracle_enhanced'
|
292
292
|
context 'when db_adapter is oracleenhanced' do
|
293
293
|
it 'should filter records matching' do
|
294
294
|
datatable.params[:columns]['3'][:search][:value] = 'RY'
|
@@ -339,6 +339,40 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
339
339
|
end
|
340
340
|
end
|
341
341
|
|
342
|
+
describe 'it can filter records with condition :string_in' do
|
343
|
+
let(:datatable) { DatatableCondStringIn.new(sample_params) }
|
344
|
+
|
345
|
+
before(:each) do
|
346
|
+
create(:user, email: 'john@foo.com')
|
347
|
+
create(:user, email: 'mary@bar.com')
|
348
|
+
create(:user, email: 'henry@baz.com')
|
349
|
+
end
|
350
|
+
|
351
|
+
it 'should filter records matching' do
|
352
|
+
datatable.params[:columns]['1'][:search][:value] = 'john@foo.com'
|
353
|
+
expect(datatable.data.size).to eq 1
|
354
|
+
item = datatable.data.first
|
355
|
+
expect(item[:email]).to eq 'john@foo.com'
|
356
|
+
end
|
357
|
+
|
358
|
+
it 'should filter records matching with multiple' do
|
359
|
+
datatable.params[:columns]['1'][:search][:value] = 'john@foo.com|henry@baz.com'
|
360
|
+
expect(datatable.data.size).to eq 2
|
361
|
+
items = datatable.data.sort_by { |h| h[:email] }
|
362
|
+
item_first = items.first
|
363
|
+
item_last = items.last
|
364
|
+
expect(item_first[:email]).to eq 'henry@baz.com'
|
365
|
+
expect(item_last[:email]).to eq 'john@foo.com'
|
366
|
+
end
|
367
|
+
|
368
|
+
it 'should filter records matching with multiple contains not found' do
|
369
|
+
datatable.params[:columns]['1'][:search][:value] = 'john@foo.com|henry_not@baz.com'
|
370
|
+
expect(datatable.data.size).to eq 1
|
371
|
+
item = datatable.data.first
|
372
|
+
expect(item[:email]).to eq 'john@foo.com'
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
342
376
|
describe 'it can filter records with condition :null_value' do
|
343
377
|
let(:datatable) { DatatableCondNullValue.new(sample_params) }
|
344
378
|
|
@@ -16,8 +16,8 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'paginates records properly' do
|
19
|
-
if
|
20
|
-
if Rails.version.in? %w[4.
|
19
|
+
if ENV['DB_ADAPTER'] == 'oracle_enhanced'
|
20
|
+
if Rails.version.in? %w[4.2.11]
|
21
21
|
expect(datatable.paginate_records(records).to_sql).to include(
|
22
22
|
'rownum <= 10'
|
23
23
|
)
|
@@ -34,8 +34,8 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
34
34
|
|
35
35
|
datatable.params[:start] = '26'
|
36
36
|
datatable.params[:length] = '25'
|
37
|
-
if
|
38
|
-
if Rails.version.in? %w[4.
|
37
|
+
if ENV['DB_ADAPTER'] == 'oracle_enhanced'
|
38
|
+
if Rails.version.in? %w[4.2.11]
|
39
39
|
expect(datatable.paginate_records(records).to_sql).to include(
|
40
40
|
'rownum <= 51'
|
41
41
|
)
|
@@ -49,26 +49,28 @@ describe AjaxDatatablesRails::ORM::ActiveRecord do
|
|
49
49
|
after { AjaxDatatablesRails.config.nulls_last = false }
|
50
50
|
|
51
51
|
it 'can handle multiple sorting columns' do
|
52
|
+
skip('unsupported database adapter') if ENV['DB_ADAPTER'] == 'oracle_enhanced'
|
53
|
+
|
52
54
|
# set to order by Users username in ascending order, and
|
53
55
|
# by Users email in descending order
|
54
56
|
datatable.params[:order]['0'] = { column: '0', dir: 'asc' }
|
55
57
|
datatable.params[:order]['1'] = { column: '1', dir: 'desc' }
|
56
58
|
expect(datatable.sort_records(records).to_sql).to include(
|
57
|
-
|
58
|
-
'CASE WHEN users.email IS NULL THEN 1 ELSE 0 END, users.email DESC'
|
59
|
+
"ORDER BY users.username ASC #{nulls_last_sql}, users.email DESC #{nulls_last_sql}"
|
59
60
|
)
|
60
61
|
end
|
61
62
|
end
|
62
63
|
|
63
64
|
describe '#sort_records with nulls last using column config' do
|
64
65
|
it 'can handle multiple sorting columns' do
|
66
|
+
skip('unsupported database adapter') if ENV['DB_ADAPTER'] == 'oracle_enhanced'
|
67
|
+
|
65
68
|
# set to order by Users username in ascending order, and
|
66
69
|
# by Users email in descending order
|
67
70
|
nulls_last_datatable.params[:order]['0'] = { column: '0', dir: 'asc' }
|
68
71
|
nulls_last_datatable.params[:order]['1'] = { column: '1', dir: 'desc' }
|
69
72
|
expect(nulls_last_datatable.sort_records(records).to_sql).to include(
|
70
|
-
|
71
|
-
'CASE WHEN users.email IS NULL THEN 1 ELSE 0 END, users.email DESC'
|
73
|
+
"ORDER BY users.username ASC, users.email DESC #{nulls_last_sql}"
|
72
74
|
)
|
73
75
|
end
|
74
76
|
end
|
data/spec/install_oracle.sh
CHANGED
@@ -4,9 +4,15 @@ wget 'https://github.com/cbandy/travis-oracle/archive/v2.0.3.tar.gz'
|
|
4
4
|
mkdir -p ~/.travis/oracle
|
5
5
|
tar xz --strip-components 1 -C ~/.travis/oracle -f v2.0.3.tar.gz
|
6
6
|
|
7
|
-
|
7
|
+
if [ -n $CUSTOM_ORACLE_FILE ]; then
|
8
|
+
wget -q $CUSTOM_ORACLE_FILE -O ~/.travis/oracle/oracle-xe-11.2.0-1.0.x86_64.rpm.zip
|
9
|
+
else
|
10
|
+
~/.travis/oracle/download.sh
|
11
|
+
fi
|
12
|
+
|
8
13
|
~/.travis/oracle/install.sh
|
9
14
|
|
15
|
+
# in dev env: sqlplus system/password@localhost/XE
|
10
16
|
"$ORACLE_HOME/bin/sqlplus" -L -S / AS SYSDBA <<SQL
|
11
17
|
ALTER USER $USER IDENTIFIED BY $USER;
|
12
18
|
SQL
|
@@ -22,6 +22,12 @@ class DatatableCondStringEq < ComplexDatatable
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
class DatatableCondStringIn < ComplexDatatable
|
26
|
+
def view_columns
|
27
|
+
super.deep_merge(email: { cond: :string_in, formatter: -> (o) { o.split("|") } })
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
25
31
|
class DatatableCondNullValue < ComplexDatatable
|
26
32
|
def view_columns
|
27
33
|
super.deep_merge(email: { cond: :null_value })
|
@@ -97,3 +97,14 @@ class ComplexDatatableArray < ComplexDatatable
|
|
97
97
|
end
|
98
98
|
end
|
99
99
|
end
|
100
|
+
|
101
|
+
def nulls_last_sql
|
102
|
+
case AjaxDatatablesRails.config.db_adapter
|
103
|
+
when :pg, :postgresql, :postgres, :oracle
|
104
|
+
"NULLS LAST"
|
105
|
+
when :mysql, :mysql2, :sqlite, :sqlite3
|
106
|
+
"IS NULL"
|
107
|
+
else
|
108
|
+
raise 'unsupported database adapter'
|
109
|
+
end
|
110
|
+
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: 1.
|
4
|
+
version: 1.1.0
|
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:
|
12
|
+
date: 2019-12-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: railties
|
@@ -26,21 +26,7 @@ dependencies:
|
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '4.2'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
30
|
-
requirement: !ruby/object:Gem::Requirement
|
31
|
-
requirements:
|
32
|
-
- - ">="
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version: '4.2'
|
35
|
-
type: :development
|
36
|
-
prerelease: false
|
37
|
-
version_requirements: !ruby/object:Gem::Requirement
|
38
|
-
requirements:
|
39
|
-
- - ">="
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
version: '4.2'
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: rake
|
29
|
+
name: activerecord-oracle_enhanced-adapter
|
44
30
|
requirement: !ruby/object:Gem::Requirement
|
45
31
|
requirements:
|
46
32
|
- - ">="
|
@@ -54,21 +40,7 @@ dependencies:
|
|
54
40
|
- !ruby/object:Gem::Version
|
55
41
|
version: '0'
|
56
42
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
58
|
-
requirement: !ruby/object:Gem::Requirement
|
59
|
-
requirements:
|
60
|
-
- - "<"
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '1.0'
|
63
|
-
type: :development
|
64
|
-
prerelease: false
|
65
|
-
version_requirements: !ruby/object:Gem::Requirement
|
66
|
-
requirements:
|
67
|
-
- - "<"
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '1.0'
|
70
|
-
- !ruby/object:Gem::Dependency
|
71
|
-
name: mysql2
|
43
|
+
name: appraisal
|
72
44
|
requirement: !ruby/object:Gem::Requirement
|
73
45
|
requirements:
|
74
46
|
- - ">="
|
@@ -82,7 +54,7 @@ dependencies:
|
|
82
54
|
- !ruby/object:Gem::Version
|
83
55
|
version: '0'
|
84
56
|
- !ruby/object:Gem::Dependency
|
85
|
-
name:
|
57
|
+
name: database_cleaner
|
86
58
|
requirement: !ruby/object:Gem::Requirement
|
87
59
|
requirements:
|
88
60
|
- - ">="
|
@@ -96,7 +68,7 @@ dependencies:
|
|
96
68
|
- !ruby/object:Gem::Version
|
97
69
|
version: '0'
|
98
70
|
- !ruby/object:Gem::Dependency
|
99
|
-
name:
|
71
|
+
name: factory_bot
|
100
72
|
requirement: !ruby/object:Gem::Requirement
|
101
73
|
requirements:
|
102
74
|
- - ">="
|
@@ -110,7 +82,7 @@ dependencies:
|
|
110
82
|
- !ruby/object:Gem::Version
|
111
83
|
version: '0'
|
112
84
|
- !ruby/object:Gem::Dependency
|
113
|
-
name:
|
85
|
+
name: faker
|
114
86
|
requirement: !ruby/object:Gem::Requirement
|
115
87
|
requirements:
|
116
88
|
- - ">="
|
@@ -138,21 +110,21 @@ dependencies:
|
|
138
110
|
- !ruby/object:Gem::Version
|
139
111
|
version: '0'
|
140
112
|
- !ruby/object:Gem::Dependency
|
141
|
-
name:
|
113
|
+
name: pg
|
142
114
|
requirement: !ruby/object:Gem::Requirement
|
143
115
|
requirements:
|
144
|
-
- - "
|
116
|
+
- - "<"
|
145
117
|
- !ruby/object:Gem::Version
|
146
|
-
version: '0'
|
118
|
+
version: '1.0'
|
147
119
|
type: :development
|
148
120
|
prerelease: false
|
149
121
|
version_requirements: !ruby/object:Gem::Requirement
|
150
122
|
requirements:
|
151
|
-
- - "
|
123
|
+
- - "<"
|
152
124
|
- !ruby/object:Gem::Version
|
153
|
-
version: '0'
|
125
|
+
version: '1.0'
|
154
126
|
- !ruby/object:Gem::Dependency
|
155
|
-
name:
|
127
|
+
name: pry
|
156
128
|
requirement: !ruby/object:Gem::Requirement
|
157
129
|
requirements:
|
158
130
|
- - ">="
|
@@ -166,21 +138,21 @@ dependencies:
|
|
166
138
|
- !ruby/object:Gem::Version
|
167
139
|
version: '0'
|
168
140
|
- !ruby/object:Gem::Dependency
|
169
|
-
name:
|
141
|
+
name: rails
|
170
142
|
requirement: !ruby/object:Gem::Requirement
|
171
143
|
requirements:
|
172
144
|
- - ">="
|
173
145
|
- !ruby/object:Gem::Version
|
174
|
-
version: '
|
146
|
+
version: '4.2'
|
175
147
|
type: :development
|
176
148
|
prerelease: false
|
177
149
|
version_requirements: !ruby/object:Gem::Requirement
|
178
150
|
requirements:
|
179
151
|
- - ">="
|
180
152
|
- !ruby/object:Gem::Version
|
181
|
-
version: '
|
153
|
+
version: '4.2'
|
182
154
|
- !ruby/object:Gem::Dependency
|
183
|
-
name:
|
155
|
+
name: rake
|
184
156
|
requirement: !ruby/object:Gem::Requirement
|
185
157
|
requirements:
|
186
158
|
- - ">="
|
@@ -194,7 +166,7 @@ dependencies:
|
|
194
166
|
- !ruby/object:Gem::Version
|
195
167
|
version: '0'
|
196
168
|
- !ruby/object:Gem::Dependency
|
197
|
-
name:
|
169
|
+
name: rspec
|
198
170
|
requirement: !ruby/object:Gem::Requirement
|
199
171
|
requirements:
|
200
172
|
- - ">="
|
@@ -208,7 +180,7 @@ dependencies:
|
|
208
180
|
- !ruby/object:Gem::Version
|
209
181
|
version: '0'
|
210
182
|
- !ruby/object:Gem::Dependency
|
211
|
-
name:
|
183
|
+
name: simplecov
|
212
184
|
requirement: !ruby/object:Gem::Requirement
|
213
185
|
requirements:
|
214
186
|
- - ">="
|
@@ -244,10 +216,11 @@ files:
|
|
244
216
|
- ajax-datatables-rails.gemspec
|
245
217
|
- doc/migrate.md
|
246
218
|
- doc/webpack.md
|
247
|
-
- gemfiles/rails_4.2.
|
219
|
+
- gemfiles/rails_4.2.11.gemfile
|
248
220
|
- gemfiles/rails_5.0.7.gemfile
|
249
|
-
- gemfiles/rails_5.1.
|
250
|
-
- gemfiles/rails_5.2.
|
221
|
+
- gemfiles/rails_5.1.7.gemfile
|
222
|
+
- gemfiles/rails_5.2.3.gemfile
|
223
|
+
- gemfiles/rails_6.0.1.gemfile
|
251
224
|
- lib/ajax-datatables-rails.rb
|
252
225
|
- lib/ajax-datatables-rails/active_record.rb
|
253
226
|
- lib/ajax-datatables-rails/base.rb
|
@@ -307,31 +280,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
307
280
|
- !ruby/object:Gem::Version
|
308
281
|
version: '0'
|
309
282
|
requirements: []
|
310
|
-
|
311
|
-
rubygems_version: 2.7.7
|
283
|
+
rubygems_version: 3.0.3
|
312
284
|
signing_key:
|
313
285
|
specification_version: 4
|
314
286
|
summary: A gem that simplifies using datatables and hundreds of records via ajax
|
315
|
-
test_files:
|
316
|
-
- spec/ajax-datatables-rails/base_spec.rb
|
317
|
-
- spec/ajax-datatables-rails/configuration_spec.rb
|
318
|
-
- spec/ajax-datatables-rails/datatable/column_spec.rb
|
319
|
-
- spec/ajax-datatables-rails/datatable/datatable_spec.rb
|
320
|
-
- spec/ajax-datatables-rails/datatable/simple_order_spec.rb
|
321
|
-
- spec/ajax-datatables-rails/datatable/simple_search_spec.rb
|
322
|
-
- spec/ajax-datatables-rails/extended_spec.rb
|
323
|
-
- spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb
|
324
|
-
- spec/ajax-datatables-rails/orm/active_record_paginate_records_spec.rb
|
325
|
-
- spec/ajax-datatables-rails/orm/active_record_sort_records_spec.rb
|
326
|
-
- spec/ajax-datatables-rails/orm/active_record_spec.rb
|
327
|
-
- spec/factories/user.rb
|
328
|
-
- spec/install_oracle.sh
|
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
|
335
|
-
- spec/support/schema.rb
|
336
|
-
- spec/support/test_helpers.rb
|
337
|
-
- spec/support/test_models.rb
|
287
|
+
test_files: []
|