mirror of
https://github.com/DataTables/DataTables.git
synced 2025-02-20 18:54:15 +01:00
Updated: Optimisation on fnDeleteRow to simply remove the search array entry, rather than rebuilding the whole array, also on fnUpdate to only rebuild the single row, rather than the entire thing, and finally fnAddData - allow the redraw to update the search array.
This commit is contained in:
parent
27627b287d
commit
d41c572798
73
media/js/jquery.dataTables.js
vendored
73
media/js/jquery.dataTables.js
vendored
@ -26,7 +26,7 @@
|
||||
* building the dynamic multi-column sort functions.
|
||||
*/
|
||||
/*jslint evil: true, undef: true, browser: true */
|
||||
/*globals $, jQuery,_fnExternApiFunc,_fnInitalise,_fnLanguageProcess,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnGatherData,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxUpdateDraw,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnArrayCmp,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap*/
|
||||
/*globals $, jQuery,_fnExternApiFunc,_fnInitalise,_fnLanguageProcess,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnGatherData,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxUpdateDraw,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnArrayCmp,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap*/
|
||||
|
||||
(function($, window, document) {
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
@ -1568,9 +1568,6 @@
|
||||
|
||||
oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
|
||||
|
||||
/* Rebuild the search */
|
||||
_fnBuildSearchArray( oSettings, 1 );
|
||||
|
||||
if ( typeof bRedraw == 'undefined' || bRedraw )
|
||||
{
|
||||
_fnReDraw( oSettings );
|
||||
@ -1600,13 +1597,14 @@
|
||||
/* Return the data array from this row */
|
||||
var oData = oSettings.aoData.splice( iAODataIndex, 1 );
|
||||
|
||||
/* Remove the target row from the search array */
|
||||
var iDisplayIndex = $.inArray( iAODataIndex, oSettings.aiDisplay );
|
||||
oSettings.asDataSearch.splice( iDisplayIndex, 1 );
|
||||
|
||||
/* Delete from the display arrays */
|
||||
_fnDeleteIndex( oSettings.aiDisplayMaster, iAODataIndex );
|
||||
_fnDeleteIndex( oSettings.aiDisplay, iAODataIndex );
|
||||
|
||||
/* Rebuild the search */
|
||||
_fnBuildSearchArray( oSettings, 1 );
|
||||
|
||||
/* If there is a user callback function - call it */
|
||||
if ( typeof fnCallBack == "function" )
|
||||
{
|
||||
@ -1888,10 +1886,16 @@
|
||||
}
|
||||
}
|
||||
|
||||
/* Modify the search index for this row (strictly this is likely not needed, since fnReDraw
|
||||
* will rebuild the search array - however, the redraw might be disabled by the user)
|
||||
*/
|
||||
var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay );
|
||||
oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow( oSettings,
|
||||
oSettings.aoData[iRow]._aData );
|
||||
|
||||
/* Perform pre-draw actions */
|
||||
if ( typeof bAction == 'undefined' || bAction )
|
||||
{
|
||||
_fnBuildSearchArray( oSettings, 1 );
|
||||
_fnAjustColumnSizing( oSettings );
|
||||
}
|
||||
|
||||
@ -4091,32 +4095,48 @@
|
||||
/* Clear out the old data */
|
||||
oSettings.asDataSearch.splice( 0, oSettings.asDataSearch.length );
|
||||
|
||||
var nTmp = document.createElement('div');
|
||||
var aArray = (typeof iMaster != 'undefined' && iMaster == 1) ?
|
||||
oSettings.aiDisplayMaster : oSettings.aiDisplay;
|
||||
|
||||
for ( var i=0, iLen=aArray.length ; i<iLen ; i++ )
|
||||
{
|
||||
oSettings.asDataSearch[i] = '';
|
||||
for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
|
||||
oSettings.asDataSearch[i] = _fnBuildSearchRow( oSettings,
|
||||
oSettings.aoData[ aArray[i] ]._aData );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Function: _fnBuildSearchRow
|
||||
* Purpose: Create a searchable string from a single data row
|
||||
* Returns: -
|
||||
* Inputs: object:oSettings - dataTables settings object
|
||||
* array:aData - aoData[]._aData array to use for the data to search
|
||||
*/
|
||||
function _fnBuildSearchRow( oSettings, aData )
|
||||
{
|
||||
var sSearch = '';
|
||||
var nTmp = document.createElement('div');
|
||||
|
||||
for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
|
||||
{
|
||||
if ( oSettings.aoColumns[j].bSearchable )
|
||||
{
|
||||
if ( oSettings.aoColumns[j].bSearchable )
|
||||
{
|
||||
var sData = oSettings.aoData[ aArray[i] ]._aData[j];
|
||||
oSettings.asDataSearch[i] += _fnDataToSearch( sData, oSettings.aoColumns[j].sType )+' ';
|
||||
}
|
||||
}
|
||||
|
||||
/* If it looks like there is an HTML entity in the string, attempt to decode it */
|
||||
if ( oSettings.asDataSearch[i].indexOf('&') !== -1 )
|
||||
{
|
||||
nTmp.innerHTML = oSettings.asDataSearch[i];
|
||||
oSettings.asDataSearch[i] = nTmp.textContent ? nTmp.textContent : nTmp.innerText;
|
||||
|
||||
/* IE and Opera appear to put an newline where there is a <br> tag - remove it */
|
||||
oSettings.asDataSearch[i] = oSettings.asDataSearch[i].replace(/\n/g," ").replace(/\r/g,"");
|
||||
var sData = aData[j];
|
||||
sSearch += _fnDataToSearch( sData, oSettings.aoColumns[j].sType )+' ';
|
||||
}
|
||||
}
|
||||
|
||||
/* If it looks like there is an HTML entity in the string, attempt to decode it */
|
||||
if ( sSearch.indexOf('&') !== -1 )
|
||||
{
|
||||
nTmp.innerHTML = sSearch;
|
||||
sSearch = nTmp.textContent ? nTmp.textContent : nTmp.innerText;
|
||||
|
||||
/* IE and Opera appear to put an newline where there is a <br> tag - remove it */
|
||||
sSearch = sSearch.replace(/\n/g," ").replace(/\r/g,"");
|
||||
}
|
||||
|
||||
return sSearch;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -6194,6 +6214,7 @@
|
||||
this.oApi._fnFilterColumn = _fnFilterColumn;
|
||||
this.oApi._fnFilter = _fnFilter;
|
||||
this.oApi._fnBuildSearchArray = _fnBuildSearchArray;
|
||||
this.oApi._fnBuildSearchRow = _fnBuildSearchRow;
|
||||
this.oApi._fnFilterCreateSearch = _fnFilterCreateSearch;
|
||||
this.oApi._fnDataToSearch = _fnDataToSearch;
|
||||
this.oApi._fnSort = _fnSort;
|
||||
|
30
media/unit_testing/tests_onhold/1_dom/fnDeleteRow.js
Executable file
30
media/unit_testing/tests_onhold/1_dom/fnDeleteRow.js
Executable file
@ -0,0 +1,30 @@
|
||||
// DATA_TEMPLATE: dom_data
|
||||
oTest.fnStart( "fnDeleteRow" );
|
||||
|
||||
$(document).ready( function () {
|
||||
/* Check the default */
|
||||
var oTable = $('#example').dataTable();
|
||||
var oSettings = oTable.fnSettings();
|
||||
|
||||
oTest.fnTest(
|
||||
"Check that the default data is sane",
|
||||
null,
|
||||
function () { return oSettings.asDataSearch.join(' ').match(/4.0/g).length == 3; }
|
||||
);
|
||||
|
||||
oTest.fnTest(
|
||||
"Remove the first data row, and check that hte search data has been updated",
|
||||
function () { oTable.fnDeleteRow( 0 ); },
|
||||
function () { return oSettings.asDataSearch.join(' ').match(/4.0/g).length == 2; }
|
||||
);
|
||||
|
||||
oTest.fnTest(
|
||||
"Check that the info element has been updated",
|
||||
null,
|
||||
function () { return $('#example_info').html() == "Showing 1 to 10 of 56 entries"; }
|
||||
);
|
||||
|
||||
|
||||
|
||||
oTest.fnComplete();
|
||||
} );
|
Loading…
x
Reference in New Issue
Block a user