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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/app/assets/javascripts/dataTables/buttons/buttons.colVis.js +4 -8
  4. data/app/assets/javascripts/dataTables/buttons/buttons.html5.js +33 -19
  5. data/app/assets/javascripts/dataTables/buttons/buttons.print.js +14 -3
  6. data/app/assets/javascripts/dataTables/buttons/dataTables.buttons.js +128 -61
  7. data/app/assets/javascripts/dataTables/dataTables.bootstrap4.js +5 -5
  8. data/app/assets/javascripts/dataTables/jquery.dataTables.js +2078 -2025
  9. data/app/assets/javascripts/dataTables/responsive/dataTables.responsive.js +46 -22
  10. data/app/assets/javascripts/effective_datatables.js +1 -0
  11. data/app/assets/javascripts/effective_datatables/bulk_actions.js.coffee +40 -41
  12. data/app/assets/javascripts/effective_datatables/events.js.coffee +1 -1
  13. data/app/assets/javascripts/effective_datatables/filters.js.coffee +1 -1
  14. data/app/assets/javascripts/effective_datatables/initialize.js.coffee +11 -33
  15. data/app/assets/javascripts/effective_datatables/inline_crud.js.coffee +158 -0
  16. data/app/assets/javascripts/effective_datatables/overrides.js.coffee +40 -0
  17. data/app/assets/javascripts/effective_datatables/reset.js.coffee +1 -1
  18. data/app/assets/stylesheets/dataTables/dataTables.bootstrap4.css +5 -1
  19. data/app/assets/stylesheets/effective_datatables/_overrides.scss +47 -1
  20. data/app/helpers/effective_datatables_helper.rb +1 -0
  21. data/app/helpers/effective_datatables_private_helper.rb +10 -1
  22. data/app/models/effective/effective_datatable/dsl/bulk_actions.rb +11 -22
  23. data/app/models/effective/effective_datatable/dsl/datatable.rb +2 -1
  24. data/app/models/effective/effective_datatable/format.rb +15 -4
  25. data/app/views/effective/datatables/_bulk_actions_column.html.haml +1 -1
  26. data/config/effective_datatables.rb +0 -13
  27. data/lib/effective_datatables.rb +0 -1
  28. data/lib/effective_datatables/version.rb +1 -1
  29. metadata +5 -5
  30. data/app/assets/javascripts/effective_datatables/overrides.js +0 -12
  31. data/app/views/effective/datatables/_actions_column.html.haml +0 -1
@@ -1,15 +1,15 @@
1
- /*! Responsive 2.2.1
2
- * 2014-2017 SpryMedia Ltd - datatables.net/license
1
+ /*! Responsive 2.2.2
2
+ * 2014-2018 SpryMedia Ltd - datatables.net/license
3
3
  */
4
4
 
