oxidized-web 0.15.1 → 0.17.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.

Potentially problematic release.


This version of oxidized-web might be problematic. Click here for more details.

Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/.rubocop.yml +22 -2
  4. data/CHANGELOG.md +30 -1
  5. data/README.md +13 -3
  6. data/Rakefile +9 -4
  7. data/docs/configuration.md +90 -0
  8. data/docs/development.md +42 -39
  9. data/lib/oxidized/web/public/scripts/oxidized.js +13 -13
  10. data/lib/oxidized/web/public/weblibs/bootstrap-icons.css +31 -3
  11. data/lib/oxidized/web/public/weblibs/bootstrap.bundle.js +20 -19
  12. data/lib/oxidized/web/public/weblibs/bootstrap.bundle.js.map +1 -1
  13. data/lib/oxidized/web/public/weblibs/bootstrap.css +110 -124
  14. data/lib/oxidized/web/public/weblibs/bootstrap.css.map +1 -1
  15. data/lib/oxidized/web/public/weblibs/bootstrap.js +20 -17
  16. data/lib/oxidized/web/public/weblibs/bootstrap.js.map +1 -1
  17. data/lib/oxidized/web/public/weblibs/buttons.bootstrap5.css +3 -3
  18. data/lib/oxidized/web/public/weblibs/buttons.colVis.js +14 -5
  19. data/lib/oxidized/web/public/weblibs/dataTables.bootstrap5.css +111 -17
  20. data/lib/oxidized/web/public/weblibs/dataTables.buttons.js +25 -7
  21. data/lib/oxidized/web/public/weblibs/dataTables.js +336 -106
  22. data/lib/oxidized/web/public/weblibs/dayjs-plugin-utc.min.js +1 -0
  23. data/lib/oxidized/web/public/weblibs/dayjs.min.js +1 -0
  24. data/lib/oxidized/web/public/weblibs/fonts/bootstrap-icons.woff +0 -0
  25. data/lib/oxidized/web/public/weblibs/fonts/bootstrap-icons.woff2 +0 -0
  26. data/lib/oxidized/web/version.rb +1 -1
  27. data/lib/oxidized/web/views/conf_search.haml +1 -1
  28. data/lib/oxidized/web/views/diffs.haml +6 -7
  29. data/lib/oxidized/web/views/head.haml +4 -0
  30. data/lib/oxidized/web/views/node.haml +3 -2
  31. data/lib/oxidized/web/views/nodes.haml +13 -5
  32. data/lib/oxidized/web/views/stats.haml +11 -3
  33. data/lib/oxidized/web/views/version.haml +1 -2
  34. data/lib/oxidized/web/views/versions.haml +11 -7
  35. data/lib/oxidized/web/webapp.rb +41 -29
  36. data/lib/oxidized/web.rb +72 -16
  37. data/oxidized-web.gemspec +22 -13
  38. data/package-lock.json +37 -25
  39. data/package.json +7 -5
  40. data/spec/spec_helper.rb +1 -0
  41. data/spec/web/node/show_spec.rb +100 -0
  42. data/spec/web/node/version_spec.rb +161 -0
  43. data/spec/{node_spec.rb → web/node_spec.rb} +1 -1
  44. data/spec/{nodes_spec.rb → web/nodes_spec.rb} +1 -1
  45. data/spec/{root_spec.rb → web/root_spec.rb} +1 -1
  46. data/spec/{webapp_spec.rb → web/webapp_spec.rb} +1 -1
  47. data/spec/web_spec.rb +98 -0
  48. metadata +69 -69
  49. data/.rubocop_todo.yml +0 -64
  50. data/spec/node_version_spec.rb +0 -102
@@ -119,7 +119,7 @@ div.dt-button-collection .dt-button-active:after {
119
119
  margin-top: -10px;
120
120
  right: 1em;
121
121
  display: inline-block;
122
- content: "";
122
+ content: "\2713";
123
123
  color: inherit;
124
124
  }
125
125
  div.dt-button-collection .dt-button-active.dt-button-split {
@@ -137,7 +137,7 @@ div.dt-button-collection .dt-button-active.dt-button-split > *:first-child:after
137
137
  margin-top: -10px;
138
138
  right: 1em;
139
139
  display: inline-block;
140
- content: "";
140
+ content: "\2713";
141
141
  color: inherit;
142
142
  }
