trk_datatables 0.2.15 → 0.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +44 -1
- data/README.md +11 -5
- data/Rakefile +5 -5
- data/lib/generators/templates/trk_datatable.rb +2 -2
- data/lib/generators/trk_datatables/trk_datatables_generator.rb +4 -4
- data/lib/trk_datatables/active_record.rb +15 -16
- data/lib/trk_datatables/base.rb +21 -19
- data/lib/trk_datatables/column_key_options.rb +50 -40
- data/lib/trk_datatables/dt_params.rb +32 -31
- data/lib/trk_datatables/neo4j.rb +3 -4
- data/lib/trk_datatables/preferences.rb +3 -3
- data/lib/trk_datatables/render_html.rb +19 -16
- data/lib/trk_datatables/version.rb +1 -1
- data/lib/trk_datatables.rb +17 -16
- data/trk_datatables.gemspec +32 -33
- metadata +25 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3fecf0c6923b35099111fc74976cf13d26087c42e7bb4461f7c91f540c5a2123
|
4
|
+
data.tar.gz: 1be013aa2381e6f79fec4c84a2913eb1de087649e971cbfb42b7b4fc8c0e97d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8d596f8b8c4ff323ca473d0d10d5cb55c991c815d936765e51ab3144ca08b71e003a01729b3ff112028555ca8fd87488b541278bc358d40e008e554e2b533d6
|
7
|
+
data.tar.gz: f8296c711ce5bfed1a6a6aa222dd669bd1b92bf92858a4ab2c31ae544c470d8863172573de21cc3f85514251a356748ad1b24c36f847645cbc7361a2803df2d6
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.0.1
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
trk_datatables (0.2.
|
4
|
+
trk_datatables (0.2.16)
|
5
5
|
activesupport
|
6
6
|
|
7
7
|
GEM
|
@@ -18,6 +18,7 @@ GEM
|
|
18
18
|
minitest (>= 5.1)
|
19
19
|
tzinfo (~> 2.0)
|
20
20
|
zeitwerk (~> 2.3)
|
21
|
+
ast (2.4.2)
|
21
22
|
byebug (11.1.3)
|
22
23
|
concurrent-ruby (1.2.0)
|
23
24
|
database_cleaner (2.0.1)
|
@@ -28,17 +29,58 @@ GEM
|
|
28
29
|
database_cleaner-core (2.0.1)
|
29
30
|
i18n (1.12.0)
|
30
31
|
concurrent-ruby (~> 1.0)
|
32
|
+
json (2.7.2)
|
33
|
+
language_server-protocol (3.17.0.3)
|
34
|
+
lint_roller (1.1.0)
|
31
35
|
mini_portile2 (2.8.1)
|
32
36
|
minitest (5.17.0)
|
33
37
|
minitest-color (0.0.2)
|
34
38
|
minitest (~> 5)
|
39
|
+
parallel (1.24.0)
|
40
|
+
parser (3.3.0.5)
|
41
|
+
ast (~> 2.4.1)
|
42
|
+
racc
|
35
43
|
pg (1.4.5)
|
44
|
+
racc (1.7.3)
|
45
|
+
rainbow (3.1.1)
|
36
46
|
rake (10.5.0)
|
47
|
+
regexp_parser (2.9.0)
|
48
|
+
rexml (3.2.6)
|
49
|
+
rubocop (1.62.1)
|
50
|
+
json (~> 2.3)
|
51
|
+
language_server-protocol (>= 3.17.0)
|
52
|
+
parallel (~> 1.10)
|
53
|
+
parser (>= 3.3.0.2)
|
54
|
+
rainbow (>= 2.2.2, < 4.0)
|
55
|
+
regexp_parser (>= 1.8, < 3.0)
|
56
|
+
rexml (>= 3.2.5, < 4.0)
|
57
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
58
|
+
ruby-progressbar (~> 1.7)
|
59
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
60
|
+
rubocop-ast (1.31.2)
|
61
|
+
parser (>= 3.3.0.4)
|
62
|
+
rubocop-performance (1.20.2)
|
63
|
+
rubocop (>= 1.48.1, < 2.0)
|
64
|
+
rubocop-ast (>= 1.30.0, < 2.0)
|
65
|
+
ruby-progressbar (1.13.0)
|
37
66
|
sqlite3 (1.6.0)
|
38
67
|
mini_portile2 (~> 2.8.0)
|
68
|
+
standard (1.35.1)
|
69
|
+
language_server-protocol (~> 3.17.0.2)
|
70
|
+
lint_roller (~> 1.0)
|
71
|
+
rubocop (~> 1.62.0)
|
72
|
+
standard-custom (~> 1.0.0)
|
73
|
+
standard-performance (~> 1.3)
|
74
|
+
standard-custom (1.0.2)
|
75
|
+
lint_roller (~> 1.0)
|
76
|
+
rubocop (~> 1.50)
|
77
|
+
standard-performance (1.3.1)
|
78
|
+
lint_roller (~> 1.1)
|
79
|
+
rubocop-performance (~> 1.20.2)
|
39
80
|
timecop (0.9.6)
|
40
81
|
tzinfo (2.0.6)
|
41
82
|
concurrent-ruby (~> 1.0)
|
83
|
+
unicode-display_width (2.5.0)
|
42
84
|
zeitwerk (2.6.6)
|
43
85
|
|
44
86
|
PLATFORMS
|
@@ -54,6 +96,7 @@ DEPENDENCIES
|
|
54
96
|
pg
|
55
97
|
rake (~> 10.0)
|
56
98
|
sqlite3
|
99
|
+
standard
|
57
100
|
timecop
|
58
101
|
trk_datatables!
|
59
102
|
|
data/README.md
CHANGED
@@ -372,11 +372,11 @@ use empty column_key
|
|
372
372
|
```
|
373
373
|
|
374
374
|
If you have more columns that are not actually columns in database (for example
|
375
|
-
links or Ruby calculated values) than you can not use empty column_key
|
376
|
-
there could be only one (keys in the hash should be unique). When you
|
377
|
-
`order` and `search` than you can use any column name since that column
|
378
|
-
be used in queries. For example column key `posts.body_size` is not in
|
379
|
-
nor in Ruby code.
|
375
|
+
links or Ruby calculated in ruby values) than you can not use empty column_key
|
376
|
+
since there could be only one (keys in the hash should be unique). When you
|
377
|
+
disable `order` and `search` than you can use any column name since that column
|
378
|
+
will not be used in queries. For example column key `posts.body_size` is not in
|
379
|
+
database nor in Ruby code.
|
380
380
|
|
381
381
|
```
|
382
382
|
def columns
|
@@ -1161,6 +1161,12 @@ Column filtering with dropdowns https://datatables.net/extensions/searchpanes/ex
|
|
1161
1161
|
Adding graphs https://datatables.net/forums/discussion/comment/123621/#Comment_123621
|
1162
1162
|
https://datatables.net/examples/api/highcharts.html
|
1163
1163
|
|
1164
|
+
Run custom JS on next page or search, for example load tooltip.
|
1165
|
+
|
1166
|
+
|
1167
|
+
Check issue when we use param_set for select_options field since select option
|
1168
|
+
does not get selected and next page will show all items instead of only ones
|
1169
|
+
with selected field.
|
1164
1170
|
|
1165
1171
|
## License
|
1166
1172
|
|
data/Rakefile
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rake/testtask"
|
3
3
|
|
4
4
|
Rake::TestTask.new(:test) do |t|
|
5
|
-
t.libs <<
|
6
|
-
t.libs <<
|
7
|
-
t.test_files = FileList[
|
5
|
+
t.libs << "test"
|
6
|
+
t.libs << "lib"
|
7
|
+
t.test_files = FileList["test/**/*_test.rb"]
|
8
8
|
end
|
9
9
|
|
10
10
|
task default: :test
|
@@ -3,7 +3,7 @@ class <%= @trk_class_name %> < TrkDatatables::ActiveRecord
|
|
3
3
|
{
|
4
4
|
<% @skip_model || class_name.constantize.columns.each do |column| -%>
|
5
5
|
<% next if %w[created_at updated_at].include? column.name -%>
|
6
|
-
|
6
|
+
"<%= table_name %>.<%= column.name %>": {},
|
7
7
|
<% end -%>
|
8
8
|
}
|
9
9
|
end
|
@@ -19,7 +19,7 @@ class <%= @trk_class_name %> < TrkDatatables::ActiveRecord
|
|
19
19
|
[
|
20
20
|
<% @skip_model || class_name.constantize.columns.each do |column| -%>
|
21
21
|
<% next if %w[created_at updated_at].include? column.name -%>
|
22
|
-
<% if column.name ==
|
22
|
+
<% if column.name == "id" -%>
|
23
23
|
@view.link_to(<%= singular_table_name %>.id, <%= singular_table_name %>),
|
24
24
|
<% else -%>
|
25
25
|
<%= singular_table_name %>.<%= column.name %>,
|
@@ -2,10 +2,10 @@ module TrkDatatables
|
|
2
2
|
module Generators
|
3
3
|
class TrkDatatablesGenerator < Rails::Generators::NamedBase
|
4
4
|
# we can call with `rails g trk_datatables` instead of: `rails g trk_datatables:trk_datatables`
|
5
|
-
namespace
|
6
|
-
source_root File.expand_path(
|
5
|
+
namespace "trk_datatables"
|
6
|
+
source_root File.expand_path("../templates", __dir__)
|
7
7
|
|
8
|
-
desc
|
8
|
+
desc "Generates datatables file for a give NAME"
|
9
9
|
def create
|
10
10
|
begin
|
11
11
|
class_name.constantize
|
@@ -18,7 +18,7 @@ module TrkDatatables
|
|
18
18
|
@trk_file_name = "#{singular_name}_datatable"
|
19
19
|
end
|
20
20
|
|
21
|
-
template
|
21
|
+
template "trk_datatable.rb", "app/datatables/#{@trk_file_name}.rb"
|
22
22
|
|
23
23
|
say <<~TEXT
|
24
24
|
======================================================================
|
@@ -6,7 +6,7 @@ module TrkDatatables
|
|
6
6
|
# Global search. All columns are typecasted to string. Search string is
|
7
7
|
# splited by space and "and"-ed.
|
8
8
|
def filter_by_search_all(filtered)
|
9
|
-
conditions = @dt_params.search_all.split(
|
9
|
+
conditions = @dt_params.search_all.split(" ").first(MAX_NUMBER_OF_STRINGS).map do |search_string|
|
10
10
|
@column_key_options.searchable_and_global_search.map do |column_key_option|
|
11
11
|
_filter_column_as_string column_key_option, search_string
|
12
12
|
end.reduce(:or) # any searchable column is 'or'-ed
|
@@ -38,8 +38,8 @@ module TrkDatatables
|
|
38
38
|
filter_column_as_in(column_key_option, search_value)
|
39
39
|
elsif %i[boolean].include?(column_key_option[:column_type_in_db])
|
40
40
|
filter_column_as_boolean(column_key_option, search_value)
|
41
|
-
elsif %i[date datetime integer float].include?(column_key_option[:column_type_in_db]) &&
|
42
|
-
|
41
|
+
elsif %i[date datetime integer float].include?(column_key_option[:column_type_in_db]) &&
|
42
|
+
search_value.include?(BETWEEN_SEPARATOR)
|
43
43
|
from, to = search_value.split BETWEEN_SEPARATOR
|
44
44
|
filter_column_as_between(column_key_option, from, to)
|
45
45
|
else
|
@@ -48,9 +48,9 @@ module TrkDatatables
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def _filter_column_as_string(column_key_option, search_value)
|
51
|
-
search_value.split(
|
51
|
+
search_value.split(" ").first(MAX_NUMBER_OF_STRINGS).map do |search_string|
|
52
52
|
casted_column = ::Arel::Nodes::NamedFunction.new(
|
53
|
-
|
53
|
+
"CAST",
|
54
54
|
[_arel_column(column_key_option).as(@column_key_options.string_cast)]
|
55
55
|
)
|
56
56
|
casted_column.matches("%#{search_string}%")
|
@@ -59,9 +59,9 @@ module TrkDatatables
|
|
59
59
|
|
60
60
|
def filter_column_as_boolean(column_key_option, search_value)
|
61
61
|
# return true relation in case we ignore
|
62
|
-
return Arel::Nodes::SqlLiteral.new(
|
62
|
+
return Arel::Nodes::SqlLiteral.new("1").eq(1) if search_value == "any"
|
63
63
|
|
64
|
-
_arel_column(column_key_option).eq(search_value ==
|
64
|
+
_arel_column(column_key_option).eq(search_value == "true")
|
65
65
|
end
|
66
66
|
|
67
67
|
def filter_column_as_between(column_key_option, from, to)
|
@@ -88,8 +88,8 @@ module TrkDatatables
|
|
88
88
|
parsed_from = from
|
89
89
|
parsed_to = to
|
90
90
|
when :date
|
91
|
-
parsed_from = _parse_in_zone(from)
|
92
|
-
parsed_to = _parse_in_zone(to)
|
91
|
+
parsed_from = _parse_in_zone(from)&.to_date
|
92
|
+
parsed_to = _parse_in_zone(to)&.to_date&.end_of_day
|
93
93
|
when :datetime
|
94
94
|
parsed_from = _parse_in_zone(from)
|
95
95
|
parsed_to = _parse_in_zone(to)
|
@@ -112,8 +112,7 @@ module TrkDatatables
|
|
112
112
|
|
113
113
|
def order_and_paginate_items(filtered)
|
114
114
|
filtered = order_items filtered
|
115
|
-
filtered
|
116
|
-
filtered
|
115
|
+
filtered.offset(@dt_params.dt_offset).limit(dt_per_page_or_default)
|
117
116
|
end
|
118
117
|
|
119
118
|
def order_items(filtered)
|
@@ -122,12 +121,12 @@ module TrkDatatables
|
|
122
121
|
next if column_key_option[:column_options][ColumnKeyOptions::ORDER_OPTION] == false
|
123
122
|
|
124
123
|
queries << if column_key_option[:table_class] < TrkDatatables::CalculatedInDb
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
124
|
+
"#{send(column_key_option[:column_key])} #{direction}"
|
125
|
+
else
|
126
|
+
"#{column_key_option[:column_key]} #{direction}"
|
127
|
+
end
|
129
128
|
end
|
130
|
-
filtered.order(Arel.sql(order_by.join(
|
129
|
+
filtered.order(Arel.sql(order_by.join(", ")))
|
131
130
|
end
|
132
131
|
|
133
132
|
def _arel_column(column_key_option)
|
data/lib/trk_datatables/base.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module TrkDatatables
|
2
2
|
# TODO: extract those to configuration options
|
3
|
-
BETWEEN_SEPARATOR =
|
4
|
-
MULTIPLE_OPTION_SEPARATOR =
|
3
|
+
BETWEEN_SEPARATOR = " - ".freeze
|
4
|
+
MULTIPLE_OPTION_SEPARATOR = "|".freeze
|
5
5
|
# maximum page length = 100 (we should not believe params)
|
6
6
|
|
7
7
|
class Error < StandardError
|
@@ -85,16 +85,16 @@ module TrkDatatables
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def filter_by_search_all(_all)
|
88
|
-
raise
|
88
|
+
raise "filter_by_columns_is_defined_in_specific_orm"
|
89
89
|
end
|
90
90
|
|
91
91
|
def filter_by_columns(_all)
|
92
|
-
raise
|
92
|
+
raise "filter_by_columns_is_defined_in_specific_orm" \
|
93
93
|
"\n Extent from TrkDatatables::ActiveRecord instead of TrkDatatables::Base"
|
94
94
|
end
|
95
95
|
|
96
96
|
def order_and_paginate_items(_filtered_items)
|
97
|
-
raise
|
97
|
+
raise "order_and_paginate_items_is_defined_in_specific_orm"
|
98
98
|
end
|
99
99
|
|
100
100
|
# Returns dt_orders or default as array of index and direction
|
@@ -112,7 +112,9 @@ module TrkDatatables
|
|
112
112
|
@dt_orders_or_default = @dt_params.dt_orders
|
113
113
|
@preferences.set :order, @dt_params.dt_orders
|
114
114
|
else
|
115
|
-
check_value =
|
115
|
+
check_value = lambda { |r|
|
116
|
+
r.is_a?(Array) && r[0].is_a?(Array) && r[0][0].is_a?(Integer) && r[0][0] < @column_key_options.size
|
117
|
+
}
|
116
118
|
@dt_orders_or_default = @preferences.get(:order, check_value) || default_order
|
117
119
|
end
|
118
120
|
@dt_orders_or_default
|
@@ -129,7 +131,7 @@ module TrkDatatables
|
|
129
131
|
def dt_per_page_or_default
|
130
132
|
return @dt_per_page_or_default if defined? @dt_per_page_or_default
|
131
133
|
|
132
|
-
@dt_per_page_or_default =
|
134
|
+
@dt_per_page_or_default =
|
133
135
|
if @dt_params.dt_per_page.present?
|
134
136
|
@preferences.set :per_page, @dt_params.dt_per_page
|
135
137
|
@dt_params.dt_per_page
|
@@ -216,31 +218,31 @@ module TrkDatatables
|
|
216
218
|
end
|
217
219
|
|
218
220
|
def predefined_ranges
|
219
|
-
Time.zone ||=
|
221
|
+
Time.zone ||= "UTC"
|
220
222
|
{
|
221
223
|
date: predefined_date_ranges,
|
222
|
-
datetime: predefined_datetime_ranges
|
224
|
+
datetime: predefined_datetime_ranges
|
223
225
|
}
|
224
226
|
end
|
225
227
|
|
226
228
|
def predefined_date_ranges # rubocop:todo Metrics/AbcSize
|
227
229
|
{
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
230
|
+
Today: Time.zone.today..Time.zone.today,
|
231
|
+
Yesterday: [Time.zone.today - 1.day, Time.zone.today - 1.day],
|
232
|
+
"This Month": Time.zone.today.beginning_of_month...Time.zone.today,
|
233
|
+
"Last Month": Time.zone.today.prev_month.beginning_of_month...Time.zone.today.prev_month.end_of_month,
|
234
|
+
"This Year": Time.zone.today.beginning_of_year...Time.zone.today
|
233
235
|
}
|
234
236
|
end
|
235
237
|
|
236
238
|
def predefined_datetime_ranges # rubocop:todo Metrics/AbcSize
|
237
239
|
{
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
240
|
+
Today: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day,
|
241
|
+
Yesterday: [Time.zone.now.beginning_of_day - 1.day, Time.zone.now.end_of_day - 1.day],
|
242
|
+
"This Month": Time.zone.today.beginning_of_month.beginning_of_day...Time.zone.now.end_of_day,
|
243
|
+
"Last Month":
|
242
244
|
Time.zone.today.prev_month.beginning_of_month.beginning_of_day...Time.zone.today.prev_month.end_of_month.end_of_day,
|
243
|
-
|
245
|
+
"This Year": Time.zone.today.beginning_of_year.beginning_of_day...Time.zone.today.end_of_day
|
244
246
|
}
|
245
247
|
end
|
246
248
|
end
|
@@ -7,13 +7,18 @@ module TrkDatatables
|
|
7
7
|
|
8
8
|
def self.determine_db_type_for_column
|
9
9
|
# converts TrkDatatables::IntegerCalculatedInDb to :integer
|
10
|
-
name.sub(
|
10
|
+
name.sub("TrkDatatables::", "").sub("CalculatedInDb", "").downcase.to_sym
|
11
11
|
end
|
12
12
|
end
|
13
|
+
|
13
14
|
class StringCalculatedInDb < CalculatedInDb; end
|
15
|
+
|
14
16
|
class IntegerCalculatedInDb < CalculatedInDb; end
|
17
|
+
|
15
18
|
class DateCalculatedInDb < CalculatedInDb; end
|
19
|
+
|
16
20
|
class DatetimeCalculatedInDb < CalculatedInDb; end
|
21
|
+
|
17
22
|
class BooleanCalculatedInDb < CalculatedInDb; end
|
18
23
|
|
19
24
|
class ColumnKeyOptions
|
@@ -55,10 +60,10 @@ module TrkDatatables
|
|
55
60
|
# for 'columns' that are calculated in Ruby you need to disable search and
|
56
61
|
# order and than it will not be used in queries
|
57
62
|
|
58
|
-
STRING_TYPE_CAST_POSTGRES =
|
59
|
-
STRING_TYPE_CAST_MYSQL
|
60
|
-
STRING_TYPE_CAST_SQLITE
|
61
|
-
STRING_TYPE_CAST_ORACLE
|
63
|
+
STRING_TYPE_CAST_POSTGRES = "VARCHAR".freeze
|
64
|
+
STRING_TYPE_CAST_MYSQL = "CHAR".freeze
|
65
|
+
STRING_TYPE_CAST_SQLITE = "TEXT".freeze
|
66
|
+
STRING_TYPE_CAST_ORACLE = "VARCHAR2(4000)".freeze
|
62
67
|
|
63
68
|
DB_ADAPTER_STRING_TYPE_CAST = {
|
64
69
|
postgresql: STRING_TYPE_CAST_POSTGRES,
|
@@ -88,12 +93,12 @@ module TrkDatatables
|
|
88
93
|
# In case first element is hash than we will use that hash
|
89
94
|
if cols.is_a? Array
|
90
95
|
cols = if cols.first.is_a? Hash
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
96
|
+
cols.first
|
97
|
+
else
|
98
|
+
cols.each_with_object({}) do |column_key, hash|
|
99
|
+
hash[column_key.to_sym] = {}
|
100
|
+
end
|
101
|
+
end
|
97
102
|
end
|
98
103
|
_set_data(cols)
|
99
104
|
_set_global_search_cols(global_search_cols)
|
@@ -102,26 +107,28 @@ module TrkDatatables
|
|
102
107
|
|
103
108
|
def _set_data(cols)
|
104
109
|
@data = cols.each_with_object([]) do |(column_key, column_options), arr|
|
105
|
-
raise Error,
|
110
|
+
raise Error, "Column options needs to be a Hash" unless column_options.is_a? Hash
|
106
111
|
|
107
112
|
column_options.assert_valid_keys(*COLUMN_OPTIONS)
|
108
|
-
table_name, column_name = column_key.to_s.split
|
109
|
-
if table_name.present? && table_name.
|
113
|
+
table_name, column_name = column_key.to_s.split "."
|
114
|
+
if table_name.present? && table_name.end_with?("_calculated_in_db")
|
110
115
|
# in calculated columns table_name is used only to determine type
|
111
116
|
column_key = column_name
|
112
117
|
elsif table_name.present? && column_name.nil?
|
113
|
-
raise Error,
|
118
|
+
raise Error,
|
119
|
+
"Unless table name ends with _calculated_in_db, column key needs to have one dot for example: posts.name"
|
114
120
|
end
|
115
121
|
|
116
122
|
if table_name.blank?
|
117
|
-
column_name = column_options[TITLE_OPTION] ||
|
123
|
+
column_name = column_options[TITLE_OPTION] || "actions" # some default name for a title
|
118
124
|
column_options[SEARCH_OPTION] = false
|
119
125
|
column_options[ORDER_OPTION] = false
|
120
126
|
else
|
121
127
|
table_class = _determine_table_class table_name, column_options[CLASS_NAME]
|
122
128
|
|
123
129
|
unless column_options[SEARCH_OPTION] == false && column_options[ORDER_OPTION] == false
|
124
|
-
column_type_in_db = column_options[COLUMN_TYPE_IN_DB] || _determine_db_type_for_column(table_class,
|
130
|
+
column_type_in_db = column_options[COLUMN_TYPE_IN_DB] || _determine_db_type_for_column(table_class,
|
131
|
+
column_name)
|
125
132
|
end
|
126
133
|
end
|
127
134
|
arr << {
|
@@ -132,7 +139,7 @@ module TrkDatatables
|
|
132
139
|
column_type_in_db: column_type_in_db,
|
133
140
|
# the following are used for RenderHtml
|
134
141
|
title: column_options[TITLE_OPTION] || _determine_column_name(table_class, column_name),
|
135
|
-
html_options: html_options(column_options, column_type_in_db)
|
142
|
+
html_options: html_options(column_options, column_type_in_db)
|
136
143
|
}
|
137
144
|
end
|
138
145
|
end
|
@@ -145,7 +152,7 @@ module TrkDatatables
|
|
145
152
|
# note that when class is not eager loaded than const_defined? returns false
|
146
153
|
if class_name.present?
|
147
154
|
class_name.constantize
|
148
|
-
elsif table_name.
|
155
|
+
elsif table_name.end_with? "_calculated_in_db"
|
149
156
|
"TrkDatatables::#{table_name.classify}".constantize
|
150
157
|
else
|
151
158
|
table_name.classify.constantize
|
@@ -153,10 +160,13 @@ module TrkDatatables
|
|
153
160
|
end
|
154
161
|
|
155
162
|
def _set_global_search_cols(global_search_cols)
|
156
|
-
|
163
|
+
unless global_search_cols.is_a? Array
|
164
|
+
raise Error,
|
165
|
+
"global_search_cols should be array, for example %w[users.name]"
|
166
|
+
end
|
157
167
|
|
158
168
|
@global_search_cols = global_search_cols.each_with_object([]) do |column_key, arr|
|
159
|
-
table_name, column_name = column_key.to_s.split
|
169
|
+
table_name, column_name = column_key.to_s.split "."
|
160
170
|
table_class = _determine_table_class table_name
|
161
171
|
column_type_in_db = _determine_db_type_for_column(table_class, column_name)
|
162
172
|
arr << {
|
@@ -164,7 +174,7 @@ module TrkDatatables
|
|
164
174
|
column_options: {},
|
165
175
|
table_class: table_class,
|
166
176
|
column_name: column_name,
|
167
|
-
column_type_in_db: column_type_in_db
|
177
|
+
column_type_in_db: column_type_in_db
|
168
178
|
}
|
169
179
|
end
|
170
180
|
end
|
@@ -173,13 +183,13 @@ module TrkDatatables
|
|
173
183
|
def _determine_string_type_cast # :nodoc:
|
174
184
|
if defined?(::ActiveRecord::Base)
|
175
185
|
current_adapter = if ::ActiveRecord::Base.respond_to?(:connection_db_config)
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
186
|
+
::ActiveRecord::Base.connection_db_config.configuration_hash[:adapter]
|
187
|
+
else
|
188
|
+
::ActiveRecord::Base.connection_config[:adapter]
|
189
|
+
end
|
180
190
|
DB_ADAPTER_STRING_TYPE_CAST[current_adapter.to_sym]
|
181
191
|
else
|
182
|
-
|
192
|
+
"not_used"
|
183
193
|
end
|
184
194
|
end
|
185
195
|
|
@@ -196,7 +206,7 @@ module TrkDatatables
|
|
196
206
|
elsif defined?(::Neo4j::ActiveNode)
|
197
207
|
(table_class.declared_properties[column_name][:type] || String).name.downcase
|
198
208
|
else
|
199
|
-
raise NotImplementedError,
|
209
|
+
raise NotImplementedError, "I work only with ActiveRecord and Neo4j"
|
200
210
|
end
|
201
211
|
end
|
202
212
|
|
@@ -235,27 +245,27 @@ module TrkDatatables
|
|
235
245
|
i = @data.find_index do |column_key_option|
|
236
246
|
column_key_option[:column_key] == column_key.to_sym
|
237
247
|
end
|
238
|
-
raise Error, "Can't find index for #{column_key} in #{@data.map { |d| d[:column_key] }.join(
|
248
|
+
raise Error, "Can't find index for #{column_key} in #{@data.map { |d| d[:column_key] }.join(", ")}" if i.nil?
|
239
249
|
|
240
250
|
i
|
241
251
|
end
|
242
252
|
|
243
253
|
def html_options(column_options, column_type_in_db)
|
244
254
|
res = {}
|
245
|
-
res[
|
246
|
-
res[
|
247
|
-
res[
|
248
|
-
res[
|
255
|
+
res["data-searchable"] = false if column_options[SEARCH_OPTION] == false
|
256
|
+
res["data-orderable"] = false if column_options[ORDER_OPTION] == false
|
257
|
+
res["data-datatable-hidden-column"] = true if column_options[HIDE_OPTION] == true
|
258
|
+
res["data-datatable-checkbox"] = true if column_type_in_db == :boolean
|
249
259
|
if %i[date datetime].include? column_type_in_db
|
250
|
-
res[
|
260
|
+
res["data-datatable-range"] = (column_type_in_db == :datetime) ? :datetime : true
|
251
261
|
if column_options[PREDEFINED_RANGES].present? ||
|
252
262
|
(@predefined_ranges.try(:[], column_type_in_db).present? && column_options[PREDEFINED_RANGES] != false)
|
253
|
-
res[
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
res[
|
263
|
+
res["data-datatable-predefined-ranges"] = if column_options[PREDEFINED_RANGES].is_a? Hash
|
264
|
+
column_options[PREDEFINED_RANGES]
|
265
|
+
else
|
266
|
+
@predefined_ranges[column_type_in_db]
|
267
|
+
end
|
268
|
+
res["data-datatable-predefined-ranges"].transform_values! do |range|
|
259
269
|
[range.first.to_s, range.last.to_s]
|
260
270
|
end
|
261
271
|
end
|
@@ -40,12 +40,12 @@ module TrkDatatables
|
|
40
40
|
@dt_orders = []
|
41
41
|
return @dt_orders if @params[:order].blank?
|
42
42
|
|
43
|
-
@dt_orders =
|
43
|
+
@dt_orders =
|
44
44
|
@params[:order].each_with_object([]) do |(_index, dt_order), a|
|
45
45
|
# for order we ignore key (_index) since order is preserved
|
46
46
|
a << [
|
47
47
|
dt_order[:column].to_i,
|
48
|
-
dt_order[:dir]&.to_s&.casecmp(
|
48
|
+
dt_order[:dir]&.to_s&.casecmp("ASC")&.zero? ? :asc : :desc
|
49
49
|
]
|
50
50
|
end
|
51
51
|
@dt_orders
|
@@ -69,9 +69,9 @@ module TrkDatatables
|
|
69
69
|
@params[:columns].each.map do |(dt_position, dt_column)|
|
70
70
|
@dt_columns[dt_position.to_i] = {
|
71
71
|
index: dt_position.to_i,
|
72
|
-
searchable: dt_column[:searchable].to_s !=
|
73
|
-
orderable: dt_column[:orderable].to_s !=
|
74
|
-
search_value: (dt_column[:search] && dt_column[:search][:value]) ||
|
72
|
+
searchable: dt_column[:searchable].to_s != "false", # if nil as it is in set_params, than use true
|
73
|
+
orderable: dt_column[:orderable].to_s != "false", # if nil as it is in set_params, than use true
|
74
|
+
search_value: (dt_column[:search] && dt_column[:search][:value]) || ""
|
75
75
|
}
|
76
76
|
end
|
77
77
|
@dt_columns.each_with_index do |dt_column, i|
|
@@ -81,20 +81,20 @@ module TrkDatatables
|
|
81
81
|
index: i,
|
82
82
|
searchable: true,
|
83
83
|
orderable: true,
|
84
|
-
search_value:
|
84
|
+
search_value: ""
|
85
85
|
}
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
89
|
def search_all
|
90
|
-
@params.dig(:search, :value) ||
|
90
|
+
@params.dig(:search, :value) || ""
|
91
91
|
rescue TypeError => e
|
92
92
|
raise Error, e.message + '. Global search is in a format: { "search": { "value": "ABC" } }'
|
93
93
|
end
|
94
94
|
|
95
95
|
def as_json(all_count, filtered_count, data, additional = {})
|
96
96
|
additional = {} if additional.nil?
|
97
|
-
raise Error,
|
97
|
+
raise Error, "additional_data_for_json needs to be a hash" unless additional.is_a? Hash
|
98
98
|
|
99
99
|
draw = @params[:draw].to_i
|
100
100
|
{
|
@@ -102,7 +102,7 @@ module TrkDatatables
|
|
102
102
|
recordsTotal: all_count,
|
103
103
|
recordsFiltered: filtered_count,
|
104
104
|
**additional,
|
105
|
-
data: data
|
105
|
+
data: data
|
106
106
|
}
|
107
107
|
end
|
108
108
|
|
@@ -111,7 +111,7 @@ module TrkDatatables
|
|
111
111
|
end
|
112
112
|
|
113
113
|
def self.order_set(column_index, direction)
|
114
|
-
{order: {
|
114
|
+
{order: {"0": {column: column_index, dir: direction}}}
|
115
115
|
end
|
116
116
|
|
117
117
|
def self.form_field_name(column_index)
|
@@ -121,51 +121,52 @@ module TrkDatatables
|
|
121
121
|
def param_get(column_index)
|
122
122
|
@params.dig :columns, column_index.to_s, :search, :value
|
123
123
|
rescue TypeError => e
|
124
|
-
raise Error,
|
124
|
+
raise Error,
|
125
|
+
"#{e.message}. Column search is in a format: { \"columns\": { \"0\": { \"search\": { \"value\": { \"ABC\" } } } } }"
|
125
126
|
end
|
126
127
|
|
127
128
|
def self.sample_view_params(options = {})
|
128
129
|
OpenStruct.new(
|
129
|
-
params: sample_params(options)
|
130
|
+
params: sample_params(options)
|
130
131
|
)
|
131
132
|
end
|
132
133
|
|
133
134
|
def self.sample_params(options = {})
|
134
135
|
HashWithIndifferentAccess.new(
|
135
|
-
draw:
|
136
|
-
start:
|
137
|
-
length:
|
136
|
+
draw: "1",
|
137
|
+
start: "0",
|
138
|
+
length: "10",
|
138
139
|
search: {
|
139
|
-
value:
|
140
|
+
value: "", regex: "false"
|
140
141
|
},
|
141
142
|
order: {
|
142
|
-
|
143
|
+
"0": {column: "0", dir: "desc"}
|
143
144
|
},
|
144
145
|
# [:columns] should have the same size as column_key_options since we
|
145
146
|
# ignore keys, and use positions
|
146
147
|
columns: {
|
147
|
-
|
148
|
-
searchable:
|
149
|
-
orderable:
|
148
|
+
"0": {
|
149
|
+
searchable: "true",
|
150
|
+
orderable: "true",
|
150
151
|
search: {
|
151
|
-
value:
|
152
|
+
value: "", regex: "false"
|
152
153
|
}
|
153
154
|
},
|
154
|
-
|
155
|
-
searchable:
|
156
|
-
orderable:
|
155
|
+
"1": {
|
156
|
+
searchable: "true",
|
157
|
+
orderable: "true",
|
157
158
|
search: {
|
158
|
-
value:
|
159
|
+
value: "", regex: "false"
|
159
160
|
}
|
160
161
|
},
|
161
|
-
|
162
|
-
searchable:
|
163
|
-
orderable:
|
162
|
+
"2": {
|
163
|
+
searchable: "true",
|
164
|
+
orderable: "false",
|
164
165
|
search: {
|
165
|
-
value:
|
166
|
+
value: "", regex: "false"
|
166
167
|
}
|
167
|
-
}
|
168
|
-
}
|
168
|
+
}
|
169
|
+
}
|
169
170
|
).merge options
|
170
171
|
end
|
171
172
|
end
|
data/lib/trk_datatables/neo4j.rb
CHANGED
@@ -6,7 +6,7 @@ module TrkDatatables
|
|
6
6
|
# https://neo4jrb.readthedocs.io/en/stable/QueryClauseMethods.html?highlight=where#where
|
7
7
|
sql = @column_key_options.searchable_and_global_search.map do |column_key_option|
|
8
8
|
"#{column_key_option[:column_key]} =~ ?"
|
9
|
-
end.join(
|
9
|
+
end.join(" or ")
|
10
10
|
|
11
11
|
filtered.where sql, ".*#{@dt_params.search_all}.*"
|
12
12
|
end
|
@@ -17,8 +17,7 @@ module TrkDatatables
|
|
17
17
|
|
18
18
|
def order_and_paginate_items(filtered)
|
19
19
|
filtered = order_items filtered
|
20
|
-
filtered
|
21
|
-
filtered
|
20
|
+
filtered.offset(@dt_params.dt_offset).limit(dt_per_page_or_default)
|
22
21
|
end
|
23
22
|
|
24
23
|
def order_items(filtered)
|
@@ -28,7 +27,7 @@ module TrkDatatables
|
|
28
27
|
|
29
28
|
queries << "#{column_key_option[:column_key]} #{direction}"
|
30
29
|
end
|
31
|
-
filtered.order(order_by.join(
|
30
|
+
filtered.order(order_by.join(", "))
|
32
31
|
end
|
33
32
|
end
|
34
33
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module TrkDatatables
|
2
2
|
class Preferences
|
3
|
-
KEY_IN_PREFERENCES =
|
3
|
+
KEY_IN_PREFERENCES = "trk_datatables"
|
4
4
|
def initialize(holder, field, class_name)
|
5
5
|
@holder = holder
|
6
6
|
@field = field
|
@@ -15,14 +15,14 @@ module TrkDatatables
|
|
15
15
|
|
16
16
|
result = @holder.send(@field).dig KEY_IN_PREFERENCES, @class_name, key
|
17
17
|
return result if check_value.nil?
|
18
|
-
|
18
|
+
result if check_value.call result
|
19
19
|
end
|
20
20
|
|
21
21
|
def set(key, value)
|
22
22
|
return unless @holder
|
23
23
|
|
24
24
|
h = {KEY_IN_PREFERENCES => {@class_name => {key => value}}}
|
25
|
-
@holder.send("#{@field}=", {}) if @holder.send(@field).nil?
|
25
|
+
@holder.send(:"#{@field}=", {}) if @holder.send(@field).nil?
|
26
26
|
@holder.send(@field).deep_merge! h
|
27
27
|
@holder.save!
|
28
28
|
end
|
@@ -43,16 +43,16 @@ module TrkDatatables
|
|
43
43
|
inline = true
|
44
44
|
end
|
45
45
|
self.class.indent += 1
|
46
|
-
html = "#{
|
46
|
+
html = "#{" " * self.class.indent}<#{tag}".html_safe
|
47
47
|
options.each do |attribute, value|
|
48
48
|
value = value.to_json if value.is_a?(Hash) || value.is_a?(Array)
|
49
49
|
html << " #{attribute}='".html_safe << replace_quote(value) << "'".html_safe
|
50
50
|
end
|
51
51
|
html << if inline
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
52
|
+
">".html_safe << content.to_s << "</#{tag}>\n".html_safe
|
53
|
+
else
|
54
|
+
">\n".html_safe << yield << "\n#{" " * self.class.indent}</#{tag}>".html_safe
|
55
|
+
end
|
56
56
|
self.class.indent -= 1 if self.class.indent > 1
|
57
57
|
html
|
58
58
|
end
|
@@ -62,7 +62,7 @@ module TrkDatatables
|
|
62
62
|
def _select_find_options(options, search_value)
|
63
63
|
selected = search_value.to_s.split(MULTIPLE_OPTION_SEPARATOR)
|
64
64
|
options.map do |key, value|
|
65
|
-
{key: key, value: value}.merge(selected.include?(value.to_s) ? {selected:
|
65
|
+
{key: key, value: value}.merge(selected.include?(value.to_s) ? {selected: "selected"} : {})
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
@@ -82,14 +82,14 @@ module TrkDatatables
|
|
82
82
|
_content_tag(
|
83
83
|
:table,
|
84
84
|
class: "table table-bordered table-striped #{@html_options[:class]}",
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
85
|
+
"data-datatable": true,
|
86
|
+
"data-datatable-ajax-url": @search_link,
|
87
|
+
"data-datatable-page-length": @datatable.dt_per_page_or_default,
|
88
|
+
"data-datatable-order": @datatable.dt_orders_or_default_index_and_direction.to_json,
|
89
89
|
# for initial page load we do not have ability to show recordsTotal
|
90
90
|
# https://github.com/trkin/trk_datatables_js/issues/1
|
91
|
-
|
92
|
-
|
91
|
+
"data-datatable-total-length": @datatable.filtered_items_count,
|
92
|
+
"data-datatable-dom": @html_options[:"data-datatable-dom"] || '<"trk-global-search-wrapper"f>rtp<"trk-move-up"il>'
|
93
93
|
) do
|
94
94
|
thead << "\n".html_safe << tbody
|
95
95
|
end +
|
@@ -102,11 +102,14 @@ module TrkDatatables
|
|
102
102
|
safe_join(@datatable.column_key_options.map do |column_key_option|
|
103
103
|
options = column_key_option[:html_options]
|
104
104
|
# add eventual value from params
|
105
|
-
search_value = @datatable.param_get(column_key_option[:column_key]) if options[
|
106
|
-
options[
|
105
|
+
search_value = @datatable.param_get(column_key_option[:column_key]) if options["data-searchable"] != false
|
106
|
+
options["data-datatable-search-value"] = search_value if search_value.present?
|
107
107
|
# add eventual select element
|
108
108
|
select_options = column_key_option[:column_options][ColumnKeyOptions::SELECT_OPTIONS]
|
109
|
-
|
109
|
+
if select_options.present?
|
110
|
+
options["data-datatable-multiselect"] =
|
111
|
+
_select_find_options select_options, search_value
|
112
|
+
end
|
110
113
|
# all other options are pulled from column_key_option[:html_options]
|
111
114
|
_content_tag :th, options, column_key_option[:title]
|
112
115
|
end)
|
@@ -148,7 +151,7 @@ module TrkDatatables
|
|
148
151
|
# # https://github.com/trkin/trk_datatables_js/issues/1
|
149
152
|
# 'data-datatable-total-length': @datatable.filtered_items_count,
|
150
153
|
# ) do
|
151
|
-
|
154
|
+
""
|
152
155
|
end
|
153
156
|
end
|
154
157
|
end
|
data/lib/trk_datatables.rb
CHANGED
@@ -1,22 +1,23 @@
|
|
1
|
-
require
|
2
|
-
# modules
|
3
|
-
require 'trk_datatables/preferences.rb'
|
4
|
-
require 'trk_datatables/base_helpers'
|
5
|
-
require 'trk_datatables/base'
|
6
|
-
require 'trk_datatables/active_record'
|
7
|
-
require 'trk_datatables/neo4j'
|
8
|
-
require 'trk_datatables/dt_params'
|
9
|
-
require 'trk_datatables/column_key_options.rb'
|
10
|
-
require 'trk_datatables/render_html.rb'
|
11
|
-
|
1
|
+
require "trk_datatables/version"
|
12
2
|
# libs
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
3
|
+
require "active_support/core_ext/hash/indifferent_access"
|
4
|
+
require "active_support/core_ext/hash/keys"
|
5
|
+
require "active_support/core_ext/string/inflections"
|
6
|
+
require "active_support/core_ext/string/output_safety"
|
7
|
+
require "active_support/core_ext/time/zones"
|
18
8
|
|
9
|
+
require "ostruct"
|
19
10
|
# we need to define here since some conventions will look for definition in this file
|
11
|
+
# modules
|
12
|
+
require "trk_datatables/preferences"
|
13
|
+
require "trk_datatables/base_helpers"
|
14
|
+
require "trk_datatables/base"
|
15
|
+
require "trk_datatables/active_record"
|
16
|
+
require "trk_datatables/neo4j"
|
17
|
+
require "trk_datatables/dt_params"
|
18
|
+
require "trk_datatables/column_key_options"
|
19
|
+
require "trk_datatables/render_html"
|
20
|
+
|
20
21
|
module TrkDatatables
|
21
22
|
class Error < StandardError
|
22
23
|
def message
|
data/trk_datatables.gemspec
CHANGED
@@ -1,31 +1,30 @@
|
|
1
|
-
lib = File.expand_path(
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require
|
3
|
+
require "trk_datatables/version"
|
4
4
|
|
5
|
-
# rubocop:disable Metrics/BlockLength
|
6
5
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.authors
|
10
|
-
spec.email
|
6
|
+
spec.name = "trk_datatables"
|
7
|
+
spec.version = TrkDatatables::VERSION
|
8
|
+
spec.authors = ["Dusan Orlovic"]
|
9
|
+
spec.email = ["[email protected]"]
|
11
10
|
|
12
|
-
spec.summary
|
13
|
-
spec.description
|
14
|
-
spec.homepage
|
15
|
-
spec.license
|
11
|
+
spec.summary = "Gem that simplify using datatables with Ruby on Rails and Sinatra."
|
12
|
+
spec.description = "Html render first page, sort and filter..."
|
13
|
+
spec.homepage = "https://github.com/trkin/trk_datatables"
|
14
|
+
spec.license = "MIT"
|
16
15
|
|
17
16
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
17
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
18
|
if spec.respond_to?(:metadata)
|
20
|
-
spec.metadata[
|
19
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
21
20
|
|
22
|
-
spec.metadata[
|
23
|
-
spec.metadata[
|
24
|
-
spec.metadata[
|
25
|
-
spec.metadata[
|
21
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
22
|
+
spec.metadata["source_code_uri"] = "https://github.com/trkin/trk_datatables"
|
23
|
+
spec.metadata["changelog_uri"] = "https://github.com/trkin/trk_datatables/blob/master/CHANGELOG.md"
|
24
|
+
spec.metadata["yard.run"] = "yri" # use "yard" to build full HTML docs.
|
26
25
|
else
|
27
|
-
raise
|
28
|
-
|
26
|
+
raise "RubyGems 2.0 or newer is required to protect against " \
|
27
|
+
"public gem pushes."
|
29
28
|
end
|
30
29
|
|
31
30
|
# Specify which files should be added to the gem when it is released.
|
@@ -33,22 +32,22 @@ Gem::Specification.new do |spec|
|
|
33
32
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
34
33
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
35
34
|
end
|
36
|
-
spec.bindir
|
37
|
-
spec.executables
|
38
|
-
spec.require_paths = [
|
35
|
+
spec.bindir = "exe"
|
36
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
37
|
+
spec.require_paths = ["lib"]
|
39
38
|
|
40
39
|
# for HashWithIndifferentAccess
|
41
|
-
spec.add_dependency
|
40
|
+
spec.add_dependency "activesupport"
|
42
41
|
|
43
|
-
spec.add_development_dependency
|
44
|
-
spec.add_development_dependency
|
45
|
-
spec.add_development_dependency
|
46
|
-
spec.add_development_dependency
|
47
|
-
spec.add_development_dependency
|
48
|
-
spec.add_development_dependency
|
49
|
-
spec.add_development_dependency
|
50
|
-
spec.add_development_dependency
|
51
|
-
spec.add_development_dependency
|
52
|
-
spec.add_development_dependency
|
42
|
+
spec.add_development_dependency "activerecord", "~> 6.0"
|
43
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
44
|
+
spec.add_development_dependency "byebug"
|
45
|
+
spec.add_development_dependency "database_cleaner"
|
46
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
47
|
+
spec.add_development_dependency "minitest-color"
|
48
|
+
spec.add_development_dependency "pg"
|
49
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
50
|
+
spec.add_development_dependency "sqlite3"
|
51
|
+
spec.add_development_dependency "timecop"
|
52
|
+
spec.add_development_dependency "standard"
|
53
53
|
end
|
54
|
-
# rubocop:enable Metrics/BlockLength
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trk_datatables
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dusan Orlovic
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: pg
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
@@ -123,7 +123,21 @@ dependencies:
|
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
126
|
+
name: rake
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '10.0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '10.0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: sqlite3
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
143
|
- - ">="
|
@@ -137,21 +151,21 @@ dependencies:
|
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: '0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
154
|
+
name: timecop
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
142
156
|
requirements:
|
143
|
-
- - "
|
157
|
+
- - ">="
|
144
158
|
- !ruby/object:Gem::Version
|
145
|
-
version: '
|
159
|
+
version: '0'
|
146
160
|
type: :development
|
147
161
|
prerelease: false
|
148
162
|
version_requirements: !ruby/object:Gem::Requirement
|
149
163
|
requirements:
|
150
|
-
- - "
|
164
|
+
- - ">="
|
151
165
|
- !ruby/object:Gem::Version
|
152
|
-
version: '
|
166
|
+
version: '0'
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
168
|
+
name: standard
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
156
170
|
requirements:
|
157
171
|
- - ">="
|
@@ -172,6 +186,7 @@ extensions: []
|
|
172
186
|
extra_rdoc_files: []
|
173
187
|
files:
|
174
188
|
- ".gitignore"
|
189
|
+
- ".ruby-version"
|
175
190
|
- ".travis.yml"
|
176
191
|
- CHANGELOG.md
|
177
192
|
- CODE_OF_CONDUCT.md
|