5
5
  /**
6
6
  * @summary Responsive
7
7
  * @description Responsive tables plug-in for DataTables
8
- * @version 2.2.1
8
+ * @version 2.2.2
9
9
  * @file dataTables.responsive.js
10
10
  * @author SpryMedia Ltd (www.sprymedia.co.uk)
11
11
  * @contact www.sprymedia.co.uk/contact
12
- * @copyright Copyright 2014-2017 SpryMedia Ltd.
12
+ * @copyright Copyright 2014-2018 SpryMedia Ltd.
13
13
  *
14
14
  * This source file is free software, available under the following license:
15
15
  * MIT license - http://datatables.net/license/mit
@@ -208,12 +208,21 @@ $.extend( Responsive.prototype, {
208
208
 
209
209
  // DataTables will trigger this event on every column it shows and
210
210
  // hides individually
211
- dt.on( 'column-visibility.dtr', function (e, ctx, col, vis, recalc) {
212
- if ( recalc ) {
211
+ dt.on( 'column-visibility.dtr', function () {
212
+ // Use a small debounce to allow multiple columns to be set together
213
+ if ( that._timer ) {
214
+ clearTimeout( that._timer );
215
+ }
216
+
217
+ that._timer = setTimeout( function () {
218
+ that._timer = null;
219
+
213
220
  that._classLogic();
214
221
  that._resizeAuto();
215
222
  that._resize();
216
- }
223
+
224
+ that._redrawChildren();
225
+ }, 100 );
217
226
  } );
218
227
 
219
228
  // Redraw the details box on each draw which will happen if the data
@@ -316,7 +325,10 @@ $.extend( Responsive.prototype, {
316
325
  // Class logic - determine which columns are in this breakpoint based
317
326
  // on the classes. If no class control (i.e. `auto`) then `-` is used
318
327
  // to indicate this to the rest of the function
319
- var display = $.map( columns, function ( col ) {
328
+ var display = $.map( columns, function ( col, i ) {
329
+ if ( dt.column(i).visible() === false ) {
330
+ return 'not-visible';
331
+ }
320
332
  return col.auto && col.minWidth === null ?
321
333
  false :
322
334
  col.auto === true ?
@@ -384,7 +396,7 @@ $.extend( Responsive.prototype, {
384
396
  var showControl = false;
385
397
 
386
398
  for ( i=0, ien=columns.length ; i<ien ; i++ ) {
387
- if ( ! columns[i].control && ! columns[i].never && ! display[i] ) {
399
+ if ( ! columns[i].control && ! columns[i].never && display[i] === false ) {
388
400
  showControl = true;
389
401
  break;
390
402
  }
@@ -394,6 +406,11 @@ $.extend( Responsive.prototype, {
394
406
  if ( columns[i].control ) {
395
407
  display[i] = showControl;
396
408
  }
409
+
410
+ // Replace not visible string with false from the control column detection above
411
+ if ( display[i] === 'not-visible' ) {
412
+ display[i] = false;
413
+ }
397
414
  }
398
415
 
399
416
  // Finally we need to make sure that there is at least one column that
@@ -758,7 +775,7 @@ $.extend( Responsive.prototype, {
758
775
  // any columns that are not visible but can be shown
759
776
  var collapsedClass = false;
760
777
  for ( i=0, ien=columns.length ; i<ien ; i++ ) {
761
- if ( columnsVis[i] === false && ! columns[i].never && ! columns[i].control ) {
778
+ if ( columnsVis[i] === false && ! columns[i].never && ! columns[i].control && ! dt.column(i).visible() === false ) {
762
779
  collapsedClass = true;
763
780
  break;
764
781
  }
@@ -885,6 +902,10 @@ $.extend( Responsive.prototype, {
885
902
  // clears the chcecked state of the original radio.
886
903
  $( clonedTable ).find( '[name]' ).removeAttr( 'name' );
887
904
 
905
+ // A position absolute table would take the table out of the flow of
906
+ // our container element, bypassing the height and width (Scroller)
907
+ $( clonedTable ).css( 'position', 'relative' )
908
+
888
909
  var inserted = $('<div/>')
889
910
  .css( {
890
911
  width: 1,
@@ -953,19 +974,22 @@ $.extend( Responsive.prototype, {
953
974
 
954
975
  cells.filter( '[data-dtr-keyboard]' ).removeData( '[data-dtr-keyboard]' );
955
976
 
956
- var selector = typeof target === 'number' ?
957
- ':eq('+target+')' :
958
- target;
959
-
960
- // This is a bit of a hack - we need to limit the selected nodes to just
961
- // those of this table
962
- if ( selector === 'td:first-child, th:first-child' ) {
963
- selector = '>td:first-child, >th:first-child';
977
+ if ( typeof target === 'number' ) {
978
+ dt.cells( null, target, { page: 'current' } ).nodes().to$()
979
+ .attr( 'tabIndex', ctx.iTabIndex )
980
+ .data( 'dtr-keyboard', 1 );
964
981
  }
982
+ else {
983
+ // This is a bit of a hack - we need to limit the selected nodes to just
984
+ // those of this table
985
+ if ( target === 'td:first-child, th:first-child' ) {
986
+ target = '>td:first-child, >th:first-child';
987
+ }
965
988
 
966
- $( selector, dt.rows( { page: 'current' } ).nodes() )
967
- .attr( 'tabIndex', ctx.iTabIndex )
968
- .data( 'dtr-keyboard', 1 );
989
+ $( target, dt.rows( { page: 'current' } ).nodes() )
990
+ .attr( 'tabIndex', ctx.iTabIndex )
991
+ .data( 'dtr-keyboard', 1 );
992
+ }
969
993
  }
970
994
  } );
971
995
 
@@ -1338,7 +1362,7 @@ Api.registerPlural( 'columns().responsiveHidden()', 'column().responsiveHidden()
1338
1362
  * @name Responsive.version
1339
1363
  * @static
1340
1364
  */
