effective_datatables 4.17.4 → 4.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +21 -0
- data/app/assets/javascripts/dataTables/UPGRADE.md +17 -0
- data/app/assets/javascripts/dataTables/buttons/buttons.bootstrap4.js +73 -19
- data/app/assets/javascripts/dataTables/buttons/buttons.colVis.js +166 -120
- data/app/assets/javascripts/dataTables/buttons/buttons.html5.js +749 -667
- data/app/assets/javascripts/dataTables/buttons/buttons.print.js +96 -64
- data/app/assets/javascripts/dataTables/buttons/dataTables.buttons.js +1568 -909
- data/app/assets/javascripts/dataTables/dataTables.bootstrap4.js +172 -154
- data/app/assets/javascripts/dataTables/jquery.dataTables.js +3119 -2704
- data/app/assets/javascripts/dataTables/responsive/dataTables.responsive.js +707 -531
- data/app/assets/javascripts/dataTables/responsive/responsive.bootstrap4.js +61 -33
- data/app/assets/javascripts/dataTables/rowReorder/dataTables.rowReorder.js +961 -740
- data/app/assets/javascripts/dataTables/rowReorder/rowReorder.bootstrap4.js +50 -30
- data/app/assets/javascripts/effective_datatables/filters.js.coffee +88 -0
- data/app/assets/stylesheets/dataTables/buttons/buttons.bootstrap4.scss +178 -151
- data/app/assets/stylesheets/dataTables/dataTables.bootstrap4.scss +300 -81
- data/app/assets/stylesheets/dataTables/responsive/responsive.bootstrap4.scss +54 -71
- data/app/assets/stylesheets/dataTables/rowReorder/rowReorder.bootstrap4.scss +23 -4
- data/app/assets/stylesheets/effective_datatables/_overrides.bootstrap4.scss +81 -39
- data/app/views/effective/datatables/_filter_date_range.html.haml +37 -9
- data/app/views/effective/datatables/_filters.html.haml +1 -1
- data/lib/effective_datatables/version.rb +1 -1
- metadata +3 -2
@@ -1,25 +1,7 @@
|
|
1
|
-
/*! Responsive 2.
|
2
|
-
*
|
1
|
+
/*! Responsive 2.5.0
|
2
|
+
* © SpryMedia Ltd - datatables.net/license
|
3
3
|
*/
|
4
4
|
|
5
|
-
/**
|
6
|
-
* @summary Responsive
|
7
|
-
* @description Responsive tables plug-in for DataTables
|
8
|
-
* @version 2.2.2
|
9
|
-
* @file dataTables.responsive.js
|
10
|
-
* @author SpryMedia Ltd (www.sprymedia.co.uk)
|
11
|
-
* @contact www.sprymedia.co.uk/contact
|
12
|
-
* @copyright Copyright 2014-2018 SpryMedia Ltd.
|
13
|
-
*
|
14
|
-
* This source file is free software, available under the following license:
|
15
|
-
* MIT license - http://datatables.net/license/mit
|
16
|
-
*
|
17
|
-
* This source file is distributed in the hope that it will be useful, but
|
18
|
-
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
19
|
-
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
|
20
|
-
*
|
21
|
-
* For details please refer to: http://www.datatables.net
|
22
|
-
*/
|
23
5
|
(function( factory ){
|
24
6
|
if ( typeof define === 'function' && define.amd ) {
|
25
7
|
// AMD
|
@@ -29,17 +11,33 @@
|
|
29
11
|
}
|
30
12
|
else if ( typeof exports === 'object' ) {
|
31
13
|
// CommonJS
|
32
|
-
|
33
|
-
|
34
|
-
|
14
|
+
var jq = require('jquery');
|
15
|
+
var cjsRequires = function (root, $) {
|
16
|
+
if ( ! $.fn.dataTable ) {
|
17
|
+
require('datatables.net')(root, $);
|
35
18
|
}
|
19
|
+
};
|
36
20
|
|
37
|
-
|
38
|
-
|
39
|
-
|
21
|
+
if (typeof window === 'undefined') {
|
22
|
+
module.exports = function (root, $) {
|
23
|
+
if ( ! root ) {
|
24
|
+
// CommonJS environments without a window global must pass a
|
25
|
+
// root. This will give an error otherwise
|
26
|
+
root = window;
|
27
|
+
}
|
40
28
|
|
41
|
-
|
42
|
-
|
29
|
+
if ( ! $ ) {
|
30
|
+
$ = jq( root );
|
31
|
+
}
|
32
|
+
|
33
|
+
cjsRequires( root, $ );
|
34
|
+
return factory( $, root, root.document );
|
35
|
+
};
|
36
|
+
}
|
37
|
+
else {
|
38
|
+
cjsRequires( window, jq );
|
39
|
+
module.exports = factory( jq, window, window.document );
|
40
|
+
}
|
43
41
|
}
|
44
42
|
else {
|
45
43
|
// Browser
|
@@ -50,6 +48,24 @@
|
|
50
48
|
var DataTable = $.fn.dataTable;
|
51
49
|
|
52
50
|
|
51
|
+
|
52
|
+
/**
|
53
|
+
* @summary Responsive
|
54
|
+
* @description Responsive tables plug-in for DataTables
|
55
|
+
* @version 2.5.0
|
56
|
+
* @author SpryMedia Ltd
|
57
|
+
* @copyright SpryMedia Ltd.
|
58
|
+
*
|
59
|
+
* This source file is free software, available under the following license:
|
60
|
+
* MIT license - http://datatables.net/license/mit
|
61
|
+
*
|
62
|
+
* This source file is distributed in the hope that it will be useful, but
|
63
|
+
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
64
|
+
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
|
65
|
+
*
|
66
|
+
* For details please refer to: http://www.datatables.net
|
67
|
+
*/
|
68
|
+
|
53
69
|
/**
|
54
70
|
* Responsive is a plug-in for the DataTables library that makes use of
|
55
71
|
* DataTables' ability to change the visibility of columns, changing the
|
@@ -95,41 +111,42 @@ var DataTable = $.fn.dataTable;
|
|
95
111
|
* } );
|
96
112
|
* } );
|
97
113
|
*/
|
98
|
-
var Responsive = function (
|
114
|
+
var Responsive = function (settings, opts) {
|
99
115
|
// Sanity check that we are using DataTables 1.10 or newer
|
100
|
-
if (
|
116
|
+
if (!DataTable.versionCheck || !DataTable.versionCheck('1.10.10')) {
|
101
117
|
throw 'DataTables Responsive requires DataTables 1.10.10 or newer';
|
102
118
|
}
|
103
119
|
|
104
120
|
this.s = {
|
105
|
-
|
121
|
+
childNodeStore: {},
|
106
122
|
columns: [],
|
107
|
-
current: []
|
123
|
+
current: [],
|
124
|
+
dt: new DataTable.Api(settings)
|
108
125
|
};
|
109
126
|
|
110
127
|
// Check if responsive has already been initialised on this table
|
111
|
-
if (
|
128
|
+
if (this.s.dt.settings()[0].responsive) {
|
112
129
|
return;
|
113
130
|
}
|
114
131
|
|
115
132
|
// details is an object, but for simplicity the user can give it as a string
|
116
133
|
// or a boolean
|
117
|
-
if (
|
134
|
+
if (opts && typeof opts.details === 'string') {
|
118
135
|
opts.details = { type: opts.details };
|
119
136
|
}
|
120
|
-
else if (
|
137
|
+
else if (opts && opts.details === false) {
|
121
138
|
opts.details = { type: false };
|
122
139
|
}
|
123
|
-
else if (
|
140
|
+
else if (opts && opts.details === true) {
|
124
141
|
opts.details = { type: 'inline' };
|
125
142
|
}
|
126
143
|
|
127
|
-
this.c = $.extend(
|
144
|
+
this.c = $.extend(true, {}, Responsive.defaults, DataTable.defaults.responsive, opts);
|
128
145
|
settings.responsive = this;
|
129
146
|
this._constructor();
|
130
147
|
};
|
131
148
|
|
132
|
-
$.extend(
|
149
|
+
$.extend(Responsive.prototype, {
|
133
150
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
134
151
|
* Constructor
|
135
152
|
*/
|
@@ -139,63 +156,69 @@ $.extend( Responsive.prototype, {
|
|
139
156
|
*
|
140
157
|
* @private
|
141
158
|
*/
|
142
|
-
_constructor: function ()
|
143
|
-
{
|
159
|
+
_constructor: function () {
|
144
160
|
var that = this;
|
145
161
|
var dt = this.s.dt;
|
146
162
|
var dtPrivateSettings = dt.settings()[0];
|
147
|
-
var oldWindowWidth = $(window).
|
163
|
+
var oldWindowWidth = $(window).innerWidth();
|
148
164
|
|
149
165
|
dt.settings()[0]._responsive = this;
|
150
166
|
|
151
167
|
// Use DataTables' throttle function to avoid processor thrashing on
|
152
168
|
// resize
|
153
|
-
$(window).on(
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
oldWindowWidth
|
161
|
-
|
162
|
-
|
169
|
+
$(window).on(
|
170
|
+
'resize.dtr orientationchange.dtr',
|
171
|
+
DataTable.util.throttle(function () {
|
172
|
+
// iOS has a bug whereby resize can fire when only scrolling
|
173
|
+
// See: http://stackoverflow.com/questions/8898412
|
174
|
+
var width = $(window).innerWidth();
|
175
|
+
|
176
|
+
if (width !== oldWindowWidth) {
|
177
|
+
that._resize();
|
178
|
+
oldWindowWidth = width;
|
179
|
+
}
|
180
|
+
})
|
181
|
+
);
|
163
182
|
|
164
183
|
// DataTables doesn't currently trigger an event when a row is added, so
|
165
184
|
// we need to hook into its private API to enforce the hidden rows when
|
166
185
|
// new data is added
|
167
|
-
dtPrivateSettings.oApi._fnCallbackReg(
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
186
|
+
dtPrivateSettings.oApi._fnCallbackReg(
|
187
|
+
dtPrivateSettings,
|
188
|
+
'aoRowCreatedCallback',
|
189
|
+
function (tr, data, idx) {
|
190
|
+
if ($.inArray(false, that.s.current) !== -1) {
|
191
|
+
$('>td, >th', tr).each(function (i) {
|
192
|
+
var idx = dt.column.index('toData', i);
|
193
|
+
|
194
|
+
if (that.s.current[idx] === false) {
|
195
|
+
$(this).css('display', 'none');
|
196
|
+
}
|
197
|
+
});
|
198
|
+
}
|
176
199
|
}
|
177
|
-
|
200
|
+
);
|
178
201
|
|
179
202
|
// Destroy event handler
|
180
|
-
dt.on(
|
181
|
-
dt.off(
|
182
|
-
$(
|
183
|
-
$(window).off(
|
203
|
+
dt.on('destroy.dtr', function () {
|
204
|
+
dt.off('.dtr');
|
205
|
+
$(dt.table().body()).off('.dtr');
|
206
|
+
$(window).off('resize.dtr orientationchange.dtr');
|
207
|
+
dt.cells('.dtr-control').nodes().to$().removeClass('dtr-control');
|
184
208
|
|
185
209
|
// Restore the columns that we've hidden
|
186
|
-
$.each(
|
187
|
-
if (
|
188
|
-
that._setColumnVis(
|
210
|
+
$.each(that.s.current, function (i, val) {
|
211
|
+
if (val === false) {
|
212
|
+
that._setColumnVis(i, true);
|
189
213
|
}
|
190
|
-
}
|
191
|
-
}
|
214
|
+
});
|
215
|
+
});
|
192
216
|
|
193
217
|
// Reorder the breakpoints array here in case they have been added out
|
194
218
|
// of order
|
195
|
-
this.c.breakpoints.sort(
|
196
|
-
return a.width < b.width ? 1 :
|
197
|
-
|
198
|
-
} );
|
219
|
+
this.c.breakpoints.sort(function (a, b) {
|
220
|
+
return a.width < b.width ? 1 : a.width > b.width ? -1 : 0;
|
221
|
+
});
|
199
222
|
|
200
223
|
this._classLogic();
|
201
224
|
this._resizeAuto();
|
@@ -203,90 +226,165 @@ $.extend( Responsive.prototype, {
|
|
203
226
|
// Details handler
|
204
227
|
var details = this.c.details;
|
205
228
|
|
206
|
-
if (
|
229
|
+
if (details.type !== false) {
|
207
230
|
that._detailsInit();
|
208
231
|
|
209
232
|
// DataTables will trigger this event on every column it shows and
|
210
233
|
// hides individually
|
211
|
-
dt.on(
|
234
|
+
dt.on('column-visibility.dtr', function () {
|
212
235
|
// Use a small debounce to allow multiple columns to be set together
|
213
|
-
if (
|
214
|
-
clearTimeout(
|
236
|
+
if (that._timer) {
|
237
|
+
clearTimeout(that._timer);
|
215
238
|
}
|
216
239
|
|
217
|
-
that._timer = setTimeout(
|
240
|
+
that._timer = setTimeout(function () {
|
218
241
|
that._timer = null;
|
219
242
|
|
220
243
|
that._classLogic();
|
221
244
|
that._resizeAuto();
|
222
|
-
that._resize();
|
245
|
+
that._resize(true);
|
223
246
|
|
224
247
|
that._redrawChildren();
|
225
|
-
}, 100
|
226
|
-
}
|
248
|
+
}, 100);
|
249
|
+
});
|
227
250
|
|
228
251
|
// Redraw the details box on each draw which will happen if the data
|
229
252
|
// has changed. This is used until DataTables implements a native
|
230
253
|
// `updated` event for rows
|
231
|
-
dt.on(
|
254
|
+
dt.on('draw.dtr', function () {
|
232
255
|
that._redrawChildren();
|
233
|
-
}
|
256
|
+
});
|
234
257
|
|
235
|
-
$(dt.table().node()).addClass(
|
258
|
+
$(dt.table().node()).addClass('dtr-' + details.type);
|
236
259
|
}
|
237
260
|
|
238
|
-
dt.on(
|
261
|
+
dt.on('column-reorder.dtr', function (e, settings, details) {
|
239
262
|
that._classLogic();
|
240
263
|
that._resizeAuto();
|
241
|
-
that._resize();
|
242
|
-
}
|
264
|
+
that._resize(true);
|
265
|
+
});
|
243
266
|
|
244
267
|
// Change in column sizes means we need to calc
|
245
|
-
dt.on(
|
268
|
+
dt.on('column-sizing.dtr', function () {
|
246
269
|
that._resizeAuto();
|
247
270
|
that._resize();
|
248
271
|
});
|
249
272
|
|
273
|
+
// DT2 let's us tell it if we are hiding columns
|
274
|
+
dt.on('column-calc.dt', function (e, d) {
|
275
|
+
var curr = that.s.current;
|
276
|
+
|
277
|
+
for (var i = 0; i < curr.length; i++) {
|
278
|
+
var idx = d.visible.indexOf(i);
|
279
|
+
|
280
|
+
if (curr[i] === false && idx >= 0) {
|
281
|
+
d.visible.splice(idx, 1);
|
282
|
+
}
|
283
|
+
}
|
284
|
+
});
|
285
|
+
|
250
286
|
// On Ajax reload we want to reopen any child rows which are displayed
|
251
287
|
// by responsive
|
252
|
-
dt.on(
|
288
|
+
dt.on('preXhr.dtr', function () {
|
253
289
|
var rowIds = [];
|
254
|
-
dt.rows().every(
|
255
|
-
if (
|
256
|
-
rowIds.push(
|
290
|
+
dt.rows().every(function () {
|
291
|
+
if (this.child.isShown()) {
|
292
|
+
rowIds.push(this.id(true));
|
257
293
|
}
|
258
|
-
}
|
294
|
+
});
|
259
295
|
|
260
|
-
dt.one(
|
296
|
+
dt.one('draw.dtr', function () {
|
261
297
|
that._resizeAuto();
|
262
298
|
that._resize();
|
263
299
|
|
264
|
-
dt.rows(
|
265
|
-
that._detailsDisplay(
|
266
|
-
}
|
267
|
-
}
|
300
|
+
dt.rows(rowIds).every(function () {
|
301
|
+
that._detailsDisplay(this, false);
|
302
|
+
});
|
303
|
+
});
|
268
304
|
});
|
269
305
|
|
270
|
-
dt.on(
|
306
|
+
dt.on('draw.dtr', function () {
|
307
|
+
that._controlClass();
|
308
|
+
}).on('init.dtr', function (e, settings, details) {
|
309
|
+
if (e.namespace !== 'dt') {
|
310
|
+
return;
|
311
|
+
}
|
312
|
+
|
271
313
|
that._resizeAuto();
|
272
314
|
that._resize();
|
273
315
|
|
274
316
|
// If columns were hidden, then DataTables needs to adjust the
|
275
317
|
// column sizing
|
276
|
-
if (
|
318
|
+
if ($.inArray(false, that.s.current)) {
|
277
319
|
dt.columns.adjust();
|
278
320
|
}
|
279
|
-
}
|
321
|
+
});
|
280
322
|
|
281
323
|
// First pass - draw the table for the current viewport size
|
282
324
|
this._resize();
|
283
325
|
},
|
284
326
|
|
285
|
-
|
286
327
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
287
328
|
* Private methods
|
288
329
|
*/
|
289
330
|
|
331
|
+
/**
|
332
|
+
* Get and store nodes from a cell - use for node moving renderers
|
333
|
+
*
|
334
|
+
* @param {*} dt DT instance
|
335
|
+
* @param {*} row Row index
|
336
|
+
* @param {*} col Column index
|
337
|
+
*/
|
338
|
+
_childNodes: function (dt, row, col) {
|
339
|
+
var name = row + '-' + col;
|
340
|
+
|
341
|
+
if (this.s.childNodeStore[name]) {
|
342
|
+
return this.s.childNodeStore[name];
|
343
|
+
}
|
344
|
+
|
345
|
+
// https://jsperf.com/childnodes-array-slice-vs-loop
|
346
|
+
var nodes = [];
|
347
|
+
var children = dt.cell(row, col).node().childNodes;
|
348
|
+
for (var i = 0, ien = children.length; i < ien; i++) {
|
349
|
+
nodes.push(children[i]);
|
350
|
+
}
|
351
|
+
|
352
|
+
this.s.childNodeStore[name] = nodes;
|
353
|
+
|
354
|
+
return nodes;
|
355
|
+
},
|
356
|
+
|
357
|
+
/**
|
358
|
+
* Restore nodes from the cache to a table cell
|
359
|
+
*
|
360
|
+
* @param {*} dt DT instance
|
361
|
+
* @param {*} row Row index
|
362
|
+
* @param {*} col Column index
|
363
|
+
*/
|
364
|
+
_childNodesRestore: function (dt, row, col) {
|
365
|
+
var name = row + '-' + col;
|
366
|
+
|
367
|
+
if (!this.s.childNodeStore[name]) {
|
368
|
+
return;
|
369
|
+
}
|
370
|
+
|
371
|
+
var node = dt.cell(row, col).node();
|
372
|
+
var store = this.s.childNodeStore[name];
|
373
|
+
var parent = store[0].parentNode;
|
374
|
+
var parentChildren = parent.childNodes;
|
375
|
+
var a = [];
|
376
|
+
|
377
|
+
for (var i = 0, ien = parentChildren.length; i < ien; i++) {
|
378
|
+
a.push(parentChildren[i]);
|
379
|
+
}
|
380
|
+
|
381
|
+
for (var j = 0, jen = a.length; j < jen; j++) {
|
382
|
+
node.appendChild(a[j]);
|
383
|
+
}
|
384
|
+
|
385
|
+
this.s.childNodeStore[name] = undefined;
|
386
|
+
},
|
387
|
+
|
290
388
|
/**
|
291
389
|
* Calculate the visibility for the columns in a table for a given
|
292
390
|
* breakpoint. The result is pre-determined based on the class logic if
|
@@ -299,8 +397,7 @@ $.extend( Responsive.prototype, {
|
|
299
397
|
* column.
|
300
398
|
* @private
|
301
399
|
*/
|
302
|
-
_columnsVisiblity: function (
|
303
|
-
{
|
400
|
+
_columnsVisiblity: function (breakpoint) {
|
304
401
|
var dt = this.s.dt;
|
305
402
|
var columns = this.s.columns;
|
306
403
|
var i, ien;
|
@@ -309,38 +406,38 @@ $.extend( Responsive.prototype, {
|
|
309
406
|
// column's priority, and secondly the column index. This allows the
|
310
407
|
// columns to be removed from the right if the priority matches
|
311
408
|
var order = columns
|
312
|
-
.map(
|
409
|
+
.map(function (col, idx) {
|
313
410
|
return {
|
314
411
|
columnIdx: idx,
|
315
412
|
priority: col.priority
|
316
413
|
};
|
317
|
-
}
|
318
|
-
.sort(
|
319
|
-
if (
|
414
|
+
})
|
415
|
+
.sort(function (a, b) {
|
416
|
+
if (a.priority !== b.priority) {
|
320
417
|
return a.priority - b.priority;
|
321
418
|
}
|
322
419
|
return a.columnIdx - b.columnIdx;
|
323
|
-
}
|
420
|
+
});
|
324
421
|
|
325
422
|
// Class logic - determine which columns are in this breakpoint based
|
326
423
|
// on the classes. If no class control (i.e. `auto`) then `-` is used
|
327
424
|
// to indicate this to the rest of the function
|
328
|
-
var display = $.map(
|
329
|
-
if (
|
425
|
+
var display = $.map(columns, function (col, i) {
|
426
|
+
if (dt.column(i).visible() === false) {
|
330
427
|
return 'not-visible';
|
331
428
|
}
|
332
|
-
return col.auto && col.minWidth === null
|
333
|
-
false
|
334
|
-
col.auto === true
|
335
|
-
|
336
|
-
|
337
|
-
}
|
429
|
+
return col.auto && col.minWidth === null
|
430
|
+
? false
|
431
|
+
: col.auto === true
|
432
|
+
? '-'
|
433
|
+
: $.inArray(breakpoint, col.includeIn) !== -1;
|
434
|
+
});
|
338
435
|
|
339
436
|
// Auto column control - first pass: how much width is taken by the
|
340
437
|
// ones that must be included from the non-auto columns
|
341
438
|
var requiredWidth = 0;
|
342
|
-
for (
|
343
|
-
if (
|
439
|
+
for (i = 0, ien = display.length; i < ien; i++) {
|
440
|
+
if (display[i] === true) {
|
344
441
|
requiredWidth += columns[i].minWidth;
|
345
442
|
}
|
346
443
|
}
|
@@ -360,8 +457,8 @@ $.extend( Responsive.prototype, {
|
|
360
457
|
// thrashing or overflow. Also we need to account for the control column
|
361
458
|
// width first so we know how much width is available for the other
|
362
459
|
// columns, since the control column might not be the first one shown
|
363
|
-
for (
|
364
|
-
if (
|
460
|
+
for (i = 0, ien = display.length; i < ien; i++) {
|
461
|
+
if (columns[i].control) {
|
365
462
|
usedWidth -= columns[i].minWidth;
|
366
463
|
}
|
367
464
|
}
|
@@ -369,14 +466,14 @@ $.extend( Responsive.prototype, {
|
|
369
466
|
// Allow columns to be shown (counting by priority and then right to
|
370
467
|
// left) until we run out of room
|
371
468
|
var empty = false;
|
372
|
-
for (
|
469
|
+
for (i = 0, ien = order.length; i < ien; i++) {
|
373
470
|
var colIdx = order[i].columnIdx;
|
374
471
|
|
375
|
-
if (
|
472
|
+
if (display[colIdx] === '-' && !columns[colIdx].control && columns[colIdx].minWidth) {
|
376
473
|
// Once we've found a column that won't fit we don't let any
|
377
474
|
// others display either, or columns might disappear in the
|
378
475
|
// middle of the table
|
379
|
-
if (
|
476
|
+
if (empty || usedWidth - columns[colIdx].minWidth < 0) {
|
380
477
|
empty = true;
|
381
478
|
display[colIdx] = false;
|
382
479
|
}
|
@@ -395,34 +492,33 @@ $.extend( Responsive.prototype, {
|
|
395
492
|
// first , before the action in the second can be taken
|
396
493
|
var showControl = false;
|
397
494
|
|
398
|
-
for (
|
399
|
-
if (
|
495
|
+
for (i = 0, ien = columns.length; i < ien; i++) {
|
496
|
+
if (!columns[i].control && !columns[i].never && display[i] === false) {
|
400
497
|
showControl = true;
|
401
498
|
break;
|
402
499
|
}
|
403
500
|
}
|
404
501
|
|
405
|
-
for (
|
406
|
-
if (
|
502
|
+
for (i = 0, ien = columns.length; i < ien; i++) {
|
503
|
+
if (columns[i].control) {
|
407
504
|
display[i] = showControl;
|
408
505
|
}
|
409
506
|
|
410
507
|
// Replace not visible string with false from the control column detection above
|
411
|
-
if (
|
508
|
+
if (display[i] === 'not-visible') {
|
412
509
|
display[i] = false;
|
413
510
|
}
|
414
511
|
}
|
415
512
|
|
416
513
|
// Finally we need to make sure that there is at least one column that
|
417
514
|
// is visible
|
418
|
-
if (
|
515
|
+
if ($.inArray(true, display) === -1) {
|
419
516
|
display[0] = true;
|
420
517
|
}
|
421
518
|
|
422
519
|
return display;
|
423
520
|
},
|
424
521
|
|
425
|
-
|
426
522
|
/**
|
427
523
|
* Create the internal `columns` array with information about the columns
|
428
524
|
* for the table. This includes determining which breakpoints the column
|
@@ -431,76 +527,78 @@ $.extend( Responsive.prototype, {
|
|
431
527
|
*
|
432
528
|
* @private
|
433
529
|
*/
|
434
|
-
_classLogic: function ()
|
435
|
-
{
|
530
|
+
_classLogic: function () {
|
436
531
|
var that = this;
|
437
532
|
var calc = {};
|
438
533
|
var breakpoints = this.c.breakpoints;
|
439
534
|
var dt = this.s.dt;
|
440
|
-
var columns = dt
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
var
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
535
|
+
var columns = dt
|
536
|
+
.columns()
|
537
|
+
.eq(0)
|
538
|
+
.map(function (i) {
|
539
|
+
var column = this.column(i);
|
540
|
+
var className = column.header().className;
|
541
|
+
var priority = dt.settings()[0].aoColumns[i].responsivePriority;
|
542
|
+
var dataPriority = column.header().getAttribute('data-priority');
|
543
|
+
|
544
|
+
if (priority === undefined) {
|
545
|
+
priority =
|
546
|
+
dataPriority === undefined || dataPriority === null
|
547
|
+
? 10000
|
548
|
+
: dataPriority * 1;
|
549
|
+
}
|
452
550
|
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
551
|
+
return {
|
552
|
+
className: className,
|
553
|
+
includeIn: [],
|
554
|
+
auto: false,
|
555
|
+
control: false,
|
556
|
+
never: className.match(/\b(dtr\-)?never\b/) ? true : false,
|
557
|
+
priority: priority
|
558
|
+
};
|
559
|
+
});
|
462
560
|
|
463
561
|
// Simply add a breakpoint to `includeIn` array, ensuring that there are
|
464
562
|
// no duplicates
|
465
|
-
var add = function (
|
466
|
-
var includeIn = columns[
|
563
|
+
var add = function (colIdx, name) {
|
564
|
+
var includeIn = columns[colIdx].includeIn;
|
467
565
|
|
468
|
-
if (
|
469
|
-
includeIn.push(
|
566
|
+
if ($.inArray(name, includeIn) === -1) {
|
567
|
+
includeIn.push(name);
|
470
568
|
}
|
471
569
|
};
|
472
570
|
|
473
|
-
var column = function (
|
571
|
+
var column = function (colIdx, name, operator, matched) {
|
474
572
|
var size, i, ien;
|
475
573
|
|
476
|
-
if (
|
477
|
-
columns[
|
574
|
+
if (!operator) {
|
575
|
+
columns[colIdx].includeIn.push(name);
|
478
576
|
}
|
479
|
-
else if (
|
577
|
+
else if (operator === 'max-') {
|
480
578
|
// Add this breakpoint and all smaller
|
481
|
-
size = that._find(
|
579
|
+
size = that._find(name).width;
|
482
580
|
|
483
|
-
for (
|
484
|
-
if (
|
485
|
-
add(
|
581
|
+
for (i = 0, ien = breakpoints.length; i < ien; i++) {
|
582
|
+
if (breakpoints[i].width <= size) {
|
583
|
+
add(colIdx, breakpoints[i].name);
|
486
584
|
}
|
487
585
|
}
|
488
586
|
}
|
489
|
-
else if (
|
587
|
+
else if (operator === 'min-') {
|
490
588
|
// Add this breakpoint and all larger
|
491
|
-
size = that._find(
|
589
|
+
size = that._find(name).width;
|
492
590
|
|
493
|
-
for (
|
494
|
-
if (
|
495
|
-
add(
|
591
|
+
for (i = 0, ien = breakpoints.length; i < ien; i++) {
|
592
|
+
if (breakpoints[i].width >= size) {
|
593
|
+
add(colIdx, breakpoints[i].name);
|
496
594
|
}
|
497
595
|
}
|
498
596
|
}
|
499
|
-
else if (
|
597
|
+
else if (operator === 'not-') {
|
500
598
|
// Add all but this breakpoint
|
501
|
-
for (
|
502
|
-
if (
|
503
|
-
add(
|
599
|
+
for (i = 0, ien = breakpoints.length; i < ien; i++) {
|
600
|
+
if (breakpoints[i].name.indexOf(matched) === -1) {
|
601
|
+
add(colIdx, breakpoints[i].name);
|
504
602
|
}
|
505
603
|
}
|
506
604
|
}
|
@@ -508,28 +606,28 @@ $.extend( Responsive.prototype, {
|
|
508
606
|
|
509
607
|
// Loop over each column and determine if it has a responsive control
|
510
608
|
// class
|
511
|
-
columns.each(
|
609
|
+
columns.each(function (col, i) {
|
512
610
|
var classNames = col.className.split(' ');
|
513
611
|
var hasClass = false;
|
514
612
|
|
515
613
|
// Split the class name up so multiple rules can be applied if needed
|
516
|
-
for (
|
517
|
-
var className =
|
614
|
+
for (var k = 0, ken = classNames.length; k < ken; k++) {
|
615
|
+
var className = classNames[k].trim();
|
518
616
|
|
519
|
-
if ( className === 'all'
|
617
|
+
if (className === 'all' || className === 'dtr-all') {
|
520
618
|
// Include in all
|
521
619
|
hasClass = true;
|
522
|
-
col.includeIn = $.map(
|
620
|
+
col.includeIn = $.map(breakpoints, function (a) {
|
523
621
|
return a.name;
|
524
|
-
}
|
622
|
+
});
|
525
623
|
return;
|
526
624
|
}
|
527
|
-
else if ( className === 'none' || col.never
|
625
|
+
else if (className === 'none' || className === 'dtr-none' || col.never) {
|
528
626
|
// Include in none (default) and no auto
|
529
627
|
hasClass = true;
|
530
628
|
return;
|
531
629
|
}
|
532
|
-
else if ( className === 'control'
|
630
|
+
else if (className === 'control' || className === 'dtr-control') {
|
533
631
|
// Special column that is only visible, when one of the other
|
534
632
|
// columns is hidden. This is used for the details control
|
535
633
|
hasClass = true;
|
@@ -537,36 +635,64 @@ $.extend( Responsive.prototype, {
|
|
537
635
|
return;
|
538
636
|
}
|
539
637
|
|
540
|
-
$.each(
|
638
|
+
$.each(breakpoints, function (j, breakpoint) {
|
541
639
|
// Does this column have a class that matches this breakpoint?
|
542
640
|
var brokenPoint = breakpoint.name.split('-');
|
543
|
-
var re = new RegExp(
|
544
|
-
|
641
|
+
var re = new RegExp(
|
642
|
+
'(min\\-|max\\-|not\\-)?(' + brokenPoint[0] + ')(\\-[_a-zA-Z0-9])?'
|
643
|
+
);
|
644
|
+
var match = className.match(re);
|
545
645
|
|
546
|
-
if (
|
646
|
+
if (match) {
|
547
647
|
hasClass = true;
|
548
648
|
|
549
|
-
if (
|
649
|
+
if (match[2] === brokenPoint[0] && match[3] === '-' + brokenPoint[1]) {
|
550
650
|
// Class name matches breakpoint name fully
|
551
|
-
column(
|
651
|
+
column(i, breakpoint.name, match[1], match[2] + match[3]);
|
552
652
|
}
|
553
|
-
else if (
|
653
|
+
else if (match[2] === brokenPoint[0] && !match[3]) {
|
554
654
|
// Class name matched primary breakpoint name with no qualifier
|
555
|
-
column(
|
655
|
+
column(i, breakpoint.name, match[1], match[2]);
|
556
656
|
}
|
557
657
|
}
|
558
|
-
}
|
658
|
+
});
|
559
659
|
}
|
560
660
|
|
561
661
|
// If there was no control class, then automatic sizing is used
|
562
|
-
if (
|
662
|
+
if (!hasClass) {
|
563
663
|
col.auto = true;
|
564
664
|
}
|
565
|
-
}
|
665
|
+
});
|
566
666
|
|
567
667
|
this.s.columns = columns;
|
568
668
|
},
|
569
669
|
|
670
|
+
/**
|
671
|
+
* Update the cells to show the correct control class / button
|
672
|
+
* @private
|
673
|
+
*/
|
674
|
+
_controlClass: function () {
|
675
|
+
if (this.c.details.type === 'inline') {
|
676
|
+
var dt = this.s.dt;
|
677
|
+
var columnsVis = this.s.current;
|
678
|
+
var firstVisible = $.inArray(true, columnsVis);
|
679
|
+
|
680
|
+
// Remove from any cells which shouldn't have it
|
681
|
+
dt.cells(
|
682
|
+
null,
|
683
|
+
function (idx) {
|
684
|
+
return idx !== firstVisible;
|
685
|
+
},
|
686
|
+
{ page: 'current' }
|
687
|
+
)
|
688
|
+
.nodes()
|
689
|
+
.to$()
|
690
|
+
.filter('.dtr-control')
|
691
|
+
.removeClass('dtr-control');
|
692
|
+
|
693
|
+
dt.cells(null, firstVisible, { page: 'current' }).nodes().to$().addClass('dtr-control');
|
694
|
+
}
|
695
|
+
},
|
570
696
|
|
571
697
|
/**
|
572
698
|
* Show the details for the child row
|
@@ -575,133 +701,143 @@ $.extend( Responsive.prototype, {
|
|
575
701
|
* @param {boolean} update Update flag
|
576
702
|
* @private
|
577
703
|
*/
|
578
|
-
_detailsDisplay: function (
|
579
|
-
{
|
704
|
+
_detailsDisplay: function (row, update) {
|
580
705
|
var that = this;
|
581
706
|
var dt = this.s.dt;
|
582
707
|
var details = this.c.details;
|
708
|
+
var event = function (res) {
|
709
|
+
$(row.node()).toggleClass('parent', res !== false);
|
710
|
+
$(dt.table().node()).triggerHandler('responsive-display.dt', [dt, row, res, update]);
|
711
|
+
};
|
583
712
|
|
584
|
-
if (
|
585
|
-
var
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
713
|
+
if (details && details.type !== false) {
|
714
|
+
var renderer =
|
715
|
+
typeof details.renderer === 'string'
|
716
|
+
? Responsive.renderer[details.renderer]()
|
717
|
+
: details.renderer;
|
718
|
+
|
719
|
+
var res = details.display(
|
720
|
+
row,
|
721
|
+
update,
|
722
|
+
function () {
|
723
|
+
return renderer.call(that, dt, row[0], that._detailsObj(row[0]));
|
724
|
+
},
|
725
|
+
function () {
|
726
|
+
event(false);
|
727
|
+
}
|
728
|
+
);
|
590
729
|
|
591
|
-
if ( res ===
|
592
|
-
|
730
|
+
if (typeof res === 'boolean') {
|
731
|
+
event(res);
|
593
732
|
}
|
594
733
|
}
|
595
734
|
},
|
596
735
|
|
597
|
-
|
598
736
|
/**
|
599
737
|
* Initialisation for the details handler
|
600
738
|
*
|
601
739
|
* @private
|
602
740
|
*/
|
603
|
-
_detailsInit: function ()
|
604
|
-
|
605
|
-
var
|
606
|
-
var dt = this.s.dt;
|
741
|
+
_detailsInit: function () {
|
742
|
+
var that = this;
|
743
|
+
var dt = this.s.dt;
|
607
744
|
var details = this.c.details;
|
608
745
|
|
609
746
|
// The inline type always uses the first child as the target
|
610
|
-
if (
|
611
|
-
details.target = 'td
|
747
|
+
if (details.type === 'inline') {
|
748
|
+
details.target = 'td.dtr-control, th.dtr-control';
|
612
749
|
}
|
613
750
|
|
614
751
|
// Keyboard accessibility
|
615
|
-
dt.on(
|
752
|
+
dt.on('draw.dtr', function () {
|
616
753
|
that._tabIndexes();
|
617
|
-
}
|
754
|
+
});
|
618
755
|
that._tabIndexes(); // Initial draw has already happened
|
619
756
|
|
620
|
-
$(
|
621
|
-
if (
|
757
|
+
$(dt.table().body()).on('keyup.dtr', 'td, th', function (e) {
|
758
|
+
if (e.keyCode === 13 && $(this).data('dtr-keyboard')) {
|
622
759
|
$(this).click();
|
623
760
|
}
|
624
|
-
}
|
761
|
+
});
|
625
762
|
|
626
763
|
// type.target can be a string jQuery selector or a column index
|
627
|
-
var target
|
764
|
+
var target = details.target;
|
628
765
|
var selector = typeof target === 'string' ? target : 'td, th';
|
629
766
|
|
630
|
-
|
631
|
-
|
632
|
-
.on(
|
767
|
+
if (target !== undefined || target !== null) {
|
768
|
+
// Click handler to show / hide the details rows when they are available
|
769
|
+
$(dt.table().body()).on('click.dtr mousedown.dtr mouseup.dtr', selector, function (e) {
|
633
770
|
// If the table is not collapsed (i.e. there is no hidden columns)
|
634
771
|
// then take no action
|
635
|
-
if (
|
772
|
+
if (!$(dt.table().node()).hasClass('collapsed')) {
|
636
773
|
return;
|
637
774
|
}
|
638
775
|
|
639
776
|
// Check that the row is actually a DataTable's controlled node
|
640
|
-
if (
|
777
|
+
if ($.inArray($(this).closest('tr').get(0), dt.rows().nodes().toArray()) === -1) {
|
641
778
|
return;
|
642
779
|
}
|
643
780
|
|
644
781
|
// For column index, we determine if we should act or not in the
|
645
782
|
// handler - otherwise it is already okay
|
646
|
-
if (
|
647
|
-
var targetIdx = target < 0 ?
|
648
|
-
dt.columns().eq(0).length + target :
|
649
|
-
target;
|
783
|
+
if (typeof target === 'number') {
|
784
|
+
var targetIdx = target < 0 ? dt.columns().eq(0).length + target : target;
|
650
785
|
|
651
|
-
if (
|
786
|
+
if (dt.cell(this).index().column !== targetIdx) {
|
652
787
|
return;
|
653
788
|
}
|
654
789
|
}
|
655
790
|
|
656
791
|
// $().closest() includes itself in its check
|
657
|
-
var row = dt.row(
|
792
|
+
var row = dt.row($(this).closest('tr'));
|
658
793
|
|
659
794
|
// Check event type to do an action
|
660
|
-
if (
|
795
|
+
if (e.type === 'click') {
|
661
796
|
// The renderer is given as a function so the caller can execute it
|
662
797
|
// only when they need (i.e. if hiding there is no point is running
|
663
798
|
// the renderer)
|
664
|
-
that._detailsDisplay(
|
799
|
+
that._detailsDisplay(row, false);
|
665
800
|
}
|
666
|
-
else if (
|
801
|
+
else if (e.type === 'mousedown') {
|
667
802
|
// For mouse users, prevent the focus ring from showing
|
668
803
|
$(this).css('outline', 'none');
|
669
804
|
}
|
670
|
-
else if (
|
805
|
+
else if (e.type === 'mouseup') {
|
671
806
|
// And then re-allow at the end of the click
|
672
|
-
$(this).blur
|
807
|
+
$(this).trigger('blur').css('outline', '');
|
673
808
|
}
|
674
|
-
}
|
809
|
+
});
|
810
|
+
}
|
675
811
|
},
|
676
812
|
|
677
|
-
|
678
813
|
/**
|
679
814
|
* Get the details to pass to a renderer for a row
|
680
815
|
* @param {int} rowIdx Row index
|
681
816
|
* @private
|
682
817
|
*/
|
683
|
-
_detailsObj: function (
|
684
|
-
{
|
818
|
+
_detailsObj: function (rowIdx) {
|
685
819
|
var that = this;
|
686
820
|
var dt = this.s.dt;
|
687
821
|
|
688
|
-
return $.map(
|
822
|
+
return $.map(this.s.columns, function (col, i) {
|
689
823
|
// Never and control columns should not be passed to the renderer
|
690
|
-
if (
|
824
|
+
if (col.never || col.control) {
|
691
825
|
return;
|
692
826
|
}
|
693
827
|
|
828
|
+
var dtCol = dt.settings()[0].aoColumns[i];
|
829
|
+
|
694
830
|
return {
|
695
|
-
|
696
|
-
data: dt.cell( rowIdx, i ).render( that.c.orthogonal ),
|
697
|
-
hidden: dt.column( i ).visible() && !that.s.current[ i ],
|
831
|
+
className: dtCol.sClass,
|
698
832
|
columnIndex: i,
|
699
|
-
|
833
|
+
data: dt.cell(rowIdx, i).render(that.c.orthogonal),
|
834
|
+
hidden: dt.column(i).visible() && !that.s.current[i],
|
835
|
+
rowIndex: rowIdx,
|
836
|
+
title: dtCol.sTitle !== null ? dtCol.sTitle : $(dt.column(i).header()).text()
|
700
837
|
};
|
701
|
-
}
|
838
|
+
});
|
702
839
|
},
|
703
840
|
|
704
|
-
|
705
841
|
/**
|
706
842
|
* Find a breakpoint object from a name
|
707
843
|
*
|
@@ -709,49 +845,43 @@ $.extend( Responsive.prototype, {
|
|
709
845
|
* @return {object} Breakpoint description object
|
710
846
|
* @private
|
711
847
|
*/
|
712
|
-
_find: function (
|
713
|
-
{
|
848
|
+
_find: function (name) {
|
714
849
|
var breakpoints = this.c.breakpoints;
|
715
850
|
|
716
|
-
for (
|
717
|
-
if (
|
851
|
+
for (var i = 0, ien = breakpoints.length; i < ien; i++) {
|
852
|
+
if (breakpoints[i].name === name) {
|
718
853
|
return breakpoints[i];
|
719
854
|
}
|
720
855
|
}
|
721
856
|
},
|
722
857
|
|
723
|
-
|
724
858
|
/**
|
725
859
|
* Re-create the contents of the child rows as the display has changed in
|
726
860
|
* some way.
|
727
861
|
*
|
728
862
|
* @private
|
729
863
|
*/
|
730
|
-
_redrawChildren: function ()
|
731
|
-
{
|
864
|
+
_redrawChildren: function () {
|
732
865
|
var that = this;
|
733
866
|
var dt = this.s.dt;
|
734
867
|
|
735
|
-
dt.rows(
|
736
|
-
|
737
|
-
|
738
|
-
that._detailsDisplay( dt.row( idx ), true );
|
739
|
-
} );
|
868
|
+
dt.rows({ page: 'current' }).iterator('row', function (settings, idx) {
|
869
|
+
that._detailsDisplay(dt.row(idx), true);
|
870
|
+
});
|
740
871
|
},
|
741
872
|
|
742
|
-
|
743
873
|
/**
|
744
874
|
* Alter the table display for a resized viewport. This involves first
|
745
875
|
* determining what breakpoint the window currently is in, getting the
|
746
876
|
* column visibilities to apply and then setting them.
|
747
877
|
*
|
878
|
+
* @param {boolean} forceRedraw Force a redraw
|
748
879
|
* @private
|
749
880
|
*/
|
750
|
-
_resize: function ()
|
751
|
-
{
|
881
|
+
_resize: function (forceRedraw) {
|
752
882
|
var that = this;
|
753
883
|
var dt = this.s.dt;
|
754
|
-
var width = $(window).
|
884
|
+
var width = $(window).innerWidth();
|
755
885
|
var breakpoints = this.c.breakpoints;
|
756
886
|
var breakpoint = breakpoints[0].name;
|
757
887
|
var columns = this.s.columns;
|
@@ -759,57 +889,68 @@ $.extend( Responsive.prototype, {
|
|
759
889
|
var oldVis = this.s.current.slice();
|
760
890
|
|
761
891
|
// Determine what breakpoint we are currently at
|
762
|
-
for (
|
763
|
-
if (
|
892
|
+
for (i = breakpoints.length - 1; i >= 0; i--) {
|
893
|
+
if (width <= breakpoints[i].width) {
|
764
894
|
breakpoint = breakpoints[i].name;
|
765
895
|
break;
|
766
896
|
}
|
767
897
|
}
|
768
898
|
|
769
899
|
// Show the columns for that break point
|
770
|
-
var columnsVis = this._columnsVisiblity(
|
900
|
+
var columnsVis = this._columnsVisiblity(breakpoint);
|
771
901
|
this.s.current = columnsVis;
|
772
902
|
|
773
903
|
// Set the class before the column visibility is changed so event
|
774
904
|
// listeners know what the state is. Need to determine if there are
|
775
905
|
// any columns that are not visible but can be shown
|
776
906
|
var collapsedClass = false;
|
777
|
-
|
778
|
-
|
907
|
+
|
908
|
+
for (i = 0, ien = columns.length; i < ien; i++) {
|
909
|
+
if (
|
910
|
+
columnsVis[i] === false &&
|
911
|
+
!columns[i].never &&
|
912
|
+
!columns[i].control &&
|
913
|
+
!dt.column(i).visible() === false
|
914
|
+
) {
|
779
915
|
collapsedClass = true;
|
780
916
|
break;
|
781
917
|
}
|
782
918
|
}
|
783
919
|
|
784
|
-
$(
|
920
|
+
$(dt.table().node()).toggleClass('collapsed', collapsedClass);
|
785
921
|
|
786
922
|
var changed = false;
|
787
923
|
var visible = 0;
|
788
924
|
|
789
|
-
dt.columns()
|
790
|
-
|
791
|
-
|
792
|
-
|
925
|
+
dt.columns()
|
926
|
+
.eq(0)
|
927
|
+
.each(function (colIdx, i) {
|
928
|
+
if (columnsVis[i] === true) {
|
929
|
+
visible++;
|
930
|
+
}
|
793
931
|
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
932
|
+
if (forceRedraw || columnsVis[i] !== oldVis[i]) {
|
933
|
+
changed = true;
|
934
|
+
that._setColumnVis(colIdx, columnsVis[i]);
|
935
|
+
}
|
936
|
+
});
|
799
937
|
|
800
|
-
if
|
801
|
-
|
938
|
+
// Always need to update the display, regardless of if it has changed or not, so nodes
|
939
|
+
// can be re-inserted for listHiddenNodes
|
940
|
+
this._redrawChildren();
|
802
941
|
|
942
|
+
if (changed) {
|
803
943
|
// Inform listeners of the change
|
804
|
-
$(dt.table().node()).trigger(
|
944
|
+
$(dt.table().node()).trigger('responsive-resize.dt', [dt, this.s.current]);
|
805
945
|
|
806
946
|
// If no records, update the "No records" display element
|
807
|
-
if (
|
947
|
+
if (dt.page.info().recordsDisplay === 0) {
|
808
948
|
$('td', dt.table().body()).eq(0).attr('colspan', visible);
|
809
949
|
}
|
810
950
|
}
|
811
|
-
},
|
812
951
|
|
952
|
+
that._controlClass();
|
953
|
+
},
|
813
954
|
|
814
955
|
/**
|
815
956
|
* Determine the width of each column in the table so the auto column hiding
|
@@ -819,113 +960,138 @@ $.extend( Responsive.prototype, {
|
|
819
960
|
*
|
820
961
|
* @private
|
821
962
|
*/
|
822
|
-
_resizeAuto: function ()
|
823
|
-
{
|
963
|
+
_resizeAuto: function () {
|
824
964
|
var dt = this.s.dt;
|
825
965
|
var columns = this.s.columns;
|
966
|
+
var that = this;
|
826
967
|
|
827
968
|
// Are we allowed to do auto sizing?
|
828
|
-
if (
|
969
|
+
if (!this.c.auto) {
|
829
970
|
return;
|
830
971
|
}
|
831
972
|
|
832
973
|
// Are there any columns that actually need auto-sizing, or do they all
|
833
974
|
// have classes defined
|
834
|
-
if (
|
975
|
+
if (
|
976
|
+
$.inArray(
|
977
|
+
true,
|
978
|
+
$.map(columns, function (c) {
|
979
|
+
return c.auto;
|
980
|
+
})
|
981
|
+
) === -1
|
982
|
+
) {
|
835
983
|
return;
|
836
984
|
}
|
837
985
|
|
838
986
|
// Need to restore all children. They will be reinstated by a re-render
|
839
|
-
if (
|
840
|
-
$.each(
|
987
|
+
if (!$.isEmptyObject(this.s.childNodeStore)) {
|
988
|
+
$.each(this.s.childNodeStore, function (key) {
|
841
989
|
var idx = key.split('-');
|
842
990
|
|
843
|
-
_childNodesRestore(
|
844
|
-
}
|
991
|
+
that._childNodesRestore(dt, idx[0] * 1, idx[1] * 1);
|
992
|
+
});
|
845
993
|
}
|
846
994
|
|
847
995
|
// Clone the table with the current data in it
|
848
|
-
var tableWidth
|
996
|
+
var tableWidth = dt.table().node().offsetWidth;
|
849
997
|
var columnWidths = dt.columns;
|
850
|
-
var clonedTable
|
851
|
-
var clonedHeader = $(
|
852
|
-
var clonedBody
|
998
|
+
var clonedTable = dt.table().node().cloneNode(false);
|
999
|
+
var clonedHeader = $(dt.table().header().cloneNode(false)).appendTo(clonedTable);
|
1000
|
+
var clonedBody = $(dt.table().body()).clone(false, false).empty().appendTo(clonedTable); // use jQuery because of IE8
|
1001
|
+
|
1002
|
+
clonedTable.style.width = 'auto';
|
853
1003
|
|
854
1004
|
// Header
|
855
|
-
var headerCells = dt
|
1005
|
+
var headerCells = dt
|
1006
|
+
.columns()
|
856
1007
|
.header()
|
857
|
-
.filter(
|
1008
|
+
.filter(function (idx) {
|
858
1009
|
return dt.column(idx).visible();
|
859
|
-
}
|
1010
|
+
})
|
860
1011
|
.to$()
|
861
|
-
.clone(
|
862
|
-
.css(
|
863
|
-
.css(
|
1012
|
+
.clone(false)
|
1013
|
+
.css('display', 'table-cell')
|
1014
|
+
.css('width', 'auto')
|
1015
|
+
.css('min-width', 0);
|
864
1016
|
|
865
1017
|
// Body rows - we don't need to take account of DataTables' column
|
866
1018
|
// visibility since we implement our own here (hence the `display` set)
|
867
1019
|
$(clonedBody)
|
868
|
-
.append(
|
869
|
-
.find(
|
1020
|
+
.append($(dt.rows({ page: 'current' }).nodes()).clone(false))
|
1021
|
+
.find('th, td')
|
1022
|
+
.css('display', '');
|
870
1023
|
|
871
1024
|
// Footer
|
872
1025
|
var footer = dt.table().footer();
|
873
|
-
if (
|
874
|
-
var clonedFooter = $(
|
875
|
-
var footerCells = dt
|
1026
|
+
if (footer) {
|
1027
|
+
var clonedFooter = $(footer.cloneNode(false)).appendTo(clonedTable);
|
1028
|
+
var footerCells = dt
|
1029
|
+
.columns()
|
876
1030
|
.footer()
|
877
|
-
.filter(
|
1031
|
+
.filter(function (idx) {
|
878
1032
|
return dt.column(idx).visible();
|
879
|
-
}
|
1033
|
+
})
|
880
1034
|
.to$()
|
881
|
-
.clone(
|
882
|
-
.css(
|
1035
|
+
.clone(false)
|
1036
|
+
.css('display', 'table-cell');
|
883
1037
|
|
884
|
-
$('<tr/>')
|
885
|
-
.append( footerCells )
|
886
|
-
.appendTo( clonedFooter );
|
1038
|
+
$('<tr/>').append(footerCells).appendTo(clonedFooter);
|
887
1039
|
}
|
888
1040
|
|
889
|
-
$('<tr/>')
|
890
|
-
.append( headerCells )
|
891
|
-
.appendTo( clonedHeader );
|
1041
|
+
$('<tr/>').append(headerCells).appendTo(clonedHeader);
|
892
1042
|
|
893
1043
|
// In the inline case extra padding is applied to the first column to
|
894
1044
|
// give space for the show / hide icon. We need to use this in the
|
895
1045
|
// calculation
|
896
|
-
if (
|
897
|
-
$(clonedTable).addClass(
|
1046
|
+
if (this.c.details.type === 'inline') {
|
1047
|
+
$(clonedTable).addClass('dtr-inline collapsed');
|
898
1048
|
}
|
899
1049
|
|
900
1050
|
// It is unsafe to insert elements with the same name into the DOM
|
901
1051
|
// multiple times. For example, cloning and inserting a checked radio
|
902
1052
|
// clears the chcecked state of the original radio.
|
903
|
-
$(
|
1053
|
+
$(clonedTable).find('[name]').removeAttr('name');
|
904
1054
|
|
905
1055
|
// A position absolute table would take the table out of the flow of
|
906
1056
|
// our container element, bypassing the height and width (Scroller)
|
907
|
-
$(
|
1057
|
+
$(clonedTable).css('position', 'relative');
|
908
1058
|
|
909
1059
|
var inserted = $('<div/>')
|
910
|
-
.css(
|
1060
|
+
.css({
|
911
1061
|
width: 1,
|
912
1062
|
height: 1,
|
913
1063
|
overflow: 'hidden',
|
914
1064
|
clear: 'both'
|
915
|
-
}
|
916
|
-
.append(
|
1065
|
+
})
|
1066
|
+
.append(clonedTable);
|
917
1067
|
|
918
|
-
inserted.insertBefore(
|
1068
|
+
inserted.insertBefore(dt.table().node());
|
919
1069
|
|
920
1070
|
// The cloned header now contains the smallest that each column can be
|
921
|
-
headerCells.each(
|
922
|
-
var idx = dt.column.index(
|
923
|
-
columns[
|
924
|
-
}
|
1071
|
+
headerCells.each(function (i) {
|
1072
|
+
var idx = dt.column.index('fromVisible', i);
|
1073
|
+
columns[idx].minWidth = this.offsetWidth || 0;
|
1074
|
+
});
|
925
1075
|
|
926
1076
|
inserted.remove();
|
927
1077
|
},
|
928
1078
|
|
1079
|
+
/**
|
1080
|
+
* Get the state of the current hidden columns - controlled by Responsive only
|
1081
|
+
*/
|
1082
|
+
_responsiveOnlyHidden: function () {
|
1083
|
+
var dt = this.s.dt;
|
1084
|
+
|
1085
|
+
return $.map(this.s.current, function (v, i) {
|
1086
|
+
// If the column is hidden by DataTables then it can't be hidden by
|
1087
|
+
// Responsive!
|
1088
|
+
if (dt.column(i).visible() === false) {
|
1089
|
+
return true;
|
1090
|
+
}
|
1091
|
+
return v;
|
1092
|
+
});
|
1093
|
+
},
|
1094
|
+
|
929
1095
|
/**
|
930
1096
|
* Set a column's visibility.
|
931
1097
|
*
|
@@ -938,24 +1104,27 @@ $.extend( Responsive.prototype, {
|
|
938
1104
|
* @param {boolean} showHide Show or hide (true or false)
|
939
1105
|
* @private
|
940
1106
|
*/
|
941
|
-
_setColumnVis: function (
|
942
|
-
|
1107
|
+
_setColumnVis: function (col, showHide) {
|
1108
|
+
var that = this;
|
943
1109
|
var dt = this.s.dt;
|
944
1110
|
var display = showHide ? '' : 'none'; // empty string will remove the attr
|
945
1111
|
|
946
|
-
$(
|
947
|
-
|
948
|
-
dt.column(
|
1112
|
+
$(dt.column(col).header()).css('display', display).toggleClass('dtr-hidden', !showHide);
|
1113
|
+
|
1114
|
+
$(dt.column(col).footer()).css('display', display).toggleClass('dtr-hidden', !showHide);
|
1115
|
+
|
1116
|
+
dt.column(col).nodes().to$().css('display', display).toggleClass('dtr-hidden', !showHide);
|
949
1117
|
|
950
1118
|
// If the are child nodes stored, we might need to reinsert them
|
951
|
-
if (
|
952
|
-
dt.cells(
|
953
|
-
|
954
|
-
|
1119
|
+
if (!$.isEmptyObject(this.s.childNodeStore)) {
|
1120
|
+
dt.cells(null, col)
|
1121
|
+
.indexes()
|
1122
|
+
.each(function (idx) {
|
1123
|
+
that._childNodesRestore(dt, idx.row, idx.column);
|
1124
|
+
});
|
955
1125
|
}
|
956
1126
|
},
|
957
1127
|
|
958
|
-
|
959
1128
|
/**
|
960
1129
|
* Update the cell tab indexes for keyboard accessibility. This is called on
|
961
1130
|
* every table draw - that is potentially inefficient, but also the least
|
@@ -965,34 +1134,34 @@ $.extend( Responsive.prototype, {
|
|
965
1134
|
*
|
966
1135
|
* @private
|
967
1136
|
*/
|
968
|
-
_tabIndexes: function ()
|
969
|
-
{
|
1137
|
+
_tabIndexes: function () {
|
970
1138
|
var dt = this.s.dt;
|
971
|
-
var cells = dt.cells(
|
1139
|
+
var cells = dt.cells({ page: 'current' }).nodes().to$();
|
972
1140
|
var ctx = dt.settings()[0];
|
973
1141
|
var target = this.c.details.target;
|
974
1142
|
|
975
|
-
cells.filter(
|
1143
|
+
cells.filter('[data-dtr-keyboard]').removeData('[data-dtr-keyboard]');
|
976
1144
|
|
977
|
-
if (
|
978
|
-
dt.cells(
|
979
|
-
.
|
980
|
-
.
|
1145
|
+
if (typeof target === 'number') {
|
1146
|
+
dt.cells(null, target, { page: 'current' })
|
1147
|
+
.nodes()
|
1148
|
+
.to$()
|
1149
|
+
.attr('tabIndex', ctx.iTabIndex)
|
1150
|
+
.data('dtr-keyboard', 1);
|
981
1151
|
}
|
982
1152
|
else {
|
983
1153
|
// This is a bit of a hack - we need to limit the selected nodes to just
|
984
1154
|
// those of this table
|
985
|
-
if (
|
1155
|
+
if (target === 'td:first-child, th:first-child') {
|
986
1156
|
target = '>td:first-child, >th:first-child';
|
987
1157
|
}
|
988
1158
|
|
989
|
-
$(
|
990
|
-
.attr(
|
991
|
-
.data(
|
1159
|
+
$(target, dt.rows({ page: 'current' }).nodes())
|
1160
|
+
.attr('tabIndex', ctx.iTabIndex)
|
1161
|
+
.data('dtr-keyboard', 1);
|
992
1162
|
}
|
993
1163
|
}
|
994
|
-
}
|
995
|
-
|
1164
|
+
});
|
996
1165
|
|
997
1166
|
/**
|
998
1167
|
* List of default breakpoints. Each item in the array is an object with two
|
@@ -1005,14 +1174,13 @@ $.extend( Responsive.prototype, {
|
|
1005
1174
|
* @static
|
1006
1175
|
*/
|
1007
1176
|
Responsive.breakpoints = [
|
1008
|
-
{ name: 'desktop',
|
1177
|
+
{ name: 'desktop', width: Infinity },
|
1009
1178
|
{ name: 'tablet-l', width: 1024 },
|
1010
1179
|
{ name: 'tablet-p', width: 768 },
|
1011
1180
|
{ name: 'mobile-l', width: 480 },
|
1012
1181
|
{ name: 'mobile-p', width: 320 }
|
1013
1182
|
];
|
1014
1183
|
|
1015
|
-
|
1016
1184
|
/**
|
1017
1185
|
* Display methods - functions which define how the hidden data should be shown
|
1018
1186
|
* in the table.
|
@@ -1022,42 +1190,38 @@ Responsive.breakpoints = [
|
|
1022
1190
|
* @static
|
1023
1191
|
*/
|
1024
1192
|
Responsive.display = {
|
1025
|
-
childRow: function (
|
1026
|
-
if (
|
1027
|
-
if (
|
1028
|
-
row.child(
|
1193
|
+
childRow: function (row, update, render) {
|
1194
|
+
if (update) {
|
1195
|
+
if ($(row.node()).hasClass('parent')) {
|
1196
|
+
row.child(render(), 'child').show();
|
1029
1197
|
|
1030
1198
|
return true;
|
1031
1199
|
}
|
1032
1200
|
}
|
1033
1201
|
else {
|
1034
|
-
if (
|
1035
|
-
row.child(
|
1036
|
-
$( row.node() ).addClass( 'parent' );
|
1202
|
+
if (!row.child.isShown()) {
|
1203
|
+
row.child(render(), 'child').show();
|
1037
1204
|
|
1038
1205
|
return true;
|
1039
1206
|
}
|
1040
1207
|
else {
|
1041
|
-
row.child(
|
1042
|
-
$( row.node() ).removeClass( 'parent' );
|
1208
|
+
row.child(false);
|
1043
1209
|
|
1044
1210
|
return false;
|
1045
1211
|
}
|
1046
1212
|
}
|
1047
1213
|
},
|
1048
1214
|
|
1049
|
-
childRowImmediate: function (
|
1050
|
-
if (
|
1215
|
+
childRowImmediate: function (row, update, render) {
|
1216
|
+
if ((!update && row.child.isShown()) || !row.responsive.hasHidden()) {
|
1051
1217
|
// User interaction and the row is show, or nothing to show
|
1052
|
-
row.child(
|
1053
|
-
$( row.node() ).removeClass( 'parent' );
|
1218
|
+
row.child(false);
|
1054
1219
|
|
1055
1220
|
return false;
|
1056
1221
|
}
|
1057
1222
|
else {
|
1058
1223
|
// Display
|
1059
|
-
row.child(
|
1060
|
-
$( row.node() ).addClass( 'parent' );
|
1224
|
+
row.child(render(), 'child').show();
|
1061
1225
|
|
1062
1226
|
return true;
|
1063
1227
|
}
|
@@ -1066,103 +1230,70 @@ Responsive.display = {
|
|
1066
1230
|
// This is a wrapper so the modal options for Bootstrap and jQuery UI can
|
1067
1231
|
// have options passed into them. This specific one doesn't need to be a
|
1068
1232
|
// function but it is for consistency in the `modal` name
|
1069
|
-
modal: function (
|
1070
|
-
return function (
|
1071
|
-
if (
|
1233
|
+
modal: function (options) {
|
1234
|
+
return function (row, update, render, closeCallback) {
|
1235
|
+
if (!update) {
|
1072
1236
|
// Show a modal
|
1073
1237
|
var close = function () {
|
1074
1238
|
modal.remove(); // will tidy events for us
|
1075
|
-
$(document).off(
|
1239
|
+
$(document).off('keypress.dtr');
|
1240
|
+
$(row.node()).removeClass('parent');
|
1241
|
+
|
1242
|
+
closeCallback();
|
1076
1243
|
};
|
1077
1244
|
|
1078
1245
|
var modal = $('<div class="dtr-modal"/>')
|
1079
|
-
.append(
|
1080
|
-
|
1081
|
-
.append(
|
1082
|
-
|
1083
|
-
|
1084
|
-
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1246
|
+
.append(
|
1247
|
+
$('<div class="dtr-modal-display"/>')
|
1248
|
+
.append(
|
1249
|
+
$('<div class="dtr-modal-content"/>')
|
1250
|
+
.data('dtr-row-idx', row.index())
|
1251
|
+
.append(render())
|
1252
|
+
)
|
1253
|
+
.append(
|
1254
|
+
$('<div class="dtr-modal-close">×</div>').click(function () {
|
1255
|
+
close();
|
1256
|
+
})
|
1257
|
+
)
|
1088
1258
|
)
|
1089
|
-
.append(
|
1090
|
-
.click(
|
1259
|
+
.append(
|
1260
|
+
$('<div class="dtr-modal-background"/>').click(function () {
|
1091
1261
|
close();
|
1092
|
-
}
|
1262
|
+
})
|
1093
1263
|
)
|
1094
|
-
.appendTo(
|
1264
|
+
.appendTo('body');
|
1265
|
+
|
1266
|
+
$(row.node()).addClass('parent');
|
1095
1267
|
|
1096
|
-
$(document).on(
|
1097
|
-
if (
|
1268
|
+
$(document).on('keyup.dtr', function (e) {
|
1269
|
+
if (e.keyCode === 27) {
|
1098
1270
|
e.stopPropagation();
|
1099
1271
|
|
1100
1272
|
close();
|
1101
1273
|
}
|
1102
|
-
}
|
1274
|
+
});
|
1103
1275
|
}
|
1104
1276
|
else {
|
1105
|
-
$('div.dtr-modal-content')
|
1106
|
-
|
1107
|
-
|
1277
|
+
var modal = $('div.dtr-modal-content');
|
1278
|
+
|
1279
|
+
if (modal.length && row.index() === modal.data('dtr-row-idx')) {
|
1280
|
+
modal.empty().append(render());
|
1281
|
+
}
|
1282
|
+
else {
|
1283
|
+
// Modal not shown, nothing to update
|
1284
|
+
return null;
|
1285
|
+
}
|
1108
1286
|
}
|
1109
1287
|
|
1110
|
-
if (
|
1111
|
-
$('div.dtr-modal-content').prepend(
|
1112
|
-
'<h2>'+options.header( row )+'</h2>'
|
1113
|
-
);
|
1288
|
+
if (options && options.header) {
|
1289
|
+
$('div.dtr-modal-content').prepend('<h2>' + options.header(row) + '</h2>');
|
1114
1290
|
}
|
1291
|
+
|
1292
|
+
return true;
|
1115
1293
|
};
|
1116
1294
|
}
|
1117
1295
|
};
|
1118
1296
|
|
1119
|
-
|
1120
|
-
var _childNodeStore = {};
|
1121
|
-
|
1122
|
-
function _childNodes( dt, row, col ) {
|
1123
|
-
var name = row+'-'+col;
|
1124
|
-
|
1125
|
-
if ( _childNodeStore[ name ] ) {
|
1126
|
-
return _childNodeStore[ name ];
|
1127
|
-
}
|
1128
|
-
|
1129
|
-
// https://jsperf.com/childnodes-array-slice-vs-loop
|
1130
|
-
var nodes = [];
|
1131
|
-
var children = dt.cell( row, col ).node().childNodes;
|
1132
|
-
for ( var i=0, ien=children.length ; i<ien ; i++ ) {
|
1133
|
-
nodes.push( children[i] );
|
1134
|
-
}
|
1135
|
-
|
1136
|
-
_childNodeStore[ name ] = nodes;
|
1137
|
-
|
1138
|
-
return nodes;
|
1139
|
-
}
|
1140
|
-
|
1141
|
-
function _childNodesRestore( dt, row, col ) {
|
1142
|
-
var name = row+'-'+col;
|
1143
|
-
|
1144
|
-
if ( ! _childNodeStore[ name ] ) {
|
1145
|
-
return;
|
1146
|
-
}
|
1147
|
-
|
1148
|
-
var node = dt.cell( row, col ).node();
|
1149
|
-
var store = _childNodeStore[ name ];
|
1150
|
-
var parent = store[0].parentNode;
|
1151
|
-
var parentChildren = parent.childNodes;
|
1152
|
-
var a = [];
|
1153
|
-
|
1154
|
-
for ( var i=0, ien=parentChildren.length ; i<ien ; i++ ) {
|
1155
|
-
a.push( parentChildren[i] );
|
1156
|
-
}
|
1157
|
-
|
1158
|
-
for ( var j=0, jen=a.length ; j<jen ; j++ ) {
|
1159
|
-
node.appendChild( a[j] );
|
1160
|
-
}
|
1161
|
-
|
1162
|
-
_childNodeStore[ name ] = undefined;
|
1163
|
-
}
|
1164
|
-
|
1165
|
-
|
1166
1297
|
/**
|
1167
1298
|
* Display methods - functions which define how the hidden data should be shown
|
1168
1299
|
* in the table.
|
@@ -1173,68 +1304,111 @@ function _childNodesRestore( dt, row, col ) {
|
|
1173
1304
|
*/
|
1174
1305
|
Responsive.renderer = {
|
1175
1306
|
listHiddenNodes: function () {
|
1176
|
-
return function (
|
1177
|
-
var
|
1307
|
+
return function (api, rowIdx, columns) {
|
1308
|
+
var that = this;
|
1309
|
+
var ul = $('<ul data-dtr-index="' + rowIdx + '" class="dtr-details"/>');
|
1178
1310
|
var found = false;
|
1179
1311
|
|
1180
|
-
var data = $.each(
|
1181
|
-
if (
|
1312
|
+
var data = $.each(columns, function (i, col) {
|
1313
|
+
if (col.hidden) {
|
1314
|
+
var klass = col.className ? 'class="' + col.className + '"' : '';
|
1315
|
+
|
1182
1316
|
$(
|
1183
|
-
'<li
|
1184
|
-
|
1185
|
-
|
1186
|
-
|
1187
|
-
|
1317
|
+
'<li ' +
|
1318
|
+
klass +
|
1319
|
+
' data-dtr-index="' +
|
1320
|
+
col.columnIndex +
|
1321
|
+
'" data-dt-row="' +
|
1322
|
+
col.rowIndex +
|
1323
|
+
'" data-dt-column="' +
|
1324
|
+
col.columnIndex +
|
1325
|
+
'">' +
|
1326
|
+
'<span class="dtr-title">' +
|
1327
|
+
col.title +
|
1328
|
+
'</span> ' +
|
1329
|
+
'</li>'
|
1188
1330
|
)
|
1189
|
-
.append(
|
1190
|
-
|
1331
|
+
.append(
|
1332
|
+
$('<span class="dtr-data"/>').append(
|
1333
|
+
that._childNodes(api, col.rowIndex, col.columnIndex)
|
1334
|
+
)
|
1335
|
+
) // api.cell( col.rowIndex, col.columnIndex ).node().childNodes ) )
|
1336
|
+
.appendTo(ul);
|
1191
1337
|
|
1192
1338
|
found = true;
|
1193
1339
|
}
|
1194
|
-
}
|
1340
|
+
});
|
1195
1341
|
|
1196
|
-
return found ?
|
1197
|
-
ul :
|
1198
|
-
false;
|
1342
|
+
return found ? ul : false;
|
1199
1343
|
};
|
1200
1344
|
},
|
1201
1345
|
|
1202
1346
|
listHidden: function () {
|
1203
|
-
return function (
|
1204
|
-
var data = $.map(
|
1205
|
-
|
1206
|
-
|
1207
|
-
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
col.
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1347
|
+
return function (api, rowIdx, columns) {
|
1348
|
+
var data = $.map(columns, function (col) {
|
1349
|
+
var klass = col.className ? 'class="' + col.className + '"' : '';
|
1350
|
+
|
1351
|
+
return col.hidden
|
1352
|
+
? '<li ' +
|
1353
|
+
klass +
|
1354
|
+
' data-dtr-index="' +
|
1355
|
+
col.columnIndex +
|
1356
|
+
'" data-dt-row="' +
|
1357
|
+
col.rowIndex +
|
1358
|
+
'" data-dt-column="' +
|
1359
|
+
col.columnIndex +
|
1360
|
+
'">' +
|
1361
|
+
'<span class="dtr-title">' +
|
1362
|
+
col.title +
|
1363
|
+
'</span> ' +
|
1364
|
+
'<span class="dtr-data">' +
|
1365
|
+
col.data +
|
1366
|
+
'</span>' +
|
1367
|
+
'</li>'
|
1368
|
+
: '';
|
1369
|
+
}).join('');
|
1370
|
+
|
1371
|
+
return data
|
1372
|
+
? $('<ul data-dtr-index="' + rowIdx + '" class="dtr-details"/>').append(data)
|
1373
|
+
: false;
|
1374
|
+
};
|
1221
1375
|
},
|
1222
1376
|
|
1223
|
-
tableAll: function (
|
1224
|
-
options = $.extend(
|
1225
|
-
|
1226
|
-
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1377
|
+
tableAll: function (options) {
|
1378
|
+
options = $.extend(
|
1379
|
+
{
|
1380
|
+
tableClass: ''
|
1381
|
+
},
|
1382
|
+
options
|
1383
|
+
);
|
1384
|
+
|
1385
|
+
return function (api, rowIdx, columns) {
|
1386
|
+
var data = $.map(columns, function (col) {
|
1387
|
+
var klass = col.className ? 'class="' + col.className + '"' : '';
|
1388
|
+
|
1389
|
+
return (
|
1390
|
+
'<tr ' +
|
1391
|
+
klass +
|
1392
|
+
' data-dt-row="' +
|
1393
|
+
col.rowIndex +
|
1394
|
+
'" data-dt-column="' +
|
1395
|
+
col.columnIndex +
|
1396
|
+
'">' +
|
1397
|
+
'<td>' +
|
1398
|
+
col.title +
|
1399
|
+
':' +
|
1400
|
+
'</td> ' +
|
1401
|
+
'<td>' +
|
1402
|
+
col.data +
|
1403
|
+
'</td>' +
|
1404
|
+
'</tr>'
|
1405
|
+
);
|
1406
|
+
}).join('');
|
1235
1407
|
|
1236
|
-
return $('<table class="'+options.tableClass+' dtr-details" width="100%"/>').append(
|
1237
|
-
|
1408
|
+
return $('<table class="' + options.tableClass + ' dtr-details" width="100%"/>').append(
|
1409
|
+
data
|
1410
|
+
);
|
1411
|
+
};
|
1238
1412
|
}
|
1239
1413
|
};
|
1240
1414
|
|
@@ -1302,59 +1476,61 @@ Responsive.defaults = {
|
|
1302
1476
|
orthogonal: 'display'
|
1303
1477
|
};
|
1304
1478
|
|
1305
|
-
|
1306
1479
|
/*
|
1307
1480
|
* API
|
1308
1481
|
*/
|
1309
1482
|
var Api = $.fn.dataTable.Api;
|
1310
1483
|
|
1311
1484
|
// Doesn't do anything - work around for a bug in DT... Not documented
|
1312
|
-
Api.register(
|
1485
|
+
Api.register('responsive()', function () {
|
1313
1486
|
return this;
|
1314
|
-
}
|
1487
|
+
});
|
1315
1488
|
|
1316
|
-
Api.register(
|
1489
|
+
Api.register('responsive.index()', function (li) {
|
1317
1490
|
li = $(li);
|
1318
1491
|
|
1319
1492
|
return {
|
1320
1493
|
column: li.data('dtr-index'),
|
1321
|
-
row:
|
1494
|
+
row: li.parent().data('dtr-index')
|
1322
1495
|
};
|
1323
|
-
}
|
1496
|
+
});
|
1324
1497
|
|
1325
|
-
Api.register(
|
1326
|
-
return this.iterator(
|
1327
|
-
if (
|
1498
|
+
Api.register('responsive.rebuild()', function () {
|
1499
|
+
return this.iterator('table', function (ctx) {
|
1500
|
+
if (ctx._responsive) {
|
1328
1501
|
ctx._responsive._classLogic();
|
1329
1502
|
}
|
1330
|
-
}
|
1331
|
-
}
|
1503
|
+
});
|
1504
|
+
});
|
1332
1505
|
|
1333
|
-
Api.register(
|
1334
|
-
return this.iterator(
|
1335
|
-
if (
|
1506
|
+
Api.register('responsive.recalc()', function () {
|
1507
|
+
return this.iterator('table', function (ctx) {
|
1508
|
+
if (ctx._responsive) {
|
1336
1509
|
ctx._responsive._resizeAuto();
|
1337
1510
|
ctx._responsive._resize();
|
1338
1511
|
}
|
1339
|
-
}
|
1340
|
-
}
|
1512
|
+
});
|
1513
|
+
});
|
1341
1514
|
|
1342
|
-
Api.register(
|
1515
|
+
Api.register('responsive.hasHidden()', function () {
|
1343
1516
|
var ctx = this.context[0];
|
1344
1517
|
|
1345
|
-
return ctx._responsive
|
1346
|
-
$.inArray(
|
1347
|
-
false;
|
1348
|
-
}
|
1349
|
-
|
1350
|
-
Api.registerPlural(
|
1351
|
-
return this.iterator(
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1357
|
-
|
1518
|
+
return ctx._responsive
|
1519
|
+
? $.inArray(false, ctx._responsive._responsiveOnlyHidden()) !== -1
|
1520
|
+
: false;
|
1521
|
+
});
|
1522
|
+
|
1523
|
+
Api.registerPlural('columns().responsiveHidden()', 'column().responsiveHidden()', function () {
|
1524
|
+
return this.iterator(
|
1525
|
+
'column',
|
1526
|
+
function (settings, column) {
|
1527
|
+
return settings._responsive
|
1528
|
+
? settings._responsive._responsiveOnlyHidden()[column]
|
1529
|
+
: false;
|
1530
|
+
},
|
1531
|
+
1
|
1532
|
+
);
|
1533
|
+
});
|
1358
1534
|
|
1359
1535
|
/**
|
1360
1536
|
* Version information
|
@@ -1362,32 +1538,32 @@ Api.registerPlural( 'columns().responsiveHidden()', 'column().responsiveHidden()
|
|
1362
1538
|
* @name Responsive.version
|
1363
1539
|
* @static
|
1364
1540
|
*/
|
1365
|
-
Responsive.version = '2.
|
1366
|
-
|
1541
|
+
Responsive.version = '2.5.0';
|
1367
1542
|
|
1368
1543
|
$.fn.dataTable.Responsive = Responsive;
|
1369
1544
|
$.fn.DataTable.Responsive = Responsive;
|
1370
1545
|
|
1371
1546
|
// Attach a listener to the document which listens for DataTables initialisation
|
1372
1547
|
// events so we can automatically initialise
|
1373
|
-
$(document).on(
|
1374
|
-
if (
|
1548
|
+
$(document).on('preInit.dt.dtr', function (e, settings, json) {
|
1549
|
+
if (e.namespace !== 'dt') {
|
1375
1550
|
return;
|
1376
1551
|
}
|
1377
1552
|
|
1378
|
-
if (
|
1379
|
-
|
1380
|
-
|
1381
|
-
|
1553
|
+
if (
|
1554
|
+
$(settings.nTable).hasClass('responsive') ||
|
1555
|
+
$(settings.nTable).hasClass('dt-responsive') ||
|
1556
|
+
settings.oInit.responsive ||
|
1557
|
+
DataTable.defaults.responsive
|
1382
1558
|
) {
|
1383
1559
|
var init = settings.oInit.responsive;
|
1384
1560
|
|
1385
|
-
if (
|
1386
|
-
new Responsive(
|
1561
|
+
if (init !== false) {
|
1562
|
+
new Responsive(settings, $.isPlainObject(init) ? init : {});
|
1387
1563
|
}
|
1388
1564
|
}
|
1389
|
-
}
|
1565
|
+
});
|
1390
1566
|
|
1391
1567
|
|
1392
|
-
return
|
1568
|
+
return DataTable;
|
1393
1569
|
}));
|