123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883 |
- (function( factory ){
- if ( typeof define === 'function' && define.amd ) {
-
- define( ['jquery', 'datatables.net'], function ( $ ) {
- return factory( $, window, document );
- } );
- }
- else if ( typeof exports === 'object' ) {
-
- module.exports = function (root, $) {
- if ( ! root ) {
- root = window;
- }
- if ( ! $ || ! $.fn.dataTable ) {
- $ = require('datatables.net')(root, $).$;
- }
- return factory( $, root, root.document );
- };
- }
- else {
-
- factory( jQuery, window, document );
- }
- }(function( $, window, document, undefined ) {
- 'use strict';
- var DataTable = $.fn.dataTable;
- var KeyTable = function ( dt, opts ) {
-
- if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.8' ) ) {
- throw 'KeyTable requires DataTables 1.10.8 or newer';
- }
-
- this.c = $.extend( true, {},
- DataTable.defaults.keyTable,
- KeyTable.defaults,
- opts
- );
-
- this.s = {
-
- dt: new DataTable.Api( dt ),
- enable: true,
-
- focusDraw: false
- };
-
- this.dom = {
- };
-
- var settings = this.s.dt.settings()[0];
- var exisiting = settings.keytable;
- if ( exisiting ) {
- return exisiting;
- }
- settings.keytable = this;
- this._constructor();
- };
- $.extend( KeyTable.prototype, {
-
-
-
- blur: function ()
- {
- this._blur();
- },
-
- enable: function ( state )
- {
- this.s.enable = state;
- },
-
- focus: function ( row, column )
- {
- this._focus( this.s.dt.cell( row, column ) );
- },
-
- focused: function ( cell )
- {
- var lastFocus = this.s.lastFocus;
- if ( ! lastFocus ) {
- return false;
- }
- var lastIdx = this.s.lastFocus.index();
- return cell.row === lastIdx.row && cell.column === lastIdx.column;
- },
-
-
- _constructor: function ()
- {
- this._tabInput();
- var that = this;
- var dt = this.s.dt;
- var table = $( dt.table().node() );
-
- if ( table.css('position') === 'static' ) {
- table.css( 'position', 'relative' );
- }
-
- $( dt.table().body() ).on( 'click.keyTable', 'th, td', function () {
- if ( that.s.enable === false ) {
- return;
- }
- var cell = dt.cell( this );
- if ( ! cell.any() ) {
- return;
- }
- that._focus( cell, null, false );
- } );
-
- $( document ).on( 'keydown.keyTable', function (e) {
- that._key( e );
- } );
-
- if ( this.c.blurable ) {
- $( document ).on( 'click.keyTable', function ( e ) {
-
- if ( $(e.target).parents( '.dataTables_filter' ).length ) {
- that._blur();
- }
-
- if ( $(e.target).parents().filter( dt.table().container() ).length ) {
- return;
- }
-
- if ( $(e.target).parents('div.DTE').length ) {
- return;
- }
- that._blur();
- } );
- }
- if ( this.c.editor ) {
- dt.on( 'key.keyTable', function ( e, dt, key, cell, orig ) {
- that._editor( key, orig );
- } );
- }
-
- if ( dt.settings()[0].oFeatures.bStateSave ) {
- dt.on( 'stateSaveParams.keyTable', function (e, s, d) {
- d.keyTable = that.s.lastFocus ?
- that.s.lastFocus.index() :
- null;
- } );
- }
-
-
-
- dt.on( 'xhr.keyTable', function ( e ) {
- if ( that.s.focusDraw ) {
-
-
- return;
- }
- var lastFocus = that.s.lastFocus;
- if ( lastFocus ) {
- that.s.lastFocus = null;
- dt.one( 'draw', function () {
- that._focus( lastFocus );
- } );
- }
- } );
- dt.on( 'destroy.keyTable', function () {
- dt.off( '.keyTable' );
- $( dt.table().body() ).off( 'click.keyTable', 'th, td' );
- $( document.body )
- .off( 'keydown.keyTable' )
- .off( 'click.keyTable' );
- } );
-
- var state = dt.state.loaded();
- if ( state && state.keyTable ) {
-
- dt.one( 'init', function () {
- var cell = dt.cell( state.keyTable );
-
- if ( cell.any() ) {
- cell.focus();
- }
- } );
- }
- else if ( this.c.focus ) {
- dt.cell( this.c.focus ).focus();
- }
- },
-
-
- _blur: function ()
- {
- if ( ! this.s.enable || ! this.s.lastFocus ) {
- return;
- }
- var cell = this.s.lastFocus;
- $( cell.node() ).removeClass( this.c.className );
- this.s.lastFocus = null;
- this._emitEvent( 'key-blur', [ this.s.dt, cell ] );
- },
-
- _columns: function ()
- {
- var dt = this.s.dt;
- var user = dt.columns( this.c.columns ).indexes();
- var out = [];
- dt.columns( ':visible' ).every( function (i) {
- if ( user.indexOf( i ) !== -1 ) {
- out.push( i );
- }
- } );
- return out;
- },
-
- _editor: function ( key, orig )
- {
- var dt = this.s.dt;
- var editor = this.c.editor;
- orig.stopPropagation();
-
-
- if ( key === 13 ) {
- orig.preventDefault();
- }
- editor.inline( this.s.lastFocus.index() );
-
- var input = $('div.DTE input, div.DTE textarea');
- if ( input.length ) {
- input[0].select();
- }
-
- dt.keys.enable( 'navigation-only' );
-
- dt.one( 'key-blur.editor', function () {
- if ( editor.displayed() ) {
- editor.submit();
- }
- } );
-
- editor.one( 'close', function () {
- dt.keys.enable( true );
- dt.off( 'key-blur.editor' );
- } );
- },
-
- _emitEvent: function ( name, args )
- {
- this.s.dt.iterator( 'table', function ( ctx, i ) {
- $(ctx.nTable).triggerHandler( name, args );
- } );
- },
-
- _focus: function ( row, column, shift )
- {
- var that = this;
- var dt = this.s.dt;
- var pageInfo = dt.page.info();
- var lastFocus = this.s.lastFocus;
- if ( ! this.s.enable ) {
- return;
- }
- if ( typeof row !== 'number' ) {
-
- var index = row.index();
- column = index.column;
- row = dt
- .rows( { filter: 'applied', order: 'applied' } )
- .indexes()
- .indexOf( index.row );
-
-
-
- if ( pageInfo.serverSide ) {
- row += pageInfo.start;
- }
- }
-
-
- if ( pageInfo.length !== -1 && (row < pageInfo.start || row >= pageInfo.start+pageInfo.length) ) {
- this.s.focusDraw = true;
- dt
- .one( 'draw', function () {
- that.s.focusDraw = false;
- that._focus( row, column );
- } )
- .page( Math.floor( row / pageInfo.length ) )
- .draw( false );
- return;
- }
-
- if ( $.inArray( column, this._columns() ) === -1 ) {
- return;
- }
-
-
- if ( pageInfo.serverSide ) {
- row -= pageInfo.start;
- }
- var cell = dt.cell( ':eq('+row+')', column, {search: 'applied'} );
- if ( lastFocus ) {
-
- if ( lastFocus.node() === cell.node() ) {
- return;
- }
-
- this._blur();
- }
- var node = $( cell.node() );
- node.addClass( this.c.className );
-
- if ( shift === undefined || shift === true ) {
- this._scroll( $(window), $(document.body), node, 'offset' );
- var bodyParent = dt.table().body().parentNode;
- if ( bodyParent !== dt.table().header().parentNode ) {
- var parent = $(bodyParent.parentNode);
- this._scroll( parent, parent, node, 'position' );
- }
- }
-
- this.s.lastFocus = cell;
- this._emitEvent( 'key-focus', [ this.s.dt, cell ] );
- dt.state.save();
- },
-
- _key: function ( e )
- {
- if ( ! this.s.enable ) {
- return;
- }
- if ( e.keyCode === 0 || e.ctrlKey || e.metaKey || e.altKey ) {
- return;
- }
-
- var cell = this.s.lastFocus;
- if ( ! cell ) {
- return;
- }
- var that = this;
- var dt = this.s.dt;
-
- if ( this.c.keys && $.inArray( e.keyCode, this.c.keys ) === -1 ) {
- return;
- }
- switch( e.keyCode ) {
- case 9:
- this._shift( e, e.shiftKey ? 'left' : 'right', true );
- break;
- case 27:
- if ( this.s.blurable && this.s.enable === true ) {
- this._blur();
- }
- break;
- case 33:
- case 34:
- e.preventDefault();
- var index = dt.cells( {page: 'current'} ).nodes().indexOf( cell.node() );
- dt
- .one( 'draw', function () {
- var nodes = dt.cells( {page: 'current'} ).nodes();
- that._focus( dt.cell( index < nodes.length ?
- nodes[ index ] :
- nodes[ nodes.length-1 ]
- ) );
- } )
- .page( e.keyCode === 33 ? 'previous' : 'next' )
- .draw( false );
- break;
- case 35:
- case 36:
- e.preventDefault();
- var indexes = dt.cells( {page: 'current'} ).indexes();
- this._focus( dt.cell(
- indexes[ e.keyCode === 35 ? indexes.length-1 : 0 ]
- ) );
- break;
- case 37:
- this._shift( e, 'left' );
- break;
- case 38:
- this._shift( e, 'up' );
- break;
- case 39:
- this._shift( e, 'right' );
- break;
- case 40:
- this._shift( e, 'down' );
- break;
- default:
-
- if ( this.s.enable === true ) {
- this._emitEvent( 'key', [ dt, e.keyCode, this.s.lastFocus, e ] );
- }
- break;
- }
- },
-
- _scroll: function ( container, scroller, cell, posOff )
- {
- var offset = cell[posOff]();
- var height = cell.outerHeight();
- var width = cell.outerWidth();
- var scrollTop = scroller.scrollTop();
- var scrollLeft = scroller.scrollLeft();
- var containerHeight = container.height();
- var containerWidth = container.width();
-
- if ( offset.top < scrollTop ) {
- scroller.scrollTop( offset.top );
- }
-
- if ( offset.left < scrollLeft ) {
- scroller.scrollLeft( offset.left );
- }
-
- if ( offset.top + height > scrollTop + containerHeight && height < containerHeight ) {
- scroller.scrollTop( offset.top + height - containerHeight );
- }
-
- if ( offset.left + width > scrollLeft + containerWidth && width < containerWidth ) {
- scroller.scrollLeft( offset.left + width - containerWidth );
- }
- },
-
- _shift: function ( e, direction, keyBlurable )
- {
- var that = this;
- var dt = this.s.dt;
- var pageInfo = dt.page.info();
- var rows = pageInfo.recordsDisplay;
- var currentCell = this.s.lastFocus;
- var columns = this._columns();
- if ( ! currentCell ) {
- return;
- }
- var currRow = dt
- .rows( { filter: 'applied', order: 'applied' } )
- .indexes()
- .indexOf( currentCell.index().row );
-
-
-
- if ( pageInfo.serverSide ) {
- currRow += pageInfo.start;
- }
- var currCol = dt
- .columns( columns )
- .indexes()
- .indexOf( currentCell.index().column );
- var
- row = currRow,
- column = columns[ currCol ];
- if ( direction === 'right' ) {
- if ( currCol >= columns.length - 1 ) {
- row++;
- column = columns[0];
- }
- else {
- column = columns[ currCol+1 ];
- }
- }
- else if ( direction === 'left' ) {
- if ( currCol === 0 ) {
- row--;
- column = columns[ columns.length - 1 ];
- }
- else {
- column = columns[ currCol-1 ];
- }
- }
- else if ( direction === 'up' ) {
- row--;
- }
- else if ( direction === 'down' ) {
- row++;
- }
- if ( row >= 0 && row < rows && $.inArray( column, columns ) !== -1
- ) {
- e.preventDefault();
- this._focus( row, column );
- }
- else if ( ! keyBlurable || ! this.c.blurable ) {
-
-
- e.preventDefault();
- }
- else {
- this._blur();
- }
- },
-
- _tabInput: function ()
- {
- var that = this;
- var dt = this.s.dt;
- var tabIndex = this.c.tabIndex !== null ?
- this.c.tabIndex :
- dt.settings()[0].iTabIndex;
- if ( tabIndex == -1 ) {
- return;
- }
- var div = $('<div><input type="text" tabindex="'+tabIndex+'"/></div>')
- .css( {
- position: 'absolute',
- height: 1,
- width: 0,
- overflow: 'hidden'
- } )
- .insertBefore( dt.table().node() );
- div.children().on( 'focus', function () {
- that._focus( dt.cell(':eq(0)', '0:visible', {page: 'current'}) );
- } );
- }
- } );
- KeyTable.defaults = {
-
- blurable: true,
-
- className: 'focus',
-
- columns: '',
-
- editor: null,
-
- focus: null,
-
- keys: null,
-
- tabIndex: null
- };
- KeyTable.version = "2.1.2";
- $.fn.dataTable.KeyTable = KeyTable;
- $.fn.DataTable.KeyTable = KeyTable;
- DataTable.Api.register( 'cell.blur()', function () {
- return this.iterator( 'table', function (ctx) {
- if ( ctx.keytable ) {
- ctx.keytable.blur();
- }
- } );
- } );
- DataTable.Api.register( 'cell().focus()', function () {
- return this.iterator( 'cell', function (ctx, row, column) {
- if ( ctx.keytable ) {
- ctx.keytable.focus( row, column );
- }
- } );
- } );
- DataTable.Api.register( 'keys.disable()', function () {
- return this.iterator( 'table', function (ctx) {
- if ( ctx.keytable ) {
- ctx.keytable.enable( false );
- }
- } );
- } );
- DataTable.Api.register( 'keys.enable()', function ( opts ) {
- return this.iterator( 'table', function (ctx) {
- if ( ctx.keytable ) {
- ctx.keytable.enable( opts === undefined ? true : opts );
- }
- } );
- } );
- DataTable.ext.selector.cell.push( function ( settings, opts, cells ) {
- var focused = opts.focused;
- var kt = settings.keytable;
- var out = [];
- if ( ! kt || focused === undefined ) {
- return cells;
- }
- for ( var i=0, ien=cells.length ; i<ien ; i++ ) {
- if ( (focused === true && kt.focused( cells[i] ) ) ||
- (focused === false && ! kt.focused( cells[i] ) )
- ) {
- out.push( cells[i] );
- }
- }
- return out;
- } );
- $(document).on( 'preInit.dt.dtk', function (e, settings, json) {
- if ( e.namespace !== 'dt' ) {
- return;
- }
- var init = settings.oInit.keys;
- var defaults = DataTable.defaults.keys;
- if ( init || defaults ) {
- var opts = $.extend( {}, init, defaults );
- if ( init !== false ) {
- new KeyTable( settings, opts );
- }
- }
- } );
- return KeyTable;
- }));
|