1341
- Responsive.version = '2.2.1';
1365
+ Responsive.version = '2.2.2';
1342
1366
 
1343
1367
 
1344
1368
  $.fn.dataTable.Responsive = Responsive;
@@ -15,6 +15,7 @@
15
15
  //= require effective_datatables/bulk_actions
16
16
  //= require effective_datatables/events
17
17
  //= require effective_datatables/filters
18
+ //= require effective_datatables/inline_crud
18
19
  //= require effective_datatables/reset
19
20
  //= require effective_datatables/responsive
20
21
  //= require effective_datatables/overrides
@@ -1,50 +1,65 @@
1
1
  #### Checkbox toggling and Bulk Actions dropdown disabling
2
2
 
3
- $(document).on 'change', "input[data-role='bulk-actions-resource']", (event) ->
3
+ $(document).on 'change', ".dataTables_wrapper input[data-role='bulk-action']", (event) ->
4
4
  $wrapper = $(event.currentTarget).closest('.dataTables_wrapper')
5
5
 
6
- $wrapper.find("input[data-role='bulk-actions-all']").prop('checked', false)
7
- toggleClosestBulkActionsButton($wrapper)
6
+ $wrapper.find("input[data-role='bulk-actions']").prop('checked', false)
7
+ toggleDropdown($wrapper)
8
8
 
9
- $(document).on 'change', "input[data-role='bulk-actions-all']", (event) ->
9
+ $(document).on 'change', ".dataTables_wrapper input[data-role='bulk-actions']", (event) ->
10
10
  $wrapper = $(event.currentTarget).closest('.dataTables_wrapper')
11
- $resources = $wrapper.find("input[data-role='bulk-actions-resource']")
11
+ $resources = $wrapper.find("input[data-role='bulk-action']")
12
12
 
13
13
  if $(event.currentTarget).is(':checked')
14
14
  $resources.prop('checked', true)
15
15
  else
16
16
  $resources.prop('checked', false)
17
17
 
18
- toggleClosestBulkActionsButton($wrapper)
18
+ toggleDropdown($wrapper)
19
19
 
20
- toggleClosestBulkActionsButton = ($wrapper) ->
20
+ toggleDropdown = ($wrapper) ->
21
21
  $bulkActions = $wrapper.children().first().find('.buttons-bulk-actions').children('button')
22
22
 
23
- if $wrapper.find("input[data-role='bulk-actions-resource']:checked").length > 0
23
+ if $wrapper.find("input[data-role='bulk-action']:checked").length > 0
24
24
  $bulkActions.removeAttr('disabled')
25
25
  else
26
26
  $bulkActions.attr('disabled', 'disabled')
27
27
 
28
+ restoreSelected = ($table, selected) ->
29
+ $bulkActions = $table.closest('.dataTables_wrapper').children().first().find('.buttons-bulk-actions').children('button')
30
+ present = false
31
+
32
+ if selected && selected.length > 0
33
+ $table.find("input[data-role='bulk-action']").each (_, input) ->
34
+ $input = $(input)
35
+
36
+ if selected.indexOf($input.val()) > -1
37
+ $input.prop('checked', true)
38
+ present = true
39
+ else
40
+ $input.prop('checked', false)
41
+
42
+ if present then $bulkActions.removeAttr('disabled') else $bulkActions.attr('disabled', 'disabled')
28
43
 
