effective_datatables 3.7.10 → 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/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/javascripts/effective_datatables.js +4 -4
- 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/_overrides.scss +72 -152
- data/app/assets/stylesheets/effective_datatables.scss +3 -4
- 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 +2 -4
- 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/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/dsl.rb +3 -8
- 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/engine.rb +4 -14
- data/lib/effective_datatables/version.rb +1 -1
- data/lib/effective_datatables.rb +4 -57
- metadata +20 -31
- data/app/assets/config/effective_datatables_manifest.js +0 -3
- 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
@@ -1,73 +1,91 @@
|
|
1
|
-
//
|
2
|
-
table.dataTable
|
3
|
-
|
4
|
-
|
1
|
+
// Override dataTables.bootstrap4.css defaults
|
2
|
+
table.dataTable { border-collapse: collapse !important; }
|
3
|
+
|
4
|
+
// Override default padding
|
5
|
+
table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
|
6
|
+
table.dataTable thead > tr > td.sorting_asc,
|
7
|
+
table.dataTable thead > tr > td.sorting_desc,
|
8
|
+
table.dataTable thead > tr > td.sorting { padding: 0.5em 0.5em 0.5em 0.5em; }
|
9
|
+
|
10
|
+
// Override default sort icons
|
11
|
+
table.dataTable thead .sorting:before,
|
12
|
+
table.dataTable thead .sorting_asc:before,
|
13
|
+
table.dataTable thead .sorting_desc:before,
|
14
|
+
table.dataTable thead .sorting_asc_disabled:before,
|
15
|
+
table.dataTable thead .sorting_desc_disabled:before,
|
16
|
+
table.dataTable thead .sorting:after,
|
17
|
+
table.dataTable thead .sorting_asc:after,
|
18
|
+
table.dataTable thead .sorting_desc:after,
|
19
|
+
table.dataTable thead .sorting_asc_disabled:after,
|
20
|
+
table.dataTable thead .sorting_desc_disabled:after { content: ''; }
|
21
|
+
|
22
|
+
table.dataTable > thead th {
|
23
|
+
vertical-align: top;
|
24
|
+
background-repeat: no-repeat;
|
25
|
+
|
26
|
+
> span { padding-right: 1rem; }
|
5
27
|
}
|
6
28
|
|
7
|
-
table.dataTable thead .
|
8
|
-
background-image: asset-data-url('dataTables/
|
9
|
-
background-position: right
|
29
|
+
table.dataTable > thead .sorting {
|
30
|
+
background-image: asset-data-url('dataTables/sort.svg');
|
31
|
+
background-position: right 0.25rem top 0.25rem;
|
10
32
|
}
|
11
33
|
|
12
|
-
table.dataTable thead .
|
13
|
-
background-image: asset-data-url('dataTables/
|
14
|
-
background-position: right
|
34
|
+
table.dataTable > thead .sorting_asc {
|
35
|
+
background-image: asset-data-url('dataTables/sort-up.svg');
|
36
|
+
background-position: right 0.25rem top 0.25rem;
|
15
37
|
}
|
16
38
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
39
|
+
table.dataTable > thead .sorting_desc {
|
40
|
+
background-image: asset-data-url('dataTables/sort-down.svg');
|
41
|
+
background-position: right 0.25rem top 0.25rem;
|
42
|
+
}
|
21
43
|
|
22
|
-
//
|
23
|
-
table.dataTable
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
44
|
+
// Collapsed Responsive View
|
45
|
+
table.dataTable > tbody > tr.child {
|
46
|
+
td, th { border: none; }
|
47
|
+
|
48
|
+
ul.dtr-details > li {
|
49
|
+
border-bottom: none;
|
50
|
+
padding-left: 0.5em;
|
51
|
+
|
52
|
+
&:hover { background-color: rgba(0, 0, 0, 0.075); }
|
53
|
+
|
54
|
+
span.dtr-title { min-width: 175px; margin-bottom: 0.25em; }
|
55
|
+
span.dtr-data { white-space: nowrap; }
|
56
|
+
.col-resource_item { margin-bottom: 0.25em; }
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
// Buttons
|
61
|
+
.dataTables_buttons {
|
62
|
+
text-align: right;
|
63
|
+
.btn { font-size: 0.75rem; }
|
28
64
|
}
|
29
65
|
|
30
66
|
// Search bar
|
31
|
-
table.dataTable thead {
|
67
|
+
table.dataTable > thead {
|
32
68
|
tr th {
|
33
|
-
text-align: left;
|
34
|
-
vertical-align: top;
|
35
69
|
border-bottom: none;
|
36
70
|
white-space: nowrap;
|
37
|
-
padding: 6px;
|
38
71
|
|
39
|
-
|
40
|
-
|
72
|
+
.form-group {
|
73
|
+
font-weight: normal;
|
74
|
+
margin-bottom: 0em;
|
41
75
|
|
42
|
-
|
43
|
-
|
44
|
-
font-weight: normal;
|
45
|
-
margin: 0px;
|
76
|
+
input { max-height: 38px; }
|
77
|
+
}
|
46
78
|
}
|
47
|
-
|
48
|
-
.datatable_search__bulk_actions { margin-left: 5px; }
|
49
79
|
}
|
50
80
|
|
51
81
|
// Simple styles
|
52
|
-
table.dataTable.simple {
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
.sorting_desc { background-image: none; cursor: default; }
|
57
|
-
|
58
|
-
.form-group { display: none; }
|
59
|
-
.col-bulk_actions { display: none; }
|
60
|
-
}
|
61
|
-
}
|
82
|
+
table.dataTable.simple > thead {
|
83
|
+
.sorting { background-image: none; cursor: default; }
|
84
|
+
.sorting_asc { background-image: none; cursor: default; }
|
85
|
+
.sorting_desc { background-image: none; cursor: default; }
|
62
86
|
|
63
|
-
|
64
|
-
|
65
|
-
top: -10px;
|
66
|
-
border: none;
|
67
|
-
box-shadow: none;
|
68
|
-
margin-left: -35%;
|
69
|
-
margin-bottom: 0;
|
70
|
-
width: 70%;
|
87
|
+
.form-group { display: none; }
|
88
|
+
.col-bulk_actions { display: none; }
|
71
89
|
}
|
72
90
|
|
73
91
|
// Datatables entries
|
@@ -82,7 +100,7 @@ div.dataTables_wrapper div.dataTables_processing {
|
|
82
100
|
// Showing 1 to 2 of 2 entries (filtered from 10 total entries)
|
83
101
|
div.dataTables_info {
|
84
102
|
display: inline-block;
|
85
|
-
padding:
|
103
|
+
padding: 0.25em 0em 0.25em 0.25em;
|
86
104
|
}
|
87
105
|
|
88
106
|
// with 25 per page
|
@@ -95,7 +113,7 @@ div.dataTables_wrapper div.dataTables_processing {
|
|
95
113
|
max-width: 45px;
|
96
114
|
|
97
115
|
.select2-selection { border: none; }
|
98
|
-
.select2-selection__rendered { padding:
|
116
|
+
.select2-selection__rendered { padding: 0em; color: #909090; }
|
99
117
|
}
|
100
118
|
|
101
119
|
span.select2-container.select2-container--open { max-width: 60px; }
|
@@ -104,80 +122,8 @@ div.dataTables_wrapper div.dataTables_processing {
|
|
104
122
|
}
|
105
123
|
}
|
106
124
|
|
107
|
-
// Buttons
|
108
|
-
div.dt-buttons {
|
109
|
-
float: right;
|
110
|
-
display: inherit;
|
111
|
-
width: auto;
|
112
|
-
}
|
113
|
-
|
114
|
-
.dt-buttons {
|
115
|
-
a, button {
|
116
|
-
border: none;
|
117
|
-
color: #337ab7;
|
118
|
-
border-color: transparent;
|
119
|
-
background: #fff;
|
120
|
-
font-size: 12px;
|
121
|
-
padding: 6px;
|
122
|
-
margin-right: 6px;
|
123
|
-
float: none;
|
124
|
-
|
125
|
-
&:hover,
|
126
|
-
&:focus {
|
127
|
-
border: none;
|
128
|
-
border-color: transparent;
|
129
|
-
background: #eee !important;
|
130
|
-
}
|
131
|
-
|
132
|
-
&:last-child { margin-right: 0px; }
|
133
|
-
|
134
|
-
&.active {
|
135
|
-
color: #fff;
|
136
|
-
background: #03428d !important;
|
137
|
-
}
|
138
|
-
|
139
|
-
.caret {
|
140
|
-
margin-bottom: 4px;
|
141
|
-
}
|
142
|
-
}
|
143
|
-
}
|
144
|
-
|
145
|
-
// Show / hide columns button
|
146
|
-
ul.dt-button-collection {
|
147
|
-
width: 400px;
|
148
|
-
|
149
|
-
li {
|
150
|
-
width: 198px;
|
151
|
-
overflow: hidden;
|
152
|
-
}
|
153
|
-
|
154
|
-
li:nth-child(odd) {
|
155
|
-
float: left;
|
156
|
-
}
|
157
|
-
|
158
|
-
li:nth-child(even) {
|
159
|
-
float: right;
|
160
|
-
}
|
161
|
-
|
162
|
-
.buttons-colvisGroup {
|
163
|
-
clear: left;
|
164
|
-
border-top: 1px solid grey;
|
165
|
-
}
|
166
|
-
|
167
|
-
.buttons-colvisRestore {
|
168
|
-
border-top: 1px solid grey;
|
169
|
-
}
|
170
|
-
}
|
171
|
-
|
172
|
-
// Collapsed Responsive View
|
173
|
-
table.dataTable > tbody > tr.child {
|
174
|
-
span.dtr-title { min-width: 175px; margin-bottom: 4px; }
|
175
|
-
span.dtr-data { white-space: nowrap; }
|
176
|
-
.col-resource_item { margin-bottom: 4px; }
|
177
|
-
}
|
178
|
-
|
179
125
|
// Column specific adjustments
|
180
|
-
table.dataTable {
|
126
|
+
table.dataTable > tbody {
|
181
127
|
td.col-price { text-align: right; }
|
182
128
|
td.col-decimal { text-align: right; }
|
183
129
|
td.col-right { text-align: right; }
|
@@ -193,32 +139,6 @@ table.dataTable {
|
|
193
139
|
td.col-resource_item { word-break: keep-all; }
|
194
140
|
|
195
141
|
td {
|
196
|
-
p { margin-bottom:
|
142
|
+
p { margin-bottom: 0em; }
|
197
143
|
}
|
198
144
|
}
|
199
|
-
|
200
|
-
// Simple styles
|
201
|
-
table.dataTable.hide-sort > thead {
|
202
|
-
.sorting { background-image: none; cursor: default; }
|
203
|
-
.sorting_asc { background-image: none; cursor: default; }
|
204
|
-
.sorting_desc { background-image: none; cursor: default; }
|
205
|
-
}
|
206
|
-
|
207
|
-
table.dataTable.hide-search > thead {
|
208
|
-
.form-group { display: none; }
|
209
|
-
}
|
210
|
-
|
211
|
-
table.dataTable.hide-buttons {
|
212
|
-
.col-bulk_actions { display: none; }
|
213
|
-
}
|
214
|
-
|
215
|
-
// Datatables entries
|
216
|
-
@media screen and (max-width: 767px) {
|
217
|
-
div.dataTables_wrapper div.dataTables_entries { text-align: center; }
|
218
|
-
}
|
219
|
-
|
220
|
-
.dataTables_buttons {
|
221
|
-
.buttons-bulk-actions {
|
222
|
-
button { font-size: 12px; }
|
223
|
-
}
|
224
|
-
}
|
@@ -1,7 +1,6 @@
|
|
1
|
-
@import 'dataTables/dataTables.
|
1
|
+
@import 'dataTables/dataTables.bootstrap4';
|
2
2
|
|
3
|
-
@import 'dataTables/buttons/buttons.
|
4
|
-
@import 'dataTables/responsive/responsive.
|
3
|
+
@import 'dataTables/buttons/buttons.bootstrap4';
|
4
|
+
@import 'dataTables/responsive/responsive.bootstrap4';
|
5
5
|
|
6
|
-
@import 'effective_datatables/filters';
|
7
6
|
@import 'effective_datatables/overrides';
|
@@ -5,7 +5,7 @@ module Effective
|
|
5
5
|
# This will respond to both a GET and a POST
|
6
6
|
def show
|
7
7
|
begin
|
8
|
-
@datatable =
|
8
|
+
@datatable = find_datatable(params[:id]).try(:new) || raise('unable to find datatable')
|
9
9
|
@datatable.view = view_context
|
10
10
|
|
11
11
|
EffectiveDatatables.authorize!(self, :index, @datatable.collection_class)
|
@@ -13,51 +13,18 @@ module Effective
|
|
13
13
|
render json: @datatable.to_json
|
14
14
|
rescue => e
|
15
15
|
EffectiveDatatables.authorized?(self, :index, @datatable.try(:collection_class))
|
16
|
-
render json: error_json(e)
|
17
16
|
|
18
|
-
|
19
|
-
raise e if Rails.env.development?
|
17
|
+
render json: error_json(e)
|
20
18
|
end
|
21
19
|
end
|
22
20
|
|
23
|
-
|
24
|
-
begin
|
25
|
-
@datatable = EffectiveDatatables.find(params[:id], params[:attributes])
|
26
|
-
@datatable.view = view_context
|
27
|
-
|
28
|
-
EffectiveDatatables.authorize!(self, :index, @datatable.collection_class)
|
29
|
-
|
30
|
-
@resource = @datatable.collection.find(params[:reorder][:id])
|
31
|
-
|
32
|
-
EffectiveDatatables.authorize!(self, :update, @resource)
|
33
|
-
|
34
|
-
attribute = @datatable.columns[:_reorder][:reorder]
|
35
|
-
old_index = params[:reorder][:old].to_i
|
36
|
-
new_index = params[:reorder][:new].to_i
|
37
|
-
|
38
|
-
@resource.class.transaction do
|
39
|
-
if new_index > old_index
|
40
|
-
@datatable.collection.where("#{attribute} > ? AND #{attribute} <= ?", old_index, new_index).update_all("#{attribute} = #{attribute} - 1")
|
41
|
-
@resource.update_column(attribute, new_index)
|
42
|
-
end
|
43
|
-
|
44
|
-
if old_index > new_index
|
45
|
-
@datatable.collection.where("#{attribute} >= ? AND #{attribute} < ?", new_index, old_index).update_all("#{attribute} = #{attribute} + 1")
|
46
|
-
@resource.update_column(attribute, new_index)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
render status: :ok, body: :ok
|
51
|
-
rescue Effective::AccessDenied => e
|
52
|
-
render(status: :unauthorized, body: 'Access Denied')
|
53
|
-
rescue => e
|
54
|
-
render(status: :error, body: 'Unexpected Error')
|
55
|
-
end
|
21
|
+
private
|
56
22
|
|
23
|
+
def find_datatable(id)
|
24
|
+
id = id.to_s.gsub(/-\d{12}\z/, '').gsub('-', '/')
|
25
|
+
id.classify.safe_constantize || id.classify.pluralize.safe_constantize
|
57
26
|
end
|
58
27
|
|
59
|
-
private
|
60
|
-
|
61
28
|
def error_json(e)
|
62
29
|
{
|
63
30
|
data: [],
|
@@ -1,15 +1,8 @@
|
|
1
1
|
# These are expected to be called by a developer. They are part of the datatables DSL.
|
2
2
|
module EffectiveDatatablesHelper
|
3
|
-
def render_datatable(datatable, input_js: {}, buttons: true, charts: true, entries: true, filters: true, inline: false, pagination: true, search: true, simple: false, sort: true)
|
4
|
-
raise 'expected datatable to be present' unless datatable
|
5
|
-
raise 'expected input_js to be a Hash' unless input_js.kind_of?(Hash)
|
6
|
-
|
7
|
-
if simple
|
8
|
-
buttons = charts = entries = filters = pagination = search = sort = false
|
9
|
-
end
|
10
3
|
|
11
|
-
|
12
|
-
datatable
|
4
|
+
def render_datatable(datatable, input_js: {}, buttons: true, charts: true, filters: true, simple: false)
|
5
|
+
raise 'expected datatable to be present' unless datatable
|
13
6
|
|
14
7
|
datatable.view ||= self
|
15
8
|
|
@@ -20,48 +13,29 @@ module EffectiveDatatablesHelper
|
|
20
13
|
charts = charts && datatable._charts.present?
|
21
14
|
filters = filters && (datatable._scopes.present? || datatable._filters.present?)
|
22
15
|
|
23
|
-
|
24
|
-
|
25
|
-
if datatable.reorder? && !buttons
|
26
|
-
buttons = true; input_js[:buttons] = false
|
27
|
-
end
|
28
|
-
|
29
|
-
# Build the datatables DOM option
|
30
|
-
input_js[:dom] ||= [
|
31
|
-
("<'row'<'col-sm-12 dataTables_buttons'B>>" if buttons),
|
32
|
-
"<'row'<'col-sm-12'tr>>",
|
33
|
-
("<'row'" if entries || pagination),
|
34
|
-
("<'col-sm-6 dataTables_entries'il>" if entries),
|
35
|
-
("<'col-sm-6'p>" if pagination),
|
36
|
-
(">" if entries || pagination)
|
37
|
-
].compact.join
|
16
|
+
datatable.attributes[:simple] = true if simple
|
17
|
+
input_js[:buttons] = false if simple || !buttons
|
38
18
|
|
39
19
|
effective_datatable_params = {
|
40
20
|
id: datatable.to_param,
|
41
|
-
class:
|
21
|
+
class: ('effective-datatable ' + Array(datatable.table_html_class).join(' ')),
|
42
22
|
data: {
|
43
|
-
'attributes' => EffectiveDatatables.encrypt(datatable.attributes),
|
44
|
-
'authenticity-token' => form_authenticity_token,
|
45
23
|
'bulk-actions' => datatable_bulk_actions(datatable),
|
46
24
|
'columns' => datatable_columns(datatable),
|
25
|
+
'cookie' => datatable.cookie_key,
|
47
26
|
'display-length' => datatable.display_length,
|
48
|
-
'display-order' =>
|
27
|
+
'display-order' => [datatable.order_index, datatable.order_direction].to_json().html_safe,
|
49
28
|
'display-records' => datatable.to_json[:recordsFiltered],
|
50
29
|
'display-start' => datatable.display_start,
|
51
|
-
'
|
52
|
-
'
|
53
|
-
'
|
54
|
-
'reset' => (datatable_reset(datatable) if search),
|
55
|
-
'reorder' => datatable_reorder(datatable),
|
56
|
-
'reorder-index' => (datatable.columns[:_reorder][:index] if datatable.reorder?).to_s,
|
57
|
-
'simple' => simple.to_s,
|
58
|
-
'spinner' => '', # effective_bootstrap
|
30
|
+
'options' => (input_js || {}).to_json.html_safe,
|
31
|
+
'reset' => datatable_reset(datatable),
|
32
|
+
'simple' => datatable.simple?.to_s,
|
59
33
|
'source' => effective_datatables.datatable_path(datatable, {format: 'json'}),
|
60
34
|
'total-records' => datatable.to_json[:recordsTotal]
|
61
35
|
}
|
62
36
|
}
|
63
37
|
|
64
|
-
if (charts || filters)
|
38
|
+
if (charts || filters) && !simple
|
65
39
|
output = ''.html_safe
|
66
40
|
|
67
41
|
if charts
|
@@ -84,28 +58,59 @@ module EffectiveDatatablesHelper
|
|
84
58
|
end
|
85
59
|
end
|
86
60
|
|
87
|
-
def
|
88
|
-
|
61
|
+
def render_simple_datatable(datatable)
|
62
|
+
raise 'expected datatable to be present' unless datatable
|
63
|
+
|
64
|
+
datatable.view ||= self
|
65
|
+
|
66
|
+
unless EffectiveDatatables.authorized?(controller, :index, datatable.collection_class)
|
67
|
+
return content_tag(:p, "You are not authorized to view this datatable. (cannot :index, #{datatable.collection_class})")
|
68
|
+
end
|
69
|
+
|
70
|
+
effective_datatable_params = {
|
71
|
+
id: datatable.to_param,
|
72
|
+
class: ('effective-datatable simple ' + Array(datatable.table_html_class).join(' ')),
|
73
|
+
data: {}
|
74
|
+
}
|
75
|
+
|
76
|
+
render(partial: 'effective/datatables/datatable',
|
77
|
+
locals: { datatable: datatable, effective_datatable_params: effective_datatable_params }
|
78
|
+
)
|
89
79
|
end
|
90
80
|
|
91
|
-
def
|
92
|
-
|
81
|
+
def render_datatable_filters(datatable)
|
82
|
+
raise 'expected datatable to be present' unless datatable
|
83
|
+
|
84
|
+
datatable.view ||= self
|
85
|
+
return unless datatable._scopes.present? || datatable._filters.present?
|
86
|
+
|
87
|
+
if datatable._filters_form_required?
|
88
|
+
render partial: 'effective/datatables/filters', locals: { datatable: datatable }
|
89
|
+
else
|
90
|
+
render(partial: 'effective/datatables/filters', locals: { datatable: datatable }).gsub('<form', '<div').gsub('/form>', '/div>').html_safe
|
91
|
+
end
|
92
|
+
|
93
93
|
end
|
94
94
|
|
95
|
-
def
|
96
|
-
|
95
|
+
def render_datatable_charts(datatable)
|
96
|
+
raise 'expected datatable to be present' unless datatable
|
97
|
+
|
98
|
+
datatable.view ||= self
|
99
|
+
return unless datatable._charts.present?
|
100
|
+
|
101
|
+
datatable._charts.map { |name, _| render_datatable_chart(datatable, name) }.join.html_safe
|
97
102
|
end
|
98
103
|
|
99
|
-
def
|
100
|
-
|
101
|
-
return @_inline_datatable if @_inline_datatable
|
104
|
+
def render_datatable_chart(datatable, name)
|
105
|
+
raise 'expected datatable to be present' unless datatable
|
102
106
|
|
103
|
-
datatable
|
104
|
-
datatable.
|
107
|
+
datatable.view ||= self
|
108
|
+
return unless datatable._charts[name].present?
|
105
109
|
|
106
|
-
|
110
|
+
chart = datatable._charts[name]
|
111
|
+
chart_data = datatable.to_json[:charts][name][:data]
|
107
112
|
|
108
|
-
|
113
|
+
render partial: chart[:partial], locals: { datatable: datatable, chart: chart, chart_data: chart_data }
|
109
114
|
end
|
110
115
|
|
111
116
|
end
|