Add API methods from DataTables plug-ins page (dropping the ones which are now provided for by the built in methods (mainly $ and _). Some examples still needed and possibly summaries
parent
6ea7a6ce12
commit
fa79071454
@ -0,0 +1,54 @@
|
||||
/**
|
||||
* Add a new row to the table and display it on the screen by jumping the
|
||||
* pagination to the required location. This function also returns an object
|
||||
* with the added TR element and it's index in aoData such that you could
|
||||
* provide an effect (fade for example) to show which row has been added.
|
||||
* This function is a drop in replacement for fnAddData with one important
|
||||
* exception, it will only take a 1D array or an object, and not a 2D array
|
||||
* (i.e. it will not add multiple rows like fnAddData).
|
||||
* @name fnAddDataAndDisplay
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* var oTable = $('#example').dataTable();
|
||||
* oTable.fnAddDataAndDisplay( [ 1, 2, 3, 4, 5, ... ] );
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnAddDataAndDisplay = function ( oSettings, aData )
|
||||
{
|
||||
/* Add the data */
|
||||
var iAdded = this.oApi._fnAddData( oSettings, aData );
|
||||
var nAdded = oSettings.aoData[ iAdded ].nTr;
|
||||
|
||||
/* Need to re-filter and re-sort the table to get positioning correct, not perfect
|
||||
* as this will actually redraw the table on screen, but the update should be so fast (and
|
||||
* possibly not alter what is already on display) that the user will not notice
|
||||
*/
|
||||
this.oApi._fnReDraw( oSettings );
|
||||
|
||||
/* Find it's position in the table */
|
||||
var iPos = -1;
|
||||
for( var i=0, iLen=oSettings.aiDisplay.length ; i<iLen ; i++ )
|
||||
{
|
||||
if( oSettings.aoData[ oSettings.aiDisplay[i] ].nTr == nAdded )
|
||||
{
|
||||
iPos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get starting point, taking account of paging */
|
||||
if( iPos >= 0 )
|
||||
{
|
||||
oSettings._iDisplayStart = ( Math.floor(i / oSettings._iDisplayLength) ) * oSettings._iDisplayLength;
|
||||
this.oApi._fnCalculateEnd( oSettings );
|
||||
}
|
||||
|
||||
this.oApi._fnDraw( oSettings );
|
||||
return {
|
||||
"nTr": nAdded,
|
||||
"iPos": iAdded
|
||||
};
|
||||
};
|
@ -0,0 +1,41 @@
|
||||
/**
|
||||
* Take a TR element and add it to a DataTables table. Useful for maintaining
|
||||
* custom classes and other attributes.
|
||||
* @name fnAddTr
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
*
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnAddTr = function ( oSettings, nTr, bRedraw ) {
|
||||
if ( typeof bRedraw == 'undefined' )
|
||||
{
|
||||
bRedraw = true;
|
||||
}
|
||||
|
||||
var nTds = nTr.getElementsByTagName('td');
|
||||
if ( nTds.length != oSettings.aoColumns.length )
|
||||
{
|
||||
alert( 'Warning: not adding new TR - columns and TD elements must match' );
|
||||
return;
|
||||
}
|
||||
|
||||
var aData = [];
|
||||
for ( var i=0 ; i<nTds.length ; i++ )
|
||||
{
|
||||
aData.push( nTds[i].innerHTML );
|
||||
}
|
||||
|
||||
/* Add the data and then replace DataTable's generated TR with ours */
|
||||
var iIndex = this.oApi._fnAddData( oSettings, aData );
|
||||
nTr._DT_RowIndex = iIndex;
|
||||
oSettings.aoData[ iIndex ].nTr = nTr;
|
||||
|
||||
oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
|
||||
|
||||
if ( bRedraw )
|
||||
{
|
||||
this.oApi._fnReDraw( oSettings );
|
||||
}
|
||||
};
|
@ -0,0 +1,17 @@
|
||||
/**
|
||||
* When DataTables removes columns from the display (bVisible or
|
||||
* fnSetColumnVis) it removes these elements from the DOM, effecting the
|
||||
* index value for the column positions. This function converts the data
|
||||
* column index (i.e. all columns regardless of visibility) into a visible
|
||||
* column index.
|
||||
* @name fnColumnIndexToVisible
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
*
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnColumnIndexToVisible = function ( oSettings, iMatch )
|
||||
{
|
||||
return oSettings.oApi._fnColumnIndexToVisible( oSettings, iMatch );
|
||||
};
|
@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Update the internal data for a TR element based on what is used in the
|
||||
* DOM. You will likely want to call fnDraw() after this function.
|
||||
* @name fnColumnIndexToVisible
|
||||
* @author Lior Gerson
|
||||
*
|
||||
* @example
|
||||
*
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnDataUpdate = function ( oSettings, nRowObject, iRowIndex )
|
||||
{
|
||||
$(nRowObject).find("TD").each( function(i) {
|
||||
var iColIndex = oSettings.oApi._fnVisibleToColumnIndex( oSettings, i );
|
||||
oSettings.oApi._fnSetCellData( oSettings, iRowIndex, iColIndex, $(this).html() );
|
||||
} );
|
||||
};
|
@ -0,0 +1,41 @@
|
||||
/**
|
||||
* Take a TR element and alter the table's paging to show the TR in question.
|
||||
* @name fnDisplayRow
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* // Display the 21st row in the table
|
||||
* var oTable = $('#example').dataTable();
|
||||
* oTable.fnDisplayRow( oTable.fnGetNodes()[20] );
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnDisplayRow = function ( oSettings, nRow )
|
||||
{
|
||||
// Account for the "display" all case - row is already displayed
|
||||
if ( oSettings._iDisplayLength == -1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Find the node in the table
|
||||
var iPos = -1;
|
||||
for( var i=0, iLen=oSettings.aiDisplay.length ; i<iLen ; i++ )
|
||||
{
|
||||
if( oSettings.aoData[ oSettings.aiDisplay[i] ].nTr == nRow )
|
||||
{
|
||||
iPos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Alter the start point of the paging display
|
||||
if( iPos >= 0 )
|
||||
{
|
||||
oSettings._iDisplayStart = ( Math.floor(i / oSettings._iDisplayLength) ) * oSettings._iDisplayLength;
|
||||
this.oApi._fnCalculateEnd( oSettings );
|
||||
}
|
||||
|
||||
this.oApi._fnDraw( oSettings );
|
||||
};
|
@ -0,0 +1,25 @@
|
||||
/**
|
||||
* Set the point at which DataTables will start it's display of data in the
|
||||
* table.
|
||||
* @name fnDisplayStart
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
*
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnDisplayStart = function ( oSettings, iStart, bRedraw )
|
||||
{
|
||||
if ( typeof bRedraw == 'undefined' )
|
||||
{
|
||||
bRedraw = true;
|
||||
}
|
||||
|
||||
oSettings._iDisplayStart = iStart;
|
||||
oSettings.oApi._fnCalculateEnd( oSettings );
|
||||
|
||||
if ( bRedraw )
|
||||
{
|
||||
oSettings.oApi._fnDraw( oSettings );
|
||||
}
|
||||
};
|
@ -0,0 +1,60 @@
|
||||
/**
|
||||
* Creates rowspan cells in a column when there are two or more cells in a
|
||||
* row with the same content, effectively grouping them together visually.
|
||||
* <b>Note</b> - this plug-in currently only operates correctly with
|
||||
* <b>server-side processing</b>.
|
||||
* @name fnFakeRowspan
|
||||
* @author Fredrik Wendel
|
||||
*
|
||||
* @example
|
||||
* $('#example').dataTable().fnFakeRowspan(3);
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnFakeRowspan = function ( oSettings, iColumn, bCaseSensitive ) {
|
||||
/* Fail silently on missing/errorenous parameter data. */
|
||||
if (isNaN(iColumn)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (iColumn < 0 || iColumn > oSettings.aoColumns.length-1) {
|
||||
alert ('Invalid column number choosen, must be between 0 and ' + (oSettings.aoColumns.length-1));
|
||||
return false;
|
||||
}
|
||||
|
||||
var oSettings = oSettings,
|
||||
iColumn = iColumn,
|
||||
bCaseSensitive = (typeof(bCaseSensitive) != 'boolean' ? true : bCaseSensitive);
|
||||
|
||||
oSettings.aoDrawCallback.push({ "fn": fakeRowspan, "sName": "fnFakeRowspan" });
|
||||
|
||||
function fakeRowspan () {
|
||||
var firstOccurance = null,
|
||||
value = null,
|
||||
rowspan = 0;
|
||||
jQuery.each(oSettings.aoData, function (i, oData) {
|
||||
var val = oData._aData[iColumn],
|
||||
cell = oData.nTr.childNodes[iColumn];
|
||||
/* Use lowercase comparison if not case-sensitive. */
|
||||
if (!bCaseSensitive) {
|
||||
val = val.toLowerCase();
|
||||
}
|
||||
/* Reset values on new cell data. */
|
||||
if (val != value) {
|
||||
value = val;
|
||||
firstOccurance = cell;
|
||||
rowspan = 0;
|
||||
}
|
||||
|
||||
if (val == value) {
|
||||
rowspan++;
|
||||
}
|
||||
|
||||
if (firstOccurance !== null && val == value && rowspan > 1) {
|
||||
oData.nTr.removeChild(cell);
|
||||
firstOccurance.rowSpan = rowspan;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
@ -0,0 +1,34 @@
|
||||
/**
|
||||
* Apply the same filter to all DataTable instances on a particular page. The
|
||||
* function call exactly matches that used by fnFilter() so regular expression
|
||||
* and individual column sorting can be used.
|
||||
* @name fnFilterAll
|
||||
* @author <a href="http://www.kmmtiming.se/">Kristoffer Karlström</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* var oTable = $(".dataTable").dataTable();
|
||||
*
|
||||
* $("#search").keyup( function () {
|
||||
* // Filter on the column (the index) of this element
|
||||
* oTable.fnFilterAll(this.value);
|
||||
* } );
|
||||
* });
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnFilterAll = function(oSettings, sInput, iColumn, bRegex, bSmart) {
|
||||
if ( typeof bRegex == 'undefined' ) {
|
||||
bRegex = false;
|
||||
}
|
||||
|
||||
if ( typeof bSmart == 'undefined' ) {
|
||||
bSmart = true;
|
||||
}
|
||||
|
||||
for (var i in this.dataTableSettings) {
|
||||
jQuery.fn.dataTableExt.iApiIndex = i;
|
||||
this.fnFilter(sInput, iColumn, bRegex, bSmart);
|
||||
}
|
||||
|
||||
jQuery.fn.dataTableExt.iApiIndex = 0;
|
||||
};
|
@ -0,0 +1,45 @@
|
||||
/**
|
||||
* Remove all filtering that has been applied to a DataTable, be it column
|
||||
* based filtering or global filtering.
|
||||
* @name fnFilterClear
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* var oTable = $('#example').dataTable();
|
||||
*
|
||||
* // Perform a filter
|
||||
* oTable.fnFilter('Win');
|
||||
* oTable.fnFilter('Trident', 0);
|
||||
*
|
||||
* // Remove all filtering
|
||||
* oTable.fnFilterClear();
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnFilterClear = function ( oSettings )
|
||||
{
|
||||
/* Remove global filter */
|
||||
oSettings.oPreviousSearch.sSearch = "";
|
||||
|
||||
/* Remove the text of the global filter in the input boxes */
|
||||
if ( typeof oSettings.aanFeatures.f != 'undefined' )
|
||||
{
|
||||
var n = oSettings.aanFeatures.f;
|
||||
for ( var i=0, iLen=n.length ; i<iLen ; i++ )
|
||||
{
|
||||
$('input', n[i]).val( '' );
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove the search text for the column filters - NOTE - if you have input boxes for these
|
||||
* filters, these will need to be reset
|
||||
*/
|
||||
for ( var i=0, iLen=oSettings.aoPreSearchCols.length ; i<iLen ; i++ )
|
||||
{
|
||||
oSettings.aoPreSearchCols[i].sSearch = "";
|
||||
}
|
||||
|
||||
/* Redraw */
|
||||
oSettings.oApi._fnReDraw( oSettings );
|
||||
};
|
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* This plug-in removed the default behaviour of DataTables to filter on each
|
||||
* keypress, and replaces with it the requirement to press the enter key to
|
||||
* perform the filter.
|
||||
* @name fnFilterOnReturn
|
||||
* @author <a href="http://www.mvccms.com/">Jon Ranes</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* $('.dataTable').dataTable().fnFilterOnReturn();
|
||||
* } );
|
||||
*/
|
||||
|
||||
jQuery.fn.dataTableExt.oApi.fnFilterOnReturn = function (oSettings) {
|
||||
var _that = this;
|
||||
|
||||
this.each(function (i) {
|
||||
$.fn.dataTableExt.iApiIndex = i;
|
||||
var $this = this;
|
||||
var anControl = $('input', _that.fnSettings().aanFeatures.f);
|
||||
anControl.unbind('keyup').bind('keypress', function (e) {
|
||||
if (e.which == 13) {
|
||||
$.fn.dataTableExt.iApiIndex = i;
|
||||
_that.fnFilter(anControl.val());
|
||||
}
|
||||
});
|
||||
return this;
|
||||
});
|
||||
return this;
|
||||
};
|
@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Search through a table looking for a given string (optionally the search
|
||||
* can be restricted to a single column). The return value is an array with
|
||||
* the data indexes (from DataTables' internal data store) for any rows which
|
||||
* match.
|
||||
* @name fnFindCellRowIndexes
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* var oTable = $('#example').dataTable();
|
||||
*
|
||||
* var a = oTable.fnFindCellRowIndexes( '1.7' ); // Search all columns
|
||||
*
|
||||
* var b = oTable.fnFindCellRowIndexes( '1.7', 3 ); // Search only column 3
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnFindCellRowIndexes = function ( oSettings, sSearch, iColumn )
|
||||
{
|
||||
var
|
||||
i,iLen, j, jLen,
|
||||
aOut = [], aData;
|
||||
|
||||
for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
|
||||
{
|
||||
aData = oSettings.aoData[i]._aData;
|
||||
|
||||
if ( typeof iColumn == 'undefined' )
|
||||
{
|
||||
for ( j=0, jLen=aData.length ; j<jLen ; j++ )
|
||||
{
|
||||
if ( aData[j] == sSearch )
|
||||
{
|
||||
aOut.push( i );
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( aData[iColumn] == sSearch )
|
||||
{
|
||||
aOut.push( i );
|
||||
}
|
||||
}
|
||||
|
||||
return aOut;
|
||||
};
|
||||
|
@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Much like fnFindCellRowIndexes this plug-in will search a table for
|
||||
* matching data (optionally the search can be restricted to a single column),
|
||||
* but in this case the returned array contains TR nodes of the matching rows,
|
||||
* rather than data indexes.
|
||||
* @name fnFindCellRowNodes
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* var oTable = $('#example').dataTable();
|
||||
*
|
||||
* var a = oTable.fnFindCellRowNodes( '1.7' ); // Search all columns
|
||||
*
|
||||
* var b = oTable.fnFindCellRowNodes( '1.7', 3 ); // Search only column 3
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnFindCellRowNodes = function ( oSettings, sSearch, iColumn )
|
||||
{
|
||||
var
|
||||
i,iLen, j, jLen,
|
||||
aOut = [], aData;
|
||||
|
||||
for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
|
||||
{
|
||||
aData = oSettings.aoData[i]._aData;
|
||||
|
||||
if ( typeof iColumn == 'undefined' )
|
||||
{
|
||||
for ( j=0, jLen=aData.length ; j<jLen ; j++ )
|
||||
{
|
||||
if ( aData[j] == sSearch )
|
||||
{
|
||||
aOut.push( oSettings.aoData[i].nTr );
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( aData[iColumn] == sSearch )
|
||||
{
|
||||
aOut.push( oSettings.aoData[i].nTr );
|
||||
}
|
||||
}
|
||||
|
||||
return aOut;
|
||||
};
|
@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Due to the fact that DataTables moves DOM elements around (mainly TR
|
||||
* elements for sorting and filtering) it can at times be a little tricky
|
||||
* to get the next row based on another, while taking into account pagination,
|
||||
* filtering, sorting etc. This function is designed to address exactly this
|
||||
* situation. It takes two parameters, the target node, and a boolean
|
||||
* indicating if the adjacent row retrieved should be the next (true, or no
|
||||
* value) or the previous (false).
|
||||
* @name fnGetAdjacentTr
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* var oTable = $('#example').dataTable();
|
||||
*
|
||||
* var n1 = $('#example tbody tr:eq(2)')[0];
|
||||
* var nNext = oTable.fnGetAdjacentTr( n1 );
|
||||
* var nPrev = oTable.fnGetAdjacentTr( n1, false );
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnGetAdjacentTr = function ( oSettings, nTr, bNext )
|
||||
{
|
||||
/* Find the node's position in the aoData store */
|
||||
var iCurrent = oSettings.oApi._fnNodeToDataIndex( oSettings, nTr );
|
||||
|
||||
/* Convert that to a position in the display array */
|
||||
var iDisplayIndex = $.inArray( iCurrent, oSettings.aiDisplay );
|
||||
if ( iDisplayIndex == -1 )
|
||||
{
|
||||
/* Not in the current display */
|
||||
return null;
|
||||
}
|
||||
|
||||
/* Move along the display array as needed */
|
||||
iDisplayIndex += (typeof bNext=='undefined' || bNext) ? 1 : -1;
|
||||
|
||||
/* Check that it within bounds */
|
||||
if ( iDisplayIndex < 0 || iDisplayIndex >= oSettings.aiDisplay.length )
|
||||
{
|
||||
/* There is no next/previous element */
|
||||
return null;
|
||||
}
|
||||
|
||||
/* Return the target node from the aoData store */
|
||||
return oSettings.aoData[ oSettings.aiDisplay[ iDisplayIndex ] ].nTr;
|
||||
};
|
@ -0,0 +1,50 @@
|
||||
/**
|
||||
* Return an array of table values from a particular column, with various
|
||||
* filtering options.
|
||||
* @name fnGetColumnData
|
||||
* @author <a href="http://mind2.de">Benedikt Forchhammer</a>
|
||||
*
|
||||
* @example
|
||||
*
|
||||
*/
|
||||
|
||||
jQUery.fn.dataTableExt.oApi.fnGetColumnData = function ( oSettings, iColumn, bUnique, bFiltered, bIgnoreEmpty ) {
|
||||
// check that we have a column id
|
||||
if ( typeof iColumn == "undefined" ) return [];
|
||||
|
||||
// by default we only wany unique data
|
||||
if ( typeof bUnique == "undefined" ) bUnique = true;
|
||||
|
||||
// by default we do want to only look at filtered data
|
||||
if ( typeof bFiltered == "undefined" ) bFiltered = true;
|
||||
|
||||
// by default we do not wany to include empty values
|
||||
if ( typeof bIgnoreEmpty == "undefined" ) bIgnoreEmpty = true;
|
||||
|
||||
// list of rows which we're going to loop through
|
||||
var aiRows;
|
||||
|
||||
// use only filtered rows
|
||||
if (bFiltered == true) aiRows = oSettings.aiDisplay;
|
||||
// use all rows
|
||||
else aiRows = oSettings.aiDisplayMaster; // all row numbers
|
||||
|
||||
// set up data array
|
||||
var asResultData = new Array();
|
||||
|
||||
for (var i=0,c=aiRows.length; i<c; i++) {
|
||||
iRow = aiRows[i];
|
||||
var sValue = this.fnGetData(iRow, iColumn);
|
||||
|
||||
// ignore empty values?
|
||||
if (bIgnoreEmpty == true && sValue.length == 0) continue;
|
||||
|
||||
// ignore unique values?
|
||||
else if (bUnique == true && jQuery.inArray(sValue, asResultData) > -1) continue;
|
||||
|
||||
// else push the value onto the result data array
|
||||
else asResultData.push(sValue);
|
||||
}
|
||||
|
||||
return asResultData;
|
||||
};
|
@ -0,0 +1,25 @@
|
||||
/**
|
||||
* Maintenance of web-sites can often cause unexpected headaches, particularly
|
||||
* if the hardcoded index of an array (the columns in a DataTables instance)
|
||||
* needs to change due to an added or removed column. This plug-in function
|
||||
* will match a given string to the title of a column in the table and return
|
||||
* the column index, helping to overcome this problem.
|
||||
* @name fnGetColumnIndex
|
||||
* @author <a href="http://www.rosstechassociates.com/">Michael Ross</a>
|
||||
*
|
||||
* @example
|
||||
*
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnGetColumnIndex = function ( oSettings, sCol )
|
||||
{
|
||||
var cols = oSettings.aoColumns;
|
||||
for ( var x=0, xLen=cols.length ; x<xLen ; x++ )
|
||||
{
|
||||
if ( cols[x].sTitle.toLowerCase() == sCol.toLowerCase() )
|
||||
{
|
||||
return x;
|
||||
};
|
||||
}
|
||||
return -1;
|
||||
};
|
@ -0,0 +1,26 @@
|
||||
/**
|
||||
* Get a list of all TR nodes in the table which are not currently visible
|
||||
* (useful for building forms).
|
||||
* @name fnGetHiddenNodes
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnGetHiddenNodes = function ( oSettings )
|
||||
{
|
||||
/* Note the use of a DataTables 'private' function thought the 'oApi' object */
|
||||
var anNodes = this.oApi._fnGetTrNodes( oSettings );
|
||||
var anDisplay = $('tbody tr', oSettings.nTable);
|
||||
|
||||
/* Remove nodes which are being displayed */
|
||||
for ( var i=0 ; i<anDisplay.length ; i++ )
|
||||
{
|
||||
var iIndex = jQuery.inArray( anDisplay[i], anNodes );
|
||||
if ( iIndex != -1 )
|
||||
{
|
||||
anNodes.splice( iIndex, 1 );
|
||||
}
|
||||
}
|
||||
|
||||
/* Fire back the array to the caller */
|
||||
return anNodes;
|
||||
};
|
@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Get a TD node from a row, taking into account column visibility. While
|
||||
* getting a TD node is easy when it is visible on the page by using normal
|
||||
* DOM methods, jQuery or whatever, it becomes a lot more complicated when
|
||||
* taking into account hidden rows and columns. This function can be used to
|
||||
* overcome these difficulties.
|
||||
* @name fnColumnIndexToVisible
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* var oTable = $('#example').dataTable();
|
||||
*
|
||||
* // Sort in the order that was origially in the HTML
|
||||
* var nTd = oTable.fnGetTd( $('#example tbody tr:eq(1)')[0], 1 );
|
||||
* console.log( nTd );
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnGetTd = function ( oSettings, mTr, iTd, bVisOnly )
|
||||
{
|
||||
/* Take either a TR node or aoData index as the mTr property */
|
||||
var iRow = (typeof mTr == 'object') ?
|
||||
oSettings.oApi._fnNodeToDataIndex(oSettings, mTr) : mTr;
|
||||
|
||||
if ( typeof bVisOnly == 'undefined' && !bVisOnly )
|
||||
{
|
||||
/* Looking at both visible and hidden TD elements - convert to visible index, if not present
|
||||
* then it must be hidden. Return as appropriate
|
||||
*/
|
||||
var iCalcVis = oSettings.oApi._fnColumnIndexToVisible( oSettings, iTd );
|
||||
if ( iCalcVis !== null )
|
||||
{
|
||||
return oSettings.aoData[ iRow ].nTr.getElementsByTagName('td')[ iCalcVis ];
|
||||
}
|
||||
else
|
||||
{
|
||||
return oSettings.aoData[ iRow ]._anHidden[ iTd ];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Only looking at visible TD elements, so just use getElements... */
|
||||
return oSettings.aoData[ iRow ].nTr.getElementsByTagName('td')[ iTd ];
|
||||
}
|
||||
};
|
@ -0,0 +1,54 @@
|
||||
/**
|
||||
* Get an array of TD nodes from DataTables for a given row, including any
|
||||
* column elements which are hidden.
|
||||
* @name fnGetTds
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* var oTable = $('#example').dataTable();
|
||||
*
|
||||
* // Sort in the order that was origially in the HTML
|
||||
* var anTds = oTable.fnGetTds( $('#example tbody tr:eq(1)')[0] );
|
||||
* console.log( anTds );
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnGetTds = function ( oSettings, mTr )
|
||||
{
|
||||
var anTds = [];
|
||||
var anVisibleTds = [];
|
||||
var iCorrector = 0;
|
||||
var nTd, iColumn, iColumns;
|
||||
|
||||
/* Take either a TR node or aoData index as the mTr property */
|
||||
var iRow = (typeof mTr == 'object') ?
|
||||
oSettings.oApi._fnNodeToDataIndex(oSettings, mTr) : mTr;
|
||||
var nTr = oSettings.aoData[iRow].nTr;
|
||||
|
||||
/* Get an array of the visible TD elements */
|
||||
for ( iColumn=0, iColumns=nTr.childNodes.length ; iColumn<iColumns ; iColumn++ )
|
||||
{
|
||||
nTd = nTr.childNodes[iColumn];
|
||||
if ( nTd.nodeName.toUpperCase() == "TD" )
|
||||
{
|
||||
anVisibleTds.push( nTd );
|
||||
}
|
||||
}
|
||||
|
||||
/* Construct and array of the combined elements */
|
||||
for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
|
||||
{
|
||||
if ( oSettings.aoColumns[iColumn].bVisible )
|
||||
{
|
||||
anTds.push( anVisibleTds[iColumn-iCorrector] );
|
||||
}
|
||||
else
|
||||
{
|
||||
anTds.push( oSettings.aoData[iRow]._anHidden[iColumn] );
|
||||
iCorrector++;
|
||||
}
|
||||
}
|
||||
|
||||
return anTds;
|
||||
};
|
@ -0,0 +1,40 @@
|
||||
/**
|
||||
* Change the number of records that can be viewed on a single page in
|
||||
* DataTables.
|
||||
* @name fnColumnIndexToVisible
|
||||
* @author <a href="http://www.webdetails.pt/">Pedro Alves</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* var oTable = $('#example').dataTable();
|
||||
* oTable.fnLengthChange( 100 );
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnLengthChange = function ( oSettings, iDisplay )
|
||||
{
|
||||
oSettings._iDisplayLength = iDisplay;
|
||||
oSettings.oApi._fnCalculateEnd( oSettings );
|
||||
|
||||
/* If we have space to show extra rows (backing up from the end point - then do so */
|
||||
if ( oSettings._iDisplayEnd == oSettings.aiDisplay.length )
|
||||
{
|
||||
oSettings._iDisplayStart = oSettings._iDisplayEnd - oSettings._iDisplayLength;
|
||||
if ( oSettings._iDisplayStart < 0 )
|
||||
{
|
||||
oSettings._iDisplayStart = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ( oSettings._iDisplayLength == -1 )
|
||||
{
|
||||
oSettings._iDisplayStart = 0;
|
||||
}
|
||||
|
||||
oSettings.oApi._fnDraw( oSettings );
|
||||
|
||||
if ( oSettings.aanFeatures.l )
|
||||
{
|
||||
$('select', oSettings.aanFeatures.l).val( iDisplay );
|
||||
}
|
||||
};
|
@ -0,0 +1,42 @@
|
||||
/**
|
||||
* This plug-in adds to DataTables the ability to set multiple column
|
||||
* filtering terms in a single call (particularly useful if using server-side
|
||||
* processing). Used in combination with the column sName parameter, simply
|
||||
* pass in an object with the key/value pair being the column you wish to
|
||||
* search on, and the value you wish to search for.
|
||||
* @name fnMultiFilter
|
||||
* @author <i>mrkevans</i>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* var oTable = $('#example').dataTable( {
|
||||
* "aoColumns": [
|
||||
* { "sName": "engine" },
|
||||
* { "sName": "browser" },
|
||||
* { "sName": "platform" },
|
||||
* { "sName": "version" },
|
||||
* { "sName": "grade" }
|
||||
* ]
|
||||
* } );
|
||||
* oTable.fnMultiFilter( { "engine": "Gecko", "browser": "Cam" } );
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnMultiFilter = function( oSettings, oData ) {
|
||||
for ( var key in oData )
|
||||
{
|
||||
if ( oData.hasOwnProperty(key) )
|
||||
{
|
||||
for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
|
||||
{
|
||||
if( oSettings.aoColumns[i].sName == key )
|
||||
{
|
||||
/* Add single column filter */
|
||||
oSettings.aoPreSearchCols[ i ].sSearch = oData[key];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.oApi._fnDraw( oSettings );
|
||||
};
|
@ -0,0 +1,29 @@
|
||||
/**
|
||||
* Get information about the paging settings that DataTables is currently
|
||||
* using to display each page, including the number of records shown, start
|
||||
* and end points in the data set etc.
|
||||
* @name fnPagingInfo
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* $('#example').dataTable( {
|
||||
* "fnDrawCallback": function () {
|
||||
* alert( 'Now on page'+ this.fnPagingInfo().iPage );
|
||||
* }
|
||||
* } );
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnPagingInfo = function ( oSettings )
|
||||
{
|
||||
return {
|
||||
"iStart": oSettings._iDisplayStart,
|
||||
"iEnd": oSettings.fnDisplayEnd(),
|
||||
"iLength": oSettings._iDisplayLength,
|
||||
"iTotal": oSettings.fnRecordsTotal(),
|
||||
"iFilteredTotal": oSettings.fnRecordsDisplay(),
|
||||
"iPage": Math.ceil( oSettings._iDisplayStart / oSettings._iDisplayLength ),
|
||||
"iTotalPages": Math.ceil( oSettings.fnRecordsDisplay() / oSettings._iDisplayLength )
|
||||
};
|
||||
};
|
@ -0,0 +1,21 @@
|
||||
/**
|
||||
* When doing some heavy processing of your own (for example using fnOpen with
|
||||
* data loading from the server) it can be useful to make use of the
|
||||
* 'processing' indicator built-into DataTables. This plug-in function
|
||||
* exposes the internal DataTables function so it can be used for exactly this.
|
||||
* @name fnProcessingIndicator
|
||||
* @author Allan Chappell
|
||||
*
|
||||
* @example
|
||||
* oTable.fnProcessingIndicator(); // On
|
||||
* oTable.fnProcessingIndicator(false); // Off
|
||||
*/
|
||||
|
||||
jQuery.fn.dataTableExt.oApi.fnProcessingIndicator = function ( oSettings, onoff )
|
||||
{
|
||||
if( typeof(onoff) == 'undefined' )
|
||||
{
|
||||
onoff=true;
|
||||
}
|
||||
this.oApi._fnProcessingDisplay( oSettings, onoff );
|
||||
};
|
@ -0,0 +1,62 @@
|
||||
/**
|
||||
* By default DataTables only uses the sAjaxSource variable at initialisation
|
||||
* time, however it can be useful to re-read an Ajax source and have the table
|
||||
* update. Typically you would need to use the fnClearTable() and fnAddData()
|
||||
* functions, however this wraps it all up in a single function call.
|
||||
* <i>Note</i>:To reload data when using server-side processing, just use the
|
||||
* built-inAPI function fnDraw rather than this plug-in.
|
||||
* @name fnReloadAjax
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
* // Example call to load a new file
|
||||
* oTable.fnReloadAjax( 'media/examples_support/json_source2.txt' );
|
||||
*
|
||||
* // Example call to reload from original file
|
||||
* oTable.fnReloadAjax();
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnReloadAjax = function ( oSettings, sNewSource, fnCallback, bStandingRedraw )
|
||||
{
|
||||
if ( typeof sNewSource != 'undefined' && sNewSource != null )
|
||||
{
|
||||
oSettings.sAjaxSource = sNewSource;
|
||||
}
|
||||
this.oApi._fnProcessingDisplay( oSettings, true );
|
||||
var that = this;
|
||||
var iStart = oSettings._iDisplayStart;
|
||||
var aData = [];
|
||||
|
||||
this.oApi._fnServerParams( oSettings, aData );
|
||||
|
||||
oSettings.fnServerData( oSettings.sAjaxSource, aData, function(json) {
|
||||
/* Clear the old information from the table */
|
||||
that.oApi._fnClearTable( oSettings );
|
||||
|
||||
/* Got the data - add it to the table */
|
||||
var aData = (oSettings.sAjaxDataProp !== "") ?
|
||||
that.oApi._fnGetObjectDataFn( oSettings.sAjaxDataProp )( json ) : json;
|
||||
|
||||
for ( var i=0 ; i<aData.length ; i++ )
|
||||
{
|
||||
that.oApi._fnAddData( oSettings, aData[i] );
|
||||
}
|
||||
|
||||
oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
|
||||
that.fnDraw();
|
||||
|
||||
if ( typeof bStandingRedraw != 'undefined' && bStandingRedraw === true )
|
||||
{
|
||||
oSettings._iDisplayStart = iStart;
|
||||
that.fnDraw( false );
|
||||
}
|
||||
|
||||
that.oApi._fnProcessingDisplay( oSettings, false );
|
||||
|
||||
/* Callback user function - for event handlers etc */
|
||||
if ( typeof fnCallback == 'function' && fnCallback != null )
|
||||
{
|
||||
fnCallback( oSettings );
|
||||
}
|
||||
}, oSettings );
|
||||
};
|
@ -0,0 +1,42 @@
|
||||
/**
|
||||
* Enables filtration delay for keeping the browser more responsive while
|
||||
* searching for a longer keyword.
|
||||
* @name fnSetFilteringDelay
|
||||
* @author <a href="http://www.zygimantas.com/">Zygimantas Berziunas</a>, <a href="http://www.sprymedia.co.uk/">Allan Jardine</a> and <i>vex</i>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* $('.dataTable').dataTable().fnSetFilteringDelay();
|
||||
* } );
|
||||
*/
|
||||
|
||||
jQuery.fn.dataTableExt.oApi.fnSetFilteringDelay = function ( oSettings, iDelay ) {
|
||||
var
|
||||
_that = this,
|
||||
iDelay = (typeof iDelay == 'undefined') ? 250 : iDelay;
|
||||
|
||||
this.each( function ( i ) {
|
||||
$.fn.dataTableExt.iApiIndex = i;
|
||||
var
|
||||
$this = this,
|
||||
oTimerId = null,
|
||||
sPreviousSearch = null,
|
||||
anControl = $( 'input', _that.fnSettings().aanFeatures.f );
|
||||
|
||||
anControl.unbind( 'keyup' ).bind( 'keyup', function() {
|
||||
var $$this = $this;
|
||||
|
||||
if (sPreviousSearch === null || sPreviousSearch != anControl.val()) {
|
||||
window.clearTimeout(oTimerId);
|
||||
sPreviousSearch = anControl.val();
|
||||
oTimerId = window.setTimeout(function() {
|
||||
$.fn.dataTableExt.iApiIndex = i;
|
||||
_that.fnFilter( anControl.val() );
|
||||
}, iDelay);
|
||||
}
|
||||
});
|
||||
|
||||
return this;
|
||||
} );
|
||||
return this;
|
||||
};
|
@ -0,0 +1,35 @@
|
||||
/**
|
||||
* This function will restore the order in which data was read into a
|
||||
* DataTable (for example from an HTML source). Although you can set
|
||||
* aaSorting to be an empty array ([ ]) in order to prevent sorting during
|
||||
* initialisation, it can sometimes be useful to restore the original order
|
||||
* after sorting has already occurred - which is exactly what this function
|
||||
* does.
|
||||
* @name fnSortNeutral
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* var oTable = $('#example').dataTable();
|
||||
*
|
||||
* // Sort in the order that was originally in the HTML
|
||||
* oTable.fnSortNeutral();
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnSortNeutral = function ( oSettings )
|
||||
{
|
||||
/* Remove any current sorting */
|
||||
oSettings.aaSorting = [];
|
||||
|
||||
/* Sort display arrays so we get them in numerical order */
|
||||
oSettings.aiDisplay.sort( function (x,y) {
|
||||
return x-y;
|
||||
} );
|
||||
oSettings.aiDisplayMaster.sort( function (x,y) {
|
||||
return x-y;
|
||||
} );
|
||||
|
||||
/* Redraw */
|
||||
oSettings.oApi._fnReDraw( oSettings );
|
||||
};
|
@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Redraw the table (i.e. fnDraw) to take account of sorting and filtering,
|
||||
* but retain the current pagination settings.
|
||||
* @name fnStandingRedraw
|
||||
* @author Jonathan Hoguet
|
||||
*
|
||||
* @example
|
||||
* $(document).ready(function() {
|
||||
* var oTable = $('.dataTable').dataTable()
|
||||
* oTable.fnStandingRedraw();
|
||||
* } );
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnStandingRedraw = function(oSettings) {
|
||||
if(oSettings.oFeatures.bServerSide === false){
|
||||
var before = oSettings._iDisplayStart;
|
||||
|
||||
oSettings.oApi._fnReDraw(oSettings);
|
||||
|
||||
// iDisplayStart has been reset to zero - so lets change it back
|
||||
oSettings._iDisplayStart = before;
|
||||
oSettings.oApi._fnCalculateEnd(oSettings);
|
||||
}
|
||||
|
||||
// draw the 'current' page
|
||||
oSettings.oApi._fnDraw(oSettings);
|
||||
};
|
@ -0,0 +1,16 @@
|
||||
/**
|
||||
* When DataTables removes columns from the display (bVisible or
|
||||
* fnSetColumnVis) it removes these elements from the DOM, effecting the index
|
||||
* value for the column positions. This function converts the visible column
|
||||
* index into a data column index (i.e. all columns regardless of visibility).
|
||||
* @name fnVisibleToColumnIndex
|
||||
* @author <a href="http://sprymedia.co.uk">Allan Jardine</a>
|
||||
*
|
||||
* @example
|
||||
*
|
||||
*/
|
||||
|
||||
$.fn.dataTableExt.oApi.fnVisibleToColumnIndex = function ( oSettings, iMatch )
|
||||
{
|
||||
return oSettings.oApi._fnVisibleToColumnIndex( oSettings, iMatch );
|
||||
};
|
Loading…
Reference in new issue