29
44
  #### Bulk Action link behaviour
30
- $(document).on 'click', '.buttons-bulk-actions a', (event) ->
45
+ $(document).on 'click', '.dataTables_wrapper .buttons-bulk-actions a', (event) ->
31
46
  event.preventDefault() # prevent the click
32
47
 
33
48
  $bulkAction = $(event.currentTarget) # This is a regular <a href=...> tag
34
49
  $wrapper = $bulkAction.closest('.dataTables_wrapper')
35
50
  $table = $wrapper.find('table.dataTable').first()
36
51
  $processing = $table.siblings('.dataTables_processing').first()
37
- $selected = $table.find("input[data-role='bulk-actions-resource']:checked")
52
+ $selected = $table.find("input[data-role='bulk-action']:checked")
38
53
 
39
54
  url = $bulkAction.attr('href')
40
55
  title = $bulkAction.text()
41
56
  token = $bulkAction.parent('li').data('authenticity-token')
42
57
  values = $.map($selected, (input) -> input.getAttribute('value'))
43
- get_link = $bulkAction.data('bulk-actions-get')
58
+ method = $bulkAction.data('ajax-method')
44
59
 
45
60
  return unless url && values
46
61
 
47
- if get_link
62
+ if method == 'GET'
48
63
  if url.includes('?')
49
64
  window.location.assign(url + '&' + $.param({ids: values}))
50
65
  else
@@ -55,8 +70,7 @@ $(document).on 'click', '.buttons-bulk-actions a', (event) ->
55
70
  # Disable the Bulk Actions dropdown, so only one can be run at a time
56
71
  $bulkAction.closest('button').attr('disabled', 'disabled')
57
72
 
58
- # Show Processing...
59
- $processing.show().data('bulk-actions-processing', true)
73
+ $table.dataTable().data('bulk-actions-restore-selected-values', values)
60
74
 
61
75
  if token # This is a file download
62
76
  $.fileDownload(url,
@@ -64,43 +78,28 @@ $(document).on 'click', '.buttons-bulk-actions a', (event) ->
64
78
  data: { ids: values, authenticity_token: token }
65
79
  successCallback: ->
66
80
  success = "Successfully completed #{title} bulk action"
67
- $processing.html(success)
68
- $table.dataTable().data('bulk-actions-restore-selected-values', values)
81
+ $table.one 'draw.dt', (e) -> $(e.target).DataTable().flash(success)
69
82
  $table.DataTable().draw()
70
83
  failCallback: ->
71
84
  error = "An error occured while attempting #{title} bulk action"
72
- $processing.html(error)
73
- alert(error)
74
- $table.dataTable().data('bulk-actions-restore-selected-values', values)
85
+ $table.one 'draw.dt', (e) -> $(e.target).DataTable().flash(error)
75
86
  $table.DataTable().draw()
76
87
  )
77
88
  else # Normal AJAX post