143
143
  div.dt-button-collection .dt-button-active-a a {
@@ -147,7 +147,7 @@ div.dt-button-collection .dt-button-active-a a:after {
147
147
  position: absolute;
148
148
  right: 1em;
149
149
  display: inline-block;
150
- content: "";
150
+ content: "\2713";
151
151
  color: inherit;
152
152
  }
153
153
  div.dt-button-collection span.dt-button-spacer {
@@ -152,11 +152,17 @@ $.extend(DataTable.ext.buttons, {
152
152
  },
153
153
  init: function (dt, button, conf) {
154
154
  var that = this;
155
+ var column = dt.column(conf.columns);
156
+
155
157
  button.attr('data-cv-idx', conf.columns);
156
158
 
157
- dt.on('column-visibility.dt' + conf.namespace, function (e, settings) {
158
- if (!settings.bDestroying && settings.nTable == dt.settings()[0].nTable) {
159
- that.active(dt.column(conf.columns).visible());
159
+ dt.on('column-visibility.dt' + conf.namespace, function (e, settings, index, state) {
160
+ if (
161
+ column.index() === index &&
162
+ !settings.bDestroying &&
163
+ settings.nTable == dt.settings()[0].nTable
164
+ ) {
165
+ that.active(state);
160
166
  }
161
167
  }).on('column-reorder.dt' + conf.namespace, function () {
162
168
  // Button has been removed from the DOM
@@ -168,15 +174,18 @@ $.extend(DataTable.ext.buttons, {
168
174
  return;
169
175
  }
170
176
 
177
+ // Reassign the column for the updated indexes
178
+ column = dt.column(conf.columns);
179
+
171
180
  // This button controls the same column index but the text for the column has
172
181
  // changed
173
182
  that.text(conf._columnText(dt, conf));
174
183
 
175
184
  // Since its a different column, we need to check its visibility
176
- that.active(dt.column(conf.columns).visible());
185
+ that.active(column.visible());
177
186
  });
178
187
 
179
- this.active(dt.column(conf.columns).visible());
188
+ this.active(column.visible());
180
189
  },
181
190
  destroy: function (dt, button, conf) {
182
191
  dt.off('column-visibility.dt' + conf.namespace).off(
@@ -5,17 +5,18 @@
5
5
  --dt-row-stripe: 0, 0, 0;
6
6
  --dt-row-hover: 0, 0, 0;
7
7
  --dt-column-ordering: 0, 0, 0;
8
+ --dt-header-align-items: center;
8
9
  --dt-html-background: white;
9
10
  }
10
11
  :root.dark {
11
12
  --dt-html-background: rgb(33, 37, 41);
12
13
  }
13
14
 
14
- table.dataTable td.dt-control {
15
+ table.dataTable tbody td.dt-control {
15
16
  text-align: center;
16
17
  cursor: pointer;
17
18
  }
18
- table.dataTable td.dt-control:before {
19
+ table.dataTable tbody td.dt-control:before {
19
20
  display: inline-block;
20
21
  box-sizing: border-box;
21
22
  content: "";
@@ -24,7 +25,7 @@ table.dataTable td.dt-control:before {
24
25
  border-bottom: 5px solid transparent;
25
26
  border-right: 0px solid transparent;
26
27
  }
27
- table.dataTable tr.dt-hasChild td.dt-control:before {
28
+ table.dataTable tbody tr.dt-hasChild td.dt-control:before {
28
29
  border-top: 10px solid rgba(0, 0, 0, 0.5);
29
30
  border-left: 5px solid transparent;
30
31
  border-bottom: 0px solid transparent;
@@ -92,24 +93,14 @@ table.dataTable thead > tr > td.dt-ordering-desc span.dt-column-order:after {
92
93
  content: "\25BC";
93
94
  content: "\25BC"/"";
94
95
  }
95
- table.dataTable thead > tr > th.dt-orderable-asc, table.dataTable thead > tr > th.dt-orderable-desc, table.dataTable thead > tr > th.dt-ordering-asc, table.dataTable thead > tr > th.dt-ordering-desc,
96
- table.dataTable thead > tr > td.dt-orderable-asc,
97
- table.dataTable thead > tr > td.dt-orderable-desc,
98
- table.dataTable thead > tr > td.dt-ordering-asc,
99
- table.dataTable thead > tr > td.dt-ordering-desc {
100
- position: relative;
101
- padding-right: 30px;
102
- }
103
96
  table.dataTable thead > tr > th.dt-orderable-asc span.dt-column-order, table.dataTable thead > tr > th.dt-orderable-desc span.dt-column-order, table.dataTable thead > tr > th.dt-ordering-asc span.dt-column-order, table.dataTable thead > tr > th.dt-ordering-desc span.dt-column-order,
104
97
  table.dataTable thead > tr > td.dt-orderable-asc span.dt-column-order,
105
98
  table.dataTable thead > tr > td.dt-orderable-desc span.dt-column-order,
106
99
  table.dataTable thead > tr > td.dt-ordering-asc span.dt-column-order,
107
100
  table.dataTable thead > tr > td.dt-ordering-desc span.dt-column-order {
108
- position: absolute;
109
- right: 12px;
110
- top: 0;
111
- bottom: 0;
101
+ position: relative;
112
102
  width: 12px;
103
+ height: 20px;
113
104
  }
114
105
  table.dataTable thead > tr > th.dt-orderable-asc span.dt-column-order:before, table.dataTable thead > tr > th.dt-orderable-asc span.dt-column-order:after, table.dataTable thead > tr > th.dt-orderable-desc span.dt-column-order:before, table.dataTable thead > tr > th.dt-orderable-desc span.dt-column-order:after, table.dataTable thead > tr > th.dt-ordering-asc span.dt-column-order:before, table.dataTable thead > tr > th.dt-ordering-asc span.dt-column-order:after, table.dataTable thead > tr > th.dt-ordering-desc span.dt-column-order:before, table.dataTable thead > tr > th.dt-ordering-desc span.dt-column-order:after,
115
106
  table.dataTable thead > tr > td.dt-orderable-asc span.dt-column-order:before,
@@ -151,6 +142,40 @@ table.dataTable thead > tr > td:active {
151
142
  outline: none;
152
143
  }
153
144
 
145
+ table.dataTable thead > tr > th div.dt-column-header,
146
+ table.dataTable thead > tr > th div.dt-column-footer,
147
+ table.dataTable thead > tr > td div.dt-column-header,
148
+ table.dataTable thead > tr > td div.dt-column-footer,
149
+ table.dataTable tfoot > tr > th div.dt-column-header,
150
+ table.dataTable tfoot > tr > th div.dt-column-footer,
151
+ table.dataTable tfoot > tr > td div.dt-column-header,
152
+ table.dataTable tfoot > tr > td div.dt-column-footer {
153
+ display: flex;
154
+ justify-content: space-between;
155
+ align-items: var(--dt-header-align-items);
156
+ gap: 4px;
157
+ }
158
+ table.dataTable thead > tr > th div.dt-column-header span.dt-column-title,
159
+ table.dataTable thead > tr > th div.dt-column-footer span.dt-column-title,
160
+ table.dataTable thead > tr > td div.dt-column-header span.dt-column-title,
161
+ table.dataTable thead > tr > td div.dt-column-footer span.dt-column-title,
162
+ table.dataTable tfoot > tr > th div.dt-column-header span.dt-column-title,
163
+ table.dataTable tfoot > tr > th div.dt-column-footer span.dt-column-title,
164
+ table.dataTable tfoot > tr > td div.dt-column-header span.dt-column-title,
165
+ table.dataTable tfoot > tr > td div.dt-column-footer span.dt-column-title {
166
+ flex-grow: 1;
167
+ }
168
+ table.dataTable thead > tr > th div.dt-column-header span.dt-column-title:empty,
169
+ table.dataTable thead > tr > th div.dt-column-footer span.dt-column-title:empty,
170
+ table.dataTable thead > tr > td div.dt-column-header span.dt-column-title:empty,
171
+ table.dataTable thead > tr > td div.dt-column-footer span.dt-column-title:empty,
172
+ table.dataTable tfoot > tr > th div.dt-column-header span.dt-column-title:empty,
173
+ table.dataTable tfoot > tr > th div.dt-column-footer span.dt-column-title:empty,
174
+ table.dataTable tfoot > tr > td div.dt-column-header span.dt-column-title:empty,
175
+ table.dataTable tfoot > tr > td div.dt-column-footer span.dt-column-title:empty {
176
+ display: none;
177
+ }
178
+
154
179
  div.dt-scroll-body > table.dataTable > thead > tr > th,
155
180
  div.dt-scroll-body > table.dataTable > thead > tr > td {
156
181
  overflow: hidden;
@@ -246,10 +271,25 @@ table.dataTable td.dt-type-numeric,
246
271
  table.dataTable td.dt-type-date {
247
272
  text-align: right;
248
273
  }
274
+ table.dataTable th.dt-type-numeric div.dt-column-header,
275
+ table.dataTable th.dt-type-numeric div.dt-column-footer, table.dataTable th.dt-type-date div.dt-column-header,
276
+ table.dataTable th.dt-type-date div.dt-column-footer,
277
+ table.dataTable td.dt-type-numeric div.dt-column-header,
278
+ table.dataTable td.dt-type-numeric div.dt-column-footer,
279
+ table.dataTable td.dt-type-date div.dt-column-header,
280
+ table.dataTable td.dt-type-date div.dt-column-footer {
281
+ flex-direction: row-reverse;
282
+ }
249
283
  table.dataTable th.dt-left,
250
284
  table.dataTable td.dt-left {
251
285
  text-align: left;
252
286
  }
287
+ table.dataTable th.dt-left div.dt-column-header,
288
+ table.dataTable th.dt-left div.dt-column-footer,
289
+ table.dataTable td.dt-left div.dt-column-header,
290
+ table.dataTable td.dt-left div.dt-column-footer {
291
+ flex-direction: row;
292
+ }
253
293
  table.dataTable th.dt-center,
254
294
  table.dataTable td.dt-center {
255
295
  text-align: center;
@@ -258,10 +298,22 @@ table.dataTable th.dt-right,
258
298
  table.dataTable td.dt-right {
259
299
  text-align: right;
260
300
  }
301
+ table.dataTable th.dt-right div.dt-column-header,
302
+ table.dataTable th.dt-right div.dt-column-footer,
303
+ table.dataTable td.dt-right div.dt-column-header,
304
+ table.dataTable td.dt-right div.dt-column-footer {
305
+ flex-direction: row-reverse;
306
+ }
261
307
  table.dataTable th.dt-justify,
262
308
  table.dataTable td.dt-justify {
263
309
  text-align: justify;
264
310
  }
311
+ table.dataTable th.dt-justify div.dt-column-header,
312
+ table.dataTable th.dt-justify div.dt-column-footer,
313
+ table.dataTable td.dt-justify div.dt-column-header,
314
+ table.dataTable td.dt-justify div.dt-column-footer {
315
+ flex-direction: row;
316
+ }
265
317
  table.dataTable th.dt-nowrap,
266
318
  table.dataTable td.dt-nowrap {
267
319
  white-space: nowrap;
@@ -283,6 +335,16 @@ table.dataTable tfoot th.dt-head-left,
283
335
  table.dataTable tfoot td.dt-head-left {
284
336
  text-align: left;
285
337
  }
338
+ table.dataTable thead th.dt-head-left div.dt-column-header,
339
+ table.dataTable thead th.dt-head-left div.dt-column-footer,
340
+ table.dataTable thead td.dt-head-left div.dt-column-header,
341
+ table.dataTable thead td.dt-head-left div.dt-column-footer,
342
+ table.dataTable tfoot th.dt-head-left div.dt-column-header,
343
+ table.dataTable tfoot th.dt-head-left div.dt-column-footer,
344
+ table.dataTable tfoot td.dt-head-left div.dt-column-header,
345
+ table.dataTable tfoot td.dt-head-left div.dt-column-footer {
346
+ flex-direction: row;
347
+ }
286
348
  table.dataTable thead th.dt-head-center,
287
349
  table.dataTable thead td.dt-head-center,
288
350
  table.dataTable tfoot th.dt-head-center,
@@ -295,12 +357,32 @@ table.dataTable tfoot th.dt-head-right,
295
357
  table.dataTable tfoot td.dt-head-right {
296
358
  text-align: right;
297
359
  }
360
+ table.dataTable thead th.dt-head-right div.dt-column-header,
361
+ table.dataTable thead th.dt-head-right div.dt-column-footer,
362
+ table.dataTable thead td.dt-head-right div.dt-column-header,
363
+ table.dataTable thead td.dt-head-right div.dt-column-footer,
364
+ table.dataTable tfoot th.dt-head-right div.dt-column-header,
365
+ table.dataTable tfoot th.dt-head-right div.dt-column-footer,
366
+ table.dataTable tfoot td.dt-head-right div.dt-column-header,
367
+ table.dataTable tfoot td.dt-head-right div.dt-column-footer {
368
+ flex-direction: row-reverse;
369
+ }
298
370
  table.dataTable thead th.dt-head-justify,
299
371
  table.dataTable thead td.dt-head-justify,
300
372
  table.dataTable tfoot th.dt-head-justify,
301
373
  table.dataTable tfoot td.dt-head-justify {
302
374
  text-align: justify;
303
375
  }
376
+ table.dataTable thead th.dt-head-justify div.dt-column-header,
377
+ table.dataTable thead th.dt-head-justify div.dt-column-footer,
378
+ table.dataTable thead td.dt-head-justify div.dt-column-header,
379
+ table.dataTable thead td.dt-head-justify div.dt-column-footer,
380
+ table.dataTable tfoot th.dt-head-justify div.dt-column-header,
381
+ table.dataTable tfoot th.dt-head-justify div.dt-column-footer,
382
+ table.dataTable tfoot td.dt-head-justify div.dt-column-header,
383
+ table.dataTable tfoot td.dt-head-justify div.dt-column-footer {
384
+ flex-direction: row;
385
+ }
304
386
  table.dataTable thead th.dt-head-nowrap,
305
387
  table.dataTable thead td.dt-head-nowrap,
306
388
  table.dataTable tfoot th.dt-head-nowrap,
@@ -328,6 +410,10 @@ table.dataTable tbody td.dt-body-nowrap {
328
410
  white-space: nowrap;
329
411
  }
330
412
 
413
+ :root {
414
+ --dt-header-align-items: flex-end;
415
+ }
416
+
331
417
  /*! Bootstrap 5 integration for DataTables
332
418
  *
333
419
  * ©2020 SpryMedia Ltd, all rights reserved.
@@ -398,6 +484,9 @@ div.dt-container div.dt-layout-table > div {
398
484
  margin-left: 0;
399
485
  }
400
486
  }
487
+ div.dt-container {
488
+ position: relative;
489
+ }
401
490
  div.dt-container div.dt-length label {
402
491
  font-weight: normal;
403
492
  text-align: left;
@@ -486,14 +575,19 @@ table.dataTable.table-sm > thead > tr td.dt-orderable-asc,
486
575
  table.dataTable.table-sm > thead > tr td.dt-orderable-desc,
487
576
  table.dataTable.table-sm > thead > tr td.dt-ordering-asc,
488
577
  table.dataTable.table-sm > thead > tr td.dt-ordering-desc {
489
- padding-right: 20px;
578
+ padding-right: 0.25rem;
490
579
  }
491
580
  table.dataTable.table-sm > thead > tr th.dt-orderable-asc span.dt-column-order, table.dataTable.table-sm > thead > tr th.dt-orderable-desc span.dt-column-order, table.dataTable.table-sm > thead > tr th.dt-ordering-asc span.dt-column-order, table.dataTable.table-sm > thead > tr th.dt-ordering-desc span.dt-column-order,
492
581
  table.dataTable.table-sm > thead > tr td.dt-orderable-asc span.dt-column-order,
493
582
  table.dataTable.table-sm > thead > tr td.dt-orderable-desc span.dt-column-order,
494
583
  table.dataTable.table-sm > thead > tr td.dt-ordering-asc span.dt-column-order,
495
584
  table.dataTable.table-sm > thead > tr td.dt-ordering-desc span.dt-column-order {
496
- right: 5px;
585
+ right: 0.25rem;
586
+ }
587
+ table.dataTable.table-sm > thead > tr th.dt-type-date span.dt-column-order, table.dataTable.table-sm > thead > tr th.dt-type-numeric span.dt-column-order,
588
+ table.dataTable.table-sm > thead > tr td.dt-type-date span.dt-column-order,
589
+ table.dataTable.table-sm > thead > tr td.dt-type-numeric span.dt-column-order {
590
+ left: 0.25rem;
497
591
  }
498
592
 
499
593
  div.dt-scroll-head table.table-bordered {
@@ -1,4 +1,4 @@
1
- /*! Buttons for DataTables 3.2.2
1
+ /*! Buttons for DataTables 3.2.4
2
2
  * © SpryMedia Ltd - datatables.net/license
3
3
  */
4
4
 
@@ -494,6 +494,10 @@ $.extend(Buttons.prototype, {
494
494
 
495
495
  $(button.node).remove();
496
496
 
497
+ if (button.inserter) {
498
+ $(button.inserter).remove();
499
+ }
500
+
497
501
  var idx = $.inArray(button, host);
498
502
  host.splice(idx, 1);
499
503
 
@@ -776,6 +780,7 @@ $.extend(Buttons.prototype, {
776
780
  var configDom = this.c.dom;
777
781
  var textNode;
778
782
  var dt = this.s.dt;
783
+ var setLinerTab = false;
779
784
  var text = function (opt) {
780
785
  return typeof opt === 'function' ? opt(dt, button, config) : opt;
781
786
  };
@@ -809,6 +814,7 @@ $.extend(Buttons.prototype, {
809
814
  return {
810
815
  conf: config,
811
816
  node: spacer,
817
+ nodeChild: null,
812
818
  inserter: spacer,
813
819
  buttons: [],
814
820
  inCollection: inCollection,
@@ -863,7 +869,6 @@ $.extend(Buttons.prototype, {
863
869
 
864
870
  button = $('<' + tag + '/>')
865
871
  .addClass(dom.className)
866
- .attr('tabindex', this.s.dt.settings()[0].iTabIndex)
867
872
  .attr('aria-controls', this.s.dt.table().node().id)
868
873
  .on('click.dtb', function (e) {
869
874
  e.preventDefault();
@@ -897,14 +902,20 @@ $.extend(Buttons.prototype, {
897
902
  }
898
903
 
899
904
  if (dom.liner.tag) {
900
- var liner = $('<' + dom.liner.tag + '/>')
905
+ var lc = dom.liner.tag.toLowerCase();
906
+ var liner = $('<' + lc + '/>')
901
907
  .html(text(config.text))
902
908
  .addClass(dom.liner.className);
903
909
 
904
- if (dom.liner.tag.toLowerCase() === 'a') {
910
+ if (lc === 'a') {
905
911
  liner.attr('href', '#');
906
912
  }
907
913
 
914
+ if (lc === 'a' || lc === 'button') {
915
+ liner.attr('tabindex', this.s.dt.settings()[0].iTabIndex);
916
+ setLinerTab = true;
917
+ }
918
+
908
919
  button.append(liner);
909
920
  textNode = liner;
910
921
  }
@@ -913,6 +924,10 @@ $.extend(Buttons.prototype, {
913
924
  textNode = button;
914
925
  }
915
926
 
927
+ if (! setLinerTab) {
928
+ button.attr('tabindex', this.s.dt.settings()[0].iTabIndex)
929
+ }
930
+
916
931
  if (config.enabled === false) {
917
932
  button.addClass(dom.disabled);
918
933
  }
@@ -1041,9 +1056,12 @@ $.extend(Buttons.prototype, {
1041
1056
  splitDiv.append(dropButton).attr(dropButtonConfig.attr);
1042
1057
  }
1043
1058
 
1059
+ var node = isSplit ? splitDiv.get(0) : button.get(0);
1060
+
1044
1061
  return {
1045
1062
  conf: config,
1046
- node: isSplit ? splitDiv.get(0) : button.get(0),
1063
+ node: node,
1064
+ nodeChild: node && node.children && node.children.length ? node.children[0] : null,
1047
1065
  inserter: isSplit ? splitDiv : inserter,
1048
1066
  buttons: [],
1049
1067
  inCollection: inCollection,
@@ -1118,7 +1136,7 @@ $.extend(Buttons.prototype, {
1118
1136
  }
1119
1137
 
1120
1138
  for (var i = 0, ien = buttons.length; i < ien; i++) {
1121
- if (buttons[i].node === node || $(buttons[i].node).children().eq(0).get(0) === node) {
1139
+ if (buttons[i].node === node || buttons[i].nodeChild === node) {
1122
1140
  return buttons[i];
1123
1141
  }
1124
1142
 
@@ -2149,7 +2167,7 @@ Buttons.defaults = {
2149
2167
  * @type {string}
2150
2168
  * @static
2151
2169
  */
2152
- Buttons.version = '3.2.2';
2170
+ Buttons.version = '3.2.4';
2153
2171
 
2154
2172
  $.extend(_dtButtons, {
2155
2173
  collection: {