effective_datatables 3.7.7 → 4.0.0
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 +5 -5
- data/MIT-LICENSE +1 -1
- data/README.md +32 -32
- data/app/assets/images/dataTables/sort-down.svg +1 -0
- data/app/assets/images/dataTables/sort-up.svg +1 -0
- data/app/assets/images/dataTables/sort.svg +1 -0
- data/app/assets/javascripts/dataTables/buttons/{buttons.bootstrap.js → buttons.bootstrap4.js} +7 -15
- data/app/assets/javascripts/dataTables/dataTables.bootstrap4.js +184 -0
- data/app/assets/javascripts/dataTables/responsive/dataTables.responsive.js +30 -11
- data/app/assets/javascripts/dataTables/responsive/{responsive.bootstrap.js → responsive.bootstrap4.js} +6 -6
- data/app/assets/javascripts/effective_datatables.js +4 -4
- data/app/assets/javascripts/effective_datatables/bulk_actions.js.coffee +43 -43
- data/app/assets/javascripts/effective_datatables/events.js.coffee +7 -4
- data/app/assets/javascripts/effective_datatables/filters.js.coffee +0 -1
- data/app/assets/javascripts/effective_datatables/initialize.js.coffee +45 -49
- data/app/assets/javascripts/effective_datatables/overrides.js +12 -0
- data/app/assets/javascripts/effective_datatables/reset.js.coffee +1 -1
- data/app/assets/stylesheets/dataTables/buttons/{buttons.bootstrap.scss → buttons.bootstrap4.css} +68 -1
- data/app/assets/stylesheets/dataTables/{dataTables.bootstrap.scss → dataTables.bootstrap4.css} +44 -29
- data/app/assets/stylesheets/dataTables/responsive/{responsive.bootstrap.scss → responsive.bootstrap4.css} +3 -3
- data/app/assets/stylesheets/effective_datatables.scss +3 -4
- data/app/assets/stylesheets/effective_datatables/_overrides.scss +72 -152
- data/app/controllers/effective/datatables_controller.rb +6 -39
- data/app/helpers/effective_datatables_helper.rb +55 -50
- data/app/helpers/effective_datatables_private_helper.rb +47 -179
- data/app/models/effective/datatable.rb +16 -44
- data/app/models/effective/datatable_column.rb +0 -1
- data/app/models/effective/datatable_column_tool.rb +1 -1
- data/app/models/effective/datatable_dsl_tool.rb +3 -11
- data/app/models/effective/datatable_value_tool.rb +23 -23
- data/app/models/effective/effective_datatable/attributes.rb +13 -5
- data/app/models/effective/effective_datatable/collection.rb +3 -18
- data/app/models/effective/effective_datatable/compute.rb +6 -17
- data/app/models/effective/effective_datatable/cookie.rb +20 -19
- data/app/models/effective/effective_datatable/dsl.rb +3 -8
- data/app/models/effective/effective_datatable/dsl/bulk_actions.rb +25 -14
- data/app/models/effective/effective_datatable/dsl/datatable.rb +28 -70
- data/app/models/effective/effective_datatable/dsl/filters.rb +5 -5
- data/app/models/effective/effective_datatable/format.rb +50 -95
- data/app/models/effective/effective_datatable/params.rb +3 -8
- data/app/models/effective/effective_datatable/resource.rb +76 -137
- data/app/models/effective/effective_datatable/state.rb +15 -30
- data/app/views/effective/datatables/_actions_column.html.haml +8 -1
- data/app/views/effective/datatables/_bulk_actions_column.html.haml +1 -1
- data/app/views/effective/datatables/_filters.html.haml +11 -12
- data/app/views/effective/datatables/_resource_column.html.haml +8 -11
- data/config/effective_datatables.rb +14 -12
- data/config/routes.rb +0 -1
- data/lib/effective_datatables.rb +4 -57
- data/lib/effective_datatables/engine.rb +1 -1
- data/lib/effective_datatables/version.rb +1 -1
- metadata +20 -30
- data/app/assets/images/dataTables/sort_asc.png +0 -0
- data/app/assets/images/dataTables/sort_both.png +0 -0
- data/app/assets/images/dataTables/sort_desc.png +0 -0
- data/app/assets/javascripts/dataTables/dataTables.bootstrap.js +0 -182
- data/app/assets/javascripts/dataTables/locales/en.lang +0 -33
- data/app/assets/javascripts/dataTables/locales/es.lang +0 -36
- data/app/assets/javascripts/dataTables/locales/nl.lang +0 -30
- data/app/assets/javascripts/effective_datatables/flash.js.coffee +0 -31
- data/app/assets/javascripts/effective_datatables/inline_crud.js.coffee +0 -217
- data/app/assets/javascripts/effective_datatables/overrides.js.coffee +0 -7
- data/app/assets/javascripts/effective_datatables/reorder.js.coffee +0 -43
- data/app/assets/stylesheets/effective_datatables/_filters.scss +0 -7
- data/app/views/effective/datatables/_reorder_column.html.haml +0 -5
- data/config/locales/en.yml +0 -12
- data/config/locales/es.yml +0 -12
- data/config/locales/nl.yml +0 -12
@@ -43,7 +43,7 @@ module Effective
|
|
43
43
|
Rails.logger.info "COLUMN TOOL: order_column #{column.to_s} #{direction} #{sql_column}" if EffectiveDatatables.debug
|
44
44
|
|
45
45
|
if column[:sql_as_column]
|
46
|
-
collection.order("#{sql_column} #{datatable.
|
46
|
+
collection.order("#{sql_column} #{datatable.resource.sql_direction(direction)}")
|
47
47
|
else
|
48
48
|
Effective::Resource.new(collection)
|
49
49
|
.order(column[:name], direction, as: column[:as], sort: column[:sort], sql_column: column[:sql_column], limit: datatable.limit)
|
@@ -16,24 +16,16 @@ module Effective
|
|
16
16
|
@view = datatable.view
|
17
17
|
end
|
18
18
|
|
19
|
-
def method_missing(method, *args
|
19
|
+
def method_missing(method, *args)
|
20
20
|
# Catch a common error
|
21
21
|
if [:bulk_actions, :charts, :collection, :filters].include?(method) && in_datatables_do_block
|
22
22
|
raise "#{method} block must be declared outside the datatable do ... end block"
|
23
23
|
end
|
24
24
|
|
25
25
|
if datatable.respond_to?(method)
|
26
|
-
|
27
|
-
datatable.send(method, *args) { yield }
|
28
|
-
else
|
29
|
-
datatable.send(method, *args)
|
30
|
-
end
|
26
|
+
datatable.send(method, *args)
|
31
27
|
elsif view.respond_to?(method)
|
32
|
-
|
33
|
-
view.send(method, *args) { yield }
|
34
|
-
else
|
35
|
-
view.send(method, *args)
|
36
|
-
end
|
28
|
+
view.send(method, *args)
|
37
29
|
else
|
38
30
|
super
|
39
31
|
end
|
@@ -74,12 +74,13 @@ module Effective
|
|
74
74
|
collection
|
75
75
|
end
|
76
76
|
|
77
|
-
def search_column(collection,
|
78
|
-
Rails.logger.info "VALUE TOOL: search_column #{column.to_s} #{
|
77
|
+
def search_column(collection, value, column, index)
|
78
|
+
Rails.logger.info "VALUE TOOL: search_column #{column.to_s} #{value} #{index}" if EffectiveDatatables.debug
|
79
79
|
|
80
|
+
macros = Effective::Resource.new('').macros
|
80
81
|
fuzzy = column[:search][:fuzzy]
|
81
82
|
|
82
|
-
term = Effective::Attribute.new(column[:as]).parse(
|
83
|
+
term = Effective::Attribute.new(column[:as]).parse(value, name: column[:name])
|
83
84
|
term_downcased = term.to_s.downcase
|
84
85
|
|
85
86
|
# term == 'nil' rescue false is a Rails 4.1 fix, where you can't compare a TimeWithZone to 'nil'
|
@@ -89,19 +90,18 @@ module Effective
|
|
89
90
|
|
90
91
|
# See effective_resources gem search() method # relation.rb
|
91
92
|
collection.select! do |row|
|
92
|
-
obj = row[index]
|
93
|
-
value = obj_to_value(row[index], column, row)
|
93
|
+
obj = obj_to_value(row[index], column, row)
|
94
94
|
|
95
95
|
case column[:as]
|
96
96
|
when :boolean
|
97
|
-
if
|
98
|
-
|
97
|
+
if fuzzy
|
98
|
+
term ? (obj == true) : (obj != true)
|
99
99
|
else
|
100
|
-
|
100
|
+
obj == term
|
101
101
|
end
|
102
102
|
when :datetime, :date
|
103
103
|
end_at = (
|
104
|
-
case (
|
104
|
+
case (value.to_s.scan(/(\d+)/).flatten).length
|
105
105
|
when 1 ; term.end_of_year # Year
|
106
106
|
when 2 ; term.end_of_month # Year-Month
|
107
107
|
when 3 ; term.end_of_day # Year-Month-Day
|
@@ -111,35 +111,35 @@ module Effective
|
|
111
111
|
else term
|
112
112
|
end
|
113
113
|
)
|
114
|
-
|
114
|
+
obj >= term && obj <= end_at
|
115
115
|
when :time
|
116
|
-
(
|
116
|
+
(obj.hour == term.hour) && (term.min == 0 ? true : (obj.min == term.min))
|
117
117
|
when :decimal, :currency
|
118
|
-
if fuzzy && (term.round(0) == term) &&
|
118
|
+
if fuzzy && (term.round(0) == term) && value.to_s.include?('.') == false
|
119
119
|
if term < 0
|
120
|
-
|
120
|
+
obj <= term && obj > (term - 1.0)
|
121
121
|
else
|
122
|
-
|
122
|
+
obj >= term && obj < (term + 1.0)
|
123
123
|
end
|
124
124
|
else
|
125
|
-
|
125
|
+
obj == term
|
126
126
|
end
|
127
127
|
when :duration
|
128
|
-
if fuzzy && (term % 60 == 0) &&
|
128
|
+
if fuzzy && (term % 60 == 0) && value.to_s.include?('m') == false
|
129
129
|
if term < 0
|
130
|
-
|
130
|
+
obj <= term && obj > (term - 60)
|
131
131
|
else
|
132
|
-
|
132
|
+
obj >= term && obj < (term + 60)
|
133
133
|
end
|
134
134
|
else
|
135
|
-
|
135
|
+
obj == term
|
136
136
|
end
|
137
|
-
when *
|
137
|
+
when *macros, :resource
|
138
138
|
Array(obj).any? do |resource|
|
139
139
|
Array(term).any? do |term|
|
140
140
|
matched = false
|
141
141
|
|
142
|
-
if term.kind_of?(Integer) && resource.respond_to?(:
|
142
|
+
if term.kind_of?(Integer) && resource.respond_to?(:to_param)
|
143
143
|
matched = (resource.id == term || resource.to_param == term)
|
144
144
|
end
|
145
145
|
|
@@ -148,9 +148,9 @@ module Effective
|
|
148
148
|
end
|
149
149
|
else # :string, :text, :email
|
150
150
|
if fuzzy
|
151
|
-
|
151
|
+
obj.to_s.downcase.include?(term_downcased)
|
152
152
|
else
|
153
|
-
|
153
|
+
obj == term || (obj.to_s == term.to_s)
|
154
154
|
end
|
155
155
|
end
|
156
156
|
end || collection
|
@@ -4,14 +4,22 @@ module Effective
|
|
4
4
|
|
5
5
|
private
|
6
6
|
|
7
|
-
def
|
8
|
-
|
9
|
-
|
10
|
-
end
|
7
|
+
def initial_attributes(args)
|
8
|
+
raise "#{self.class.name}.new() expected Hash like arguments" unless args.kind_of?(Hash)
|
9
|
+
args
|
11
10
|
end
|
12
11
|
|
13
12
|
def load_attributes!
|
14
|
-
|
13
|
+
if datatables_ajax_request?
|
14
|
+
raise 'expected cookie to be present' unless cookie
|
15
|
+
raise 'expected attributes cookie to be present' unless cookie[:attributes]
|
16
|
+
|
17
|
+
@attributes = cookie.delete(:attributes)
|
18
|
+
end
|
19
|
+
|
20
|
+
unless datatables_ajax_request?
|
21
|
+
@attributes[:_n] ||= view.controller_path.split('/')[0...-1].join('/').presence
|
22
|
+
end
|
15
23
|
end
|
16
24
|
|
17
25
|
end
|
@@ -7,23 +7,10 @@ module Effective
|
|
7
7
|
@collection_class # Will be either User/Post/etc or Array
|
8
8
|
end
|
9
9
|
|
10
|
-
# User.all
|
11
10
|
def active_record_collection?
|
12
11
|
@active_record_collection == true
|
13
12
|
end
|
14
13
|
|
15
|
-
# [User<1>, User<2>, Post<1>, Page<3>]
|
16
|
-
def active_record_array_collection?
|
17
|
-
@active_record_array_collection == true
|
18
|
-
end
|
19
|
-
|
20
|
-
def active_record_polymorphic_array_collection?
|
21
|
-
return false unless active_record_array_collection?
|
22
|
-
return @active_record_polymorphic_array_collection unless @active_record_polymorphic_array_collection.nil?
|
23
|
-
@active_record_polymorphic_array_collection = collection.map { |obj| obj.class }.uniq.length > 1
|
24
|
-
end
|
25
|
-
|
26
|
-
# [[1, 'foo'], [2, 'bar']]
|
27
14
|
def array_collection?
|
28
15
|
@array_collection == true
|
29
16
|
end
|
@@ -34,13 +21,11 @@ module Effective
|
|
34
21
|
raise 'No collection defined. Please add a collection with collection do ... end' if collection.nil?
|
35
22
|
|
36
23
|
@collection_class = (collection.respond_to?(:klass) ? collection.klass : self.class)
|
37
|
-
|
38
24
|
@active_record_collection = (collection.ancestors.include?(ActiveRecord::Base) rescue false)
|
39
|
-
@
|
40
|
-
@array_collection = collection.kind_of?(Array) && (collection.blank? || collection.first.kind_of?(Array))
|
25
|
+
@array_collection = (collection.kind_of?(Array) && (collection.length == 0 || collection.first.kind_of?(Array)))
|
41
26
|
|
42
|
-
unless active_record_collection? ||
|
43
|
-
raise "Unsupported collection. Expecting an ActiveRecord
|
27
|
+
unless active_record_collection? || array_collection?
|
28
|
+
raise "Unsupported collection type. Expecting an ActiveRecord class, ActiveRecord relation, or an Array of Arrays [[1, 'foo'], [2, 'bar']]"
|
44
29
|
end
|
45
30
|
|
46
31
|
_scopes.each do |scope, _|
|
@@ -14,14 +14,11 @@ module Effective
|
|
14
14
|
@total_records = (active_record_collection? ? column_tool.size(col) : value_tool.size(col))
|
15
15
|
|
16
16
|
# Apply scope
|
17
|
-
col = column_tool.scope(col)
|
17
|
+
col = column_tool.scope(col)
|
18
18
|
|
19
19
|
# Apply column searching
|
20
20
|
col = column_tool.search(col)
|
21
|
-
|
22
|
-
unless value_tool.searched.present? || (column_tool.scoped.blank? && column_tool.searched.blank?)
|
23
|
-
@display_records = column_tool.size(col)
|
24
|
-
end
|
21
|
+
@display_records = column_tool.size(col) unless value_tool.searched.present?
|
25
22
|
|
26
23
|
# Apply column ordering
|
27
24
|
col = column_tool.order(col)
|
@@ -64,15 +61,11 @@ module Effective
|
|
64
61
|
if state[:visible][name] == false && (name != order_name) # Sort by invisible array column
|
65
62
|
BLANK
|
66
63
|
elsif opts[:compute]
|
67
|
-
|
68
|
-
dsl_tool.instance_exec(obj, obj[opts[:index]], &opts[:compute])
|
69
|
-
else
|
70
|
-
dsl_tool.instance_exec(obj, collection, &opts[:compute])
|
71
|
-
end
|
64
|
+
dsl_tool.instance_exec(obj, (active_record_collection? ? collection : obj[opts[:index]]), &opts[:compute])
|
72
65
|
elsif (opts[:partial] || opts[:format])
|
73
|
-
|
66
|
+
active_record_collection? ? obj : obj[opts[:index]]
|
74
67
|
elsif opts[:resource]
|
75
|
-
resource =
|
68
|
+
resource = active_record_collection? ? obj : obj[opts[:index]]
|
76
69
|
|
77
70
|
if opts[:resource_field]
|
78
71
|
(associated, field) = name.to_s.split('.').first(2)
|
@@ -82,8 +75,6 @@ module Effective
|
|
82
75
|
resource.send(name)
|
83
76
|
end
|
84
77
|
|
85
|
-
elsif opts[:as] == :actions
|
86
|
-
obj
|
87
78
|
elsif opts[:as] == :effective_obfuscation
|
88
79
|
obj.to_param
|
89
80
|
elsif array_collection?
|
@@ -135,11 +126,9 @@ module Effective
|
|
135
126
|
length = values.length
|
136
127
|
values = values.reject { |value| value.nil? }
|
137
128
|
|
138
|
-
return BLANK if [:id, :year].include?(column[:name])
|
139
|
-
|
140
129
|
case aggregate[:name]
|
141
130
|
when :total
|
142
|
-
if [:
|
131
|
+
if [:percentage].include?(column[:as])
|
143
132
|
BLANK
|
144
133
|
elsif values.all? { |value| value.kind_of?(Numeric) }
|
145
134
|
values.sum
|
@@ -1,20 +1,32 @@
|
|
1
1
|
module Effective
|
2
2
|
module EffectiveDatatable
|
3
3
|
module Cookie
|
4
|
+
MAX_COOKIE_SIZE = 2500 # String size. Real byte size is about 1.5 times bigger.
|
5
|
+
|
4
6
|
def cookie
|
5
7
|
@cookie
|
6
8
|
end
|
7
9
|
|
10
|
+
def cookie_key
|
11
|
+
@cookie_key ||= (datatables_ajax_request? ? view.params[:cookie] : cookie_param)
|
12
|
+
end
|
13
|
+
|
14
|
+
# All possible dt cookie keys. Used to make sure the datatable has a cookie set for this session.
|
15
|
+
def cookie_keys
|
16
|
+
@cookie_keys ||= Array(@dt_cookie).compact.map(&:first)
|
17
|
+
end
|
18
|
+
|
19
|
+
def cookie_param
|
20
|
+
[self.class, attributes].hash.to_s.last(12)
|
21
|
+
end
|
22
|
+
|
8
23
|
private
|
9
24
|
|
10
25
|
def load_cookie!
|
11
|
-
return unless EffectiveDatatables.save_state
|
12
|
-
|
13
26
|
@dt_cookie = view.cookies.signed['_effective_dt']
|
14
27
|
|
15
28
|
# Load global datatables cookie
|
16
29
|
if @dt_cookie.present?
|
17
|
-
|
18
30
|
@dt_cookie = Marshal.load(Base64.decode64(@dt_cookie))
|
19
31
|
raise 'invalid datatables cookie' unless @dt_cookie.kind_of?(Array)
|
20
32
|
|
@@ -27,33 +39,21 @@ module Effective
|
|
27
39
|
if @cookie.kind_of?(Array)
|
28
40
|
@cookie = initial_state.keys.zip(@cookie.second).to_h
|
29
41
|
end
|
30
|
-
|
31
42
|
end
|
32
43
|
|
33
44
|
def save_cookie!
|
34
|
-
return unless EffectiveDatatables.save_state
|
35
|
-
|
36
45
|
@dt_cookie ||= []
|
37
46
|
@dt_cookie << [cookie_key, cookie_payload]
|
38
47
|
|
39
|
-
while @dt_cookie.to_s.size >
|
48
|
+
while @dt_cookie.to_s.size > MAX_COOKIE_SIZE
|
40
49
|
@dt_cookie.shift((@dt_cookie.length / 3) + 1)
|
41
50
|
end
|
42
51
|
|
43
|
-
|
44
|
-
domain = EffectiveDatatables.cookie_domain || :all
|
45
|
-
tld_length = EffectiveDatatables.cookie_tld_length
|
46
|
-
tld_length ||= (view.request.host == 'localhost' ? nil : view.request.host.to_s.split('.').count)
|
47
|
-
|
48
|
-
view.cookies.signed['_effective_dt'] = { value: Base64.encode64(Marshal.dump(@dt_cookie)), domain: domain, tld_length: tld_length }.compact
|
49
|
-
end
|
50
|
-
|
51
|
-
def cookie_key
|
52
|
-
@cookie_key ||= to_param
|
52
|
+
view.cookies.signed['_effective_dt'] = Base64.encode64(Marshal.dump(@dt_cookie))
|
53
53
|
end
|
54
54
|
|
55
55
|
def cookie_payload
|
56
|
-
payload = state.except(:visible)
|
56
|
+
payload = state.except(:attributes, :visible)
|
57
57
|
|
58
58
|
# Turn visible into a bitmask. This is undone in load_columns!
|
59
59
|
payload[:vismask] = (
|
@@ -62,7 +62,8 @@ module Effective
|
|
62
62
|
end
|
63
63
|
)
|
64
64
|
|
65
|
-
|
65
|
+
# Just store the values
|
66
|
+
[attributes.delete_if { |k, v| v.nil? }] + payload.values
|
66
67
|
end
|
67
68
|
|
68
69
|
end
|
@@ -3,20 +3,15 @@ module Effective
|
|
3
3
|
module Dsl
|
4
4
|
|
5
5
|
def bulk_actions(&block)
|
6
|
-
define_method('initialize_bulk_actions') { dsl_tool.instance_exec(&block)
|
6
|
+
define_method('initialize_bulk_actions') { dsl_tool.instance_exec(&block) }
|
7
7
|
end
|
8
8
|
|
9
9
|
def charts(&block)
|
10
10
|
define_method('initialize_charts') { dsl_tool.instance_exec(&block) }
|
11
11
|
end
|
12
12
|
|
13
|
-
def collection(
|
14
|
-
define_method('initialize_collection') {
|
15
|
-
self._collection_apply_belongs_to = apply_belongs_to
|
16
|
-
self._collection_apply_scope = apply_scope
|
17
|
-
|
18
|
-
self._collection = dsl_tool.instance_exec(&block)
|
19
|
-
}
|
13
|
+
def collection(&block)
|
14
|
+
define_method('initialize_collection') { self._collection = dsl_tool.instance_exec(&block) }
|
20
15
|
end
|
21
16
|
|
22
17
|
def datatable(&block)
|
@@ -3,12 +3,12 @@ module Effective
|
|
3
3
|
module Dsl
|
4
4
|
module BulkActions
|
5
5
|
|
6
|
-
def bulk_action(
|
7
|
-
datatable._bulk_actions.push(link_to_bulk_action(
|
6
|
+
def bulk_action(*args)
|
7
|
+
datatable._bulk_actions.push(link_to_bulk_action(*args))
|
8
8
|
end
|
9
9
|
|
10
|
-
def bulk_download(
|
11
|
-
datatable._bulk_actions.push(link_to_bulk_action(
|
10
|
+
def bulk_download(*args)
|
11
|
+
datatable._bulk_actions.push(link_to_bulk_action(*args.merge('data-authenticity-token' => form_authenticity_token)))
|
12
12
|
end
|
13
13
|
|
14
14
|
def bulk_action_divider
|
@@ -22,19 +22,30 @@ module Effective
|
|
22
22
|
private
|
23
23
|
|
24
24
|
# We can't let any data-method be applied to the link, or jquery_ujs does the wrong thing with it
|
25
|
-
def link_to_bulk_action(
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
25
|
+
def link_to_bulk_action(*args)
|
26
|
+
args.map! do |arg|
|
27
|
+
if arg.kind_of?(Hash)
|
28
|
+
data_method = (
|
29
|
+
arg.delete(:'data-method') ||
|
30
|
+
arg.delete('data-method') ||
|
31
|
+
(arg[:data] || {}).delete('method') ||
|
32
|
+
(arg[:data] || {}).delete(:method)
|
33
|
+
)
|
34
|
+
|
35
|
+
# But if the data-method was :get, we add bulk-actions-get-link = true
|
36
|
+
if data_method.to_s == 'get'
|
37
|
+
arg[:data].present? ? arg[:data]['bulk-actions-get'] = true : arg['data-bulk-actions-get'] = true
|
38
|
+
end
|
39
|
+
|
40
|
+
arg[:class] = [arg[:class], 'dropdown-item'].compact.join(' ')
|
41
|
+
end
|
42
|
+
|
43
|
+
arg
|
30
44
|
end
|
31
45
|
|
32
|
-
|
33
|
-
opts['data-ajax-method'] = verbs[opts.delete('data-method').to_s.upcase] || 'POST'
|
34
|
-
|
35
|
-
opts[:class] = [opts[:class], 'dropdown-item'].compact.join(' ')
|
46
|
+
args << { class: 'dropdown-item' } if args.none? { |arg| arg.kind_of?(Hash) }
|
36
47
|
|
37
|
-
|
48
|
+
link_to(*args)
|
38
49
|
end
|
39
50
|
|
40
51
|
end
|
@@ -3,11 +3,6 @@ module Effective
|
|
3
3
|
module Dsl
|
4
4
|
module Datatable
|
5
5
|
# Instance Methods inside the datatable do .. end block
|
6
|
-
def length(length)
|
7
|
-
raise 'length must be 5, 10, 25, 50, 100, 250, 500, :all' unless [5, 10, 25, 50, 100, 250, 500, :all].include?(length)
|
8
|
-
datatable.state[:length] ||= (length == :all ? 9999999 : length)
|
9
|
-
end
|
10
|
-
|
11
6
|
def order(name, dir = nil)
|
12
7
|
raise 'order direction must be :asc or :desc' unless [nil, :asc, :desc].include?(dir)
|
13
8
|
|
@@ -15,13 +10,9 @@ module Effective
|
|
15
10
|
datatable.state[:order_dir] ||= dir
|
16
11
|
end
|
17
12
|
|
18
|
-
def
|
19
|
-
raise '
|
20
|
-
|
21
|
-
datatable.state[:order_name] = :_reorder
|
22
|
-
datatable.state[:order_dir] = dir
|
23
|
-
|
24
|
-
reorder_col(name)
|
13
|
+
def length(length)
|
14
|
+
raise 'length must be 5, 10, 25, 50, 100, 250, 500, :all' unless [5, 10, 25, 50, 100, 250, 500, :all].include?(length)
|
15
|
+
datatable.state[:length] ||= (length == :all ? 9999999 : length)
|
25
16
|
end
|
26
17
|
|
27
18
|
# A col has its internal values sorted/searched before the block is run
|
@@ -34,7 +25,7 @@ module Effective
|
|
34
25
|
name = name.to_sym unless name.to_s.include?('.')
|
35
26
|
|
36
27
|
datatable._columns[name] = Effective::DatatableColumn.new(
|
37
|
-
action: action,
|
28
|
+
action: action, # resource columns only
|
38
29
|
as: as,
|
39
30
|
compute: nil,
|
40
31
|
col_class: col_class,
|
@@ -62,7 +53,7 @@ module Effective
|
|
62
53
|
name = name.to_sym unless name.to_s.include?('.')
|
63
54
|
|
64
55
|
datatable._columns[name] = Effective::DatatableColumn.new(
|
65
|
-
action: action,
|
56
|
+
action: action, # Resource columns only
|
66
57
|
as: as,
|
67
58
|
compute: (compute if block_given?),
|
68
59
|
col_class: col_class,
|
@@ -82,48 +73,8 @@ module Effective
|
|
82
73
|
)
|
83
74
|
end
|
84
75
|
|
85
|
-
def
|
86
|
-
raise 'You can only have one actions column' if datatable.columns[:
|
87
|
-
|
88
|
-
datatable._columns[:_actions] = Effective::DatatableColumn.new(
|
89
|
-
action: false,
|
90
|
-
as: :actions,
|
91
|
-
compute: nil,
|
92
|
-
btn_class: (btn_class || 'btn-sm btn-outline-primary'),
|
93
|
-
col_class: col_class,
|
94
|
-
format: (format if block_given?),
|
95
|
-
index: nil,
|
96
|
-
inline: (inline.nil? ? datatable.inline? : inline),
|
97
|
-
label: false,
|
98
|
-
name: :actions,
|
99
|
-
partial: partial,
|
100
|
-
partial_as: partial_as,
|
101
|
-
actions_partial: (actions_partial || :glyphicons),
|
102
|
-
responsive: responsive,
|
103
|
-
search: false,
|
104
|
-
sort: false,
|
105
|
-
sql_column: nil,
|
106
|
-
th: nil,
|
107
|
-
th_append: nil,
|
108
|
-
visible: visible,
|
109
|
-
|
110
|
-
# { approve: false }. These args are passed to effective_resources render_resource_actions
|
111
|
-
actions: actions
|
112
|
-
)
|
113
|
-
end
|
114
|
-
|
115
|
-
def aggregate(name, label: nil, &compute)
|
116
|
-
datatable._aggregates[name.to_sym] = {
|
117
|
-
compute: (compute if block_given?),
|
118
|
-
label: label || name.to_s.titleize,
|
119
|
-
name: name.to_sym,
|
120
|
-
}
|
121
|
-
end
|
122
|
-
|
123
|
-
# Called automatically after bulk_actions do ... end
|
124
|
-
# Call again if you want to change the position of the bulk_actions_col
|
125
|
-
def bulk_actions_col(col_class: nil, input_name: nil, partial: nil, partial_as: nil, responsive: 5000)
|
126
|
-
datatable._columns.delete(:_bulk_actions) if datatable.columns[:_bulk_actions]
|
76
|
+
def bulk_actions_col(col_class: nil, partial: nil, partial_as: nil, responsive: 5000)
|
77
|
+
raise 'You can only have one bulk actions column' if datatable.columns[:_bulk_actions].present?
|
127
78
|
|
128
79
|
datatable._columns[:_bulk_actions] = Effective::DatatableColumn.new(
|
129
80
|
action: false,
|
@@ -132,7 +83,6 @@ module Effective
|
|
132
83
|
col_class: col_class,
|
133
84
|
format: nil,
|
134
85
|
index: nil,
|
135
|
-
input_name: (input_name || 'bulk_actions_resources'),
|
136
86
|
label: false,
|
137
87
|
name: :bulk_actions,
|
138
88
|
partial: partial || '/effective/datatables/bulk_actions_column',
|
@@ -147,33 +97,41 @@ module Effective
|
|
147
97
|
)
|
148
98
|
end
|
149
99
|
|
150
|
-
|
151
|
-
|
152
|
-
def reorder_col(name, col_class: nil, partial: nil, partial_as: nil, sql_column: nil, responsive: 5000)
|
153
|
-
datatable._columns.delete(:_reorder) if datatable.columns[:_reorder]
|
100
|
+
def actions_col(show: true, edit: true, destroy: true, col_class: nil, partial: nil, partial_as: nil, responsive: 5000, visible: true, &format)
|
101
|
+
raise 'You can only have one actions column' if datatable.columns[:_actions].present?
|
154
102
|
|
155
|
-
datatable._columns[:
|
103
|
+
datatable._columns[:_actions] = Effective::DatatableColumn.new(
|
156
104
|
action: false,
|
157
|
-
as: :
|
105
|
+
as: :actions,
|
158
106
|
compute: nil,
|
159
107
|
col_class: col_class,
|
160
|
-
format:
|
108
|
+
format: (format if block_given?),
|
161
109
|
index: nil,
|
162
110
|
label: false,
|
163
|
-
name: :
|
164
|
-
partial: partial || '/effective/datatables/
|
111
|
+
name: :actions,
|
112
|
+
partial: partial || '/effective/datatables/actions_column',
|
165
113
|
partial_as: partial_as,
|
166
|
-
reorder: name,
|
167
114
|
responsive: responsive,
|
168
115
|
search: false,
|
169
|
-
sort:
|
170
|
-
sql_column:
|
116
|
+
sort: false,
|
117
|
+
sql_column: nil,
|
171
118
|
th: nil,
|
172
119
|
th_append: nil,
|
173
|
-
visible:
|
120
|
+
visible: visible,
|
121
|
+
|
122
|
+
show: show,
|
123
|
+
edit: edit,
|
124
|
+
destroy: destroy
|
174
125
|
)
|
175
126
|
end
|
176
127
|
|
128
|
+
def aggregate(name, label: nil, &compute)
|
129
|
+
datatable._aggregates[name.to_sym] = {
|
130
|
+
compute: (compute if block_given?),
|
131
|
+
label: label || name.to_s.titleize,
|
132
|
+
name: name.to_sym,
|
133
|
+
}
|
134
|
+
end
|
177
135
|
end
|
178
136
|
end
|
179
137
|
end
|