effective_datatables 2.12.2 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +632 -512
- data/app/assets/javascripts/dataTables/buttons/buttons.html5.js +176 -177
- data/app/assets/javascripts/dataTables/buttons/buttons.print.js +2 -0
- data/app/assets/javascripts/dataTables/buttons/dataTables.buttons.js +14 -14
- data/app/assets/javascripts/dataTables/dataTables.bootstrap.js +1 -1
- data/app/assets/javascripts/dataTables/jquery.dataTables.js +246 -217
- data/app/assets/javascripts/effective_datatables.js +2 -3
- data/app/assets/javascripts/effective_datatables/events.js.coffee +7 -0
- data/app/assets/javascripts/effective_datatables/filters.js.coffee +6 -0
- data/app/assets/javascripts/effective_datatables/initialize.js.coffee +42 -39
- data/app/assets/javascripts/effective_datatables/reset.js.coffee +7 -0
- data/app/assets/javascripts/vendor/jquery.delayedChange.js +1 -1
- data/app/assets/stylesheets/dataTables/dataTables.bootstrap.css +0 -1
- data/app/assets/stylesheets/effective_datatables.scss +1 -2
- data/app/assets/stylesheets/effective_datatables/{_scopes.scss → _filters.scss} +1 -1
- data/app/assets/stylesheets/effective_datatables/_overrides.scss +1 -1
- data/app/controllers/effective/datatables_controller.rb +2 -4
- data/app/helpers/effective_datatables_helper.rb +56 -91
- data/app/helpers/effective_datatables_private_helper.rb +55 -64
- data/app/models/effective/datatable.rb +103 -177
- data/app/models/effective/datatable_column.rb +28 -0
- data/app/models/effective/datatable_column_tool.rb +110 -0
- data/app/models/effective/datatable_dsl_tool.rb +28 -0
- data/app/models/effective/datatable_value_tool.rb +142 -0
- data/app/models/effective/effective_datatable/attributes.rb +25 -0
- data/app/models/effective/effective_datatable/collection.rb +38 -0
- data/app/models/effective/effective_datatable/compute.rb +154 -0
- data/app/models/effective/effective_datatable/cookie.rb +29 -0
- data/app/models/effective/effective_datatable/dsl.rb +14 -8
- data/app/models/effective/effective_datatable/dsl/bulk_actions.rb +5 -6
- data/app/models/effective/effective_datatable/dsl/charts.rb +7 -9
- data/app/models/effective/effective_datatable/dsl/datatable.rb +107 -57
- data/app/models/effective/effective_datatable/dsl/filters.rb +50 -0
- data/app/models/effective/effective_datatable/format.rb +157 -0
- data/app/models/effective/effective_datatable/hooks.rb +0 -18
- data/app/models/effective/effective_datatable/params.rb +34 -0
- data/app/models/effective/effective_datatable/resource.rb +108 -0
- data/app/models/effective/effective_datatable/state.rb +178 -0
- data/app/views/effective/datatables/_actions_column.html.haml +9 -42
- data/app/views/effective/datatables/_bulk_actions_column.html.haml +1 -1
- data/app/views/effective/datatables/_bulk_actions_dropdown.html.haml +2 -3
- data/app/views/effective/datatables/_chart.html.haml +1 -1
- data/app/views/effective/datatables/_datatable.html.haml +7 -25
- data/app/views/effective/datatables/_filters.html.haml +21 -0
- data/app/views/effective/datatables/_reset.html.haml +2 -0
- data/app/views/effective/datatables/_resource_column.html.haml +8 -0
- data/app/views/effective/datatables/index.html.haml +0 -1
- data/config/effective_datatables.rb +9 -32
- data/lib/effective_datatables.rb +2 -6
- data/lib/effective_datatables/engine.rb +1 -1
- data/lib/effective_datatables/version.rb +1 -1
- data/lib/generators/effective_datatables/install_generator.rb +2 -2
- metadata +39 -19
- data/app/assets/javascripts/dataTables/colreorder/dataTables.colReorder.js +0 -27
- data/app/assets/javascripts/dataTables/jszip/jszip.js +0 -9155
- data/app/assets/javascripts/effective_datatables/scopes.js.coffee +0 -9
- data/app/models/effective/active_record_datatable_tool.rb +0 -242
- data/app/models/effective/array_datatable_tool.rb +0 -97
- data/app/models/effective/effective_datatable/ajax.rb +0 -101
- data/app/models/effective/effective_datatable/charts.rb +0 -20
- data/app/models/effective/effective_datatable/dsl/scopes.rb +0 -23
- data/app/models/effective/effective_datatable/helpers.rb +0 -24
- data/app/models/effective/effective_datatable/options.rb +0 -309
- data/app/models/effective/effective_datatable/rendering.rb +0 -365
- data/app/views/effective/datatables/_scopes.html.haml +0 -21
@@ -1,9 +0,0 @@
|
|
1
|
-
$(document).on 'click', 'a[data-clear-form]', (event) ->
|
2
|
-
event.preventDefault()
|
3
|
-
$(event.currentTarget).closest('form').trigger('clear')
|
4
|
-
|
5
|
-
$(document).on 'clear', '.effective-datatable-scopes form', (event) ->
|
6
|
-
$(this).find('.radio.active').removeClass('active');
|
7
|
-
$(this).find(':radio').prop('checked', false);
|
8
|
-
$('form.form-inline input:not([type=submit])').val('');
|
9
|
-
$(this).submit()
|
@@ -1,242 +0,0 @@
|
|
1
|
-
module Effective
|
2
|
-
class ActiveRecordDatatableTool
|
3
|
-
attr_accessor :table_columns
|
4
|
-
|
5
|
-
delegate :page, :per_page, :search_column, :order_column, :collection_class, :quote_sql, :to => :@datatable
|
6
|
-
|
7
|
-
def initialize(datatable, table_columns)
|
8
|
-
@datatable = datatable
|
9
|
-
@table_columns = table_columns
|
10
|
-
end
|
11
|
-
|
12
|
-
def search_terms
|
13
|
-
@search_terms ||= @datatable.search_terms.select { |name, search_term| table_columns.key?(name) }
|
14
|
-
end
|
15
|
-
|
16
|
-
def order_by_column
|
17
|
-
@order_by_column ||= table_columns[@datatable.order_name]
|
18
|
-
end
|
19
|
-
|
20
|
-
def order(collection)
|
21
|
-
return collection unless order_by_column.present?
|
22
|
-
|
23
|
-
column_order = order_column(collection, order_by_column, @datatable.order_direction, order_by_column[:column])
|
24
|
-
raise 'order_column must return an ActiveRecord::Relation object' unless column_order.kind_of?(ActiveRecord::Relation)
|
25
|
-
column_order
|
26
|
-
end
|
27
|
-
|
28
|
-
def order_column_with_defaults(collection, table_column, direction, sql_column)
|
29
|
-
before = ''; after = ''
|
30
|
-
sql_direction = (direction == :desc ? 'DESC' : 'ASC')
|
31
|
-
|
32
|
-
if postgres?
|
33
|
-
after = if table_column[:nulls] == :first
|
34
|
-
' NULLS FIRST'
|
35
|
-
elsif table_column[:nulls] == :last
|
36
|
-
' NULLS LAST'
|
37
|
-
else
|
38
|
-
" NULLS #{direction == :desc ? 'FIRST' : 'LAST' }"
|
39
|
-
end
|
40
|
-
elsif mysql?
|
41
|
-
before = "ISNULL(#{sql_column}), "
|
42
|
-
end
|
43
|
-
|
44
|
-
if table_column[:type] == :belongs_to_polymorphic
|
45
|
-
collection.order("#{before}#{sql_column.sub('_id', '_type')} #{sql_direction}, #{sql_column} #{sql_direction}#{after}")
|
46
|
-
elsif table_column[:sql_as_column] == true
|
47
|
-
collection.order("#{sql_column} #{sql_direction}")
|
48
|
-
else
|
49
|
-
collection.order("#{before}#{sql_column} #{sql_direction}#{after}")
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def search(collection)
|
54
|
-
search_terms.each do |name, search_term|
|
55
|
-
column_search = search_column(collection, table_columns[name], search_term, table_columns[name][:column])
|
56
|
-
raise 'search_column must return an ActiveRecord::Relation object' unless column_search.kind_of?(ActiveRecord::Relation)
|
57
|
-
collection = column_search
|
58
|
-
end
|
59
|
-
collection
|
60
|
-
end
|
61
|
-
|
62
|
-
def search_column_with_defaults(collection, table_column, term, sql_column)
|
63
|
-
sql_op = table_column[:filter][:sql_operation] || :where # only other option is :having
|
64
|
-
|
65
|
-
case table_column[:type]
|
66
|
-
when :string, :text
|
67
|
-
if sql_op != :where
|
68
|
-
collection.public_send(sql_op, "#{sql_column} = :term", term: term)
|
69
|
-
elsif ['null', 'nil', nil].include?(term)
|
70
|
-
collection.public_send(sql_op, "#{sql_column} = :term OR #{sql_column} IS NULL", term: '')
|
71
|
-
elsif table_column[:filter][:fuzzy]
|
72
|
-
collection.public_send(sql_op, "#{sql_column} #{ilike} :term", term: "%#{term}%")
|
73
|
-
else
|
74
|
-
collection.public_send(sql_op, "#{sql_column} = :term", term: term)
|
75
|
-
end
|
76
|
-
when :belongs_to_polymorphic
|
77
|
-
# our key will be something like Post_15, or Event_1
|
78
|
-
(type, id) = term.split('_')
|
79
|
-
|
80
|
-
if type.present? && id.present?
|
81
|
-
collection.public_send(sql_op, "#{sql_column} = :id AND #{sql_column.sub('_id', '_type')} = :type", id: id, type: type)
|
82
|
-
else
|
83
|
-
collection
|
84
|
-
end
|
85
|
-
when :has_many
|
86
|
-
reflection = collection.klass.reflect_on_association(table_column[:name].to_sym)
|
87
|
-
raise "unable to find #{collection.klass.name} :has_many :#{table_column[:name]} association" unless reflection
|
88
|
-
|
89
|
-
obj = reflection.build_association({})
|
90
|
-
klass = obj.class
|
91
|
-
polymorphic = reflection.options[:as].present?
|
92
|
-
|
93
|
-
inverse = reflection.inverse_of
|
94
|
-
inverse ||= klass.reflect_on_association(reflection.options[:as]) if polymorphic
|
95
|
-
inverse ||= klass.reflect_on_association(collection.table_name)
|
96
|
-
inverse ||= obj.class.reflect_on_association(collection.table_name.singularize)
|
97
|
-
|
98
|
-
raise "unable to find #{klass.name} has_many :#{collection.table_name} or belongs_to :#{collection.table_name.singularize} associations" unless inverse
|
99
|
-
|
100
|
-
ids = if [:select, :grouped_select].include?(table_column[:filter][:as])
|
101
|
-
# Treat the search term as one or more IDs
|
102
|
-
inverse_ids = term.split(',').map { |term| (term = term.to_i) == 0 ? nil : term }.compact
|
103
|
-
return collection unless inverse_ids.present?
|
104
|
-
|
105
|
-
if polymorphic
|
106
|
-
klass.where(id: inverse_ids).where(reflection.type => collection.klass.name).pluck(reflection.foreign_key)
|
107
|
-
else
|
108
|
-
klass.where(id: inverse_ids).joins(inverse.name).pluck(inverse.foreign_key)
|
109
|
-
end
|
110
|
-
else
|
111
|
-
# Treat the search term as a string.
|
112
|
-
klass_columns = if (sql_column == klass.table_name) # No custom column has been defined
|
113
|
-
klass.columns.map { |col| col.name if col.text? }.compact # Search all database text? columns
|
114
|
-
else
|
115
|
-
[sql_column.gsub("#{klass.table_name}.", '')] # table_column :order_items, column: 'order_items.title'
|
116
|
-
end
|
117
|
-
|
118
|
-
if polymorphic
|
119
|
-
klass_columns -= [reflection.type]
|
120
|
-
end
|
121
|
-
|
122
|
-
conditions = klass_columns.map { |col_name| "#{klass.table_name}.#{col_name} #{ilike} :term" }
|
123
|
-
|
124
|
-
if polymorphic
|
125
|
-
klass.where(conditions.join(' OR '), term: "%#{term}%", num: term.to_i).where(reflection.type => collection.klass.name).pluck(reflection.foreign_key)
|
126
|
-
else
|
127
|
-
klass.where(conditions.join(' OR '), term: "%#{term}%", num: term.to_i).joins(inverse.name).pluck(inverse.foreign_key)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
collection.public_send(sql_op, id: ids)
|
132
|
-
|
133
|
-
when :has_and_belongs_to_many
|
134
|
-
reflection = collection.klass.reflect_on_association(table_column[:name].to_sym)
|
135
|
-
raise "unable to find #{collection.klass.name} :has_and_belongs_to_many :#{table_column[:name]} association" unless reflection
|
136
|
-
|
137
|
-
obj = reflection.build_association({})
|
138
|
-
klass = obj.class
|
139
|
-
|
140
|
-
inverse = reflection.inverse_of || klass.reflect_on_association(collection.table_name) || obj.class.reflect_on_association(collection.table_name.singularize)
|
141
|
-
raise "unable to find #{klass.name} has_and_belongs_to_many :#{collection.table_name} or belongs_to :#{collection.table_name.singularize} associations" unless inverse
|
142
|
-
|
143
|
-
ids = if [:select, :grouped_select].include?(table_column[:filter][:as])
|
144
|
-
# Treat the search term as one or more IDs
|
145
|
-
inverse_ids = term.split(',').map { |term| (term = term.to_i) == 0 ? nil : term }.compact
|
146
|
-
return collection unless inverse_ids.present?
|
147
|
-
|
148
|
-
klass.where(id: inverse_ids).flat_map { |klass| (klass.send(inverse.name).pluck(:id) rescue []) }
|
149
|
-
else
|
150
|
-
# Treat the search term as a string.
|
151
|
-
|
152
|
-
klass_columns = if (sql_column == klass.table_name) # No custom column has been defined
|
153
|
-
klass.columns.map { |col| col.name if col.text? }.compact # Search all database text? columns
|
154
|
-
else
|
155
|
-
[sql_column.gsub("#{klass.table_name}.", '')] # table_column :order_items, column: 'order_items.title'
|
156
|
-
end
|
157
|
-
|
158
|
-
conditions = klass_columns.map { |col_name| "#{klass.table_name}.#{col_name} #{ilike} :term" }
|
159
|
-
|
160
|
-
klass.where(conditions.join(' OR '), term: "%#{term}%", num: term.to_i).flat_map { |klass| (klass.send(inverse.name).pluck(:id) rescue []) }
|
161
|
-
end
|
162
|
-
|
163
|
-
collection.public_send(sql_op, id: ids)
|
164
|
-
when :obfuscated_id
|
165
|
-
if (deobfuscated_id = collection.deobfuscate(term)) == term # We weren't able to deobfuscate it, so this is an Invalid ID
|
166
|
-
collection.public_send(sql_op, "#{sql_column} = :term", term: 0)
|
167
|
-
else
|
168
|
-
collection.public_send(sql_op, "#{sql_column} = :term", term: deobfuscated_id)
|
169
|
-
end
|
170
|
-
when :effective_address
|
171
|
-
ids = Effective::Address
|
172
|
-
.where('addressable_type = ?', collection_class.name)
|
173
|
-
.where("address1 #{ilike} :term OR address2 #{ilike} :term OR city #{ilike} :term OR postal_code #{ilike} :term OR state_code = :code OR country_code = :code", term: "%#{term}%", code: term)
|
174
|
-
.pluck(:addressable_id)
|
175
|
-
|
176
|
-
collection.public_send(sql_op, id: ids)
|
177
|
-
when :effective_roles
|
178
|
-
collection.with_role(term)
|
179
|
-
when :datetime, :date
|
180
|
-
begin
|
181
|
-
digits = term.scan(/(\d+)/).flatten.map { |digit| digit.to_i }
|
182
|
-
start_at = Time.zone.local(*digits)
|
183
|
-
|
184
|
-
case digits.length
|
185
|
-
when 1 # Year
|
186
|
-
end_at = start_at.end_of_year
|
187
|
-
when 2 # Year-Month
|
188
|
-
end_at = start_at.end_of_month
|
189
|
-
when 3 # Year-Month-Day
|
190
|
-
end_at = start_at.end_of_day
|
191
|
-
when 4 # Year-Month-Day Hour
|
192
|
-
end_at = start_at.end_of_hour
|
193
|
-
when 5 # Year-Month-Day Hour-Minute
|
194
|
-
end_at = start_at.end_of_minute
|
195
|
-
when 6
|
196
|
-
end_at = start_at + 1.second
|
197
|
-
else
|
198
|
-
end_at = start_at
|
199
|
-
end
|
200
|
-
|
201
|
-
collection.public_send(sql_op, "#{sql_column} >= :start_at AND #{sql_column} <= :end_at", start_at: start_at, end_at: end_at)
|
202
|
-
rescue => e
|
203
|
-
collection
|
204
|
-
end
|
205
|
-
when :boolean
|
206
|
-
collection.public_send(sql_op, "#{sql_column} = :term", term: [1, 'true', 'yes'].include?(term.to_s.downcase))
|
207
|
-
when :integer
|
208
|
-
collection.public_send(sql_op, "#{sql_column} = :term", term: term.gsub(/\D/, '').to_i)
|
209
|
-
when :year
|
210
|
-
collection.public_send(sql_op, "EXTRACT(YEAR FROM #{sql_column}) = :term", term: term.to_i)
|
211
|
-
when :price
|
212
|
-
price_in_cents = (term.gsub(/[^0-9|\.]/, '').to_f * 100.0).to_i
|
213
|
-
collection.public_send(sql_op, "#{sql_column} = :term", term: price_in_cents)
|
214
|
-
when :currency, :decimal, :number, :percentage
|
215
|
-
collection.public_send(sql_op, "#{sql_column} = :term", term: term.gsub(/[^0-9|\.]/, '').to_f)
|
216
|
-
else
|
217
|
-
collection.public_send(sql_op, "#{sql_column} = :term", term: term)
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
def paginate(collection)
|
222
|
-
collection.page(page).per(per_page)
|
223
|
-
end
|
224
|
-
|
225
|
-
protected
|
226
|
-
|
227
|
-
def postgres?
|
228
|
-
return @postgres unless @postgres.nil?
|
229
|
-
@postgres ||= (collection_class.connection.kind_of?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) rescue false)
|
230
|
-
end
|
231
|
-
|
232
|
-
def mysql?
|
233
|
-
return @mysql unless @mysql.nil?
|
234
|
-
@mysql ||= (collection_class.connection.kind_of?(ActiveRecord::ConnectionAdapters::Mysql2Adapter) rescue false)
|
235
|
-
end
|
236
|
-
|
237
|
-
def ilike
|
238
|
-
@ilike ||= (postgres? ? 'ILIKE' : 'LIKE') # Only Postgres supports ILIKE, Mysql and Sqlite3 use LIKE
|
239
|
-
end
|
240
|
-
|
241
|
-
end
|
242
|
-
end
|
@@ -1,97 +0,0 @@
|
|
1
|
-
module Effective
|
2
|
-
# The collection is an Array of Arrays
|
3
|
-
class ArrayDatatableTool
|
4
|
-
attr_accessor :table_columns
|
5
|
-
|
6
|
-
delegate :page, :per_page, :search_column, :order_column, :display_table_columns, :convert_to_column_type, :to => :@datatable
|
7
|
-
|
8
|
-
def initialize(datatable, table_columns)
|
9
|
-
@datatable = datatable
|
10
|
-
@table_columns = table_columns
|
11
|
-
end
|
12
|
-
|
13
|
-
def search_terms
|
14
|
-
@search_terms ||= @datatable.search_terms.select { |name, search_term| table_columns.key?(name) }
|
15
|
-
end
|
16
|
-
|
17
|
-
def order_by_column
|
18
|
-
@order_by_column ||= table_columns[@datatable.order_name]
|
19
|
-
end
|
20
|
-
|
21
|
-
def order(collection)
|
22
|
-
return collection unless order_by_column.present?
|
23
|
-
|
24
|
-
column_order = order_column(collection, order_by_column, @datatable.order_direction, display_index(order_by_column))
|
25
|
-
raise 'order_column must return an Array' unless column_order.kind_of?(Array)
|
26
|
-
column_order
|
27
|
-
end
|
28
|
-
|
29
|
-
def order_column_with_defaults(collection, table_column, direction, index)
|
30
|
-
if direction == :asc
|
31
|
-
collection.sort! do |x, y|
|
32
|
-
if (x[index] && y[index])
|
33
|
-
x[index] <=> y[index]
|
34
|
-
elsif x[index]
|
35
|
-
-1
|
36
|
-
elsif y[index]
|
37
|
-
1
|
38
|
-
else
|
39
|
-
0
|
40
|
-
end
|
41
|
-
end
|
42
|
-
else
|
43
|
-
collection.sort! do |x, y|
|
44
|
-
if (x[index] && y[index])
|
45
|
-
y[index] <=> x[index]
|
46
|
-
elsif x[index]
|
47
|
-
1
|
48
|
-
elsif y[index]
|
49
|
-
-1
|
50
|
-
else
|
51
|
-
0
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
collection
|
57
|
-
end
|
58
|
-
|
59
|
-
def search(collection)
|
60
|
-
search_terms.each do |name, search_term|
|
61
|
-
column_search = search_column(collection, table_columns[name], search_term, display_index(table_columns[name]))
|
62
|
-
raise 'search_column must return an Array object' unless column_search.kind_of?(Array)
|
63
|
-
collection = column_search
|
64
|
-
end
|
65
|
-
collection
|
66
|
-
end
|
67
|
-
|
68
|
-
def search_column_with_defaults(collection, table_column, search_term, index)
|
69
|
-
search_term = search_term.downcase if table_column[:filter][:fuzzy]
|
70
|
-
|
71
|
-
collection.select! do |row|
|
72
|
-
if table_column[:filter][:fuzzy]
|
73
|
-
row[index].to_s.downcase.include?(search_term)
|
74
|
-
else
|
75
|
-
row[index] == search_term
|
76
|
-
end
|
77
|
-
end || collection
|
78
|
-
end
|
79
|
-
|
80
|
-
def paginate(collection)
|
81
|
-
Kaminari.paginate_array(collection).page(page).per(per_page)
|
82
|
-
end
|
83
|
-
|
84
|
-
private
|
85
|
-
|
86
|
-
def display_index(column)
|
87
|
-
display_table_columns.present? ? display_table_columns.keys.index(column[:name]) : column[:index]
|
88
|
-
end
|
89
|
-
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
# [
|
94
|
-
# [1, 'title 1'],
|
95
|
-
# [2, 'title 2'],
|
96
|
-
# [3, 'title 3']
|
97
|
-
# ]
|
@@ -1,101 +0,0 @@
|
|
1
|
-
# This is extended as class level into Datatable
|
2
|
-
|
3
|
-
module Effective
|
4
|
-
module EffectiveDatatable
|
5
|
-
module Ajax
|
6
|
-
|
7
|
-
# This is for the ColReorder plugin
|
8
|
-
# It sends us a list of columns that are different than our table_columns order
|
9
|
-
# So this method just returns an array of column names, as per ColReorder
|
10
|
-
def display_table_columns
|
11
|
-
return nil if params[:columns].blank?
|
12
|
-
|
13
|
-
@display_table_columns ||= (
|
14
|
-
{}.tap do |retval|
|
15
|
-
params[:columns].each do |_, column|
|
16
|
-
retval[column[:name]] = table_columns[column[:name]] # Same order as ColReordernow
|
17
|
-
retval[column[:name]][:visible] = (column[:visible] == 'true') # As per ColVis
|
18
|
-
end
|
19
|
-
end
|
20
|
-
)
|
21
|
-
end
|
22
|
-
|
23
|
-
def order_name
|
24
|
-
@order_name ||= begin
|
25
|
-
if params[:order] && params[:columns]
|
26
|
-
order_by_column_index = (params[:order]['0'][:column] rescue '0')
|
27
|
-
(params[:columns][order_by_column_index] || {})[:name]
|
28
|
-
elsif @default_order.present?
|
29
|
-
@default_order.keys.first
|
30
|
-
end || table_columns.find { |col, opts| opts[:type] != :bulk_actions_column }.try(:first)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def order_index
|
35
|
-
(table_columns[order_name][:index] || 0) rescue 0
|
36
|
-
end
|
37
|
-
|
38
|
-
def order_direction
|
39
|
-
@order_direction ||= if params[:order].present?
|
40
|
-
params[:order]['0'][:dir] == 'desc' ? :desc : :asc
|
41
|
-
elsif @default_order.present?
|
42
|
-
@default_order.values.first.to_s.downcase == 'desc' ? :desc : :asc
|
43
|
-
else
|
44
|
-
:asc
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def display_entries
|
49
|
-
@display_entries ||= begin
|
50
|
-
entries = (@default_entries.presence || EffectiveDatatables.default_entries)
|
51
|
-
entries = -1 if entries.to_s.downcase == 'all'
|
52
|
-
[5, 10, 25, 50, 100, 250, 1000, -1].include?(entries) ? entries : 25
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def search_terms
|
57
|
-
@search_terms ||= HashWithIndifferentAccess.new().tap do |terms|
|
58
|
-
if params[:columns].present? # This is an AJAX request from the DataTable
|
59
|
-
(params[:columns] || {}).each do |_, column|
|
60
|
-
next if table_columns[column[:name]].blank? || (column[:search] || {})[:value].blank?
|
61
|
-
|
62
|
-
terms[column[:name]] = column[:search][:value]
|
63
|
-
end
|
64
|
-
else # This is the initial render, and we have to apply default search terms only
|
65
|
-
table_columns.each do |name, values|
|
66
|
-
terms[name] = values[:filter][:selected] if values[:filter][:selected].present?
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def per_page
|
73
|
-
return 9999999 if simple?
|
74
|
-
|
75
|
-
length = (params[:length].presence || display_entries).to_i
|
76
|
-
|
77
|
-
if length == -1
|
78
|
-
9999999
|
79
|
-
elsif length > 0
|
80
|
-
length
|
81
|
-
else
|
82
|
-
25
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def per_page=(length)
|
87
|
-
case length
|
88
|
-
when Integer
|
89
|
-
params[:length] = length
|
90
|
-
when :all
|
91
|
-
params[:length] = -1
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def page
|
96
|
-
params[:start].to_i / per_page + 1
|
97
|
-
end
|
98
|
-
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|