effective_datatables 4.2.0 → 4.3.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 +1 -0
- data/app/assets/javascripts/dataTables/buttons/buttons.colVis.js +4 -8
- data/app/assets/javascripts/dataTables/buttons/buttons.html5.js +33 -19
- data/app/assets/javascripts/dataTables/buttons/buttons.print.js +14 -3
- data/app/assets/javascripts/dataTables/buttons/dataTables.buttons.js +128 -61
- data/app/assets/javascripts/dataTables/dataTables.bootstrap4.js +5 -5
- data/app/assets/javascripts/dataTables/jquery.dataTables.js +2078 -2025
- data/app/assets/javascripts/dataTables/responsive/dataTables.responsive.js +46 -22
- data/app/assets/javascripts/effective_datatables.js +1 -0
- data/app/assets/javascripts/effective_datatables/bulk_actions.js.coffee +40 -41
- data/app/assets/javascripts/effective_datatables/events.js.coffee +1 -1
- data/app/assets/javascripts/effective_datatables/filters.js.coffee +1 -1
- data/app/assets/javascripts/effective_datatables/initialize.js.coffee +11 -33
- data/app/assets/javascripts/effective_datatables/inline_crud.js.coffee +158 -0
- data/app/assets/javascripts/effective_datatables/overrides.js.coffee +40 -0
- data/app/assets/javascripts/effective_datatables/reset.js.coffee +1 -1
- data/app/assets/stylesheets/dataTables/dataTables.bootstrap4.css +5 -1
- data/app/assets/stylesheets/effective_datatables/_overrides.scss +47 -1
- data/app/helpers/effective_datatables_helper.rb +1 -0
- data/app/helpers/effective_datatables_private_helper.rb +10 -1
- data/app/models/effective/effective_datatable/dsl/bulk_actions.rb +11 -22
- data/app/models/effective/effective_datatable/dsl/datatable.rb +2 -1
- data/app/models/effective/effective_datatable/format.rb +15 -4
- data/app/views/effective/datatables/_bulk_actions_column.html.haml +1 -1
- data/config/effective_datatables.rb +0 -13
- data/lib/effective_datatables.rb +0 -1
- data/lib/effective_datatables/version.rb +1 -1
- metadata +5 -5
- data/app/assets/javascripts/effective_datatables/overrides.js +0 -12
- data/app/views/effective/datatables/_actions_column.html.haml +0 -1
@@ -0,0 +1,40 @@
|
|
1
|
+
$.extend(true, $.fn.dataTable.Buttons.defaults, {
|
2
|
+
dom: {
|
3
|
+
button: {
|
4
|
+
className: 'btn btn-link btn-sm'
|
5
|
+
}
|
6
|
+
}
|
7
|
+
});
|
8
|
+
|
9
|
+
# DataTable is the API
|
10
|
+
# dataTable is the object fnStuff
|
11
|
+
|
12
|
+
flash = (message) ->
|
13
|
+
@context[0].oFeatures.bProcessing = false
|
14
|
+
|
15
|
+
message ||= 'Processing...'
|
16
|
+
|
17
|
+
$processing = $(@table().node()).siblings('.dataTables_processing')
|
18
|
+
$processing.html(message).show()
|
19
|
+
|
20
|
+
timeout = $processing.data('timeout')
|
21
|
+
clearTimeout(timeout) if timeout
|
22
|
+
|
23
|
+
$processing.html(message).data('timeout', setTimeout( =>
|
24
|
+
$processing.html('Processing...').hide()
|
25
|
+
@context[0].oFeatures.bProcessing = true
|
26
|
+
, 1500)
|
27
|
+
)
|
28
|
+
|
29
|
+
return @
|
30
|
+
|
31
|
+
turboDestroy = ->
|
32
|
+
@iterator('table', (settings) ->
|
33
|
+
$(window).off('.DT-' + settings.sInstance)
|
34
|
+
|
35
|
+
index = $.inArray(settings, $.fn.DataTable.settings)
|
36
|
+
$.fn.DataTable.settings.splice(index, 1) if index > -1
|
37
|
+
)
|
38
|
+
|
39
|
+
$.fn.DataTable.Api.register('flash()', flash);
|
40
|
+
$.fn.DataTable.Api.register('turboDestroy()', turboDestroy);
|
@@ -1,4 +1,4 @@
|
|
1
|
-
$(document).on 'click', 'a.buttons-reset-search', (event) ->
|
1
|
+
$(document).on 'click', '.dataTables_wrapper a.buttons-reset-search', (event) ->
|
2
2
|
event.preventDefault() # prevent the click
|
3
3
|
|
4
4
|
$table = $(event.currentTarget).closest('.dataTables_wrapper').find('table.dataTable').first()
|
@@ -4,6 +4,7 @@ table.dataTable {
|
|
4
4
|
margin-bottom: 6px !important;
|
5
5
|
max-width: none !important;
|
6
6
|
border-collapse: separate !important;
|
7
|
+
border-spacing: 0;
|
7
8
|
}
|
8
9
|
table.dataTable td,
|
9
10
|
table.dataTable th {
|
@@ -25,7 +26,7 @@ div.dataTables_wrapper div.dataTables_length label {
|
|
25
26
|
white-space: nowrap;
|
26
27
|
}
|
27
28
|
div.dataTables_wrapper div.dataTables_length select {
|
28
|
-
width:
|
29
|
+
width: auto;
|
29
30
|
display: inline-block;
|
30
31
|
}
|
31
32
|
div.dataTables_wrapper div.dataTables_filter {
|
@@ -132,6 +133,9 @@ div.dataTables_scrollBody table {
|
|
132
133
|
margin-top: 0 !important;
|
133
134
|
margin-bottom: 0 !important;
|
134
135
|
}
|
136
|
+
div.dataTables_scrollBody table thead .sorting:before,
|
137
|
+
div.dataTables_scrollBody table thead .sorting_asc:before,
|
138
|
+
div.dataTables_scrollBody table thead .sorting_desc:before,
|
135
139
|
div.dataTables_scrollBody table thead .sorting:after,
|
136
140
|
div.dataTables_scrollBody table thead .sorting_asc:after,
|
137
141
|
div.dataTables_scrollBody table thead .sorting_desc:after {
|
@@ -19,6 +19,38 @@ table.dataTable thead .sorting_desc:after,
|
|
19
19
|
table.dataTable thead .sorting_asc_disabled:after,
|
20
20
|
table.dataTable thead .sorting_desc_disabled:after { content: ''; }
|
21
21
|
|
22
|
+
table.dataTable > thead {
|
23
|
+
th.col-actions {
|
24
|
+
text-align: right;
|
25
|
+
|
26
|
+
span { display: block; height: 1.25em; }
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
.dataTables_wrapper {
|
31
|
+
table.dataTable {
|
32
|
+
tr.effective-datatables-inline-row { visibility: collapse; } // Turbolinks destroy fix
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
// When Inline Expanded
|
37
|
+
.dataTables_wrapper.effective-datatables-inline-expanded {
|
38
|
+
.dt-buttons { opacity: 0.4; }
|
39
|
+
.dataTables_entries { opacity: 0.4; }
|
40
|
+
.dataTables_paginate { opacity: 0.4; }
|
41
|
+
|
42
|
+
table.dataTable {
|
43
|
+
tr { opacity: 0.4; }
|
44
|
+
|
45
|
+
tr.effective-datatables-inline-row {
|
46
|
+
visibility: visible;
|
47
|
+
opacity: 1.0;
|
48
|
+
|
49
|
+
&:hover { background-color: inherit; }
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
22
54
|
table.dataTable > thead th {
|
23
55
|
vertical-align: top;
|
24
56
|
background-repeat: no-repeat;
|
@@ -78,6 +110,18 @@ table.dataTable > thead {
|
|
78
110
|
}
|
79
111
|
}
|
80
112
|
|
113
|
+
// Processing div
|
114
|
+
div.dataTables_wrapper div.dataTables_processing {
|
115
|
+
position: absolute;
|
116
|
+
top: 1em;
|
117
|
+
left: 50%;
|
118
|
+
width: 300px;
|
119
|
+
margin-left: -150px;
|
120
|
+
margin-top: -26px;
|
121
|
+
text-align: center;
|
122
|
+
padding: 1em;
|
123
|
+
}
|
124
|
+
|
81
125
|
// Simple styles
|
82
126
|
table.dataTable.simple > thead {
|
83
127
|
.sorting { background-image: none; cursor: default; }
|
@@ -93,6 +137,7 @@ table.dataTable.simple > thead {
|
|
93
137
|
div.dataTables_wrapper div.dataTables_entries { text-align: center; }
|
94
138
|
}
|
95
139
|
|
140
|
+
// Showing x to y of z entries with 25 per page
|
96
141
|
.dataTables_wrapper .dataTables_entries {
|
97
142
|
color: #909090;
|
98
143
|
font-size: 12px;
|
@@ -148,5 +193,6 @@ table.dataTable {
|
|
148
193
|
td {
|
149
194
|
p { margin-bottom: 0em; }
|
150
195
|
}
|
151
|
-
|
152
196
|
}
|
197
|
+
|
198
|
+
|
@@ -30,6 +30,7 @@ module EffectiveDatatablesHelper
|
|
30
30
|
'options' => (input_js || {}).to_json.html_safe,
|
31
31
|
'reset' => datatable_reset(datatable),
|
32
32
|
'simple' => datatable.simple?.to_s,
|
33
|
+
'spinner' => icon('spinner'), # effective_bootstrap
|
33
34
|
'source' => effective_datatables.datatable_path(datatable, {format: 'json'}),
|
34
35
|
'total-records' => datatable.to_json[:recordsTotal]
|
35
36
|
}
|
@@ -27,7 +27,16 @@ module EffectiveDatatablesPrivateHelper
|
|
27
27
|
link_to(content_tag(:span, 'Reset'), '#', class: 'btn btn-link btn-sm buttons-reset-search')
|
28
28
|
end
|
29
29
|
|
30
|
+
def datatable_new_resource_button(datatable, name, column)
|
31
|
+
if column[:inline] && column[:actions][:new] != false
|
32
|
+
actions = {'New' => { action: :new, class: 'btn btn-outline-primary', 'data-remote': true } }
|
33
|
+
render_resource_actions(datatable.resource.klass, actions: actions) # Will only work if permitted
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
30
37
|
def datatable_search_tag(datatable, name, opts)
|
38
|
+
return datatable_new_resource_button(datatable, name, opts) if name == :_actions
|
39
|
+
|
31
40
|
return if opts[:search] == false
|
32
41
|
|
33
42
|
# Build the search
|
@@ -60,7 +69,7 @@ module EffectiveDatatablesPrivateHelper
|
|
60
69
|
options[:input_js] = (options[:input_js] || {}).reverse_merge(placeholder: '')
|
61
70
|
form.select name, collection, options
|
62
71
|
when :bulk_actions
|
63
|
-
options[:data]['role'] = 'bulk-actions
|
72
|
+
options[:data]['role'] = 'bulk-actions'
|
64
73
|
form.check_box name, options.merge(custom: false)
|
65
74
|
end
|
66
75
|
end
|
@@ -8,7 +8,7 @@ module Effective
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def bulk_download(*args)
|
11
|
-
datatable._bulk_actions.push(link_to_bulk_action(*args.merge('data-authenticity-token' => form_authenticity_token)))
|
11
|
+
datatable._bulk_actions.push(link_to_bulk_action(*args.merge('data-authenticity-token' => form_authenticity_token, 'data-method' => :post)))
|
12
12
|
end
|
13
13
|
|
14
14
|
def bulk_action_divider
|
@@ -22,30 +22,19 @@ 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
|
-
|
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
|
25
|
+
def link_to_bulk_action(body, url, opts = {})
|
26
|
+
|
27
|
+
# Transform data: { ... } hash into 'data-' keys
|
28
|
+
if (data = opts.delete(:data))
|
29
|
+
data.each { |k, v| opts["data-#{k}"] ||= v }
|
44
30
|
end
|
45
31
|
|
46
|
-
|
32
|
+
verbs = {'DELETE' => 'DELETE', 'GET' => 'GET'}
|
33
|
+
opts['data-ajax-method'] = verbs[opts.delete('data-method').to_s.upcase] || 'POST'
|
34
|
+
|
35
|
+
opts[:class] = [opts[:class], 'dropdown-item'].compact.join(' ')
|
47
36
|
|
48
|
-
link_to(
|
37
|
+
link_to(body, url, opts)
|
49
38
|
end
|
50
39
|
|
51
40
|
end
|
@@ -97,7 +97,7 @@ module Effective
|
|
97
97
|
)
|
98
98
|
end
|
99
99
|
|
100
|
-
def actions_col(col_class: nil, partial: nil, partial_as: nil, actions_partial: nil, responsive: 5000, visible: true, **actions, &format)
|
100
|
+
def actions_col(col_class: nil, inline: false, partial: nil, partial_as: nil, actions_partial: nil, responsive: 5000, visible: true, **actions, &format)
|
101
101
|
raise 'You can only have one actions column' if datatable.columns[:_actions].present?
|
102
102
|
|
103
103
|
datatable._columns[:_actions] = Effective::DatatableColumn.new(
|
@@ -107,6 +107,7 @@ module Effective
|
|
107
107
|
col_class: col_class,
|
108
108
|
format: (format if block_given?),
|
109
109
|
index: nil,
|
110
|
+
inline: inline,
|
110
111
|
label: false,
|
111
112
|
name: :actions,
|
112
113
|
partial: partial,
|
@@ -24,10 +24,9 @@ module Effective
|
|
24
24
|
spacer_template: SPACER_TEMPLATE
|
25
25
|
) || '').split(SPACER)
|
26
26
|
elsif opts[:as] == :actions # This is actions_col and actions_col do .. end, but not actions_col partial: 'something'
|
27
|
-
locals = { datatable: self, column: columns[name], spacer_template: SPACER_TEMPLATE }
|
28
|
-
|
29
27
|
resources = collection.map { |row| row[opts[:index]] }
|
30
|
-
|
28
|
+
locals = { datatable: self, column: opts, spacer_template: SPACER_TEMPLATE }
|
29
|
+
atts = { actions: actions_col_actions(opts), effective_resource: resource, locals: locals, partial: opts[:actions_partial] }.merge(opts[:actions])
|
31
30
|
|
32
31
|
rendered[name] = (view.render_resource_actions(resources, atts, &opts[:format]) || '').split(SPACER)
|
33
32
|
end
|
@@ -67,7 +66,9 @@ module Effective
|
|
67
66
|
|
68
67
|
case column[:as]
|
69
68
|
when :actions
|
70
|
-
|
69
|
+
atts = { actions: actions_col_actions(column), effective_resource: resource, partial: column[:actions_partial] }.merge(column[:actions])
|
70
|
+
|
71
|
+
(view.render_resource_actions(value, atts) || '')
|
71
72
|
when :boolean
|
72
73
|
case value
|
73
74
|
when true ; 'Yes'
|
@@ -110,6 +111,16 @@ module Effective
|
|
110
111
|
end
|
111
112
|
end
|
112
113
|
|
114
|
+
# Takes all default resource actions
|
115
|
+
# Applies data-remote to anything that's data-method post or delete
|
116
|
+
def actions_col_actions(column)
|
117
|
+
if column[:inline]
|
118
|
+
resource.resource_actions.transform_values { |opts| opts['data-remote'] = true; opts }
|
119
|
+
else
|
120
|
+
resource.resource_actions.transform_values { |opts| opts['data-remote'] = true if opts['data-method']; opts }
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
113
124
|
def resource_col_locals(opts)
|
114
125
|
return {} unless (resource = opts[:resource]).present?
|
115
126
|
|
@@ -1,2 +1,2 @@
|
|
1
1
|
- id = (resource.try(:to_param) || resource.try(:id) || resource.object_id)
|
2
|
-
= check_box_tag 'bulk_actions_resources[]', id, false, autocomplete: 'off', id: "datatable_bulk_actions_resource_#{id}", data: { role: 'bulk-
|
2
|
+
= check_box_tag 'bulk_actions_resources[]', id, false, autocomplete: 'off', id: "datatable_bulk_actions_resource_#{id}", data: { role: 'bulk-action' }
|
@@ -28,19 +28,6 @@ EffectiveDatatables.setup do |config|
|
|
28
28
|
# Default class used on the <table> tag
|
29
29
|
config.html_class = 'table table-hover'
|
30
30
|
|
31
|
-
# When using the actions_column DSL method, apply the following behavior
|
32
|
-
# Valid values for each action are:
|
33
|
-
# true - display this action if authorized?(:show, Post)
|
34
|
-
# false - do not display this action
|
35
|
-
#
|
36
|
-
# You can override these defaults on a per-table basis
|
37
|
-
# by calling `actions_column(show: false, edit: true, destroy: false)`
|
38
|
-
config.actions_column = {
|
39
|
-
show: true,
|
40
|
-
edit: true,
|
41
|
-
destroy: true
|
42
|
-
}
|
43
|
-
|
44
31
|
# Log search/sort information to the console
|
45
32
|
config.debug = true
|
46
33
|
|
data/lib/effective_datatables.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_datatables
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-09-
|
11
|
+
date: 2018-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -109,7 +109,8 @@ files:
|
|
109
109
|
- app/assets/javascripts/effective_datatables/events.js.coffee
|
110
110
|
- app/assets/javascripts/effective_datatables/filters.js.coffee
|
111
111
|
- app/assets/javascripts/effective_datatables/initialize.js.coffee
|
112
|
-
- app/assets/javascripts/effective_datatables/
|
112
|
+
- app/assets/javascripts/effective_datatables/inline_crud.js.coffee
|
113
|
+
- app/assets/javascripts/effective_datatables/overrides.js.coffee
|
113
114
|
- app/assets/javascripts/effective_datatables/reset.js.coffee
|
114
115
|
- app/assets/javascripts/effective_datatables/responsive.js.coffee
|
115
116
|
- app/assets/javascripts/vendor/jquery.delayedChange.js
|
@@ -144,7 +145,6 @@ files:
|
|
144
145
|
- app/models/effective/effective_datatable/params.rb
|
145
146
|
- app/models/effective/effective_datatable/resource.rb
|
146
147
|
- app/models/effective/effective_datatable/state.rb
|
147
|
-
- app/views/effective/datatables/_actions_column.html.haml
|
148
148
|
- app/views/effective/datatables/_bulk_actions_column.html.haml
|
149
149
|
- app/views/effective/datatables/_bulk_actions_dropdown.html.haml
|
150
150
|
- app/views/effective/datatables/_chart.html.haml
|
@@ -181,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
181
181
|
version: '0'
|
182
182
|
requirements: []
|
183
183
|
rubyforge_project:
|
184
|
-
rubygems_version: 2.5.
|
184
|
+
rubygems_version: 2.4.5.1
|
185
185
|
signing_key:
|
186
186
|
specification_version: 4
|
187
187
|
summary: Uniquely powerful server-side searching, sorting and filtering of any ActiveRecord
|
@@ -1,12 +0,0 @@
|
|
1
|
-
$.extend(true, $.fn.dataTable.Buttons.defaults, {
|
2
|
-
dom: {
|
3
|
-
button: {
|
4
|
-
className: 'btn btn-link btn-sm'
|
5
|
-
}
|
6
|
-
}
|
7
|
-
});
|
8
|
-
|
9
|
-
/* Default class modification */
|
10
|
-
$.extend($.fn.dataTable.ext.classes, {
|
11
|
-
sWrapper: 'dataTables_wrapper dt-bootstrap4', // Remove container-fluid
|
12
|
-
});
|
@@ -1 +0,0 @@
|
|
1
|
-
= render_resource_actions(resource, **actions_col_locals)
|