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.
Files changed (68) hide show
  1. checksums.yaml +5 -5
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +32 -32
  4. data/app/assets/images/dataTables/sort-down.svg +1 -0
  5. data/app/assets/images/dataTables/sort-up.svg +1 -0
  6. data/app/assets/images/dataTables/sort.svg +1 -0
  7. data/app/assets/javascripts/dataTables/buttons/{buttons.bootstrap.js → buttons.bootstrap4.js} +7 -15
  8. data/app/assets/javascripts/dataTables/dataTables.bootstrap4.js +184 -0
  9. data/app/assets/javascripts/dataTables/responsive/dataTables.responsive.js +30 -11
  10. data/app/assets/javascripts/dataTables/responsive/{responsive.bootstrap.js → responsive.bootstrap4.js} +6 -6
  11. data/app/assets/javascripts/effective_datatables.js +4 -4
  12. data/app/assets/javascripts/effective_datatables/bulk_actions.js.coffee +43 -43
  13. data/app/assets/javascripts/effective_datatables/events.js.coffee +7 -4
  14. data/app/assets/javascripts/effective_datatables/filters.js.coffee +0 -1
  15. data/app/assets/javascripts/effective_datatables/initialize.js.coffee +45 -49
  16. data/app/assets/javascripts/effective_datatables/overrides.js +12 -0
  17. data/app/assets/javascripts/effective_datatables/reset.js.coffee +1 -1
  18. data/app/assets/stylesheets/dataTables/buttons/{buttons.bootstrap.scss → buttons.bootstrap4.css} +68 -1
  19. data/app/assets/stylesheets/dataTables/{dataTables.bootstrap.scss → dataTables.bootstrap4.css} +44 -29
  20. data/app/assets/stylesheets/dataTables/responsive/{responsive.bootstrap.scss → responsive.bootstrap4.css} +3 -3
  21. data/app/assets/stylesheets/effective_datatables.scss +3 -4
  22. data/app/assets/stylesheets/effective_datatables/_overrides.scss +72 -152
  23. data/app/controllers/effective/datatables_controller.rb +6 -39
  24. data/app/helpers/effective_datatables_helper.rb +55 -50
  25. data/app/helpers/effective_datatables_private_helper.rb +47 -179
  26. data/app/models/effective/datatable.rb +16 -44
  27. data/app/models/effective/datatable_column.rb +0 -1
  28. data/app/models/effective/datatable_column_tool.rb +1 -1
  29. data/app/models/effective/datatable_dsl_tool.rb +3 -11
  30. data/app/models/effective/datatable_value_tool.rb +23 -23
  31. data/app/models/effective/effective_datatable/attributes.rb +13 -5
  32. data/app/models/effective/effective_datatable/collection.rb +3 -18
  33. data/app/models/effective/effective_datatable/compute.rb +6 -17
  34. data/app/models/effective/effective_datatable/cookie.rb +20 -19
  35. data/app/models/effective/effective_datatable/dsl.rb +3 -8
  36. data/app/models/effective/effective_datatable/dsl/bulk_actions.rb +25 -14
  37. data/app/models/effective/effective_datatable/dsl/datatable.rb +28 -70
  38. data/app/models/effective/effective_datatable/dsl/filters.rb +5 -5
  39. data/app/models/effective/effective_datatable/format.rb +50 -95
  40. data/app/models/effective/effective_datatable/params.rb +3 -8
  41. data/app/models/effective/effective_datatable/resource.rb +76 -137
  42. data/app/models/effective/effective_datatable/state.rb +15 -30
  43. data/app/views/effective/datatables/_actions_column.html.haml +8 -1
  44. data/app/views/effective/datatables/_bulk_actions_column.html.haml +1 -1
  45. data/app/views/effective/datatables/_filters.html.haml +11 -12
  46. data/app/views/effective/datatables/_resource_column.html.haml +8 -11
  47. data/config/effective_datatables.rb +14 -12
  48. data/config/routes.rb +0 -1
  49. data/lib/effective_datatables.rb +4 -57
  50. data/lib/effective_datatables/engine.rb +1 -1
  51. data/lib/effective_datatables/version.rb +1 -1
  52. metadata +20 -30
  53. data/app/assets/images/dataTables/sort_asc.png +0 -0
  54. data/app/assets/images/dataTables/sort_both.png +0 -0
  55. data/app/assets/images/dataTables/sort_desc.png +0 -0
  56. data/app/assets/javascripts/dataTables/dataTables.bootstrap.js +0 -182
  57. data/app/assets/javascripts/dataTables/locales/en.lang +0 -33
  58. data/app/assets/javascripts/dataTables/locales/es.lang +0 -36
  59. data/app/assets/javascripts/dataTables/locales/nl.lang +0 -30
  60. data/app/assets/javascripts/effective_datatables/flash.js.coffee +0 -31
  61. data/app/assets/javascripts/effective_datatables/inline_crud.js.coffee +0 -217
  62. data/app/assets/javascripts/effective_datatables/overrides.js.coffee +0 -7
  63. data/app/assets/javascripts/effective_datatables/reorder.js.coffee +0 -43
  64. data/app/assets/stylesheets/effective_datatables/_filters.scss +0 -7
  65. data/app/views/effective/datatables/_reorder_column.html.haml +0 -5
  66. data/config/locales/en.yml +0 -12
  67. data/config/locales/es.yml +0 -12
  68. data/config/locales/nl.yml +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 173590e66ff34a72a7aaed989391a718e25eaca196fae4981f295bf4a73a6bf0
