jquery-datatables 1.10.12 → 1.10.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/app/assets/javascripts/datatables/dataTables.bootstrap.js +2 -2
- data/app/assets/javascripts/datatables/dataTables.bootstrap4.js +5 -5
- data/app/assets/javascripts/datatables/dataTables.foundation.js +1 -1
- data/app/assets/javascripts/datatables/dataTables.material.js +1 -1
- data/app/assets/javascripts/datatables/dataTables.semanticui.js +1 -1
- data/app/assets/javascripts/datatables/extensions/AutoFill/dataTables.autoFill.js +63 -31
- data/app/assets/javascripts/datatables/extensions/Buttons/buttons.colVis.js +2 -3
- data/app/assets/javascripts/datatables/extensions/Buttons/buttons.flash.js +145 -55
- data/app/assets/javascripts/datatables/extensions/Buttons/buttons.html5.js +224 -206
- data/app/assets/javascripts/datatables/extensions/Buttons/buttons.print.js +14 -8
- data/app/assets/javascripts/datatables/extensions/Buttons/dataTables.buttons.js +54 -24
- data/app/assets/javascripts/datatables/extensions/KeyTable/dataTables.keyTable.js +137 -68
- data/app/assets/javascripts/datatables/extensions/Responsive/dataTables.responsive.js +30 -7
- data/app/assets/javascripts/datatables/extensions/Responsive/responsive.bootstrap.js +6 -2
- data/app/assets/javascripts/datatables/extensions/Responsive/responsive.bootstrap4.js +6 -2
- data/app/assets/javascripts/datatables/extensions/RowReorder/dataTables.rowReorder.js +64 -6
- data/app/assets/javascripts/datatables/extensions/Select/dataTables.select.js +40 -15
- data/app/assets/javascripts/datatables/jquery.dataTables.js +246 -217
- data/app/assets/javascripts/datatables/plugins/api/average.js +32 -0
- data/app/assets/javascripts/datatables/plugins/api/sum.js +51 -0
- data/app/assets/javascripts/datatables/plugins/pagination/input.js +224 -0
- data/app/assets/javascripts/datatables/plugins/search/alphabetSearch.js +368 -0
- data/app/assets/javascripts/datatables/plugins/sorting/file-size.js +43 -0
- data/app/assets/javascripts/datatables/plugins/sorting/ip-address.js +103 -0
- data/app/assets/stylesheets/datatables/dataTables.bootstrap.css +0 -1
- data/app/assets/stylesheets/datatables/dataTables.semanticui.css +0 -1
- data/app/assets/stylesheets/datatables/extensions/Responsive/responsive.bootstrap.css +4 -4
- data/app/assets/stylesheets/datatables/extensions/Responsive/responsive.bootstrap4.css +4 -4
- data/app/assets/stylesheets/datatables/extensions/Responsive/responsive.dataTables.css +4 -4
- data/app/assets/stylesheets/datatables/extensions/Responsive/responsive.foundation.css +4 -4
- data/app/assets/stylesheets/datatables/extensions/Responsive/responsive.jqueryui.css +4 -4
- data/app/assets/stylesheets/datatables/extensions/Responsive/responsive.semanticui.css +4 -4
- data/app/assets/stylesheets/datatables/extensions/Select/select.bootstrap.css +9 -4
- data/app/assets/stylesheets/datatables/extensions/Select/select.bootstrap4.css +9 -4
- data/app/assets/stylesheets/datatables/extensions/Select/select.dataTables.css +9 -4
- data/app/assets/stylesheets/datatables/extensions/Select/select.foundation.css +9 -4
- data/app/assets/stylesheets/datatables/extensions/Select/select.jqueryui.css +9 -4
- data/app/assets/stylesheets/datatables/extensions/Select/select.semanticui.css +9 -4
- data/app/assets/stylesheets/datatables/plugins/search/alphabetSearch.css +43 -0
- data/lib/jquery-datatables/version.rb +1 -1
- metadata +10 -3
@@ -126,19 +126,25 @@ DataTable.ext.buttons.print = {
|
|
126
126
|
head += _relToAbs( this );
|
127
127
|
} );
|
128
128
|
|
129
|
-
|
130
|
-
|
129
|
+
try {
|
130
|
+
win.document.head.innerHTML = head; // Work around for Edge
|
131
|
+
}
|
132
|
+
catch (e) {
|
133
|
+
$(win.document.head).html( head ); // Old IE
|
134
|
+
}
|
131
135
|
|
132
136
|
// Inject the table and other surrounding information
|
133
137
|
win.document.body.innerHTML =
|
134
138
|
'<h1>'+title+'</h1>'+
|
135
|
-
'<div>'+
|
139
|
+
'<div>'+
|
140
|
+
(typeof config.message === 'function' ?
|
141
|
+
config.message( dt, button, config ) :
|
142
|
+
config.message
|
143
|
+
)+
|
144
|
+
'</div>'+
|
136
145
|
html;
|
137
|
-
|
138
|
-
|
139
|
-
// '<div>'+config.message+'</div>'+
|
140
|
-
// html
|
141
|
-
// );
|
146
|
+
|
147
|
+
$(win.document.body).addClass('dt-print-view');
|
142
148
|
|
143
149
|
if ( config.customize ) {
|
144
150
|
config.customize( win );
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/*! Buttons for DataTables 1.2.
|
1
|
+
/*! Buttons for DataTables 1.2.3
|
2
2
|
* ©2016 SpryMedia Ltd - datatables.net/license
|
3
3
|
*/
|
4
4
|
|
@@ -191,8 +191,8 @@ $.extend( Buttons.prototype, {
|
|
191
191
|
$('body').off( 'keyup.'+this.s.namespace );
|
192
192
|
|
193
193
|
// Individual button destroy (so they can remove their own events if
|
194
|
-
// needed
|
195
|
-
var buttons = this.s.buttons;
|
194
|
+
// needed). Take a copy as the array is modified by `remove`
|
195
|
+
var buttons = this.s.buttons.slice();
|
196
196
|
var i, ien;
|
197
197
|
|
198
198
|
for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
|
@@ -879,7 +879,9 @@ Buttons.background = function ( show, className, fade ) {
|
|
879
879
|
else {
|
880
880
|
$('body > div.'+className)
|
881
881
|
.fadeOut( fade, function () {
|
882
|
-
$(this)
|
882
|
+
$(this)
|
883
|
+
.removeClass( className )
|
884
|
+
.remove();
|
883
885
|
} );
|
884
886
|
}
|
885
887
|
};
|
@@ -1116,7 +1118,7 @@ Buttons.defaults = {
|
|
1116
1118
|
* @type {string}
|
1117
1119
|
* @static
|
1118
1120
|
*/
|
1119
|
-
Buttons.version = '1.2.
|
1121
|
+
Buttons.version = '1.2.3';
|
1120
1122
|
|
1121
1123
|
|
1122
1124
|
$.extend( _dtButtons, {
|
@@ -1133,7 +1135,7 @@ $.extend( _dtButtons, {
|
|
1133
1135
|
|
1134
1136
|
// Remove any old collection
|
1135
1137
|
if ( $('div.dt-button-background').length ) {
|
1136
|
-
multiLevel = $('
|
1138
|
+
multiLevel = $('.dt-button-collection').offset();
|
1137
1139
|
$('body').trigger( 'click.dtb-collection' );
|
1138
1140
|
}
|
1139
1141
|
|
@@ -1147,8 +1149,8 @@ $.extend( _dtButtons, {
|
|
1147
1149
|
|
1148
1150
|
if ( multiLevel && position === 'absolute' ) {
|
1149
1151
|
config._collection.css( {
|
1150
|
-
top: multiLevel.top
|
1151
|
-
left: multiLevel.left
|
1152
|
+
top: multiLevel.top,
|
1153
|
+
left: multiLevel.left
|
1152
1154
|
} );
|
1153
1155
|
}
|
1154
1156
|
else if ( position === 'absolute' ) {
|
@@ -1187,7 +1189,10 @@ $.extend( _dtButtons, {
|
|
1187
1189
|
$('div.dt-button-background').on( 'click.dtb-collection', function () {} );
|
1188
1190
|
|
1189
1191
|
$('body').on( 'click.dtb-collection', function (e) {
|
1190
|
-
|
1192
|
+
// andSelf is deprecated in jQ1.8, but we want 1.7 compat
|
1193
|
+
var back = $.fn.addBack ? 'addBack' : 'andSelf';
|
1194
|
+
|
1195
|
+
if ( ! $(e.target).parents()[back]().filter( config._collection ).length ) {
|
1191
1196
|
config._collection
|
1192
1197
|
.fadeOut( config.fade, function () {
|
1193
1198
|
config._collection.detach();
|
@@ -1268,6 +1273,7 @@ $.extend( _dtButtons, {
|
|
1268
1273
|
buttons: $.map( vals, function ( val, i ) {
|
1269
1274
|
return {
|
1270
1275
|
text: lang[i],
|
1276
|
+
className: 'button-page-length',
|
1271
1277
|
action: function ( e, dt ) {
|
1272
1278
|
dt.page.len( val ).draw();
|
1273
1279
|
},
|
@@ -1314,7 +1320,9 @@ DataTable.Api.register( 'buttons()', function ( group, selector ) {
|
|
1314
1320
|
group = undefined;
|
1315
1321
|
}
|
1316
1322
|
|
1317
|
-
|
1323
|
+
this.selector.buttonGroup = group;
|
1324
|
+
|
1325
|
+
var res = this.iterator( true, 'table', function ( ctx ) {
|
1318
1326
|
if ( ctx._buttons ) {
|
1319
1327
|
return Buttons.buttonSelector(
|
1320
1328
|
Buttons.instanceSelector( group, ctx._buttons ),
|
@@ -1322,6 +1330,9 @@ DataTable.Api.register( 'buttons()', function ( group, selector ) {
|
|
1322
1330
|
);
|
1323
1331
|
}
|
1324
1332
|
}, true );
|
1333
|
+
|
1334
|
+
res._groupSelector = group;
|
1335
|
+
return res;
|
1325
1336
|
} );
|
1326
1337
|
|
1327
1338
|
// Individual button selector
|
@@ -1408,25 +1419,40 @@ DataTable.Api.registerPlural( 'buttons().trigger()', 'button().trigger()', funct
|
|
1408
1419
|
} );
|
1409
1420
|
} );
|
1410
1421
|
|
1411
|
-
// Get the container elements
|
1422
|
+
// Get the container elements
|
1412
1423
|
DataTable.Api.registerPlural( 'buttons().containers()', 'buttons().container()', function () {
|
1413
1424
|
var jq = $();
|
1425
|
+
var groupSelector = this._groupSelector;
|
1414
1426
|
|
1415
|
-
//
|
1416
|
-
|
1417
|
-
|
1418
|
-
|
1427
|
+
// We need to use the group selector directly, since if there are no buttons
|
1428
|
+
// the result set will be empty
|
1429
|
+
this.iterator( true, 'table', function ( ctx ) {
|
1430
|
+
if ( ctx._buttons ) {
|
1431
|
+
var insts = Buttons.instanceSelector( groupSelector, ctx._buttons );
|
1432
|
+
|
1433
|
+
for ( var i=0, ien=insts.length ; i<ien ; i++ ) {
|
1434
|
+
jq = jq.add( insts[i].container() );
|
1435
|
+
}
|
1436
|
+
}
|
1437
|
+
} );
|
1419
1438
|
|
1420
1439
|
return jq;
|
1421
1440
|
} );
|
1422
1441
|
|
1423
1442
|
// Add a new button
|
1424
1443
|
DataTable.Api.register( 'button().add()', function ( idx, conf ) {
|
1425
|
-
|
1426
|
-
|
1444
|
+
var ctx = this.context;
|
1445
|
+
|
1446
|
+
// Don't use `this` as it could be empty - select the instances directly
|
1447
|
+
if ( ctx.length ) {
|
1448
|
+
var inst = Buttons.instanceSelector( this._groupSelector, ctx[0]._buttons );
|
1449
|
+
|
1450
|
+
if ( inst.length ) {
|
1451
|
+
inst[0].add( conf, idx );
|
1452
|
+
}
|
1427
1453
|
}
|
1428
1454
|
|
1429
|
-
return this.button( idx );
|
1455
|
+
return this.button( this._groupSelector, idx );
|
1430
1456
|
} );
|
1431
1457
|
|
1432
1458
|
// Destroy the button sets selected
|
@@ -1552,21 +1578,25 @@ var _exportData = function ( dt, inOpts )
|
|
1552
1578
|
|
1553
1579
|
|
1554
1580
|
var header = dt.columns( config.columns ).indexes().map( function (idx) {
|
1555
|
-
|
1581
|
+
var el = dt.column( idx ).header();
|
1582
|
+
return config.format.header( el.innerHTML, idx, el );
|
1556
1583
|
} ).toArray();
|
1557
1584
|
|
1558
1585
|
var footer = dt.table().footer() ?
|
1559
1586
|
dt.columns( config.columns ).indexes().map( function (idx) {
|
1560
1587
|
var el = dt.column( idx ).footer();
|
1561
|
-
return config.format.footer( el ? el.innerHTML : '', idx );
|
1588
|
+
return config.format.footer( el ? el.innerHTML : '', idx, el );
|
1562
1589
|
} ).toArray() :
|
1563
1590
|
null;
|
1564
1591
|
|
1565
|
-
var
|
1566
|
-
var cells =
|
1567
|
-
.cells( rowIndexes, config.columns )
|
1592
|
+
var selectedCells = dt.cells( config.rows, config.columns, config.modifier );
|
1593
|
+
var cells = selectedCells
|
1568
1594
|
.render( config.orthogonal )
|
1569
1595
|
.toArray();
|
1596
|
+
var cellNodes = selectedCells
|
1597
|
+
.nodes()
|
1598
|
+
.toArray();
|
1599
|
+
|
1570
1600
|
var columns = header.length;
|
1571
1601
|
var rows = columns > 0 ? cells.length / columns : 0;
|
1572
1602
|
var body = new Array( rows );
|
@@ -1576,7 +1606,7 @@ var _exportData = function ( dt, inOpts )
|
|
1576
1606
|
var row = new Array( columns );
|
1577
1607
|
|
1578
1608
|
for ( var j=0 ; j<columns ; j++ ) {
|
1579
|
-
row[j] = config.format.body( cells[ cellCounter ], j,
|
1609
|
+
row[j] = config.format.body( cells[ cellCounter ], i, j, cellNodes[ cellCounter ] );
|
1580
1610
|
cellCounter++;
|
1581
1611
|
}
|
1582
1612
|
|
@@ -1,11 +1,11 @@
|
|
1
|
-
/*! KeyTable 2.
|
1
|
+
/*! KeyTable 2.2.0
|
2
2
|
* ©2009-2016 SpryMedia Ltd - datatables.net/license
|
3
3
|
*/
|
4
4
|
|
5
5
|
/**
|
6
6
|
* @summary KeyTable
|
7
7
|
* @description Spreadsheet like keyboard navigation for DataTables
|
8
|
-
* @version 2.
|
8
|
+
* @version 2.2.0
|
9
9
|
* @file dataTables.keyTable.js
|
10
10
|
* @author SpryMedia Ltd (www.sprymedia.co.uk)
|
11
11
|
* @contact www.sprymedia.co.uk/contact
|
@@ -72,7 +72,15 @@ var KeyTable = function ( dt, opts ) {
|
|
72
72
|
enable: true,
|
73
73
|
|
74
74
|
/** @type {bool} Flag for if a draw is triggered by focus */
|
75
|
-
focusDraw: false
|
75
|
+
focusDraw: false,
|
76
|
+
|
77
|
+
/** @type {bool} Flag to indicate when waiting for a draw to happen.
|
78
|
+
* Will ignore key presses at this point
|
79
|
+
*/
|
80
|
+
waitingForDraw: false,
|
81
|
+
|
82
|
+
/** @type {object} Information about the last cell that was focused */
|
83
|
+
lastFocus: null
|
76
84
|
};
|
77
85
|
|
78
86
|
// DOM items
|
@@ -96,7 +104,7 @@ $.extend( KeyTable.prototype, {
|
|
96
104
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
97
105
|
* API methods for DataTables API interface
|
98
106
|
*/
|
99
|
-
|
107
|
+
|
100
108
|
/**
|
101
109
|
* Blur the table's cell focus
|
102
110
|
*/
|
@@ -138,7 +146,7 @@ $.extend( KeyTable.prototype, {
|
|
138
146
|
return false;
|
139
147
|
}
|
140
148
|
|
141
|
-
var lastIdx = this.s.lastFocus.index();
|
149
|
+
var lastIdx = this.s.lastFocus.cell.index();
|
142
150
|
return cell.row === lastIdx.row && cell.column === lastIdx.column;
|
143
151
|
},
|
144
152
|
|
@@ -166,7 +174,7 @@ $.extend( KeyTable.prototype, {
|
|
166
174
|
}
|
167
175
|
|
168
176
|
// Click to focus
|
169
|
-
$( dt.table().body() ).on( 'click.keyTable', 'th, td', function () {
|
177
|
+
$( dt.table().body() ).on( 'click.keyTable', 'th, td', function (e) {
|
170
178
|
if ( that.s.enable === false ) {
|
171
179
|
return;
|
172
180
|
}
|
@@ -177,7 +185,7 @@ $.extend( KeyTable.prototype, {
|
|
177
185
|
return;
|
178
186
|
}
|
179
187
|
|
180
|
-
that._focus( cell, null, false );
|
188
|
+
that._focus( cell, null, false, e );
|
181
189
|
} );
|
182
190
|
|
183
191
|
// Key events
|
@@ -187,7 +195,7 @@ $.extend( KeyTable.prototype, {
|
|
187
195
|
|
188
196
|
// Click blur
|
189
197
|
if ( this.c.blurable ) {
|
190
|
-
$( document ).on( '
|
198
|
+
$( document ).on( 'mousedown.keyTable', function ( e ) {
|
191
199
|
// Click on the search input will blur focus
|
192
200
|
if ( $(e.target).parents( '.dataTables_filter' ).length ) {
|
193
201
|
that._blur();
|
@@ -203,6 +211,11 @@ $.extend( KeyTable.prototype, {
|
|
203
211
|
return;
|
204
212
|
}
|
205
213
|
|
214
|
+
//If the click was inside the fixed columns container, don't blur
|
215
|
+
if ( $(e.target).parents().filter('.DTFC_Cloned').length ) {
|
216
|
+
return;
|
217
|
+
}
|
218
|
+
|
206
219
|
that._blur();
|
207
220
|
} );
|
208
221
|
}
|
@@ -217,29 +230,30 @@ $.extend( KeyTable.prototype, {
|
|
217
230
|
if ( dt.settings()[0].oFeatures.bStateSave ) {
|
218
231
|
dt.on( 'stateSaveParams.keyTable', function (e, s, d) {
|
219
232
|
d.keyTable = that.s.lastFocus ?
|
220
|
-
that.s.lastFocus.index() :
|
233
|
+
that.s.lastFocus.cell.index() :
|
221
234
|
null;
|
222
235
|
} );
|
223
236
|
}
|
224
237
|
|
225
|
-
//
|
226
|
-
|
227
|
-
// well (which is different from how client-side processing works).
|
228
|
-
dt.on( 'xhr.keyTable', function ( e ) {
|
238
|
+
// Redraw - retain focus on the current cell
|
239
|
+
dt.on( 'draw.keyTable', function (e) {
|
229
240
|
if ( that.s.focusDraw ) {
|
230
|
-
// Triggered by server-side processing, and thus `_focus` will
|
231
|
-
// do the refocus on the next draw event
|
232
241
|
return;
|
233
242
|
}
|
234
243
|
|
235
244
|
var lastFocus = that.s.lastFocus;
|
236
245
|
|
237
246
|
if ( lastFocus ) {
|
238
|
-
that.s.lastFocus
|
247
|
+
var relative = that.s.lastFocus.relative;
|
248
|
+
var info = dt.page.info();
|
249
|
+
var row = relative.row + info.start;
|
239
250
|
|
240
|
-
|
241
|
-
|
242
|
-
|
251
|
+
// Reverse if needed
|
252
|
+
if ( row >= info.recordsDisplay ) {
|
253
|
+
row = info.recordsDisplay - 1;
|
254
|
+
}
|
255
|
+
|
256
|
+
that._focus( row, relative.column, true, e );
|
243
257
|
}
|
244
258
|
} );
|
245
259
|
|
@@ -288,11 +302,13 @@ $.extend( KeyTable.prototype, {
|
|
288
302
|
return;
|
289
303
|
}
|
290
304
|
|
291
|
-
var cell = this.s.lastFocus;
|
305
|
+
var cell = this.s.lastFocus.cell;
|
292
306
|
|
293
307
|
$( cell.node() ).removeClass( this.c.className );
|
294
308
|
this.s.lastFocus = null;
|
295
309
|
|
310
|
+
this._updateFixedColumns(cell.index().column);
|
311
|
+
|
296
312
|
this._emitEvent( 'key-blur', [ this.s.dt, cell ] );
|
297
313
|
},
|
298
314
|
|
@@ -332,6 +348,11 @@ $.extend( KeyTable.prototype, {
|
|
332
348
|
var dt = this.s.dt;
|
333
349
|
var editor = this.c.editor;
|
334
350
|
|
351
|
+
// Don't activate inline editing when the shift key is pressed
|
352
|
+
if ( key === 16 ) {
|
353
|
+
return;
|
354
|
+
}
|
355
|
+
|
335
356
|
orig.stopPropagation();
|
336
357
|
|
337
358
|
// Return key should do nothing - for textareas's it would empty the
|
@@ -340,16 +361,13 @@ $.extend( KeyTable.prototype, {
|
|
340
361
|
orig.preventDefault();
|
341
362
|
}
|
342
363
|
|
343
|
-
editor.inline( this.s.lastFocus.index() );
|
364
|
+
editor.inline( this.s.lastFocus.cell.index() );
|
344
365
|
|
345
366
|
// Excel style - select all text
|
346
|
-
|
347
|
-
if ( input.length ) {
|
348
|
-
input[0].select();
|
349
|
-
}
|
367
|
+
$('div.DTE input, div.DTE textarea').select();
|
350
368
|
|
351
369
|
// Reduce the keys the Keys listens for
|
352
|
-
dt.keys.enable(
|
370
|
+
dt.keys.enable( this.c.editorKeys );
|
353
371
|
|
354
372
|
// On blur of the navigation submit
|
355
373
|
dt.one( 'key-blur.editor', function () {
|
@@ -386,19 +404,21 @@ $.extend( KeyTable.prototype, {
|
|
386
404
|
*
|
387
405
|
* @param {DataTables.Api|integer} row Can be given as an API instance that
|
388
406
|
* contains the cell to focus or as an integer. As the latter it is the
|
389
|
-
* visible row index - NOT the data index
|
407
|
+
* visible row index (from the whole data set) - NOT the data index
|
390
408
|
* @param {integer} [column] Not required if a cell is given as the first
|
391
409
|
* parameter. Otherwise this is the column data index for the cell to
|
392
410
|
* focus on
|
393
411
|
* @param {boolean} [shift=true] Should the viewport be moved to show cell
|
394
412
|
* @private
|
395
413
|
*/
|
396
|
-
_focus: function ( row, column, shift )
|
414
|
+
_focus: function ( row, column, shift, originalEvent )
|
397
415
|
{
|
398
416
|
var that = this;
|
399
417
|
var dt = this.s.dt;
|
400
418
|
var pageInfo = dt.page.info();
|
401
419
|
var lastFocus = this.s.lastFocus;
|
420
|
+
if( ! originalEvent)
|
421
|
+
originalEvent = null;
|
402
422
|
|
403
423
|
if ( ! this.s.enable ) {
|
404
424
|
return;
|
@@ -425,10 +445,12 @@ $.extend( KeyTable.prototype, {
|
|
425
445
|
// page
|
426
446
|
if ( pageInfo.length !== -1 && (row < pageInfo.start || row >= pageInfo.start+pageInfo.length) ) {
|
427
447
|
this.s.focusDraw = true;
|
448
|
+
this.s.waitingForDraw = true;
|
428
449
|
|
429
450
|
dt
|
430
451
|
.one( 'draw', function () {
|
431
452
|
that.s.focusDraw = false;
|
453
|
+
that.s.waitingForDraw = false;
|
432
454
|
that._focus( row, column );
|
433
455
|
} )
|
434
456
|
.page( Math.floor( row / pageInfo.length ) )
|
@@ -452,7 +474,7 @@ $.extend( KeyTable.prototype, {
|
|
452
474
|
|
453
475
|
if ( lastFocus ) {
|
454
476
|
// Don't trigger a refocus on the same cell
|
455
|
-
if ( lastFocus.node
|
477
|
+
if ( lastFocus.node === cell.node() ) {
|
456
478
|
return;
|
457
479
|
}
|
458
480
|
|
@@ -463,6 +485,8 @@ $.extend( KeyTable.prototype, {
|
|
463
485
|
var node = $( cell.node() );
|
464
486
|
node.addClass( this.c.className );
|
465
487
|
|
488
|
+
this._updateFixedColumns(column);
|
489
|
+
|
466
490
|
// Shift viewpoint and page to make cell visible
|
467
491
|
if ( shift === undefined || shift === true ) {
|
468
492
|
this._scroll( $(window), $(document.body), node, 'offset' );
|
@@ -476,9 +500,16 @@ $.extend( KeyTable.prototype, {
|
|
476
500
|
}
|
477
501
|
|
478
502
|
// Event and finish
|
479
|
-
this.s.lastFocus =
|
503
|
+
this.s.lastFocus = {
|
504
|
+
cell: cell,
|
505
|
+
node: cell.node(),
|
506
|
+
relative: {
|
507
|
+
row: dt.rows( { page: 'current' } ).indexes().indexOf( cell.index().row ),
|
508
|
+
column: cell.index().column
|
509
|
+
}
|
510
|
+
};
|
480
511
|
|
481
|
-
this._emitEvent( 'key-focus', [ this.s.dt, cell ] );
|
512
|
+
this._emitEvent( 'key-focus', [ this.s.dt, cell, originalEvent || null ] );
|
482
513
|
dt.state.save();
|
483
514
|
},
|
484
515
|
|
@@ -491,7 +522,16 @@ $.extend( KeyTable.prototype, {
|
|
491
522
|
*/
|
492
523
|
_key: function ( e )
|
493
524
|
{
|
494
|
-
|
525
|
+
// If we are waiting for a draw to happen from another key event, then
|
526
|
+
// do nothing for this new key press.
|
527
|
+
if ( this.s.waitingForDraw ) {
|
528
|
+
e.preventDefault();
|
529
|
+
return;
|
530
|
+
}
|
531
|
+
|
532
|
+
var enable = this.s.enable;
|
533
|
+
var navEnable = enable === true || enable === 'navigation-only';
|
534
|
+
if ( ! enable ) {
|
495
535
|
return;
|
496
536
|
}
|
497
537
|
|
@@ -500,8 +540,8 @@ $.extend( KeyTable.prototype, {
|
|
500
540
|
}
|
501
541
|
|
502
542
|
// If not focused, then there is no key action to take
|
503
|
-
var
|
504
|
-
if ( !
|
543
|
+
var lastFocus = this.s.lastFocus;
|
544
|
+
if ( ! lastFocus ) {
|
505
545
|
return;
|
506
546
|
}
|
507
547
|
|
@@ -515,63 +555,68 @@ $.extend( KeyTable.prototype, {
|
|
515
555
|
|
516
556
|
switch( e.keyCode ) {
|
517
557
|
case 9: // tab
|
558
|
+
// `enable` can be tab-only
|
518
559
|
this._shift( e, e.shiftKey ? 'left' : 'right', true );
|
519
560
|
break;
|
520
561
|
|
521
562
|
case 27: // esc
|
522
|
-
if ( this.s.blurable &&
|
563
|
+
if ( this.s.blurable && enable === true ) {
|
523
564
|
this._blur();
|
524
565
|
}
|
525
566
|
break;
|
526
567
|
|
527
568
|
case 33: // page up (previous page)
|
528
569
|
case 34: // page down (next page)
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
that._focus( dt.cell( index < nodes.length ?
|
537
|
-
nodes[ index ] :
|
538
|
-
nodes[ nodes.length-1 ]
|
539
|
-
) );
|
540
|
-
} )
|
541
|
-
.page( e.keyCode === 33 ? 'previous' : 'next' )
|
542
|
-
.draw( false );
|
570
|
+
if ( navEnable ) {
|
571
|
+
e.preventDefault();
|
572
|
+
|
573
|
+
dt
|
574
|
+
.page( e.keyCode === 33 ? 'previous' : 'next' )
|
575
|
+
.draw( false );
|
576
|
+
}
|
543
577
|
break;
|
544
578
|
|
545
579
|
case 35: // end (end of current page)
|
546
580
|
case 36: // home (start of current page)
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
581
|
+
if ( navEnable ) {
|
582
|
+
e.preventDefault();
|
583
|
+
var indexes = dt.cells( {page: 'current'} ).indexes();
|
584
|
+
var colIndexes = this._columns();
|
585
|
+
|
586
|
+
this._focus( dt.cell(
|
587
|
+
indexes[ e.keyCode === 35 ? indexes.length-1 : colIndexes[0] ]
|
588
|
+
), null, true, e );
|
589
|
+
}
|
553
590
|
break;
|
554
591
|
|
555
592
|
case 37: // left arrow
|
556
|
-
|
593
|
+
if ( navEnable ) {
|
594
|
+
this._shift( e, 'left' );
|
595
|
+
}
|
557
596
|
break;
|
558
597
|
|
559
598
|
case 38: // up arrow
|
560
|
-
|
599
|
+
if ( navEnable ) {
|
600
|
+
this._shift( e, 'up' );
|
601
|
+
}
|
561
602
|
break;
|
562
603
|
|
563
604
|
case 39: // right arrow
|
564
|
-
|
605
|
+
if ( navEnable ) {
|
606
|
+
this._shift( e, 'right' );
|
607
|
+
}
|
565
608
|
break;
|
566
609
|
|
567
610
|
case 40: // down arrow
|
568
|
-
|
611
|
+
if ( navEnable ) {
|
612
|
+
this._shift( e, 'down' );
|
613
|
+
}
|
569
614
|
break;
|
570
615
|
|
571
616
|
default:
|
572
617
|
// Everything else - pass through only when fully enabled
|
573
|
-
if (
|
574
|
-
this._emitEvent( 'key', [ dt, e.keyCode, this.s.lastFocus, e ] );
|
618
|
+
if ( enable === true ) {
|
619
|
+
this._emitEvent( 'key', [ dt, e.keyCode, this.s.lastFocus.cell, e ] );
|
575
620
|
}
|
576
621
|
break;
|
577
622
|
}
|
@@ -639,7 +684,7 @@ $.extend( KeyTable.prototype, {
|
|
639
684
|
var dt = this.s.dt;
|
640
685
|
var pageInfo = dt.page.info();
|
641
686
|
var rows = pageInfo.recordsDisplay;
|
642
|
-
var currentCell = this.s.lastFocus;
|
687
|
+
var currentCell = this.s.lastFocus.cell;
|
643
688
|
var columns = this._columns();
|
644
689
|
|
645
690
|
if ( ! currentCell ) {
|
@@ -696,7 +741,7 @@ $.extend( KeyTable.prototype, {
|
|
696
741
|
) {
|
697
742
|
e.preventDefault();
|
698
743
|
|
699
|
-
this._focus( row, column );
|
744
|
+
this._focus( row, column, true, e );
|
700
745
|
}
|
701
746
|
else if ( ! keyBlurable || ! this.c.blurable ) {
|
702
747
|
// No new focus, but if the table isn't blurable, then don't loose
|
@@ -736,10 +781,27 @@ $.extend( KeyTable.prototype, {
|
|
736
781
|
} )
|
737
782
|
.insertBefore( dt.table().node() );
|
738
783
|
|
739
|
-
div.children().on( 'focus', function () {
|
740
|
-
that._focus( dt.cell(':eq(0)', '0:visible', {page: 'current'}) );
|
784
|
+
div.children().on( 'focus', function (e) {
|
785
|
+
that._focus( dt.cell(':eq(0)', '0:visible', {page: 'current'}), null, true, e );
|
741
786
|
} );
|
742
|
-
}
|
787
|
+
},
|
788
|
+
/**
|
789
|
+
* Update fixed columns if they are enabled and if the cell we are focusing is inside a fixed column
|
790
|
+
* @param {integer} column Index of the column being changed
|
791
|
+
*
|
792
|
+
* @private
|
793
|
+
*/
|
794
|
+
_updateFixedColumns:function(column){
|
795
|
+
var dt = this.s.dt;
|
796
|
+
var settings = dt.settings()[0];
|
797
|
+
|
798
|
+
if(settings._oFixedColumns){
|
799
|
+
var leftCols = settings._oFixedColumns.s.iLeftColumns;
|
800
|
+
var rightCols = settings.aoColumns.length - settings._oFixedColumns.s.iRightColumns;
|
801
|
+
if (column < leftCols || column > rightCols)
|
802
|
+
dt.fixedColumns().update();
|
803
|
+
}
|
804
|
+
}
|
743
805
|
} );
|
744
806
|
|
745
807
|
|
@@ -776,6 +838,13 @@ KeyTable.defaults = {
|
|
776
838
|
*/
|
777
839
|
editor: null,
|
778
840
|
|
841
|
+
/**
|
842
|
+
* Option that defines what KeyTable's behaviour will be when used with
|
843
|
+
* Editor's inline editing. Can be `navigation-only` or `tab-only`.
|
844
|
+
* @type {String}
|
845
|
+
*/
|
846
|
+
editorKeys: 'navigation-only',
|
847
|
+
|
779
848
|
/**
|
780
849
|
* Select a cell to automatically select on start up. `null` for no
|
781
850
|
* automatic selection
|
@@ -798,7 +867,7 @@ KeyTable.defaults = {
|
|
798
867
|
|
799
868
|
|
800
869
|
|
801
|
-
KeyTable.version = "2.
|
870
|
+
KeyTable.version = "2.2.0";
|
802
871
|
|
803
872
|
|
804
873
|
$.fn.dataTable.KeyTable = KeyTable;
|
@@ -870,7 +939,7 @@ $(document).on( 'preInit.dt.dtk', function (e, settings, json) {
|
|
870
939
|
var defaults = DataTable.defaults.keys;
|
871
940
|
|
872
941
|
if ( init || defaults ) {
|
873
|
-
var opts = $.extend( {},
|
942
|
+
var opts = $.extend( {}, defaults, init );
|
874
943
|
|
875
944
|
if ( init !== false ) {
|
876
945
|
new KeyTable( settings, opts );
|