dataTables.bootstrap.js (4559B)
1 /*! DataTables Bootstrap 3 integration 2 * ©2011-2015 SpryMedia Ltd - datatables.net/license 3 */ 4 5 /** 6 * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and 7 * DataTables 1.10 or newer. 8 * 9 * This file sets the defaults and adds options to DataTables to style its 10 * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap 11 * for further information. 12 */ 13 (function( factory ){ 14 if ( typeof define === 'function' && define.amd ) { 15 // AMD 16 define( ['jquery', 'datatables.net'], function ( $ ) { 17 return factory( $, window, document ); 18 } ); 19 } 20 else if ( typeof exports === 'object' ) { 21 // CommonJS 22 module.exports = function (root, $) { 23 if ( ! root ) { 24 root = window; 25 } 26 27 if ( ! $ || ! $.fn.dataTable ) { 28 // Require DataTables, which attaches to jQuery, including 29 // jQuery if needed and have a $ property so we can access the 30 // jQuery object that is used 31 $ = require('datatables.net')(root, $).$; 32 } 33 34 return factory( $, root, root.document ); 35 }; 36 } 37 else { 38 // Browser 39 factory( jQuery, window, document ); 40 } 41 }(function( $, window, document, undefined ) { 42 'use strict'; 43 var DataTable = $.fn.dataTable; 44 45 46 /* Set the defaults for DataTables initialisation */ 47 $.extend( true, DataTable.defaults, { 48 dom: 49 "<'row'<'col-sm-6'l><'col-sm-6'f>>" + 50 "<'row'<'col-sm-12'tr>>" + 51 "<'row'<'col-sm-5'i><'col-sm-7'p>>", 52 renderer: 'bootstrap' 53 } ); 54 55 56 /* Default class modification */ 57 $.extend( DataTable.ext.classes, { 58 sWrapper: "dataTables_wrapper form-inline dt-bootstrap", 59 sFilterInput: "form-control input-sm", 60 sLengthSelect: "form-control input-sm", 61 sProcessing: "dataTables_processing panel panel-default" 62 } ); 63 64 65 /* Bootstrap paging button renderer */ 66 DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) { 67 var api = new DataTable.Api( settings ); 68 var classes = settings.oClasses; 69 var lang = settings.oLanguage.oPaginate; 70 var aria = settings.oLanguage.oAria.paginate || {}; 71 var btnDisplay, btnClass, counter=0; 72 73 var attach = function( container, buttons ) { 74 var i, ien, node, button; 75 var clickHandler = function ( e ) { 76 e.preventDefault(); 77 if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) { 78 api.page( e.data.action ).draw( 'page' ); 79 } 80 }; 81 82 for ( i=0, ien=buttons.length ; i<ien ; i++ ) { 83 button = buttons[i]; 84 85 if ( $.isArray( button ) ) { 86 attach( container, button ); 87 } 88 else { 89 btnDisplay = ''; 90 btnClass = ''; 91 92 switch ( button ) { 93 case 'ellipsis': 94 btnDisplay = '…'; 95 btnClass = 'disabled'; 96 break; 97 98 case 'first': 99 btnDisplay = lang.sFirst; 100 btnClass = button + (page > 0 ? 101 '' : ' disabled'); 102 break; 103 104 case 'previous': 105 btnDisplay = lang.sPrevious; 106 btnClass = button + (page > 0 ? 107 '' : ' disabled'); 108 break; 109 110 case 'next': 111 btnDisplay = lang.sNext; 112 btnClass = button + (page < pages-1 ? 113 '' : ' disabled'); 114 break; 115 116 case 'last': 117 btnDisplay = lang.sLast; 118 btnClass = button + (page < pages-1 ? 119 '' : ' disabled'); 120 break; 121 122 default: 123 btnDisplay = button + 1; 124 btnClass = page === button ? 125 'active' : ''; 126 break; 127 } 128 129 if ( btnDisplay ) { 130 node = $('<li>', { 131 'class': classes.sPageButton+' '+btnClass, 132 'id': idx === 0 && typeof button === 'string' ? 133 settings.sTableId +'_'+ button : 134 null 135 } ) 136 .append( $('<a>', { 137 'href': '#', 138 'aria-controls': settings.sTableId, 139 'aria-label': aria[ button ], 140 'data-dt-idx': counter, 141 'tabindex': settings.iTabIndex 142 } ) 143 .html( btnDisplay ) 144 ) 145 .appendTo( container ); 146 147 settings.oApi._fnBindAction( 148 node, {action: button}, clickHandler 149 ); 150 151 counter++; 152 } 153 } 154 } 155 }; 156 157 // IE9 throws an 'unknown error' if document.activeElement is used 158 // inside an iframe or frame. 159 var activeEl; 160 161 try { 162 // Because this approach is destroying and recreating the paging 163 // elements, focus is lost on the select button which is bad for 164 // accessibility. So we want to restore focus once the draw has 165 // completed 166 activeEl = $(host).find(document.activeElement).data('dt-idx'); 167 } 168 catch (e) {} 169 170 attach( 171 $(host).empty().html('<ul class="pagination"/>').children('ul'), 172 buttons 173 ); 174 175 if ( activeEl !== undefined ) { 176 $(host).find( '[data-dt-idx='+activeEl+']' ).focus(); 177 } 178 }; 179 180 181 return DataTable; 182 }));