4
- data.tar.gz: 8330bb5487288950f107f6dc79dedde2b2298e77c059d98bdf4d7f095ca8c353
2
+ SHA1:
3
+ metadata.gz: 409a99e8dc9284b103bbbcd90ef5e66e4945c4fe
4
+ data.tar.gz: 5e320731bec22af5f939b6dd35c9358df9e41b08
5
5
  SHA512:
6
- metadata.gz: 242e5bf78a1f1aef37f3864e76d8cf90e98141a84ff4408b9fb5fed72a51115c15a5d19ca1fa79a692401ff6abc29d1f40dae4d781f217add15509f09217c810
7
- data.tar.gz: 569226fd1c6c32e498efc9ee7728a070f971d54ee10ef353777712a7ccf891337d2061cbceec3366a5d627daa84841eb8a70bea3a81ee32a2e1fdc9c03809576
6
+ metadata.gz: 3d568242347b2c0656e993305a296284fb0f2731f4d2f4177725f992db7891bdf5e5f873b52cb57b0301c0b0807cb90917147d3a42abb59d8932ff7e1c0a50f5
7
+ data.tar.gz: a5147ebee2cc69002e0da8e7682e9fe84909da9e7726ea3a61a0887df2e644617324bd36066b1e36a99b1a385b596dc48118fde79bfd3ee85bcacd747eb867dc
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2019 Code and Effect Inc.
1
+ Copyright 2018 Code and Effect Inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -12,23 +12,22 @@ Other features include aggregate (total/average) footer rows, bulk actions, show
12
12
 
13
13
  This gem includes the jQuery DataTables assets.
14
14
 
15
- For use with any Rails 3, 4, 5 application already using Twitter Bootstrap 3.
16
15
 
17
16
  Works with postgres, mysql, sqlite3 and arrays.
18
17
 
19
- ## Bootstrap3
18
+ ## effective_datatables 4.0
20
19
 
21
- This is the `bootstrap3` branch of effective_datatables which supports Twitter Bootstrap 3.
20
+ This is the 4.0 series of effective_datatables.
22
21
 
23
- All published effective_datatables 3.x gems will support Twitter Bootstrap 3 and SimpleForm.
22
+ This requires Twitter Bootstrap 4 and Rails 5.1+
24
23
 