78
- $.post(
79
- url, { ids: values }
89
+ $table.dataTable().data('bulk-actions-restore-selected-values', values)
90
+
91
+ $.ajax(
92
+ method: method,
93
+ url: url,
94
+ data: { ids: values }
80
95
  ).done((response) ->
81
96
  success = response['message'] || "Successfully completed #{title} bulk action"
82
- $processing.html(success)
97
+ $table.one 'draw.dt', (e) -> $(e.target).DataTable().flash(success) and restoreSelected($(e.target), values)
98
+
83
99
  ).fail((response) ->
84
100
  error = response['message'] || "An error occured while attempting #{title} bulk action: #{response.statusText}"
85
- $processing.html(error)
86
- alert(error)
101
+ $table.one 'draw.dt', (e) -> $(e.target).DataTable().flash(error) and restoreSelected($(e.target), values)
102
+
87
103
  ).always((response) ->
88
- $table.dataTable().data('bulk-actions-restore-selected-values', values)
89
104
  $table.DataTable().draw()
90
105
  )
91
-
92
- # We borrow the Processing div for our bulk action success/error messages
93
- # This makes sure that the message is displayed for 1500ms
94
- $(document).on 'processing.dt', (event, settings, visible) ->
95
- return if settings.bDestroying
96
-
97
- $processing = $(event.target).siblings('.dataTables_processing').first()
98
- return unless $processing.data('bulk-actions-processing')
99
-
100
- timeout = $processing.show().data('timeout')
101
- clearTimeout(timeout) if timeout
102
- $processing.data('timeout', setTimeout( =>
103
- $processing.html('Processing...').hide()
104
- $processing.data('bulk-actions-processing', null)
105
- , 1500)
106
- )
@@ -14,7 +14,7 @@ $(document).on 'column-visibility.dt', (event, settings, index, state) ->
14
14
  true
15
15
 
16
16
  # Remove empty label (bulk actions) from ColVis dropdown
17
- $(document).on 'click', 'a.buttons-colvis:not(.initialized)', (event) ->
17
+ $(document).on 'click', '.dataTables_wrapper a.buttons-colvis:not(.initialized)', (event) ->
18
18
  $colvis = $('.dt-button-collection')
19
19
  return if $colvis.length == 0
20
20
 
@@ -1,4 +1,4 @@
1
- $(document).on 'click', 'a[data-apply-effective-datatables-filters]', (event) ->
1
+ $(document).on 'click', '.dataTables_wrapper a[data-apply-effective-datatables-filters]', (event) ->
2
2
  event.preventDefault()
3
3
  $form = $(event.currentTarget).closest('.effective-datatables-filters')
4
4
  $table = $('#' + $form.attr('aria-controls'))
@@ -1,7 +1,5 @@
1
1
  initializeDataTables = ->
2
- $('table.effective-datatable').each ->
3
- return if $.fn.DataTable.fnIsDataTable(this)
4
-
2
+ $('table.effective-datatable:not(.initialized)').each ->
5
3
  datatable = $(this)
6
4
  options = datatable.data('options') || {}
7
5
  buttons_export_columns = options['buttons_export_columns'] || ':not(.col-actions)'
@@ -78,8 +76,7 @@ initializeDataTables = ->
78
76
  scrollCollapse: true
79
77
  pagingType: 'simple_numbers'
80
78
  initComplete: (settings) ->
81
- initializeReset(this.api())
82
- initializeBulkActions(this.api())
79
+ initializeButtons(this.api())
83
80
  initializeSearch(this.api())
84
81
  drawCallback: (settings) ->
85
82
  $table = $(this.api().table().node())
@@ -95,36 +92,16 @@ initializeDataTables = ->
95
92
  if settings['json']['charts']
96
93
  drawCharts($table, settings['json']['charts'])
97
94
 
98
- drawBulkActions($table)
99
-
100
95
  # Copies the bulk actions html, stored in a data attribute on the table, into the buttons area
101
- initializeBulkActions = (api) ->
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) ->
96
+ initializeButtons = (api) ->
108
97
  $table = $(api.table().node())
98
+ $buttons = $table.closest('.dataTables_wrapper').children().first().find('.dt-buttons')
109
99
 
110
100
  if $table.data('reset')
111
- $table.closest('.dataTables_wrapper').children().first().find('.dt-buttons').prepend($table.data('reset'))
101
+ $buttons.prepend($table.data('reset'))
112
102
 
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')
116
-
117
- $bulkActions = $table.closest('.dataTables_wrapper').children().first().find('.buttons-bulk-actions').children('button')
118
-
119
- if selected && selected.length > 0
120
- $table.find("input[data-role='bulk-actions-resource']").each (_, input) ->
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')
103
+ if $table.data('bulk-actions')
104
+ $buttons.prepend($table.data('bulk-actions'))
128
105
 
