effective_datatables 3.6.3 → 3.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/app/assets/javascripts/dataTables/locales/en.lang +33 -0
- data/app/assets/javascripts/dataTables/locales/es.lang +36 -0
- data/app/assets/javascripts/dataTables/locales/nl.lang +30 -0
- data/app/assets/javascripts/effective_datatables/filters.js.coffee +1 -0
- data/app/assets/javascripts/effective_datatables/flash.js.coffee +31 -0
- data/app/assets/javascripts/effective_datatables/initialize.js.coffee +41 -53
- data/app/assets/javascripts/effective_datatables/inline_crud.js.coffee +217 -0
- data/app/assets/javascripts/effective_datatables/overrides.js.coffee +7 -0
- data/app/assets/javascripts/effective_datatables/reorder.js.coffee +43 -0
- data/app/assets/javascripts/effective_datatables/reset.js.coffee +1 -1
- data/app/assets/stylesheets/effective_datatables/_overrides.scss +28 -0
- data/app/controllers/effective/datatables_controller.rb +39 -6
- data/app/datatables/effective_style_guide_datatable.rb +47 -0
- data/app/helpers/effective_datatables_helper.rb +49 -56
- data/app/helpers/effective_datatables_private_helper.rb +137 -11
- data/app/models/effective/datatable.rb +36 -16
- data/app/models/effective/datatable_column.rb +1 -0
- data/app/models/effective/datatable_value_tool.rb +20 -20
- data/app/models/effective/effective_datatable/attributes.rb +5 -13
- data/app/models/effective/effective_datatable/collection.rb +18 -3
- data/app/models/effective/effective_datatable/compute.rb +15 -6
- data/app/models/effective/effective_datatable/cookie.rb +19 -18
- data/app/models/effective/effective_datatable/dsl.rb +8 -3
- data/app/models/effective/effective_datatable/dsl/bulk_actions.rb +16 -23
- data/app/models/effective/effective_datatable/dsl/datatable.rb +70 -28
- data/app/models/effective/effective_datatable/dsl/filters.rb +12 -4
- data/app/models/effective/effective_datatable/format.rb +1 -4
- data/app/models/effective/effective_datatable/params.rb +9 -4
- data/app/models/effective/effective_datatable/resource.rb +129 -74
- data/app/models/effective/effective_datatable/state.rb +30 -15
- data/app/views/effective/datatables/_bulk_actions_dropdown.html.haml +3 -5
- data/app/views/effective/datatables/_datatable.html.haml +3 -5
- data/app/views/effective/datatables/_filters.html.haml +4 -24
- data/app/views/effective/datatables/_reorder_column.html.haml +5 -0
- data/app/views/effective/style_guide/_effective_datatables.html.haml +1 -0
- data/config/effective_datatables.rb +8 -21
- data/config/locales/en.yml +12 -0
- data/config/locales/es.yml +12 -0
- data/config/locales/nl.yml +12 -0
- data/config/routes.rb +5 -4
- data/lib/effective_datatables.rb +49 -2
- data/lib/effective_datatables/engine.rb +4 -2
- data/lib/effective_datatables/version.rb +1 -1
- metadata +17 -5
- data/app/views/effective/datatables/_reset.html.haml +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63197015127b15c2f50203c0cd6b8fad50fd441cefed7bee38e7a1755dd3e131
|
4
|
+
data.tar.gz: e3615c89e3c8c3c0b89c107625d4e9c7ed4f75dc356b29bb16b929d6df4bddf7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3cfa114b29faca24afed1d84ebdc4276de6c802c2a2682dcf288541438127c15fd60f7897142ec13e89d0abdef3d719509aac5e0fce69d9fe0ca2c8f00d5de7
|
7
|
+
data.tar.gz: d296c07e31f1b00b8b94aaecfbda53612016a3fade4f0631078a0a2f33af79dc2ca64f1ef50a421b10c35d6c60b649da74a741927cede4603467bfe32cee4fe6
|
data/MIT-LICENSE
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
/**
|
2
|
+
* English - this is the default DataTables ships with
|
3
|
+
* @name English
|
4
|
+
* @anchor English
|
5
|
+
* @author <a href="http://www.sprymedia.co.uk/">Allan Jardine</a>
|
6
|
+
*/
|
7
|
+
|
8
|
+
{
|
9
|
+
"sEmptyTable": "No data available in table",
|
10
|
+
"sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
|
11
|
+
"sInfoEmpty": "Showing 0 to 0 of 0 entries",
|
12
|
+
"sInfoFiltered": "(filtered from _MAX_ total entries)",
|
13
|
+
"sInfoPostFix": "",
|
14
|
+
"sInfoThousands": ",",
|
15
|
+
"sLengthMenu": " with _MENU_ per page",
|
16
|
+
"sLoadingRecords": "Loading...",
|
17
|
+
"sProcessing": "Processing...",
|
18
|
+
"sSearch": "Search:",
|
19
|
+
"sZeroRecords": "No matching records found",
|
20
|
+
"oPaginate": {
|
21
|
+
"sFirst": "First",
|
22
|
+
"sLast": "Last",
|
23
|
+
"sNext": "Next",
|
24
|
+
"sPrevious": "Previous"
|
25
|
+
},
|
26
|
+
"oAria": {
|
27
|
+
"sSortAscending": ": activate to sort column ascending",
|
28
|
+
"sSortDescending": ": activate to sort column descending"
|
29
|
+
},
|
30
|
+
"buttons": {
|
31
|
+
"colvis": "Show / Hide"
|
32
|
+
}
|
33
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
/**
|
2
|
+
* Spanish translation
|
3
|
+
* @name Spanish
|
4
|
+
* @anchor Spanish
|
5
|
+
* @author Giovanni Ariza, Aristobulo Gomez and Roberto Poo
|
6
|
+
*/
|
7
|
+
|
8
|
+
{
|
9
|
+
"sProcessing": "Procesando...",
|
10
|
+
"sLengthMenu": "Mostrar _MENU_ registros",
|
11
|
+
"sZeroRecords": "No se encontraron resultados",
|
12
|
+
"sEmptyTable": "Ningún dato disponible en esta tabla =(",
|
13
|
+
"sInfo": "Mostrando registros del _START_ al _END_ de un total de _TOTAL_ registros",
|
14
|
+
"sInfoEmpty": "Mostrando registros del 0 al 0 de un total de 0 registros",
|
15
|
+
"sInfoFiltered": "(filtrado de un total de _MAX_ registros)",
|
16
|
+
"sLengthMenu": " con _MENU_ por página",
|
17
|
+
"sInfoPostFix": "",
|
18
|
+
"sSearch": "Buscar:",
|
19
|
+
"sUrl": "",
|
20
|
+
"sInfoThousands": ",",
|
21
|
+
"sLoadingRecords": "Cargando...",
|
22
|
+
"oPaginate": {
|
23
|
+
"sFirst": "Primero",
|
24
|
+
"sLast": "Último",
|
25
|
+
"sNext": "Siguiente",
|
26
|
+
"sPrevious": "Anterior"
|
27
|
+
},
|
28
|
+
"oAria": {
|
29
|
+
"sSortAscending": ": Activar para ordenar la columna de manera ascendente",
|
30
|
+
"sSortDescending": ": Activar para ordenar la columna de manera descendente"
|
31
|
+
},
|
32
|
+
"buttons": {
|
33
|
+
"copy": "Copiar",
|
34
|
+
"colvis": "Mostrar/Ocultar"
|
35
|
+
}
|
36
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
/**
|
2
|
+
* Dutch translation
|
3
|
+
* @name Dutch
|
4
|
+
* @anchor Dutch
|
5
|
+
* @author <a href="http://www.blikgooien.nl/">Erwin Kerk</a> and <i>ashwin</i>
|
6
|
+
*/
|
7
|
+
|
8
|
+
{
|
9
|
+
"sProcessing": "Bezig...",
|
10
|
+
"sLengthMenu": "_MENU_ resultaten weergeven",
|
11
|
+
"sZeroRecords": "Geen resultaten gevonden",
|
12
|
+
"sInfo": "_START_ tot _END_ van _TOTAL_ resultaten",
|
13
|
+
"sInfoEmpty": "Geen resultaten om weer te geven",
|
14
|
+
"sInfoFiltered": " (gefilterd uit _MAX_ resultaten)",
|
15
|
+
"sInfoPostFix": "",
|
16
|
+
"sSearch": "Zoeken:",
|
17
|
+
"sEmptyTable": "Geen resultaten aanwezig in de tabel",
|
18
|
+
"sInfoThousands": ".",
|
19
|
+
"sLoadingRecords": "Een moment geduld aub - bezig met laden...",
|
20
|
+
"oPaginate": {
|
21
|
+
"sFirst": "Eerste",
|
22
|
+
"sLast": "Laatste",
|
23
|
+
"sNext": "Volgende",
|
24
|
+
"sPrevious": "Vorige"
|
25
|
+
},
|
26
|
+
"oAria": {
|
27
|
+
"sSortAscending": ": activeer om kolom oplopend te sorteren",
|
28
|
+
"sSortDescending": ": activeer om kolom aflopend te sorteren"
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
flash = (message, status = '') ->
|
2
|
+
@context[0].oFeatures.bProcessing = false
|
3
|
+
|
4
|
+
message ||= 'Processing...'
|
5
|
+
|
6
|
+
if status == 'danger'
|
7
|
+
message = 'Error: ' + message
|
8
|
+
|
9
|
+
$processing = $(@table().node()).siblings('.dataTables_processing')
|
10
|
+
|
11
|
+
if status.length > 0
|
12
|
+
$processing.addClass("alert-#{status}")
|
13
|
+
|
14
|
+
$processing.html(message).show()
|
15
|
+
|
16
|
+
timeout = $processing.data('timeout')
|
17
|
+
clearTimeout(timeout) if timeout
|
18
|
+
|
19
|
+
delay = (if status == 'danger' then 4000 else 1500)
|
20
|
+
|
21
|
+
$processing.html(message).data('timeout', setTimeout( =>
|
22
|
+
$processing.html('Processing...')
|
23
|
+
$processing.removeClass('alert-success alert-info alert-warning alert-danger alert-error')
|
24
|
+
$processing.hide()
|
25
|
+
@context[0].oFeatures.bProcessing = true
|
26
|
+
, delay)
|
27
|
+
)
|
28
|
+
|
29
|
+
return @
|
30
|
+
|
31
|
+
$.fn.DataTable.Api.register('flash()', flash);
|
@@ -1,14 +1,12 @@
|
|
1
|
-
initializeDataTables = ->
|
2
|
-
$('table.effective-datatable').each ->
|
3
|
-
return if $.fn.DataTable.fnIsDataTable(this)
|
4
|
-
|
1
|
+
initializeDataTables = (target) ->
|
2
|
+
$(target || document).find('table.effective-datatable:not(.initialized)').each ->
|
5
3
|
datatable = $(this)
|
6
|
-
|
7
|
-
buttons_export_columns =
|
8
|
-
|
4
|
+
options = datatable.data('options') || {}
|
5
|
+
buttons_export_columns = options['buttons_export_columns'] || ':not(.col-actions)'
|
6
|
+
reorder = datatable.data('reorder')
|
9
7
|
|
10
|
-
if
|
11
|
-
|
8
|
+
if options['buttons'] == false
|
9
|
+
options['buttons'] = []
|
12
10
|
|
13
11
|
init_options =
|
14
12
|
ajax: { url: datatable.data('source'), type: 'POST' }
|
@@ -16,10 +14,10 @@ initializeDataTables = ->
|
|
16
14
|
buttons: [
|
17
15
|
{
|
18
16
|
extend: 'colvis',
|
19
|
-
text: 'Show / Hide',
|
20
17
|
postfixButtons: [
|
21
|
-
{ extend: 'colvisGroup', text: 'Show all', show: ':hidden'},
|
22
|
-
{ extend: '
|
18
|
+
{ extend: 'colvisGroup', text: 'Show all', show: ':hidden', className: 'buttons-colvisGroup-first'},
|
19
|
+
{ extend: 'colvisGroup', text: 'Show none', hide: ':visible' },
|
20
|
+
{ extend: 'colvisGroup', text: 'Show default', hide: ':not(.colvis-default)', show: '.colvis-default' }
|
23
21
|
]
|
24
22
|
},
|
25
23
|
{
|
@@ -49,9 +47,8 @@ initializeDataTables = ->
|
|
49
47
|
deferLoading: [datatable.data('display-records'), datatable.data('total-records')]
|
50
48
|
deferRender: true
|
51
49
|
displayStart: datatable.data('display-start')
|
52
|
-
dom: "<'row'<'col-sm-12'B>><'row'<'col-sm-12'tr>><'row'<'col-sm-6 dataTables_entries'il><'col-sm-6'p>>"
|
53
50
|
iDisplayLength: datatable.data('display-length')
|
54
|
-
language:
|
51
|
+
language: datatable.data('language')
|
55
52
|
lengthMenu: [[5, 10, 25, 50, 100, 250, 500, 9999999], ['5', '10', '25', '50', '100', '250', '500', 'All']]
|
56
53
|
order: datatable.data('display-order')
|
57
54
|
processing: true
|
@@ -63,7 +60,7 @@ initializeDataTables = ->
|
|
63
60
|
$table = $(api.table().node())
|
64
61
|
$form = $(".effective-datatables-filters[aria-controls='#{$table.attr('id')}']").first()
|
65
62
|
|
66
|
-
params['
|
63
|
+
params['attributes'] = $table.data('attributes')
|
67
64
|
params['authenticity_token'] = $table.data('authenticity-token')
|
68
65
|
|
69
66
|
if $form.length > 0
|
@@ -78,8 +75,7 @@ initializeDataTables = ->
|
|
78
75
|
scrollCollapse: true
|
79
76
|
pagingType: 'simple_numbers'
|
80
77
|
initComplete: (settings) ->
|
81
|
-
|
82
|
-
initializeBulkActions(this.api())
|
78
|
+
initializeButtons(this.api())
|
83
79
|
initializeSearch(this.api())
|
84
80
|
drawCallback: (settings) ->
|
85
81
|
$table = $(this.api().table().node())
|
@@ -95,36 +91,21 @@ initializeDataTables = ->
|
|
95
91
|
if settings['json']['charts']
|
96
92
|
drawCharts($table, settings['json']['charts'])
|
97
93
|
|
98
|
-
|
94
|
+
$table.children('tbody').trigger('effective-bootstrap:initialize')
|
99
95
|
|
100
96
|
# Copies the bulk actions html, stored in a data attribute on the table, into the buttons area
|
101
|
-
|
102
|
-
$table = $(api.table().node())
|
103
|
-
|
104
|
-
if $table.data('bulk-actions')
|
105
|
-
$table.closest('.dataTables_wrapper').children().first().find('.dt-buttons').prepend($table.data('bulk-actions'))
|
106
|
-
|
107
|
-
initializeReset = (api) ->
|
97
|
+
initializeButtons = (api) ->
|
108
98
|
$table = $(api.table().node())
|
99
|
+
$buttons = $table.closest('.dataTables_wrapper').children().first().find('.dt-buttons')
|
109
100
|
|
110
101
|
if $table.data('reset')
|
111
|
-
$
|
112
|
-
|
113
|
-
# After we perform a bulk action, we have to re-select the checkboxes manually and do a bit of house keeping
|
114
|
-
drawBulkActions = ($table) ->
|
115
|
-
selected = $table.data('bulk-actions-restore-selected-values')
|
102
|
+
$buttons.prepend($table.data('reset'))
|
116
103
|
|
117
|
-
|
104
|
+
if $table.data('reorder')
|
105
|
+
$buttons.prepend($table.data('reorder'))
|
118
106
|
|
119
|
-
if
|
120
|
-
$table.
|
121
|
-
$input = $(input)
|
122
|
-
$input.prop('checked', selected.indexOf($input.val()) > -1)
|
123
|
-
|
124
|
-
$bulkActions.removeAttr('disabled')
|
125
|
-
$table.data('bulk-actions-restore-selected-values', [])
|
126
|
-
else
|
127
|
-
$bulkActions.attr('disabled', 'disabled')
|
107
|
+
if $table.data('bulk-actions')
|
108
|
+
$buttons.prepend($table.data('bulk-actions'))
|
128
109
|
|
129
110
|
drawAggregates = ($table, aggregates) ->
|
130
111
|
$tfoot = $table.find('tfoot').first()
|
@@ -152,7 +133,7 @@ initializeDataTables = ->
|
|
152
133
|
api.settings()[0].aoPreSearchCols[index].sSearch = settings.search
|
153
134
|
|
154
135
|
if settings.searchHtml # Append the search html and initialize input events
|
155
|
-
$th.append(
|
136
|
+
$th.append(settings.searchHtml)
|
156
137
|
initializeSearchEvents($th)
|
157
138
|
|
158
139
|
# Sets up the proper events for each input
|
@@ -169,6 +150,7 @@ initializeDataTables = ->
|
|
169
150
|
$input.on 'change', (event) -> dataTableSearch($(event.currentTarget))
|
170
151
|
else if $input.is('input')
|
171
152
|
$input.delayedChange ($input) -> dataTableSearch($input)
|
153
|
+
$input.on('paste', -> dataTableSearch($input))
|
172
154
|
|
173
155
|
# Do the actual search
|
174
156
|
dataTableSearch = ($input) -> # This is the function called by a select or input to run the search
|
@@ -177,27 +159,33 @@ initializeDataTables = ->
|
|
177
159
|
table = $input.closest('table.dataTable')
|
178
160
|
table.DataTable().column("#{$input.data('column-name')}:name").search($input.val()).draw()
|
179
161
|
|
180
|
-
if
|
181
|
-
init_options['
|
182
|
-
datatable.addClass('simple')
|
162
|
+
if reorder
|
163
|
+
init_options['rowReorder'] = { selector: 'td.col-_reorder', snapX: true, dataSrc: datatable.data('reorder-index') }
|
183
164
|
|
184
165
|
# Let's actually initialize the table now
|
185
|
-
table = datatable.dataTable(jQuery.extend(init_options,
|
166
|
+
table = datatable.dataTable(jQuery.extend(init_options, options))
|
167
|
+
|
168
|
+
# Fix a tabindex issue
|
169
|
+
table.children('tbody').children('tr').children('td[tabindex]').removeAttr('tabindex')
|
186
170
|
|
187
171
|
# Apply EffectiveFormInputs to the Show x per page dropdown
|
188
|
-
|
189
|
-
|
172
|
+
try table.closest('.dataTables_wrapper').find('.dataTables_length select').removeAttr('name').select2(minimumResultsForSearch: 100)
|
173
|
+
|
174
|
+
if reorder
|
175
|
+
table.DataTable().on('row-reorder', (event, diff, edit) -> $(event.target).DataTable().reorder(event, diff, edit))
|
176
|
+
|
177
|
+
table.addClass('initialized')
|
178
|
+
table.children('thead').trigger('effective-bootstrap:initialize')
|
179
|
+
true
|
190
180
|
|
191
181
|
destroyDataTables = ->
|
192
|
-
$('
|
193
|
-
|
194
|
-
$(this).DataTable().destroy()
|
182
|
+
$('.effective-datatables-inline-expanded').removeClass('effective-datatables-inline-expanded')
|
183
|
+
$('table.effective-datatable').each -> try $(this).removeClass('initialized').DataTable().destroy()
|
195
184
|
|
196
185
|
$ -> initializeDataTables()
|
186
|
+
$(document).on 'effective-datatables:initialize', (event) -> initializeDataTables(event.currentTarget)
|
187
|
+
|
197
188
|
$(document).on 'page:change', -> initializeDataTables()
|
198
189
|
$(document).on 'turbolinks:load', -> initializeDataTables()
|
199
190
|
$(document).on 'turbolinks:render', -> initializeDataTables()
|
200
191
|
$(document).on 'turbolinks:before-cache', -> destroyDataTables()
|
201
|
-
|
202
|
-
|
203
|
-
|
@@ -0,0 +1,217 @@
|
|
1
|
+
# To achieve inline crud, we use rails' data-remote links, and override their behaviour when inside a datatable
|
2
|
+
# This works with EffectiveForm.remote_form which is part of the effective_bootstrap gem.
|
3
|
+
|
4
|
+
# We click the New/Edit/Action button from the col-actions
|
5
|
+
$(document).on 'ajax:beforeSend', '.dataTables_wrapper .col-actions', (e, xhr, settings) ->
|
6
|
+
$action = $(e.target)
|
7
|
+
$table = $(e.target).closest('table')
|
8
|
+
|
9
|
+
return true if ('' + $action.data('inline')) == 'false'
|
10
|
+
|
11
|
+
$params = $.param({_datatable_id: $table.attr('id'), _datatable_attributes: $table.data('attributes'), _datatable_action: true })
|
12
|
+
settings.url += (if settings.url.indexOf('?') == -1 then '?' else '&') + $params
|
13
|
+
|
14
|
+
if $action.closest('.effective-datatables-inline-row,table.dataTable').hasClass('effective-datatables-inline-row')
|
15
|
+
# Nothing.
|
16
|
+
else if $action.closest('tr').parent().prop('tagName') == 'THEAD'
|
17
|
+
beforeNew($action)
|
18
|
+
else
|
19
|
+
beforeEdit($action)
|
20
|
+
|
21
|
+
true
|
22
|
+
|
23
|
+
# We have either completed the resource action, or fetched the inline form to load.
|
24
|
+
$(document).on 'ajax:success', '.dataTables_wrapper .col-actions', (event, data) ->
|
25
|
+
$action = $(event.target)
|
26
|
+
|
27
|
+
return true if ('' + $action.data('inline')) == 'false'
|
28
|
+
|
29
|
+
if data.length > 0
|
30
|
+
return true if data.indexOf('Turbolinks.clearCache()') == 0 && data.includes("Turbolinks.visit(")
|
31
|
+
return true if data.indexOf('<html') >= 0
|
32
|
+
|
33
|
+
if ($action.data('method') || 'get') == 'get'
|
34
|
+
if $action.closest('tr').parent().prop('tagName') == 'THEAD' then afterNew($action) else afterEdit($action)
|
35
|
+
else
|
36
|
+
afterAction($action)
|
37
|
+
|
38
|
+
EffectiveForm.remote_form_payload = ''
|
39
|
+
EffectiveForm.remote_form_commit = ''
|
40
|
+
EffectiveForm.remote_form_flash = ''
|
41
|
+
|
42
|
+
true
|
43
|
+
|
44
|
+
# There was an error completing something
|
45
|
+
$(document).on 'ajax:error', '.dataTables_wrapper', (event) ->
|
46
|
+
$action = $(event.target)
|
47
|
+
|
48
|
+
return true if ('' + $action.data('inline')) == 'false'
|
49
|
+
|
50
|
+
afterError($action)
|
51
|
+
|
52
|
+
EffectiveForm.remote_form_payload = ''
|
53
|
+
EffectiveForm.remote_form_commit = ''
|
54
|
+
EffectiveForm.remote_form_flash = ''
|
55
|
+
true
|
56
|
+
|
57
|
+
# Submitting an inline datatables form
|
58
|
+
$(document).on 'ajax:beforeSend', '.dataTables_wrapper .col-inline-form', (e, xhr, settings) ->
|
59
|
+
$table = $(e.target).closest('table')
|
60
|
+
|
61
|
+
$params = $.param({_datatable_id: $table.attr('id'), _datatable_attributes: $table.data('attributes') })
|
62
|
+
settings.url += (if settings.url.indexOf('?') == -1 then '?' else '&') + $params
|
63
|
+
|
64
|
+
true
|
65
|
+
|
66
|
+
# The inline form has been submitted successfully
|
67
|
+
$(document).on 'effective-form:success', '.dataTables_wrapper .col-inline-form', (event, flash) ->
|
68
|
+
$action = $(event.target)
|
69
|
+
|
70
|
+
$tr = $action.closest('tr')
|
71
|
+
$table = $tr.closest('table')
|
72
|
+
|
73
|
+
if $tr.hasClass('effective-datatables-new-resource')
|
74
|
+
$table.DataTable().flash(flash || 'Item created', 'success')
|
75
|
+
$tr.fadeOut('slow')
|
76
|
+
|
77
|
+
$actions = $table.children('thead').find('th.col-actions')
|
78
|
+
$actions.children('svg').remove()
|
79
|
+
$actions.children('a').fadeIn()
|
80
|
+
else
|
81
|
+
$table.DataTable().flash(flash || 'Item updated', 'success')
|
82
|
+
$tr.fadeOut('slow')
|
83
|
+
|
84
|
+
$table.DataTable().draw()
|
85
|
+
|
86
|
+
beforeNew = ($action) ->
|
87
|
+
$table = $action.closest('table')
|
88
|
+
$th = $action.closest('th')
|
89
|
+
|
90
|
+
# Hide New Button
|
91
|
+
$th.children('a').hide()
|
92
|
+
|
93
|
+
# Append spinner and show Processing
|
94
|
+
$th.append($table.data('spinner'))
|
95
|
+
$table.DataTable().flash()
|
96
|
+
$table.one 'draw.dt', (event) ->
|
97
|
+
$th.find('a').show().siblings('svg').remove() if event.target == event.currentTarget
|
98
|
+
|
99
|
+
afterNew = ($action) ->
|
100
|
+
$tr = $action.closest('tr')
|
101
|
+
$table = $tr.closest('table')
|
102
|
+
$action.siblings('svg').remove()
|
103
|
+
|
104
|
+
html = buildRow($tr.children('th').length, EffectiveForm.remote_form_payload)
|
105
|
+
|
106
|
+
$tr = $("<tr class='effective-datatables-inline-row effective-datatables-new-resource' role='row'>#{html}</tr>")
|
107
|
+
$table.children('tbody').prepend($tr)
|
108
|
+
|
109
|
+
expand($table)
|
110
|
+
$tr.trigger('turbolinks:load')
|
111
|
+
$tr.hide().fadeIn()
|
112
|
+
|
113
|
+
beforeEdit = ($action) ->
|
114
|
+
$table = $action.closest('table')
|
115
|
+
$td = $action.closest('td')
|
116
|
+
|
117
|
+
# Hide dropdown
|
118
|
+
$td.find('.dropdown-toggle').dropdown('toggle')
|
119
|
+
$td.children('.btn-group').hide()
|
120
|
+
$td.children('a').hide()
|
121
|
+
|
122
|
+
# Append spinner and show Processing
|
123
|
+
$td.append($table.data('spinner'))
|
124
|
+
$table.DataTable().flash()
|
125
|
+
|
126
|
+
afterEdit = ($action) ->
|
127
|
+
$tr = $action.closest('tr')
|
128
|
+
$table = $tr.closest('table')
|
129
|
+
|
130
|
+
html = buildRow($tr.children('td').length, EffectiveForm.remote_form_payload)
|
131
|
+
|
132
|
+
$tr.data('inline-form-original-html', $tr.children().detach())
|
133
|
+
$tr.html(html)
|
134
|
+
$tr.addClass('effective-datatables-inline-row')
|
135
|
+
|
136
|
+
expand($table)
|
137
|
+
$tr.trigger('turbolinks:load')
|
138
|
+
$tr.hide().fadeIn()
|
139
|
+
|
140
|
+
# This is when one of the resource actions completes
|
141
|
+
afterAction = ($action) ->
|
142
|
+
$table = $action.closest('table')
|
143
|
+
|
144
|
+
if EffectiveForm.remote_form_flash.length > 0
|
145
|
+
flash = EffectiveForm.remote_form_flash[0]
|
146
|
+
$table.DataTable().flash(flash[1], flash[0])
|
147
|
+
else
|
148
|
+
$table.DataTable().flash('Successfully ' + $action.attr('title'), 'success')
|
149
|
+
|
150
|
+
$table.DataTable().draw()
|
151
|
+
|
152
|
+
afterError = ($action) ->
|
153
|
+
$table = $action.closest('table')
|
154
|
+
$td = $action.closest('td')
|
155
|
+
|
156
|
+
# Show dropdown
|
157
|
+
$td.children('.btn-group').show()
|
158
|
+
|
159
|
+
# Hide spinner
|
160
|
+
$td.children('svg').hide()
|
161
|
+
|
162
|
+
# Cancel
|
163
|
+
cancel($table)
|
164
|
+
|
165
|
+
# Don't redraw
|
166
|
+
$table.DataTable().flash('unable to ' + ($action.attr('title') || 'complete action'), 'danger')
|
167
|
+
|
168
|
+
buildRow = (length, payload) ->
|
169
|
+
"<td class='col-inline-form' colspan='#{length-1}'><div class='container'>#{payload}</div></td>" +
|
170
|
+
"<td class='col-actions col-actions-inline-form'>" +
|
171
|
+
"<a href='#' class='btn btn-sm btn-outline-primary' title='Cancel' data-role='inline-form-cancel'>Cancel</a>" +
|
172
|
+
"</td>"
|
173
|
+
|
174
|
+
expand = ($table) ->
|
175
|
+
$wrapper = $table.closest('.dataTables_wrapper').addClass('effective-datatables-inline-expanded')
|
176
|
+
$table.on 'draw.dt', (event) ->
|
177
|
+
$wrapper.removeClass('effective-datatables-inline-expanded') if event.target == event.currentTarget
|
178
|
+
|
179
|
+
cancel = ($table) ->
|
180
|
+
$wrapper = $table.closest('.dataTables_wrapper')
|
181
|
+
if $wrapper.find('.effective-datatables-inline-row').length == 0
|
182
|
+
$wrapper.removeClass('effective-datatables-inline-expanded')
|
183
|
+
|
184
|
+
# Cancel button clicked. Blow away new tr, or restore edit tr
|
185
|
+
# No data will have changed at this point
|
186
|
+
$(document).on 'click', ".dataTables_wrapper a[data-role='inline-form-cancel']", (event) ->
|
187
|
+
$tr = $(event.currentTarget).closest('tr')
|
188
|
+
|
189
|
+
if $tr.hasClass('effective-datatables-new-resource')
|
190
|
+
$tr.fadeOut('slow', ->
|
191
|
+
$table = $(this).closest('table')
|
192
|
+
|
193
|
+
$actions = $table.children('thead').find('th.col-actions')
|
194
|
+
$actions.children('svg').remove()
|
195
|
+
$actions.children('a').fadeIn()
|
196
|
+
|
197
|
+
$(this).remove()
|
198
|
+
cancel($table)
|
199
|
+
)
|
200
|
+
else
|
201
|
+
$tr.fadeOut('slow', ->
|
202
|
+
$table = $(this).closest('table')
|
203
|
+
$tr.html($tr.data('inline-form-original-html'))
|
204
|
+
|
205
|
+
$td = $tr.children('.col-actions').first()
|
206
|
+
$td.children('svg').remove()
|
207
|
+
|
208
|
+
$toggle = $td.find('.dropdown-toggle')
|
209
|
+
$toggle.dropdown('toggle') if $toggle.parent().hasClass('show')
|
210
|
+
$td.children('.btn-group').show()
|
211
|
+
$td.children('a').show()
|
212
|
+
|
213
|
+
$tr.removeClass('effective-datatables-inline-row').fadeIn()
|
214
|
+
cancel($table)
|
215
|
+
)
|
216
|
+
|
217
|
+
false
|