25
- For Bootstrap 4 please see the master branch and/or effective_datatables 4.x gems.
24
+ Please check out [Effective Datatables 3.x](https://github.com/code-and-effect/effective_datatables/tree/bootstrap3) for more information using this gem with Bootstrap 3.
26
25
 
27
26
  # Getting Started
28
27
 
29
28
  ```ruby
30
29
  gem 'haml-rails' # or try using gem 'hamlit-rails'
31
- gem 'effective_datatables', '~> 3.0'
30
+ gem 'effective_datatables'
32
31
  ```
33
32
 
34
33
  Run the bundle command to install it:
@@ -45,6 +44,8 @@ rails generate effective_datatables:install
45
44
 
46
45
  The generator will install an initializer which describes all configuration options.
47
46
 
47
+ Make sure you have [Twitter Bootstrap 4](https://github.com/twbs/bootstrap-rubygem) installed.
48
+
48
49
  Require the javascript on the asset pipeline by adding the following to your application.js:
49
50
 
50
51
  ```ruby
@@ -91,7 +92,7 @@ We're going to display this DataTable on the posts#index action.
91
92
  ```ruby
92
93
  class PostsController < ApplicationController
93
94
  def index
94
- @datatable = PostsDatatable.new
95
+ @datatable = PostsDatatable.new(self)
95
96
  end
96
97
  end
97
98
  ```
@@ -234,13 +235,13 @@ class PostsDatatable < Effective::Datatable
234
235
  aggregate :total
235
236
 
236
237
  # Uses effective_resources gem to discover the resource path and authorization actions
237
- # Puts links to show/edit/destroy actions, if authorized to those actions.
238
+ # Puts in icons to show/edit/destroy actions, if authorized to those actions.
238
239
  # Use the actions_col block to add additional actions
239
-
240
- actions_col(edit: false) do |post|
241
- glyphicon_to('print', print_post_path(post), title: 'Print')
240
+ actions_col show: false do |post|
241
+ if !post.approved? && can?(:approve, Post)
242
+ link_to 'Approve', approve_post_path(post) data: { method: :post, confirm: 'Really approve?'}
243
+ end
242
244
  end
243
-
244
245
  end
245
246
 
246
247
  end
@@ -255,7 +256,7 @@ In the above example, when `attributes[:user_id]` is present, the table displays
255
256
  ```ruby
256
257
  class PostsController < ApplicationController
257
258
  def index
258
- @datatable = PostsDatatable.new(user_id: current_user.id)
259
+ @datatable = PostsDatatable.new(self, user_id: current_user.id)
259
260
  end
260
261
  end
261
262
  ```
@@ -311,7 +312,7 @@ Attributes cannot be changed by search, filter, or state in any way. They're gua
311
312
  ```ruby
312
313
  class PostsController < ApplicationController
313
314
  def index
314
- @datatable = PostsDatatable.new(user_id: current_user.id, admin: true)
315
+ @datatable = PostsDatatable.new(self, user_id: current_user.id, admin: true)
315
316
  end
316
317
  end
317
318
  ```
@@ -407,7 +408,7 @@ Sometimes it's handy to call `.reorder(nil)` on a scope.
407
408
 
408
409
  The `datatable do ... end` block configures a table of data.
409
410
 
410
- Initialize the datatable in your controller or view, `@datatable = PostsDatatable.new`, and render it in your view `<%= render_datatable(@datatable) %>`
411
+ Initialize the datatable in your controller or view, `@datatable = PostsDatatable.new(self)`, and render it in your view `<%= render_datatable(@datatable) %>`
411
412
 
412
413
  ### col
413
414
 
@@ -514,36 +515,35 @@ You can only have one `bulk_actions_col` per datatable.
514
515
 
515
516
  ### actions_col
516
517
 
517
- When working with an ActiveRecord based collection, this column will consider the `current_user`'s authorization, and generate links to edit, show and destroy actions for any collection class.
518
+ When working with an ActiveRecord based collection, this column will consider the `current_user`'s authorization, and generate
519
+ glyphicon links to edit, show and destroy actions for any collection class.
518
520
 
519
521
  The authorization method is configured via the `config/initializers/effective_datatables.rb` initializer file.
520
522
 
521
523
  There are just a few options:
522
524
 
523
525
  ```ruby
524
- show: true|false
525
- edit: true|false
526
- destroy: true|false
526
+ show: true|false|:authorize
527
+ edit: true|false|:authorize
528
+ destroy: true|false|:authorize
529
+
527
530
  visible: true|false
528
- actions_partial: :glyphicons
529
531
  ```
530
532
 
531
- Each object is checked individually for authorization.
533
+ When the show, edit and destroy actions are `true` (default), the permission check will be made just once, authorizing the class.
534
+ When set to `:authorize`, permission to each individual object will be checked.
532
535
 
533
- The arguments to `actions_col` are passed through to the `effective_resource` gem's [render_resource_actions](https://github.com/code-and-effect/effective_resources/blob/master/app/helpers/effective_resources_helper.rb#L57).
534
-
535
- It's all very complicated.
536
-
537
- If you just want to override this entire column with your own actions implementation, you can pass `actions_col partial: 'my_partial'` and roll your own.
538
-
539
- Otherwise, use the following block syntax to add additional actions. This helper comes from `effective_form_inputs` gem.
536
+ Use the block syntax to add additional actions
540
537
 
541
538
  ```ruby
542
- actions_col do |post|
543
- glyphicon_to('print', print_post_path(post), title: 'Print')
539
+ actions_col show: false do |post|
540
+ (post.approved? ? link_to('Approve', approve_post_path(post)) : '') +
541
+ glyphicon_to('print', print_ticket_path(ticket), title: 'Print')
544
542
  end
545
543
  ```
546
544
 
545
+ The `glyphicon_to` helper is part of the [effective_resources](https://github.com/code-and-effect/effective_resources) gem, which is a dependency of this gem.
546
+
547
547
  ### length
548
548
 
549
549
  Sets the default number of rows per page. Valid lengths are `5`, `10`, `25`, `50`, `100`, `250`, `500`, `:all`
@@ -609,7 +609,7 @@ Creates a single form with fields for each `filter` and a single radio input fie
609
609
 
610
610
  The form is submitted by an AJAX POST action, or, in some advanced circumstances (see Dynamic Columns below) as a regular POST or even GET.
611
611
 
612
- Initialize the datatable in your controller or view, `@datatable = PostsDatatable.new`, and render its filters anywhere with `<%= render_datatable_filters(@datatable) %>`.
612
+ Initialize the datatable in your controller or view, `@datatable = PostsDatatable.new(self)`, and render its filters anywhere with `<%= render_datatable_filters(@datatable) %>`.
613
613
 
614
614
  ### scope
615
615
 
@@ -865,7 +865,7 @@ If you just want to render a datatable and nothing else, there is a quick way to
865
865
  ```ruby
866
866
  class PostsController < ApplicationController
867
867
  def index
868
- render_datatable_index PostsDatatable.new
868
+ render_datatable_index PostsDatatable.new(self)
869
869
  end
870
870
  end
871
871
  ```
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" width="24" height="24"><path fill="#007bff" d="M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" width="24" height="24"><path fill="#007bff" d="M279 224H41c-21.4 0-32.1-25.9-17-41L143 64c9.4-9.4 24.6-9.4 33.9 0l119 119c15.2 15.1 4.5 41-16.9 41z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" width="24" height="24"><path fill='#ddd' d="M41 288h238c21.4 0 32.1 25.9 17 41L177 448c-9.4 9.4-24.6 9.4-33.9 0L24 329c-15.1-15.1-4.4-41 17-41zm255-105L177 64c-9.4-9.4-24.6-9.4-33.9 0L24 183c-15.1 15.1-4.4 41 17 41h238c21.4 0 32.1-25.9 17-41z"/></svg>
@@ -5,7 +5,7 @@
5
5
  (function( factory ){
6
6
  if ( typeof define === 'function' && define.amd ) {
7
7
  // AMD
8
- define( ['jquery', 'datatables.net-bs', 'datatables.net-buttons'], function ( $ ) {
8
+ define( ['jquery', 'datatables.net-bs4', 'datatables.net-buttons'], function ( $ ) {
9
9
  return factory( $, window, document );
10
10
  } );
11
11
  }
@@ -17,7 +17,7 @@
17
17
  }
18
18
 
19
19
  if ( ! $ || ! $.fn.dataTable ) {
20
- $ = require('datatables.net-bs')(root, $).$;
20
+ $ = require('datatables.net-bs4')(root, $).$;
21
21
  }
22
22
 
23
23
  if ( ! $.fn.dataTable.Buttons ) {
@@ -35,36 +35,28 @@
35
35
  'use strict';
36
36
  var DataTable = $.fn.dataTable;
37
37
 
38
-
39
38
  $.extend( true, DataTable.Buttons.defaults, {
40
39
  dom: {
41
40
  container: {
42
41
  className: 'dt-buttons btn-group'
43
42
  },
44
43
  button: {
45
- className: 'btn btn-default'
44
+ className: 'btn btn-secondary'
46
45
  },
47
46
  collection: {
48
- tag: 'ul',
47
+ tag: 'div',
49
48
  className: 'dt-button-collection dropdown-menu',
50
49
  button: {
51
- tag: 'li',
52
- className: 'dt-button',
50
+ tag: 'a',
51
+ className: 'dt-button dropdown-item',
53
52
  active: 'active',
54
53
  disabled: 'disabled'
55
- },
56
- buttonLiner: {
57
- tag: 'a',
58
- className: ''
59
54
  }
60
55
  }
61
56
  }
62
57
  } );
63
58
 
64
- DataTable.ext.buttons.collection.text = function ( dt ) {
65
- return dt.i18n('buttons.collection', 'Collection <span class="caret"/>');
66
- };
67
-
59
+ DataTable.ext.buttons.collection.className += ' dropdown-toggle';
68
60
 
69
61
  return DataTable.Buttons;
70
62
  }));
@@ -0,0 +1,184 @@
1
+ /*! DataTables Bootstrap 3 integration
2
+ * ©2011-2015 SpryMedia Ltd - datatables.net/license
3
+ */
4
+
5
+ /**
6
+ * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and
7
+ * DataTables 1.10 or newer.
8
+ *
9
+ * This file sets the defaults and adds options to DataTables to style its
10
+ * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
11
+ * for further information.
12
+ */
13
+ (function( factory ){
14
+ if ( typeof define === 'function' && define.amd ) {
15
+ // AMD
16
+ define( ['jquery', 'datatables.net'], function ( $ ) {
17
+ return factory( $, window, document );
18
+ } );
19
+ }
20
+ else if ( typeof exports === 'object' ) {
21
+ // CommonJS
22
+ module.exports = function (root, $) {
23
+ if ( ! root ) {
24
+ root = window;
25
+ }
26
+
27
+ if ( ! $ || ! $.fn.dataTable ) {
28
+ // Require DataTables, which attaches to jQuery, including
29
+ // jQuery if needed and have a $ property so we can access the
30
+ // jQuery object that is used
31
+ $ = require('datatables.net')(root, $).$;
32
+ }
33
+
34
+ return factory( $, root, root.document );
35
+ };
36
+ }
37
+ else {
38
+ // Browser
39
+ factory( jQuery, window, document );
40
+ }
41
+ }(function( $, window, document, undefined ) {
42
+ 'use strict';
43
+ var DataTable = $.fn.dataTable;
44
+
45
+
46
+ /* Set the defaults for DataTables initialisation */
47
+ $.extend( true, DataTable.defaults, {
48
+ dom:
49
+ "<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
50
+ "<'row'<'col-sm-12'tr>>" +
51
+ "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
52
+ renderer: 'bootstrap'
53
+ } );
54
+
55
+
56
+ /* Default class modification */
57
+ $.extend( DataTable.ext.classes, {
58
+ sWrapper: "dataTables_wrapper container-fluid dt-bootstrap4",
59
+ sFilterInput: "form-control form-control-sm",
60
+ sLengthSelect: "form-control form-control-sm",
61
+ sProcessing: "dataTables_processing card",
62
+ sPageButton: "paginate_button page-item"
63
+ } );
64
+
65
+
66
+ /* Bootstrap paging button renderer */
67
+ DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {
68
+ var api = new DataTable.Api( settings );
69
+ var classes = settings.oClasses;
70
+ var lang = settings.oLanguage.oPaginate;
71
+ var aria = settings.oLanguage.oAria.paginate || {};
72
+ var btnDisplay, btnClass, counter=0;
73
+
74
+ var attach = function( container, buttons ) {
75
+ var i, ien, node, button;
76
+ var clickHandler = function ( e ) {
77
+ e.preventDefault();
78
+ if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {
79
+ api.page( e.data.action ).draw( 'page' );
80
+ }
81
+ };
82
+
83
+ for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
84
+ button = buttons[i];
85
+
86
+ if ( $.isArray( button ) ) {
87
+ attach( container, button );
88
+ }
89
+ else {
90
+ btnDisplay = '';
91
+ btnClass = '';
92
+
93
+ switch ( button ) {
94
+ case 'ellipsis':
95
+ btnDisplay = '&#x2026;';
96
+ btnClass = 'disabled';
97
+ break;
98
+
99
+ case 'first':
100
+ btnDisplay = lang.sFirst;
101
+ btnClass = button + (page > 0 ?
102
+ '' : ' disabled');
103
+ break;
104
+
105
+ case 'previous':
106
+ btnDisplay = lang.sPrevious;
107
+ btnClass = button + (page > 0 ?
108
+ '' : ' disabled');
109
+ break;
110
+
111
+ case 'next':
112
+ btnDisplay = lang.sNext;
113
+ btnClass = button + (page < pages-1 ?
114
+ '' : ' disabled');
115
+ break;
116
+
117
+ case 'last':
118
+ btnDisplay = lang.sLast;
119
+ btnClass = button + (page < pages-1 ?
120
+ '' : ' disabled');
121
+ break;
122
+
123
+ default:
124
+ btnDisplay = button + 1;
125
+ btnClass = page === button ?
126
+ 'active' : '';
127
+ break;
128
+ }
129
+
130
+ if ( btnDisplay ) {
131
+ node = $('<li>', {
132
+ 'class': classes.sPageButton+' '+btnClass,
133
+ 'id': idx === 0 && typeof button === 'string' ?
134
+ settings.sTableId +'_'+ button :
135
+ null
136
+ } )
137
+ .append( $('<a>', {
138
+ 'href': '#',
139
+ 'aria-controls': settings.sTableId,
140
+ 'aria-label': aria[ button ],
141
+ 'data-dt-idx': counter,
142
+ 'tabindex': settings.iTabIndex,
143
+ 'class': 'page-link'
144
+ } )
145
+ .html( btnDisplay )
146
+ )
147
+ .appendTo( container );
148
+
149
+ settings.oApi._fnBindAction(
150
+ node, {action: button}, clickHandler
151
+ );
152
+
153
+ counter++;
154
+ }
155
+ }
156
+ }
157
+ };
158
+
159
+ // IE9 throws an 'unknown error' if document.activeElement is used
160
+ // inside an iframe or frame.
161
+ var activeEl;
162
+
163
+ try {
164
+ // Because this approach is destroying and recreating the paging
165
+ // elements, focus is lost on the select button which is bad for
166
+ // accessibility. So we want to restore focus once the draw has
167
+ // completed
168
+ activeEl = $(host).find(document.activeElement).data('dt-idx');
169
+ }
170
+ catch (e) {}
171
+
172
+ attach(
173
+ $(host).empty().html('<ul class="pagination"/>').children('ul'),
174
+ buttons
175
+ );
176
+
177
+ if ( activeEl !== undefined ) {
178
+ $(host).find( '[data-dt-idx='+activeEl+']' ).focus();
179
+ }
180
+ };
181
+
182
+
183
+ return DataTable;
184
+ }));
@@ -1,11 +1,11 @@
1
- /*! Responsive 2.2.0
1
+ /*! Responsive 2.2.1
2
2
  * 2014-2017 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.0
8
+ * @version 2.2.1
9
9
  * @file dataTables.responsive.js
10
10
  * @author SpryMedia Ltd (www.sprymedia.co.uk)
11
11
  * @contact www.sprymedia.co.uk/contact
@@ -97,8 +97,8 @@ var DataTable = $.fn.dataTable;
97
97
  */
98
98
  var Responsive = function ( settings, opts ) {
99
99
  // Sanity check that we are using DataTables 1.10 or newer
100
- if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.3' ) ) {
101
- throw 'DataTables Responsive requires DataTables 1.10.3 or newer';
100
+ if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.10' ) ) {
101
+ throw 'DataTables Responsive requires DataTables 1.10.10 or newer';
102
102
  }
103
103
 
104
104
  this.s = {
@@ -208,10 +208,12 @@ $.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) {
212
- that._classLogic();
213
- that._resizeAuto();
214
- that._resize();
211
+ dt.on( 'column-visibility.dtr', function (e, ctx, col, vis, recalc) {
212
+ if ( recalc ) {
213
+ that._classLogic();
214
+ that._resizeAuto();
215
+ that._resize();
216
+ }
215
217
  } );
216
218
 
217
219
  // Redraw the details box on each draw which will happen if the data
@@ -247,6 +249,9 @@ $.extend( Responsive.prototype, {
247
249
  } );
248
250
 
249
251
  dt.one( 'draw.dtr', function () {
252
+ that._resizeAuto();
253
+ that._resize();
254
+
250
255
  dt.rows( rowIds ).every( function () {
251
256
  that._detailsDisplay( this, false );
252
257
  } );
@@ -762,8 +767,13 @@ $.extend( Responsive.prototype, {
762
767
  $( dt.table().node() ).toggleClass( 'collapsed', collapsedClass );
763
768
 
764
769
  var changed = false;
770
+ var visible = 0;
765
771
 
766
772
  dt.columns().eq(0).each( function ( colIdx, i ) {
773
+ if ( columnsVis[i] === true ) {
774
+ visible++;
775
+ }
776
+
767
777
  if ( columnsVis[i] !== oldVis[i] ) {
768
778
  changed = true;
769
779
  that._setColumnVis( colIdx, columnsVis[i] );
@@ -778,7 +788,7 @@ $.extend( Responsive.prototype, {
778
788
 
779
789
  // If no records, update the "No records" display element
780
790
  if ( dt.page.info().recordsDisplay === 0 ) {
781
- //dt.draw(); # effective_datatables - don't draw
791
+ $('td', dt.table().body()).eq(0).attr('colspan', visible);
782
792
  }
783
793
  }
784
794
  },
@@ -832,7 +842,8 @@ $.extend( Responsive.prototype, {
832
842
  } )
833
843
  .to$()
834
844
  .clone( false )
835
- .css( 'display', 'table-cell' );
845
+ .css( 'display', 'table-cell' )
846
+ .css( 'min-width', 0 );
836
847
 
837
848
  // Body rows - we don't need to take account of DataTables' column
838
849
  // visibility since we implement our own here (hence the `display` set)
@@ -1312,6 +1323,14 @@ Api.register( 'responsive.hasHidden()', function () {
1312
1323
  false;
1313
1324
  } );
1314
1325
 
1326
+ Api.registerPlural( 'columns().responsiveHidden()', 'column().responsiveHidden()', function () {
1327
+ return this.iterator( 'column', function ( settings, column ) {
1328
+ return settings._responsive ?
1329
+ settings._responsive.s.current[ column ] :
1330
+ false;
1331
+ }, 1 );
1332
+ } );
1333
+
1315
1334
 
1316
1335
  /**
1317
1336
  * Version information
@@ -1319,7 +1338,7 @@ Api.register( 'responsive.hasHidden()', function () {
1319
1338
  * @name Responsive.version
1320
1339
  * @static
1321
1340
  */
1322
- Responsive.version = '2.2.0';
1341
+ Responsive.version = '2.2.1';
1323
1342
 
1324
1343
 
1325
1344
  $.fn.dataTable.Responsive = Responsive;