129
106
  drawAggregates = ($table, aggregates) ->
130
107
  $tfoot = $table.find('tfoot').first()
@@ -187,10 +164,11 @@ initializeDataTables = ->
187
164
  # Apply EffectiveFormInputs to the Show x per page dropdown
188
165
  try table.closest('.dataTables_wrapper').find('.dataTables_length select').removeAttr('name').select2(minimumResultsForSearch: 100)
189
166
 
167
+ table.addClass('initialized')
168
+
190
169
  destroyDataTables = ->
191
- $('table.effective-datatable').each ->
192
- if $.fn.DataTable.fnIsDataTable(this)
193
- $(this).DataTable().destroy()
170
+ $('.effective-datatables-inline-expanded').removeClass('effective-datatables-inline-expanded')
171
+ $('table.effective-datatable').each -> $(this).DataTable().turboDestroy()
194
172
 
195
173
  $ -> initializeDataTables()
196
174
  $(document).on 'page:change', -> initializeDataTables()
@@ -0,0 +1,158 @@
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
+ # About to do a resource action, or fetch a partial. Show loading.
5
+ $(document).on 'ajax:beforeSend', '.dataTables_wrapper', (e) ->
6
+ $action = $(e.target)
7
+
8
+ if $action.closest('.effective-datatables-inline-row').length > 0
9
+ # Nothing. This is a save action from within the inline form.
10
+ else if $action.closest('tr').parent().prop('tagName') == 'THEAD'
11
+ beforeNew($action)
12
+ else
13
+ beforeEdit($action)
14
+
15
+ true
16
+
17
+ # We have either completed the resource action, or fetched the inline form to load.
18
+ $(document).on 'ajax:success', '.dataTables_wrapper', (e) ->
19
+ $action = $(e.target)
20
+
21
+ if ($action.data('method') || 'get') == 'get'
22
+ if $action.closest('tr').parent().prop('tagName') == 'THEAD' then afterNew($action) else afterEdit($action)
23
+ else
24
+ afterAction($action)
25
+
26
+ EffectiveForm.remote_form_payload = ''
27
+ EffectiveForm.remote_form_flash = ''
28
+ true
29
+
30
+ # The inline form has been submitted successfully
31
+ $(document).on '.dataTables_wrapper effective-form:success', (event, flash) ->
32
+ $tr = $(event.target).closest('tr')
33
+ $table = $tr.closest('table')
34
+
35
+ if $tr.hasClass('effective-datatables-new-resource')
36
+ $table.DataTable().flash(flash || 'Item created').draw()
37
+ $tr.fadeOut('slow')
38
+
39
+ $actions = $table.children('thead').find('th.col-actions')
40
+ $actions.children('svg').remove()
41
+ $actions.children('a').fadeIn()
42
+ else
43
+ $table.DataTable().flash(flash || 'Item updated').draw()
44
+ $tr.fadeOut('slow')
45
+
46
+ # There was an error completing something
47
+ $(document).on 'ajax:error', '.dataTables_wrapper', (e) ->
48
+ $action = $(e.target)
49
+ $table = $action.closest('table')
50
+ $table.DataTable().flash('Error: unable to ' + ($action.attr('title') || 'complete action')).draw()
51
+
52
+ beforeNew = ($action) ->
53
+ $table = $action.closest('table')
54
+ $th = $action.closest('th')
55
+
56
+ # Hide New Button
57
+ $th.children('a').hide()
58
+
59
+ # Append spinner and show Processing
60
+ $th.append($table.data('spinner'))
61
+ $table.DataTable().flash()
62
+ $table.one 'draw.dt', (event) -> $th.find('a').show().siblings('svg').remove()
63
+
64
+ afterNew = ($action) ->
65
+ $tr = $action.closest('tr')
66
+ $table = $tr.closest('table')
67
+ $action.siblings('svg').remove()
68
+
69
+ html = buildRow($tr.children('th').length, EffectiveForm.remote_form_payload)
70
+
71
+ $tr = $("<tr class='effective-datatables-inline-row effective-datatables-new-resource' role='row'>#{html}</tr>")
72
+ $table.children('tbody').prepend($tr)
73
+
74
+ expand($table)
75
+ $tr.find('form').attr('data-remote', true).trigger('effective-bootstrap:initialize')
76
+ $tr.hide().fadeIn()
77
+
78
+ beforeEdit = ($action) ->
79
+ $table = $action.closest('table')
80
+ $td = $action.closest('td')
81
+
82
+ # Hide dropdown
83
+ $td.find('.dropdown-toggle').dropdown('toggle')
84
+ $td.children('.btn-group').hide()
85
+ $td.children('a').hide()
86
+
87
+ # Append spinner and show Processing
88
+ $td.append($table.data('spinner'))
89
+ $table.DataTable().flash()
90
+
91
+ afterEdit = ($action) ->
92
+ $tr = $action.closest('tr')
93
+ $table = $tr.closest('table')
94
+ $tr.data('inline-form-original-html', $tr.html())
95
+
96
+ html = buildRow($tr.children('td').length, EffectiveForm.remote_form_payload)
97
+
98
+ $tr.html(html)
99
+ $tr.addClass('effective-datatables-inline-row')
100
+
101
+ expand($table)
102
+ $tr.find('form').attr('data-remote', true).trigger('effective-bootstrap:initialize')
103
+ $tr.hide().fadeIn()
104
+
105
+ # This is when one of the resource actions completes
106
+ afterAction = ($action) ->
107
+ $table = $action.closest('table')
108
+ $table.DataTable().flash('Successful ' + $action.attr('title')).draw()
109
+
110
+ buildRow = (length, payload) ->
111
+ "<td class='col-inline-form' colspan='#{length-1}'><div class='container'>#{payload}</div></td>" +
112
+ "<td class='col-actions col-actions-inline-form'>" +
113
+ "<a href='#' class='btn btn-outline-primary' title='Cancel' data-role='inline-form-cancel'>Cancel</a>" +
114
+ "</td>"
115
+
116
+ expand = ($table) ->
117
+ $wrapper = $table.closest('.dataTables_wrapper').addClass('effective-datatables-inline-expanded')
118
+ $table.one 'draw.dt', (event) -> $wrapper.removeClass('effective-datatables-inline-expanded')
119
+
120
+ cancel = ($table) ->
121
+ $wrapper = $table.closest('.dataTables_wrapper')
122
+ $wrapper.removeClass('effective-datatables-inline-expanded') if $wrapper.find('.effective-datatables-inline-row').length == 0
123
+
124
+ # Cancel button clicked. Blow away new tr, or restore edit tr
125
+ # No data will have changed at this point
126
+ $(document).on 'click', ".dataTables_wrapper a[data-role='inline-form-cancel']", (event) ->
127
+ $tr = $(event.currentTarget).closest('tr')
128
+
129
+ if $tr.hasClass('effective-datatables-new-resource')
130
+ $tr.fadeOut('slow', ->
131
+ $table = $(this).closest('table')
132
+
133
+ $actions = $table.children('thead').find('th.col-actions')
134
+ $actions.children('svg').remove()
135
+ $actions.children('a').fadeIn()
136
+
137
+ $(this).remove()
138
+ cancel($table)
139
+ )
140
+ else
141
+ $tr.fadeOut('slow', ->
142
+ $table = $(this).closest('table')
143
+ $tr.html($tr.data('inline-form-original-html'))
144
+
145
+ $td = $tr.children('.col-actions').first()
146
+ $td.children('svg').remove()
147
+
148
+ $td.find('.dropdown-toggle').dropdown('toggle')
149
+ $td.children('.btn-group').show()
150
+ $td.children('a').show()
151
+
152
+ $tr.removeClass('effective-datatables-inline-row').fadeIn()
153
+ cancel($table)
154
+ )
155
+
156
+ false
157
+
158
+