jquery-datatables-checkboxes
Advanced tools
Comparing version 1.2.9 to 1.2.10
@@ -1,2 +0,2 @@ | ||
/*! Checkboxes 1.2.9 | ||
/*! Checkboxes 1.2.10 | ||
* Copyright (c) Gyrocode (www.gyrocode.com) | ||
@@ -9,3 +9,3 @@ * License: MIT License | ||
* @description Checkboxes extension for jQuery DataTables | ||
* @version 1.2.9 | ||
* @version 1.2.10 | ||
* @file dataTables.checkboxes.js | ||
@@ -19,2 +19,3 @@ * @author Gyrocode (http://www.gyrocode.com/projects/jquery-datatables-checkboxes/) | ||
(function( factory ){ | ||
/* eslint-disable */ | ||
if ( typeof define === 'function' && define.amd ) { | ||
@@ -44,938 +45,949 @@ // AMD | ||
} | ||
}(function( $, window, document, undefined ) { | ||
'use strict'; | ||
var DataTable = $.fn.dataTable; | ||
/* eslint-enable */ | ||
}(function( $, window, document ) { | ||
'use strict'; | ||
var DataTable = $.fn.dataTable; | ||
/** | ||
* Checkboxes is an extension for the jQuery DataTables library that provides | ||
* universal solution for working with checkboxes in a table. | ||
* | ||
* @class | ||
* @param {object} settings DataTables settings object for the host table | ||
* @requires jQuery 1.7+ | ||
* @requires DataTables 1.10.8+ | ||
* | ||
* @example | ||
* $('#example').DataTable({ | ||
* 'columnDefs': [ | ||
* { | ||
* 'targets': 0, | ||
* 'checkboxes': true | ||
* } | ||
* ] | ||
* }); | ||
*/ | ||
var Checkboxes = function ( settings ) { | ||
// Sanity check that we are using DataTables 1.10.8 or newer | ||
if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.8' ) ) { | ||
throw 'DataTables Checkboxes requires DataTables 1.10.8 or newer'; | ||
} | ||
/** | ||
* Checkboxes is an extension for the jQuery DataTables library that provides | ||
* universal solution for working with checkboxes in a table. | ||
* | ||
* @class | ||
* @param {object} settings DataTables settings object for the host table | ||
* @requires jQuery 1.7+ | ||
* @requires DataTables 1.10.8+ | ||
* | ||
* @example | ||
* $('#example').DataTable({ | ||
* 'columnDefs': [ | ||
* { | ||
* 'targets': 0, | ||
* 'checkboxes': true | ||
* } | ||
* ] | ||
* }); | ||
*/ | ||
var Checkboxes = function ( settings ) { | ||
// Sanity check that we are using DataTables 1.10.8 or newer | ||
if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.8' ) ) { | ||
throw 'DataTables Checkboxes requires DataTables 1.10.8 or newer'; | ||
} | ||
this.s = { | ||
dt: new DataTable.Api( settings ), | ||
columns: [], | ||
data: {}, | ||
dataDisabled: {}, | ||
ignoreSelect: false | ||
}; | ||
this.s = { | ||
dt: new DataTable.Api( settings ), | ||
columns: [], | ||
data: [], | ||
dataDisabled: [], | ||
ignoreSelect: false | ||
}; | ||
// Get settings object | ||
this.s.ctx = this.s.dt.settings()[0]; | ||
// Get settings object | ||
this.s.ctx = this.s.dt.settings()[0]; | ||
// Check if checkboxes have already been initialised on this table | ||
if ( this.s.ctx.checkboxes ) { | ||
return; | ||
} | ||
// Check if checkboxes have already been initialised on this table | ||
if ( this.s.ctx.checkboxes ) { | ||
return; | ||
} | ||
settings.checkboxes = this; | ||
settings.checkboxes = this; | ||
this._constructor(); | ||
}; | ||
this._constructor(); | ||
}; | ||
Checkboxes.prototype = { | ||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | ||
* Constructor | ||
*/ | ||
Checkboxes.prototype = { | ||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | ||
* Constructor | ||
*/ | ||
/** | ||
* Initialise the Checkboxes instance | ||
* | ||
* @private | ||
*/ | ||
_constructor: function () | ||
{ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
var hasCheckboxes = false; | ||
var hasCheckboxesSelectRow = false; | ||
/** | ||
* Initialise the Checkboxes instance | ||
* | ||
* @private | ||
*/ | ||
_constructor: function () | ||
{ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
var hasCheckboxes = false; | ||
var hasCheckboxesSelectRow = false; | ||
// Retrieve stored state | ||
var state = dt.state.loaded(); | ||
// Retrieve stored state | ||
var state = dt.state.loaded(); | ||
for(var i = 0; i < ctx.aoColumns.length; i++){ | ||
if (ctx.aoColumns[i].checkboxes){ | ||
var $colHeader = $(dt.column(i).header()); | ||
for(var i = 0; i < ctx.aoColumns.length; i++){ | ||
if (ctx.aoColumns[i].checkboxes){ | ||
var $colHeader = $(dt.column(i).header()); | ||
// | ||
// INITIALIZATION | ||
// | ||
// | ||
// INITIALIZATION | ||
// | ||
hasCheckboxes = true; | ||
hasCheckboxes = true; | ||
if(!$.isPlainObject(ctx.aoColumns[i].checkboxes)){ | ||
ctx.aoColumns[i].checkboxes = {}; | ||
} | ||
if(!$.isPlainObject(ctx.aoColumns[i].checkboxes)){ | ||
ctx.aoColumns[i].checkboxes = {}; | ||
} | ||
ctx.aoColumns[i].checkboxes = $.extend( | ||
{}, Checkboxes.defaults, ctx.aoColumns[i].checkboxes | ||
); | ||
ctx.aoColumns[i].checkboxes = $.extend( | ||
{}, Checkboxes.defaults, ctx.aoColumns[i].checkboxes | ||
); | ||
// | ||
// OPTIONS | ||
// | ||
// | ||
// OPTIONS | ||
// | ||
var colOptions = { | ||
'searchable': false, | ||
'orderable': false | ||
}; | ||
var colOptions = { | ||
'searchable': false, | ||
'orderable': false | ||
}; | ||
if(ctx.aoColumns[i].sClass === ''){ | ||
colOptions['className'] = 'dt-checkboxes-cell'; | ||
} else { | ||
colOptions['className'] = ctx.aoColumns[i].sClass + ' dt-checkboxes-cell'; | ||
} | ||
if(ctx.aoColumns[i].sClass === ''){ | ||
colOptions['className'] = 'dt-checkboxes-cell'; | ||
} else { | ||
colOptions['className'] = ctx.aoColumns[i].sClass + ' dt-checkboxes-cell'; | ||
} | ||
if(ctx.aoColumns[i].sWidthOrig === null){ | ||
colOptions['width'] = '1%'; | ||
} | ||
if(ctx.aoColumns[i].sWidthOrig === null){ | ||
colOptions['width'] = '1%'; | ||
} | ||
if(ctx.aoColumns[i].mRender === null){ | ||
colOptions['render'] = function(){ | ||
return '<input type="checkbox" class="dt-checkboxes">'; | ||
}; | ||
} | ||
if(ctx.aoColumns[i].mRender === null){ | ||
colOptions['render'] = function(){ | ||
return '<input type="checkbox" class="dt-checkboxes">'; | ||
}; | ||
} | ||
DataTable.ext.internal._fnColumnOptions(ctx, i, colOptions); | ||
DataTable.ext.internal._fnColumnOptions(ctx, i, colOptions); | ||
// WORKAROUND: Remove "sorting" class | ||
$colHeader.removeClass('sorting'); | ||
// WORKAROUND: Remove "sorting" class | ||
$colHeader.removeClass('sorting'); | ||
// WORKAROUND: Detach all event handlers for this column | ||
$colHeader.off('.dt'); | ||
// WORKAROUND: Detach all event handlers for this column | ||
$colHeader.off('.dt'); | ||
// If table has data source other than Ajax | ||
if(ctx.sAjaxSource === null){ | ||
// WORKAROUND: Invalidate column data | ||
var cells = dt.cells('tr', i); | ||
cells.invalidate('data'); | ||
// If table has data source other than Ajax | ||
if(ctx.sAjaxSource === null){ | ||
// WORKAROUND: Invalidate column data | ||
var cells = dt.cells('tr', i); | ||
cells.invalidate('data'); | ||
// WORKAROUND: Add required class to existing cells | ||
$(cells.nodes()).addClass(colOptions['className']); | ||
} | ||
// WORKAROUND: Add required class to existing cells | ||
$(cells.nodes()).addClass(colOptions['className']); | ||
} | ||
// | ||
// DATA | ||
// | ||
// | ||
// DATA | ||
// | ||
// Initialize object holding data for selected checkboxes | ||
self.s.data[i] = {}; | ||
self.s.dataDisabled[i] = {}; | ||
// Initialize object holding data for selected checkboxes | ||
self.s.data[i] = {}; | ||
self.s.dataDisabled[i] = {}; | ||
// If state is loaded and contains data for this column | ||
if(state && state.checkboxes && state.checkboxes.hasOwnProperty(i)){ | ||
// Load previous state | ||
self.s.data[i] = state.checkboxes[i]; | ||
} | ||
// If state is loaded and contains data for this column | ||
if(state && state.checkboxes && state.checkboxes.hasOwnProperty(i)){ | ||
// If checkbox state saving is enabled | ||
if(ctx.aoColumns[i].checkboxes.stateSave){ | ||
// Load previous state | ||
self.s.data[i] = state.checkboxes[i]; | ||
} | ||
} | ||
// Store column index for easy column selection later | ||
self.s.columns.push(i); | ||
// Store column index for easy column selection later | ||
self.s.columns.push(i); | ||
// | ||
// CLASSES | ||
// | ||
// | ||
// CLASSES | ||
// | ||
// If row selection is enabled for this column | ||
if(ctx.aoColumns[i].checkboxes.selectRow){ | ||
// If row selection is enabled for this column | ||
if(ctx.aoColumns[i].checkboxes.selectRow){ | ||
// If Select extension is enabled | ||
if(ctx._select){ | ||
hasCheckboxesSelectRow = true; | ||
// If Select extension is enabled | ||
if(ctx._select){ | ||
hasCheckboxesSelectRow = true; | ||
// Otherwise, if Select extension is not enabled | ||
} else { | ||
// Disable row selection for this column | ||
ctx.aoColumns[i].checkboxes.selectRow = false; | ||
// Otherwise, if Select extension is not enabled | ||
} else { | ||
// Disable row selection for this column | ||
ctx.aoColumns[i].checkboxes.selectRow = false; | ||
} | ||
} | ||
} | ||
if(ctx.aoColumns[i].checkboxes.selectAll){ | ||
// Save previous HTML content | ||
$colHeader.data('html', $colHeader.html()); | ||
if(ctx.aoColumns[i].checkboxes.selectAll){ | ||
// Save previous HTML content | ||
$colHeader.data('html', $colHeader.html()); | ||
// If "Select all" control markup is provided | ||
if(ctx.aoColumns[i].checkboxes.selectAllRender !== null){ | ||
var selectAllHtml = ''; | ||
// If "Select all" control markup is provided | ||
if(ctx.aoColumns[i].checkboxes.selectAllRender !== null){ | ||
var selectAllHtml = ''; | ||
// If "selectAllRender" option is a function | ||
if($.isFunction(ctx.aoColumns[i].checkboxes.selectAllRender)){ | ||
selectAllHtml = ctx.aoColumns[i].checkboxes.selectAllRender(); | ||
// If "selectAllRender" option is a function | ||
if($.isFunction(ctx.aoColumns[i].checkboxes.selectAllRender)){ | ||
selectAllHtml = ctx.aoColumns[i].checkboxes.selectAllRender(); | ||
// Otherwise, if "selectAllRender" option is a string | ||
} else if(typeof ctx.aoColumns[i].checkboxes.selectAllRender === 'string'){ | ||
selectAllHtml = ctx.aoColumns[i].checkboxes.selectAllRender; | ||
// Otherwise, if "selectAllRender" option is a string | ||
} else if(typeof ctx.aoColumns[i].checkboxes.selectAllRender === 'string'){ | ||
selectAllHtml = ctx.aoColumns[i].checkboxes.selectAllRender; | ||
} | ||
$colHeader | ||
.html(selectAllHtml) | ||
.addClass('dt-checkboxes-select-all') | ||
.attr('data-col', i); | ||
} | ||
$colHeader | ||
.html(selectAllHtml) | ||
.addClass('dt-checkboxes-select-all') | ||
.attr('data-col', i); | ||
} | ||
} | ||
} | ||
} | ||
// If table has at least one checkbox | ||
if(hasCheckboxes){ | ||
// If table has at least one checkbox | ||
if(hasCheckboxes){ | ||
// | ||
// EVENT HANDLERS | ||
// | ||
// | ||
// EVENT HANDLERS | ||
// | ||
var $table = $(dt.table().node()); | ||
var $tableBody = $(dt.table().body()); | ||
var $tableContainer = $(dt.table().container()); | ||
var $table = $(dt.table().node()); | ||
var $tableBody = $(dt.table().body()); | ||
var $tableContainer = $(dt.table().container()); | ||
// If there is at least one column that has row selection enabled | ||
if(hasCheckboxesSelectRow){ | ||
$table.addClass('dt-checkboxes-select'); | ||
// If there is at least one column that has row selection enabled | ||
if(hasCheckboxesSelectRow){ | ||
$table.addClass('dt-checkboxes-select'); | ||
// Handle event before row is selected/deselected | ||
$table.on('user-select.dt.dtCheckboxes', function ( e, dt, type, cell, originalEvent ){ | ||
var cellIdx = cell.index(); | ||
var rowIdx = cellIdx.row; | ||
var colIdx = self.getSelectRowColIndex(); | ||
var cellData = dt.cell({ row: rowIdx, column: colIdx }).data(); | ||
// Handle event before row is selected/deselected | ||
$table.on('user-select.dt.dtCheckboxes', function ( e, dt, type, cell /*, originalEvent*/ ){ | ||
var cellIdx = cell.index(); | ||
var rowIdx = cellIdx.row; | ||
var colIdx = self.getSelectRowColIndex(); | ||
var cellData = dt.cell({ row: rowIdx, column: colIdx }).data(); | ||
// If checkbox in the cell cannot be checked | ||
if(!self.isCellSelectable(colIdx, cellData)){ | ||
// Prevent row selection | ||
e.preventDefault(); | ||
} | ||
}); | ||
// If checkbox in the cell cannot be checked | ||
if(!self.isCellSelectable(colIdx, cellData)){ | ||
// Prevent row selection | ||
e.preventDefault(); | ||
} | ||
}); | ||
// Handle row select/deselect event | ||
$table.on('select.dt.dtCheckboxes deselect.dt.dtCheckboxes', function(e, api, type, indexes){ | ||
self.onSelect(e, type, indexes); | ||
}); | ||
// Handle row select/deselect event | ||
$table.on('select.dt.dtCheckboxes deselect.dt.dtCheckboxes', function(e, api, type, indexes){ | ||
self.onSelect(e, type, indexes); | ||
}); | ||
// Disable Select extension information display | ||
dt.select.info(false); | ||
// Disable Select extension information display | ||
dt.select.info(false); | ||
// Update the table information element with selected item summary | ||
// | ||
// NOTE: Needed to display correct count of selected rows | ||
// when using server-side processing mode | ||
$table.on('draw.dt.dtCheckboxes select.dt.dtCheckboxes deselect.dt.dtCheckboxes', function(){ | ||
self.showInfoSelected(); | ||
// Update the table information element with selected item summary | ||
// | ||
// NOTE: Needed to display correct count of selected rows | ||
// when using server-side processing mode | ||
$table.on('draw.dt.dtCheckboxes select.dt.dtCheckboxes deselect.dt.dtCheckboxes', function(){ | ||
self.showInfoSelected(); | ||
}); | ||
} | ||
// Handle table draw event | ||
$table.on('draw.dt.dtCheckboxes', function(e){ | ||
self.onDraw(e); | ||
}); | ||
} | ||
// Handle table draw event | ||
$table.on('draw.dt.dtCheckboxes', function(e){ | ||
self.onDraw(e); | ||
}); | ||
// Handle checkbox click event | ||
$tableBody.on('click.dtCheckboxes', 'input.dt-checkboxes', function(e){ | ||
self.onClick(e, this); | ||
}); | ||
// Handle checkbox click event | ||
$tableBody.on('click.dtCheckboxes', 'input.dt-checkboxes', function(e){ | ||
self.onClick(e, this); | ||
}); | ||
// Handle click on "Select all" control | ||
$tableContainer.on('click.dtCheckboxes', 'thead th.dt-checkboxes-select-all input[type="checkbox"]', function(e){ | ||
self.onClickSelectAll(e, this); | ||
}); | ||
// Handle click on "Select all" control | ||
$tableContainer.on('click.dtCheckboxes', 'thead th.dt-checkboxes-select-all input[type="checkbox"]', function(e){ | ||
self.onClickSelectAll(e, this); | ||
}); | ||
// Handle click on heading containing "Select all" control | ||
$tableContainer.on('click.dtCheckboxes', 'thead th.dt-checkboxes-select-all', function(e) { | ||
$('input[type="checkbox"]', this).not(':disabled').trigger('click'); | ||
}); | ||
// If row selection is disabled | ||
if(!hasCheckboxesSelectRow){ | ||
// Handle click on cell containing checkbox | ||
$tableContainer.on('click.dtCheckboxes', 'tbody td.dt-checkboxes-cell', function(e) { | ||
// Handle click on heading containing "Select all" control | ||
$tableContainer.on('click.dtCheckboxes', 'thead th.dt-checkboxes-select-all', function() { | ||
$('input[type="checkbox"]', this).not(':disabled').trigger('click'); | ||
}); | ||
} | ||
// Handle click on label node in heading containing "Select all" control | ||
// and in cell containing checkbox | ||
$tableContainer.on('click.dtCheckboxes', 'thead th.dt-checkboxes-select-all label, tbody td.dt-checkboxes-cell label', function(e) { | ||
// Prevent default behavior | ||
e.preventDefault(); | ||
}); | ||
// Handle click on "Select all" control in floating fixed header | ||
$(document).on('click.dtCheckboxes', '.fixedHeader-floating thead th.dt-checkboxes-select-all input[type="checkbox"]', function(e){ | ||
// If FixedHeader is enabled in this instance | ||
if(ctx._fixedHeader){ | ||
// If header is floating in this instance | ||
if(ctx._fixedHeader.dom['header'].floating){ | ||
self.onClickSelectAll(e, this); | ||
} | ||
// If row selection is disabled | ||
if(!hasCheckboxesSelectRow){ | ||
// Handle click on cell containing checkbox | ||
$tableContainer.on('click.dtCheckboxes', 'tbody td.dt-checkboxes-cell', function() { | ||
$('input[type="checkbox"]', this).not(':disabled').trigger('click'); | ||
}); | ||
} | ||
}); | ||
// Handle click on heading containing "Select all" control in floating fixed header | ||
$(document).on('click.dtCheckboxes', '.fixedHeader-floating thead th.dt-checkboxes-select-all', function(e) { | ||
// If FixedHeader is enabled in this instance | ||
if(ctx._fixedHeader){ | ||
// If header is floating in this instance | ||
if(ctx._fixedHeader.dom['header'].floating){ | ||
$('input[type="checkbox"]', this).trigger('click'); | ||
// Handle click on label node in heading containing "Select all" control | ||
// and in cell containing checkbox | ||
$tableContainer.on('click.dtCheckboxes', 'thead th.dt-checkboxes-select-all label, tbody td.dt-checkboxes-cell label', function(e) { | ||
// Prevent default behavior | ||
e.preventDefault(); | ||
}); | ||
// Handle click on "Select all" control in floating fixed header | ||
$(document).on('click.dtCheckboxes', '.fixedHeader-floating thead th.dt-checkboxes-select-all input[type="checkbox"]', function(e){ | ||
// If FixedHeader is enabled in this instance | ||
if(ctx._fixedHeader){ | ||
// If header is floating in this instance | ||
if(ctx._fixedHeader.dom['header'].floating){ | ||
self.onClickSelectAll(e, this); | ||
} | ||
} | ||
} | ||
}); | ||
}); | ||
// Handle table initialization event | ||
$table.on('init.dt.dtCheckboxes', function(){ | ||
// If server-side processing mode is not enabled | ||
// NOTE: Needed to avoid duplicate call to updateStateCheckboxes() in onDraw() | ||
if(!ctx.oFeatures.bServerSide){ | ||
// If state saving is enabled | ||
if(ctx.oFeatures.bStateSave){ | ||
self.updateState(); | ||
// Handle click on heading containing "Select all" control in floating fixed header | ||
$(document).on('click.dtCheckboxes', '.fixedHeader-floating thead th.dt-checkboxes-select-all', function() { | ||
// If FixedHeader is enabled in this instance | ||
if(ctx._fixedHeader){ | ||
// If header is floating in this instance | ||
if(ctx._fixedHeader.dom['header'].floating){ | ||
$('input[type="checkbox"]', this).trigger('click'); | ||
} | ||
} | ||
}); | ||
// Handle Ajax request completion event | ||
// NOTE: Needed to update table state | ||
// if table is reloaded via ajax.reload() API method | ||
$table.on('xhr.dt', function ( e, settings, json, xhr ) { | ||
// For every column where checkboxes are enabled | ||
$.each(self.s.columns, function(index, colIdx){ | ||
// Clear data | ||
self.s.data[colIdx] = {}; | ||
}); | ||
// Handle table initialization event | ||
$table.on('init.dt.dtCheckboxes', function(){ | ||
// If server-side processing mode is not enabled | ||
// NOTE: Needed to avoid duplicate call to updateStateCheckboxes() in onDraw() | ||
if(!ctx.oFeatures.bServerSide){ | ||
// If state saving is enabled | ||
if(ctx.oFeatures.bStateSave){ | ||
// Retrieve stored state | ||
var state = dt.state.loaded(); | ||
self.updateState(); | ||
} | ||
// Handle Ajax request completion event | ||
// NOTE: Needed to update table state | ||
// if table is reloaded via ajax.reload() API method | ||
$table.on('xhr.dt.dtCheckboxes', function ( /* e, settings , json, xhr */ ) { | ||
// For every column where checkboxes are enabled | ||
$.each(self.s.columns, function(index, colIdx){ | ||
// If state is loaded and contains data for this column | ||
if(state && state.checkboxes && state.checkboxes.hasOwnProperty(colIdx)){ | ||
// Load previous state | ||
self.s.data[colIdx] = state.checkboxes[colIdx]; | ||
// Clear data | ||
self.s.data[colIdx] = {}; | ||
self.s.dataDisabled[colIdx] = {}; | ||
}); | ||
// If state saving is enabled | ||
if(ctx.oFeatures.bStateSave){ | ||
// Retrieve stored state | ||
var state = dt.state.loaded(); | ||
// For every column where checkboxes are enabled | ||
$.each(self.s.columns, function(index, colIdx){ | ||
// If state is loaded and contains data for this column | ||
if(state && state.checkboxes && state.checkboxes.hasOwnProperty(colIdx)){ | ||
// If checkbox state saving is enabled | ||
if(ctx.aoColumns[colIdx].checkboxes.stateSave){ | ||
// Load previous state | ||
self.s.data[colIdx] = state.checkboxes[colIdx]; | ||
} | ||
} | ||
}); | ||
// Update table state on next redraw | ||
$table.one('draw.dt.dtCheckboxes', function(){ | ||
self.updateState(); | ||
}); | ||
} | ||
}); | ||
} | ||
// If state saving is enabled | ||
if(ctx.oFeatures.bStateSave){ | ||
// Handle state saving event | ||
$table.on('stateSaveParams.dt.dtCheckboxes', function (e, settings, data){ | ||
// Initialize array holding checkbox state for each column | ||
data.checkboxes = []; | ||
// For every column where checkboxes are enabled | ||
$.each(self.s.columns, function(index, colIdx){ | ||
// If checkbox state saving is enabled | ||
if(ctx.aoColumns[colIdx].checkboxes.stateSave){ | ||
// Store data associated with this plug-in | ||
data.checkboxes[colIdx] = self.s.data[colIdx]; | ||
} | ||
}); | ||
}); | ||
} | ||
}); | ||
// Update table state on next redraw | ||
$table.one('draw.dt.dtCheckboxes', function(e){ | ||
self.updateState(); | ||
}); | ||
} | ||
// Handle table destroy event | ||
$table.one('destroy.dt.dtCheckboxes', function(){ | ||
// Detach event handlers | ||
$(document).off('click.dtCheckboxes'); | ||
$tableContainer.on('.dtCheckboxes'); | ||
$tableBody.off('.dtCheckboxes'); | ||
$table.off('.dtCheckboxes'); | ||
// Clear data | ||
// | ||
// NOTE: Needed only to reduce memory footprint | ||
// in case user saves instance of DataTable object. | ||
self.s.data = {}; | ||
self.s.dataDisabled = {}; | ||
// Remove added elements | ||
$('.dt-checkboxes-select-all', $table).each(function(index, el){ | ||
$(el) | ||
.html($(el).data('html')) | ||
.removeClass('dt-checkboxes-select-all'); | ||
}); | ||
} | ||
}); | ||
} | ||
}, | ||
// Updates array holding data for selected checkboxes | ||
updateData: function(cells, colIdx, isSelected){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// If Checkboxes extension is enabled for this column | ||
if(ctx.aoColumns[colIdx].checkboxes){ | ||
var cellsData = cells.data(); | ||
cellsData.each(function(cellData){ | ||
// If checkbox is checked | ||
if(isSelected){ | ||
ctx.checkboxes.s.data[colIdx][cellData] = 1; | ||
// Otherwise, if checkbox is not checked | ||
} else { | ||
delete ctx.checkboxes.s.data[colIdx][cellData]; | ||
} | ||
}); | ||
// If state saving is enabled | ||
if(ctx.oFeatures.bStateSave){ | ||
// Handle state saving event | ||
$table.on('stateSaveParams.dt.dtCheckboxes', function (e, settings, data){ | ||
// Store data associated with this plug-in | ||
data.checkboxes = self.s.data; | ||
}); | ||
// If checkbox state saving is enabled | ||
if(ctx.aoColumns[colIdx].checkboxes.stateSave){ | ||
// Save state | ||
dt.state.save(); | ||
} | ||
} | ||
}); | ||
} | ||
}, | ||
// Handle table destroy event | ||
$table.one('destroy.dt.dtCheckboxes', function(e, settings){ | ||
// Detach event handlers | ||
$(document).off('click.dtCheckboxes'); | ||
$tableContainer.on('.dtCheckboxes'); | ||
$tableBody.off('.dtCheckboxes'); | ||
$table.off('.dtCheckboxes'); | ||
// Updates row selection | ||
updateSelect: function(selector, isSelected){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// Clear data | ||
// | ||
// NOTE: Needed only to reduce memory footprint | ||
// in case user saves instance of DataTable object. | ||
self.s.data = {}; | ||
// If Select extension is enabled | ||
if(ctx._select){ | ||
// Disable select event hanlder temporarily | ||
self.s.ignoreSelect = true; | ||
// Remove added elements | ||
$('.dt-checkboxes-select-all', $table).each(function(index, el){ | ||
$(el) | ||
.html($(el).data('html')) | ||
.removeClass('dt-checkboxes-select-all'); | ||
}); | ||
}); | ||
} | ||
}, | ||
// Updates array holding data for selected checkboxes | ||
updateData: function(cells, colIdx, isSelected){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// If Checkboxes extension is enabled for this column | ||
if(ctx.aoColumns[colIdx].checkboxes){ | ||
var cellsData = cells.data(); | ||
cellsData.each(function(cellData, index){ | ||
// If checkbox is checked | ||
if(isSelected){ | ||
ctx.checkboxes.s.data[colIdx][cellData] = 1; | ||
// Otherwise, if checkbox is not checked | ||
dt.rows(selector).select(); | ||
} else { | ||
delete ctx.checkboxes.s.data[colIdx][cellData]; | ||
dt.rows(selector).deselect(); | ||
} | ||
}); | ||
// If state saving is enabled | ||
if(ctx.oFeatures.bStateSave){ | ||
// Save state | ||
dt.state.save(); | ||
// Re-enable select event handler | ||
self.s.ignoreSelect = false; | ||
} | ||
} | ||
}, | ||
}, | ||
// Updates row selection | ||
updateSelect: function(selector, isSelected){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// Updates state of single checkbox | ||
updateCheckbox: function(cells, colIdx, isSelected){ | ||
var self = this; | ||
var ctx = self.s.ctx; | ||
// If Select extension is enabled | ||
if(ctx._select){ | ||
// Disable select event hanlder temporarily | ||
self.s.ignoreSelect = true; | ||
var cellNodes = cells.nodes(); | ||
if(cellNodes.length){ | ||
$('input.dt-checkboxes', cellNodes).not(':disabled').prop('checked', isSelected); | ||
if(isSelected){ | ||
dt.rows(selector).select(); | ||
} else { | ||
dt.rows(selector).deselect(); | ||
// If selectCallback is a function | ||
if($.isFunction(ctx.aoColumns[colIdx].checkboxes.selectCallback)){ | ||
ctx.aoColumns[colIdx].checkboxes.selectCallback(cellNodes, isSelected); | ||
} | ||
} | ||
}, | ||
// Re-enable select event handler | ||
self.s.ignoreSelect = false; | ||
} | ||
}, | ||
// Update table state | ||
updateState: function(){ | ||
var self = this; | ||
// Updates state of single checkbox | ||
updateCheckbox: function(cells, colIdx, isSelected){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
self.updateStateCheckboxes({ page: 'all', search: 'none' }); | ||
var cellNodes = cells.nodes(); | ||
if(cellNodes.length){ | ||
$('input.dt-checkboxes', cellNodes).not(':disabled').prop('checked', isSelected); | ||
$.each(self.s.columns, function(index, colIdx){ | ||
self.updateSelectAll(colIdx); | ||
}); | ||
}, | ||
// If selectCallback is a function | ||
if($.isFunction(ctx.aoColumns[colIdx].checkboxes.selectCallback)){ | ||
ctx.aoColumns[colIdx].checkboxes.selectCallback(cellNodes, isSelected); | ||
} | ||
} | ||
}, | ||
// Updates state of multiple checkboxes | ||
updateStateCheckboxes: function(opts){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// Update table state | ||
updateState: function(){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// Enumerate all cells | ||
dt.cells('tr', self.s.columns, opts).every(function(rowIdx, colIdx){ | ||
// Get cell data | ||
var cellData = this.data(); | ||
self.updateStateCheckboxes({ page: 'all', search: 'none' }); | ||
// Determine if checkbox in the cell can be selected | ||
var isCellSelectable = self.isCellSelectable(colIdx, cellData); | ||
$.each(self.s.columns, function(index, colIdx){ | ||
self.updateSelectAll(colIdx); | ||
}); | ||
}, | ||
// If checkbox is checked | ||
if(ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){ | ||
self.updateCheckbox(this, colIdx, true); | ||
// Updates state of multiple checkboxes | ||
updateStateCheckboxes: function(opts){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// If row selection is enabled | ||
// and checkbox can be checked | ||
if(ctx.aoColumns[colIdx].checkboxes.selectRow && isCellSelectable){ | ||
self.updateSelect(rowIdx, true); | ||
} | ||
} | ||
// Enumerate all cells | ||
dt.cells('tr', self.s.columns, opts).every(function(rowIdx, colIdx){ | ||
// Get cell data | ||
var cellData = this.data(); | ||
// If checkbox is disabled | ||
if(!isCellSelectable){ | ||
$('input.dt-checkboxes', this.node()).prop('disabled', true); | ||
} | ||
}); | ||
}, | ||
// Determine if checkbox in the cell can be checked | ||
var isCellSelectable = self.isCellSelectable(colIdx, cellData); | ||
// Handles checkbox click event | ||
onClick: function(e, ctrl){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// If checkbox is selected | ||
if(ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){ | ||
self.updateCheckbox(this, colIdx, true); | ||
var cellSelector; | ||
// If row selection is enabled | ||
// and checkbox can be checked | ||
if(ctx.aoColumns[colIdx].checkboxes.selectRow && isCellSelectable){ | ||
self.updateSelect(rowIdx, true); | ||
} | ||
} | ||
// Get cell | ||
var $cell = $(ctrl).closest('td'); | ||
// If checkbox is disabled | ||
if(!isCellSelectable){ | ||
$('input.dt-checkboxes', this.node()).prop('disabled', true); | ||
// If cell is in a fixed column using FixedColumns extension | ||
if($cell.parents('.DTFC_Cloned').length){ | ||
cellSelector = dt.fixedColumns().cellIndex($cell); | ||
} else { | ||
cellSelector = $cell; | ||
} | ||
}); | ||
}, | ||
// Handles checkbox click event | ||
onClick: function(e, ctrl){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
var cell = dt.cell(cellSelector); | ||
var cellIdx = cell.index(); | ||
var colIdx = cellIdx.column; | ||
var cellSelector; | ||
// If row selection is not enabled | ||
// NOTE: if row selection is enabled, checkbox selection/deselection | ||
// would be handled by onSelect event instead | ||
if(!ctx.aoColumns[colIdx].checkboxes.selectRow){ | ||
cell.checkboxes.select(ctrl.checked); | ||
// Get cell | ||
var $cell = $(ctrl).closest('td'); | ||
// Prevent click event from propagating to parent | ||
e.stopPropagation(); | ||
// If cell is in a fixed column using FixedColumns extension | ||
if($cell.parents('.DTFC_Cloned').length){ | ||
cellSelector = dt.fixedColumns().cellIndex($cell); | ||
} else { | ||
// WORKAROUND: | ||
// Select extension may keep the row selected | ||
// when checkbox is unchecked with SHIFT key. | ||
// | ||
// We need to update the state of the checkbox AFTER handling | ||
// select/deselect event from Select extension. | ||
// | ||
// Call to setTimeout is needed to let select/deselect event handler | ||
// update the data first. | ||
setTimeout(function(){ | ||
// Get cell data | ||
var cellData = cell.data(); | ||
} else { | ||
cellSelector = $cell; | ||
} | ||
// Determine whether data is in the list | ||
var hasData = self.s.data[colIdx].hasOwnProperty(cellData); | ||
var cell = dt.cell(cellSelector); | ||
var cellIdx = cell.index(); | ||
var colIdx = cellIdx.column; | ||
// If state of the checkbox needs to be updated | ||
if(hasData !== ctrl.checked){ | ||
self.updateCheckbox(cell, colIdx, hasData); | ||
self.updateSelectAll(colIdx); | ||
} | ||
}, 0); | ||
} | ||
}, | ||
// If row selection is not enabled | ||
// NOTE: if row selection is enabled, checkbox selection/deselection | ||
// would be handled by onSelect event instead | ||
if(!ctx.aoColumns[colIdx].checkboxes.selectRow){ | ||
cell.checkboxes.select(ctrl.checked); | ||
// Handles row select/deselect event | ||
onSelect: function(e, type, indexes){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
// Prevent click event from propagating to parent | ||
e.stopPropagation(); | ||
if(self.s.ignoreSelect){ return; } | ||
} else { | ||
// WORKAROUND: | ||
// Select extension may keep the row selected | ||
// when checkbox is unchecked with SHIFT key. | ||
// | ||
// We need to update the state of the checkbox AFTER handling | ||
// select/deselect event from Select extension. | ||
// | ||
// Call to setTimeout is needed to let select/deselect event handler | ||
// update the data first. | ||
setTimeout(function(){ | ||
// Get cell data | ||
var cellData = cell.data(); | ||
if(type === 'row'){ | ||
// Get index of the first column that has checkbox and row selection enabled | ||
var colIdx = self.getSelectRowColIndex(); | ||
if(colIdx !== null){ | ||
var cells = dt.cells(indexes, colIdx); | ||
// Determine whether data is in the list | ||
var hasData = self.s.data[colIdx].hasOwnProperty(cellData); | ||
// If state of the checkbox needs to be updated | ||
if(hasData !== ctrl.checked){ | ||
self.updateCheckbox(cell, colIdx, hasData); | ||
self.updateData(cells, colIdx, (e.type === 'select') ? true : false); | ||
self.updateCheckbox(cells, colIdx, (e.type === 'select') ? true : false); | ||
self.updateSelectAll(colIdx); | ||
} | ||
}, 0); | ||
} | ||
}, | ||
} | ||
}, | ||
// Handles row select/deselect event | ||
onSelect: function(e, type, indexes){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// Handles checkbox click event | ||
onClickSelectAll: function(e, ctrl){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
if(self.s.ignoreSelect){ return; } | ||
// Calculate column index | ||
var colIdx = null; | ||
var $th = $(ctrl).closest('th'); | ||
if(type === 'row'){ | ||
// Get index of the first column that has checkbox and row selection enabled | ||
var colIdx = self.getSelectRowColIndex(); | ||
if(colIdx !== null){ | ||
var cells = dt.cells(indexes, colIdx); | ||
self.updateData(cells, colIdx, (e.type === 'select') ? true : false); | ||
self.updateCheckbox(cells, colIdx, (e.type === 'select') ? true : false); | ||
self.updateSelectAll(colIdx); | ||
// If column is fixed using FixedColumns extension | ||
if($th.parents('.DTFC_Cloned').length){ | ||
var cellIdx = dt.fixedColumns().cellIndex($th); | ||
colIdx = cellIdx.column; | ||
} else { | ||
colIdx = dt.column($th).index(); | ||
} | ||
} | ||
}, | ||
// Handles checkbox click event | ||
onClickSelectAll: function(e, ctrl){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// Indicate that state of "Select all" control has been changed | ||
$(ctrl).data('is-changed', true); | ||
// Calculate column index | ||
var colIdx = null; | ||
var $th = $(ctrl).closest('th'); | ||
dt.column(colIdx, { | ||
page: ( | ||
(ctx.aoColumns[colIdx].checkboxes && ctx.aoColumns[colIdx].checkboxes.selectAllPages) | ||
? 'all' | ||
: 'current' | ||
), | ||
search: 'applied' | ||
}).checkboxes.select(ctrl.checked); | ||
// If column is fixed using FixedColumns extension | ||
if($th.parents('.DTFC_Cloned').length){ | ||
var cellIdx = dt.fixedColumns().cellIndex($th); | ||
colIdx = cellIdx.column; | ||
} else { | ||
colIdx = dt.column($th).index(); | ||
} | ||
// Prevent click event from propagating to parent | ||
e.stopPropagation(); | ||
}, | ||
dt.column(colIdx, { | ||
page: ( | ||
(ctx.aoColumns[colIdx].checkboxes && ctx.aoColumns[colIdx].checkboxes.selectAllPages) | ||
? 'all' | ||
: 'current' | ||
), | ||
search: 'applied' | ||
}).checkboxes.select(ctrl.checked); | ||
// Handles table draw event | ||
onDraw: function(){ | ||
var self = this; | ||
var ctx = self.s.ctx; | ||
// Prevent click event from propagating to parent | ||
e.stopPropagation(); | ||
}, | ||
// If server-side processing is enabled | ||
// or deferred render is enabled | ||
// | ||
// TODO: it's not optimal to update state of checkboxes | ||
// for already created rows in deferred rendering mode | ||
if(ctx.oFeatures.bServerSide || ctx.oFeatures.bDeferRender){ | ||
self.updateStateCheckboxes({ page: 'current', search: 'none' }); | ||
} | ||
// Handles table draw event | ||
onDraw: function(e){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
$.each(self.s.columns, function(index, colIdx){ | ||
self.updateSelectAll(colIdx); | ||
}); | ||
}, | ||
// If server-side processing is enabled | ||
// or deferred render is enabled | ||
// | ||
// TODO: it's not optimal to update state of checkboxes | ||
// for already created rows in deferred rendering mode | ||
if(ctx.oFeatures.bServerSide || ctx.oFeatures.bDeferRender){ | ||
self.updateStateCheckboxes({ page: 'current', search: 'none' }); | ||
} | ||
// Updates state of the "Select all" controls | ||
updateSelectAll: function(colIdx){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
$.each(self.s.columns, function(index, colIdx){ | ||
self.updateSelectAll(colIdx); | ||
}); | ||
}, | ||
// If Checkboxes extension is enabled for this column | ||
// and "Select all" control is enabled for this column | ||
if(ctx.aoColumns[colIdx].checkboxes && ctx.aoColumns[colIdx].checkboxes.selectAll){ | ||
var cells = dt.cells('tr', colIdx, { | ||
page: ( | ||
(ctx.aoColumns[colIdx].checkboxes.selectAllPages) | ||
? 'all' | ||
: 'current' | ||
), | ||
search: 'applied' | ||
}); | ||
// Updates state of the "Select all" controls | ||
updateSelectAll: function(colIdx){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
var $tableContainer = dt.table().container(); | ||
var $checkboxesSelectAll = $('.dt-checkboxes-select-all[data-col="' + colIdx + '"] input[type="checkbox"]', $tableContainer); | ||
// If Checkboxes extension is enabled for this column | ||
// and "Select all" control is enabled for this column | ||
if(ctx.aoColumns[colIdx].checkboxes && ctx.aoColumns[colIdx].checkboxes.selectAll){ | ||
var cells = dt.cells('tr', colIdx, { | ||
page: ( | ||
(ctx.aoColumns[colIdx].checkboxes.selectAllPages) | ||
? 'all' | ||
: 'current' | ||
), | ||
search: 'applied' | ||
}); | ||
var countChecked = 0; | ||
var countDisabled = 0; | ||
var cellsData = cells.data(); | ||
$.each(cellsData, function(index, cellData){ | ||
// If checkbox is not disabled | ||
if(self.isCellSelectable(colIdx, cellData)){ | ||
if(self.s.data[colIdx].hasOwnProperty(cellData)){ countChecked++; } | ||
var $tableContainer = dt.table().container(); | ||
var $checkboxesSelectAll = $('.dt-checkboxes-select-all[data-col="' + colIdx + '"] input[type="checkbox"]', $tableContainer); | ||
// Otherwise, if checkbox is disabled | ||
} else { | ||
countDisabled++; | ||
} | ||
}); | ||
var countChecked = 0; | ||
var cellsData = cells.data(); | ||
$.each(cellsData, function(index, cellData){ | ||
if(self.s.data[colIdx].hasOwnProperty(cellData)){ countChecked++; } | ||
}); | ||
// If FixedHeader is enabled in this instance | ||
if(ctx._fixedHeader){ | ||
// If header is floating in this instance | ||
if(ctx._fixedHeader.dom['header'].floating){ | ||
$checkboxesSelectAll = $('.fixedHeader-floating .dt-checkboxes-select-all[data-col="' + colIdx + '"] input[type="checkbox"]'); | ||
// If FixedHeader is enabled in this instance | ||
if(ctx._fixedHeader){ | ||
// If header is floating in this instance | ||
if(ctx._fixedHeader.dom['header'].floating){ | ||
$checkboxesSelectAll = $('.fixedHeader-floating .dt-checkboxes-select-all[data-col="' + colIdx + '"] input[type="checkbox"]'); | ||
} | ||
} | ||
} | ||
var isSelected; | ||
var isIndeterminate; | ||
var isSelected; | ||
var isIndeterminate; | ||
// If none of the checkboxes are checked | ||
if (countChecked === 0) { | ||
isSelected = false; | ||
isIndeterminate = false; | ||
// If none of the checkboxes are checked | ||
if (countChecked === 0){ | ||
isSelected = false; | ||
isIndeterminate = false; | ||
// If all of the checkboxes are checked | ||
} else if (countChecked === cellsData.length) { | ||
isSelected = true; | ||
isIndeterminate = false; | ||
// If all of the checkboxes are checked | ||
} else if ((countChecked + countDisabled) === cellsData.length){ | ||
isSelected = true; | ||
isIndeterminate = false; | ||
// If some of the checkboxes are checked | ||
} else { | ||
isSelected = true; | ||
isIndeterminate = true; | ||
} | ||
// If some of the checkboxes are checked | ||
} else { | ||
isSelected = true; | ||
isIndeterminate = true; | ||
} | ||
$checkboxesSelectAll.prop({ | ||
'checked': isSelected, | ||
'indeterminate': isIndeterminate | ||
}); | ||
var isChanged = $checkboxesSelectAll.data('is-changed'); | ||
var isSelectedNow = $checkboxesSelectAll.prop('checked'); | ||
var isIndeterminateNow = $checkboxesSelectAll.prop('indeterminate'); | ||
// If selectAllCallback is a function | ||
if($.isFunction(ctx.aoColumns[colIdx].checkboxes.selectAllCallback)){ | ||
ctx.aoColumns[colIdx].checkboxes.selectAllCallback($checkboxesSelectAll.closest('th').get(0), isSelected, isIndeterminate); | ||
} | ||
} | ||
}, | ||
// If state of "Select all" control has been changed | ||
if(isChanged || isSelectedNow !== isSelected || isIndeterminateNow !== isIndeterminate){ | ||
// Reset "Select all" control state flag | ||
$checkboxesSelectAll.data('is-changed', false); | ||
// Updates the information element of the DataTable showing information about the | ||
// items selected. Based on info() method of Select extension. | ||
showInfoSelected: function(){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
$checkboxesSelectAll.prop({ | ||
'checked': isSelected, | ||
'indeterminate': isIndeterminate | ||
}); | ||
if ( ! ctx.aanFeatures.i ) { | ||
return; | ||
} | ||
// If selectAllCallback is a function | ||
if($.isFunction(ctx.aoColumns[colIdx].checkboxes.selectAllCallback)){ | ||
ctx.aoColumns[colIdx].checkboxes.selectAllCallback($checkboxesSelectAll.closest('th').get(0), isSelected, isIndeterminate); | ||
} | ||
} | ||
} | ||
}, | ||
var $output = $('<span class="select-info"/>'); | ||
var add = function(name, num){ | ||
$output.append( $('<span class="select-item"/>').append( dt.i18n( | ||
'select.'+name+'s', | ||
{ _: '%d '+name+'s selected', 0: '', 1: '1 '+name+' selected' }, | ||
num | ||
) ) ); | ||
}; | ||
// Updates the information element of the DataTable showing information about the | ||
// items selected. Based on info() method of Select extension. | ||
showInfoSelected: function(){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// Get index of the first column that has checkbox and row selection enabled | ||
var colIdx = self.getSelectRowColIndex(); | ||
// If there is a column that has checkbox and row selection enabled | ||
if(colIdx !== null){ | ||
// Count number of selected rows | ||
var countRows = 0; | ||
for (var cellData in ctx.checkboxes.s.data[colIdx]){ | ||
if (ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){ | ||
countRows++; | ||
} | ||
if ( ! ctx.aanFeatures.i ) { | ||
return; | ||
} | ||
add('row', countRows); | ||
var $output = $('<span class="select-info"/>'); | ||
var add = function(name, num){ | ||
$output.append( $('<span class="select-item"/>').append( dt.i18n( | ||
'select.'+name+'s', | ||
{ _: '%d '+name+'s selected', 0: '', 1: '1 '+name+' selected' }, | ||
num | ||
) ) ); | ||
}; | ||
// Internal knowledge of DataTables to loop over all information elements | ||
$.each( ctx.aanFeatures.i, function ( i, el ) { | ||
var $el = $(el); | ||
// Get index of the first column that has checkbox and row selection enabled | ||
var colIdx = self.getSelectRowColIndex(); | ||
var $existing = $el.children('span.select-info'); | ||
if($existing.length){ | ||
$existing.remove(); | ||
// If there is a column that has checkbox and row selection enabled | ||
if(colIdx !== null){ | ||
// Count number of selected rows | ||
var countRows = 0; | ||
for (var cellData in ctx.checkboxes.s.data[colIdx]){ | ||
if (ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){ | ||
countRows++; | ||
} | ||
} | ||
if($output.text() !== ''){ | ||
$el.append($output); | ||
} | ||
}); | ||
} | ||
}, | ||
add('row', countRows); | ||
// Determines whether checkbox in the cell can be checked | ||
isCellSelectable: function(colIdx, cellData){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// Internal knowledge of DataTables to loop over all information elements | ||
$.each( ctx.aanFeatures.i, function ( i, el ) { | ||
var $el = $(el); | ||
// If data is in the list of disabled elements | ||
if(ctx.checkboxes.s.dataDisabled[colIdx].hasOwnProperty(cellData)){ | ||
return false; | ||
var $existing = $el.children('span.select-info'); | ||
if($existing.length){ | ||
$existing.remove(); | ||
} | ||
// Otherwise, if checkbox can be selected | ||
} else { | ||
return true; | ||
} | ||
}, | ||
if($output.text() !== ''){ | ||
$el.append($output); | ||
} | ||
}); | ||
} | ||
}, | ||
// Gets cell index | ||
getCellIndex: function(cell){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// Determines whether checkbox in the cell can be checked | ||
isCellSelectable: function(colIdx, cellData){ | ||
var self = this; | ||
var ctx = self.s.ctx; | ||
// If FixedColumns extension is available | ||
if(ctx._oFixedColumns){ | ||
return dt.fixedColumns().cellIndex(cell); | ||
// If data is in the list of disabled elements | ||
if(ctx.checkboxes.s.dataDisabled[colIdx].hasOwnProperty(cellData)){ | ||
return false; | ||
} else { | ||
return dt.cell(cell).index(); | ||
} | ||
}, | ||
// Otherwise, if checkbox can be selected | ||
} else { | ||
return true; | ||
} | ||
}, | ||
// Gets index of the first column that has checkbox and row selection enabled | ||
getSelectRowColIndex: function(){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
// Gets cell index | ||
getCellIndex: function(cell){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
var colIdx = null; | ||
// If FixedColumns extension is available | ||
if(ctx._oFixedColumns){ | ||
return dt.fixedColumns().cellIndex(cell); | ||
for(var i = 0; i < ctx.aoColumns.length; i++){ | ||
// If Checkboxes extension is enabled | ||
// and row selection is enabled for this column | ||
if(ctx.aoColumns[i].checkboxes && ctx.aoColumns[i].checkboxes.selectRow){ | ||
colIdx = i; | ||
break; | ||
} else { | ||
return dt.cell(cell).index(); | ||
} | ||
} | ||
}, | ||
return colIdx; | ||
}, | ||
// Gets index of the first column that has checkbox and row selection enabled | ||
getSelectRowColIndex: function(){ | ||
var self = this; | ||
var ctx = self.s.ctx; | ||
// Updates fixed column if FixedColumns extension is enabled | ||
// and given column is inside a fixed column | ||
updateFixedColumn: function(colIdx){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
var colIdx = null; | ||
// If FixedColumns extension is enabled | ||
if(ctx._oFixedColumns){ | ||
var leftCols = ctx._oFixedColumns.s.iLeftColumns; | ||
var rightCols = ctx.aoColumns.length - ctx._oFixedColumns.s.iRightColumns - 1; | ||
if (colIdx < leftCols || colIdx > rightCols){ | ||
dt.fixedColumns().update(); | ||
} | ||
} | ||
} | ||
}; | ||
for(var i = 0; i < ctx.aoColumns.length; i++){ | ||
// If Checkboxes extension is enabled | ||
// and row selection is enabled for this column | ||
if(ctx.aoColumns[i].checkboxes && ctx.aoColumns[i].checkboxes.selectRow){ | ||
colIdx = i; | ||
break; | ||
} | ||
} | ||
return colIdx; | ||
}, | ||
/** | ||
* Checkboxes default settings for initialisation | ||
* | ||
* @namespace | ||
* @name Checkboxes.defaults | ||
* @static | ||
*/ | ||
Checkboxes.defaults = { | ||
/** | ||
* Enable / disable row selection | ||
* | ||
* @type {Boolean} | ||
* @default `false` | ||
*/ | ||
selectRow: false, | ||
// Updates fixed column if FixedColumns extension is enabled | ||
// and given column is inside a fixed column | ||
updateFixedColumn: function(colIdx){ | ||
var self = this; | ||
var dt = self.s.dt; | ||
var ctx = self.s.ctx; | ||
/** | ||
* Enable / disable "select all" control in the header | ||
* | ||
* @type {Boolean} | ||
* @default `true` | ||
*/ | ||
selectAll: true, | ||
// If FixedColumns extension is enabled | ||
if(ctx._oFixedColumns){ | ||
var leftCols = ctx._oFixedColumns.s.iLeftColumns; | ||
var rightCols = ctx.aoColumns.length - ctx._oFixedColumns.s.iRightColumns - 1; | ||
if (colIdx < leftCols || colIdx > rightCols){ | ||
dt.fixedColumns().update(); | ||
} | ||
} | ||
} | ||
}; | ||
/** | ||
* Enable / disable ability to select checkboxes from all pages | ||
* | ||
* @type {Boolean} | ||
* @default `true` | ||
*/ | ||
selectAllPages: true, | ||
/** | ||
* Checkbox select/deselect callback | ||
* | ||
* @type {Function} | ||
* @default `null` | ||
*/ | ||
selectCallback: null, | ||
* Checkboxes default settings for initialisation | ||
* | ||
* @namespace | ||
* @name Checkboxes.defaults | ||
* @static | ||
*/ | ||
Checkboxes.defaults = { | ||
/** | ||
* Enable / disable checkbox state loading/saving if state saving is enabled globally | ||
* | ||
* @type {Boolean} | ||
* @default `true` | ||
*/ | ||
stateSave: true, | ||
/** | ||
* "Select all" control select/deselect callback | ||
* | ||
* @type {Function} | ||
* @default `null` | ||
*/ | ||
selectAllCallback: null, | ||
/** | ||
* Enable / disable row selection | ||
* | ||
* @type {Boolean} | ||
* @default `false` | ||
*/ | ||
selectRow: false, | ||
/** | ||
* "Select all" control markup | ||
* | ||
* @type {mixed} | ||
* @default `<input type="checkbox">` | ||
*/ | ||
selectAllRender: '<input type="checkbox">' | ||
}; | ||
/** | ||
* Enable / disable "select all" control in the header | ||
* | ||
* @type {Boolean} | ||
* @default `true` | ||
*/ | ||
selectAll: true, | ||
/** | ||
* Enable / disable ability to select checkboxes from all pages | ||
* | ||
* @type {Boolean} | ||
* @default `true` | ||
*/ | ||
selectAllPages: true, | ||
/* | ||
* API | ||
*/ | ||
var Api = $.fn.dataTable.Api; | ||
/** | ||
* Checkbox select/deselect callback | ||
* | ||
* @type {Function} | ||
* @default `null` | ||
*/ | ||
selectCallback: null, | ||
// Doesn't do anything - work around for a bug in DT... Not documented | ||
Api.register( 'checkboxes()', function () { | ||
return this; | ||
} ); | ||
/** | ||
* "Select all" control select/deselect callback | ||
* | ||
* @type {Function} | ||
* @default `null` | ||
*/ | ||
selectAllCallback: null, | ||
Api.registerPlural( 'columns().checkboxes.select()', 'column().checkboxes.select()', function ( state ) { | ||
if(typeof state === 'undefined'){ state = true; } | ||
/** | ||
* "Select all" control markup | ||
* | ||
* @type {mixed} | ||
* @default `<input type="checkbox">` | ||
*/ | ||
selectAllRender: '<input type="checkbox">' | ||
}; | ||
return this.iterator( 'column-rows', function ( ctx, colIdx, i, j, rowsIdx ) { | ||
if(ctx.checkboxes){ | ||
// Prepare a list of all cells | ||
var selector = []; | ||
$.each(rowsIdx, function(index, rowIdx){ | ||
selector.push({ row: rowIdx, column: colIdx }); | ||
}); | ||
var cells = this.cells(selector); | ||
var cellsData = cells.data(); | ||
/* | ||
* API | ||
*/ | ||
var Api = $.fn.dataTable.Api; | ||
// Prepare a list of cells that contain checkboxes that can be selected | ||
var rowsSelectableIdx = []; | ||
selector = []; | ||
$.each(cellsData, function(index, cellData){ | ||
// If checkbox in the cell can be checked | ||
if(ctx.checkboxes.isCellSelectable(colIdx, cellData)){ | ||
selector.push({ row: rowsIdx[index], column: colIdx }); | ||
rowsSelectableIdx.push(rowsIdx[index]); | ||
} | ||
}); | ||
// Doesn't do anything - work around for a bug in DT... Not documented | ||
Api.register( 'checkboxes()', function () { | ||
return this; | ||
} ); | ||
cells = this.cells(selector); | ||
Api.registerPlural( 'columns().checkboxes.select()', 'column().checkboxes.select()', function ( state ) { | ||
if(typeof state === 'undefined'){ state = true; } | ||
ctx.checkboxes.updateData(cells, colIdx, state); | ||
ctx.checkboxes.updateCheckbox(cells, colIdx, state); | ||
return this.iterator( 'column-rows', function ( ctx, colIdx, i, j, rowsIdx ) { | ||
// If Checkboxes extension is enabled for this column | ||
if(ctx.aoColumns[colIdx].checkboxes){ | ||
// Prepare a list of all cells | ||
var selector = []; | ||
$.each(rowsIdx, function(index, rowIdx){ | ||
selector.push({ row: rowIdx, column: colIdx }); | ||
}); | ||
// If row selection is enabled | ||
if(ctx.aoColumns[colIdx].checkboxes.selectRow){ | ||
ctx.checkboxes.updateSelect(rowsSelectableIdx, state); | ||
} | ||
var cells = this.cells(selector); | ||
var cellsData = cells.data(); | ||
// If FixedColumns extension is enabled | ||
if(ctx._oFixedColumns){ | ||
// Use timeout to let FixedColumns construct the header | ||
// before we update the "Select all" checkbox | ||
setTimeout(function(){ ctx.checkboxes.updateSelectAll(colIdx); }, 0); | ||
// Prepare a list of cells that contain checkboxes that can be selected | ||
var rowsSelectableIdx = []; | ||
selector = []; | ||
$.each(cellsData, function(index, cellData){ | ||
// If checkbox in the cell can be selected | ||
if(ctx.checkboxes.isCellSelectable(colIdx, cellData)){ | ||
selector.push({ row: rowsIdx[index], column: colIdx }); | ||
rowsSelectableIdx.push(rowsIdx[index]); | ||
} | ||
}); | ||
} else { | ||
ctx.checkboxes.updateSelectAll(colIdx); | ||
} | ||
cells = this.cells(selector); | ||
ctx.checkboxes.updateFixedColumn(colIdx); | ||
} | ||
}, 1 ); | ||
} ); | ||
Api.registerPlural( 'cells().checkboxes.select()', 'cell().checkboxes.select()', function ( state ) { | ||
if(typeof state === 'undefined'){ state = true; } | ||
return this.iterator( 'cell', function ( ctx, rowIdx, colIdx ) { | ||
if(ctx.checkboxes){ | ||
var cells = this.cells([{ row: rowIdx, column: colIdx }]); | ||
var cellData = this.cell({ row: rowIdx, column: colIdx }).data(); | ||
// If checkbox in the cell can be checked | ||
if(ctx.checkboxes.isCellSelectable(colIdx, cellData)){ | ||
ctx.checkboxes.updateData(cells, colIdx, state); | ||
@@ -986,3 +998,3 @@ ctx.checkboxes.updateCheckbox(cells, colIdx, state); | ||
if(ctx.aoColumns[colIdx].checkboxes.selectRow){ | ||
ctx.checkboxes.updateSelect(rowIdx, state); | ||
ctx.checkboxes.updateSelect(rowsSelectableIdx, state); | ||
} | ||
@@ -1002,119 +1014,170 @@ | ||
} | ||
} | ||
}, 1 ); | ||
} ); | ||
}, 1 ); | ||
} ); | ||
Api.registerPlural( 'cells().checkboxes.enable()', 'cell().checkboxes.enable()', function ( state ) { | ||
if(typeof state === 'undefined'){ state = true; } | ||
Api.registerPlural( 'cells().checkboxes.select()', 'cell().checkboxes.select()', function ( state ) { | ||
if(typeof state === 'undefined'){ state = true; } | ||
return this.iterator( 'cell', function ( ctx, rowIdx, colIdx ) { | ||
if(ctx.checkboxes){ | ||
var cell = this.cell({ row: rowIdx, column: colIdx }); | ||
return this.iterator( 'cell', function ( ctx, rowIdx, colIdx ) { | ||
// If Checkboxes extension is enabled for this column | ||
if(ctx.aoColumns[colIdx].checkboxes){ | ||
var cells = this.cells([{ row: rowIdx, column: colIdx }]); | ||
var cellData = this.cell({ row: rowIdx, column: colIdx }).data(); | ||
// Get cell data | ||
var cellData = cell.data(); | ||
// If checkbox in the cell can be selected | ||
if(ctx.checkboxes.isCellSelectable(colIdx, cellData)){ | ||
ctx.checkboxes.updateData(cells, colIdx, state); | ||
ctx.checkboxes.updateCheckbox(cells, colIdx, state); | ||
// If checkbox should be enabled | ||
if(state){ | ||
delete ctx.checkboxes.s.dataDisabled[colIdx][cellData]; | ||
// If row selection is enabled | ||
if(ctx.aoColumns[colIdx].checkboxes.selectRow){ | ||
ctx.checkboxes.updateSelect(rowIdx, state); | ||
} | ||
// Otherwise, if checkbox should be disabled | ||
} else { | ||
ctx.checkboxes.s.dataDisabled[colIdx][cellData] = 1; | ||
} | ||
// If FixedColumns extension is enabled | ||
if(ctx._oFixedColumns){ | ||
// Use timeout to let FixedColumns construct the header | ||
// before we update the "Select all" checkbox | ||
setTimeout(function(){ ctx.checkboxes.updateSelectAll(colIdx); }, 0); | ||
// Determine if cell node is available | ||
// (deferRender is not enabled or cell has been already created) | ||
var cellNode = cell.node(); | ||
if(cellNode){ | ||
$('input.dt-checkboxes', cellNode).prop('disabled', !state); | ||
} | ||
} else { | ||
ctx.checkboxes.updateSelectAll(colIdx); | ||
} | ||
// If row selection is enabled | ||
// and checkbox can be checked | ||
if(ctx.aoColumns[colIdx].checkboxes.selectRow){ | ||
// If data is in the list | ||
if(ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){ | ||
// Update selection based on current state: | ||
// if checkbox is enabled then select row; | ||
// otherwise, deselect row | ||
ctx.checkboxes.updateSelect(rowIdx, state); | ||
ctx.checkboxes.updateFixedColumn(colIdx); | ||
} | ||
} | ||
} | ||
}, 1 ); | ||
} ); | ||
}, 1 ); | ||
} ); | ||
Api.registerPlural( 'cells().checkboxes.disable()', 'cell().checkboxes.disable()', function ( state ) { | ||
if(typeof state === 'undefined'){ state = true; } | ||
return this.checkboxes.enable(!state); | ||
} ); | ||
Api.registerPlural( 'cells().checkboxes.enable()', 'cell().checkboxes.enable()', function ( state ) { | ||
if(typeof state === 'undefined'){ state = true; } | ||
Api.registerPlural( 'columns().checkboxes.deselect()', 'column().checkboxes.deselect()', function ( state ) { | ||
if(typeof state === 'undefined'){ state = true; } | ||
return this.checkboxes.select(!state); | ||
} ); | ||
return this.iterator( 'cell', function ( ctx, rowIdx, colIdx ) { | ||
// If Checkboxes extension is enabled for this column | ||
if(ctx.aoColumns[colIdx].checkboxes){ | ||
var cell = this.cell({ row: rowIdx, column: colIdx }); | ||
Api.registerPlural( 'cells().checkboxes.deselect()', 'cell().checkboxes.deselect()', function ( state ) { | ||
if(typeof state === 'undefined'){ state = true; } | ||
return this.checkboxes.select(!state); | ||
} ); | ||
// Get cell data | ||
var cellData = cell.data(); | ||
Api.registerPlural( 'columns().checkboxes.deselectAll()', 'column().checkboxes.deselectAll()', function () { | ||
return this.iterator( 'column', function (ctx, colIdx){ | ||
// If Checkboxes extension is enabled for this column | ||
if(ctx.aoColumns[colIdx].checkboxes){ | ||
ctx.checkboxes.s.data[colIdx] = {}; | ||
// If checkbox should be enabled | ||
if(state){ | ||
delete ctx.checkboxes.s.dataDisabled[colIdx][cellData]; | ||
this.column(colIdx).checkboxes.select(false); | ||
} | ||
}, 1 ); | ||
} ); | ||
// Otherwise, if checkbox should be disabled | ||
} else { | ||
ctx.checkboxes.s.dataDisabled[colIdx][cellData] = 1; | ||
} | ||
Api.registerPlural( 'columns().checkboxes.selected()', 'column().checkboxes.selected()', function () { | ||
return this.iterator( 'column', function (ctx, colIdx){ | ||
if(ctx.aoColumns[colIdx].checkboxes){ | ||
var data = []; | ||
// Determine if cell node is available | ||
// (deferRender is not enabled or cell has been already created) | ||
var cellNode = cell.node(); | ||
if(cellNode){ | ||
$('input.dt-checkboxes', cellNode).prop('disabled', !state); | ||
} | ||
$.each(ctx.checkboxes.s.data[colIdx], function(cellData, countRows){ | ||
// If checkbox in the cell can be checked | ||
if(ctx.checkboxes.isCellSelectable(colIdx, cellData)){ | ||
data.push(cellData); | ||
// If row selection is enabled | ||
// and checkbox can be checked | ||
if(ctx.aoColumns[colIdx].checkboxes.selectRow){ | ||
// If data is in the list | ||
if(ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){ | ||
// Update selection based on current state: | ||
// if checkbox is enabled then select row; | ||
// otherwise, deselect row | ||
ctx.checkboxes.updateSelect(rowIdx, state); | ||
} | ||
} | ||
}); | ||
} | ||
}, 1 ); | ||
} ); | ||
return data; | ||
} else { | ||
return []; | ||
} | ||
}, 1 ); | ||
} ); | ||
Api.registerPlural( 'cells().checkboxes.disable()', 'cell().checkboxes.disable()', function ( state ) { | ||
if(typeof state === 'undefined'){ state = true; } | ||
return this.checkboxes.enable(!state); | ||
} ); | ||
Api.registerPlural( 'columns().checkboxes.deselect()', 'column().checkboxes.deselect()', function ( state ) { | ||
if(typeof state === 'undefined'){ state = true; } | ||
return this.checkboxes.select(!state); | ||
} ); | ||
/** | ||
* Version information | ||
* | ||
* @name Checkboxes.version | ||
* @static | ||
*/ | ||
Checkboxes.version = '1.2.9'; | ||
Api.registerPlural( 'cells().checkboxes.deselect()', 'cell().checkboxes.deselect()', function ( state ) { | ||
if(typeof state === 'undefined'){ state = true; } | ||
return this.checkboxes.select(!state); | ||
} ); | ||
Api.registerPlural( 'columns().checkboxes.deselectAll()', 'column().checkboxes.deselectAll()', function () { | ||
return this.iterator( 'column', function (ctx, colIdx){ | ||
// If Checkboxes extension is enabled for this column | ||
if(ctx.aoColumns[colIdx].checkboxes){ | ||
ctx.checkboxes.s.data[colIdx] = {}; | ||
this.column(colIdx).checkboxes.select(false); | ||
} | ||
}, 1 ); | ||
} ); | ||
$.fn.DataTable.Checkboxes = Checkboxes; | ||
$.fn.dataTable.Checkboxes = Checkboxes; | ||
Api.registerPlural( 'columns().checkboxes.selected()', 'column().checkboxes.selected()', function () { | ||
return this.iterator( 'column-rows', function ( ctx, colIdx, i, j, rowsIdx ) { | ||
// If Checkboxes extension is enabled for this column | ||
if(ctx.aoColumns[colIdx].checkboxes){ | ||
// Prepare a list of all cells | ||
var selector = []; | ||
$.each(rowsIdx, function(index, rowIdx){ | ||
selector.push({ row: rowIdx, column: colIdx }); | ||
}); | ||
// Get all cells data | ||
var cells = this.cells(selector); | ||
var cellsData = cells.data(); | ||
// Attach a listener to the document which listens for DataTables initialisation | ||
// events so we can automatically initialise | ||
$(document).on( 'preInit.dt.dtCheckboxes', function (e, settings, json) { | ||
if ( e.namespace !== 'dt' ) { | ||
return; | ||
} | ||
var data = []; | ||
new Checkboxes( settings ); | ||
} ); | ||
// Enumerate all cells data | ||
$.each(cellsData, function(index, cellData){ | ||
// If checkbox is checked | ||
if(ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){ | ||
// If checkbox in the cell can be selected | ||
if(ctx.checkboxes.isCellSelectable(colIdx, cellData)){ | ||
data.push(cellData); | ||
} | ||
} | ||
}); | ||
return data; | ||
return Checkboxes; | ||
} else { | ||
return []; | ||
} | ||
}, 1 ); | ||
} ); | ||
/** | ||
* Version information | ||
* | ||
* @name Checkboxes.version | ||
* @static | ||
*/ | ||
Checkboxes.version = '1.2.10'; | ||
$.fn.DataTable.Checkboxes = Checkboxes; | ||
$.fn.dataTable.Checkboxes = Checkboxes; | ||
// Attach a listener to the document which listens for DataTables initialisation | ||
// events so we can automatically initialise | ||
$(document).on( 'preInit.dt.dtCheckboxes', function (e, settings /*, json */ ) { | ||
if ( e.namespace !== 'dt' ) { | ||
return; | ||
} | ||
new Checkboxes( settings ); | ||
} ); | ||
return Checkboxes; | ||
})); |
@@ -1,5 +0,5 @@ | ||
/*! Checkboxes 1.2.9 | ||
/*! Checkboxes 1.2.10 | ||
* Copyright (c) Gyrocode (www.gyrocode.com) | ||
* License: MIT License | ||
*/ | ||
(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){var DataTable=$.fn.dataTable;var Checkboxes=function(settings){if(!DataTable.versionCheck||!DataTable.versionCheck("1.10.8")){throw"DataTables Checkboxes requires DataTables 1.10.8 or newer";}this.s={dt:new DataTable.Api(settings),columns:[],data:{},dataDisabled:{},ignoreSelect:false};this.s.ctx=this.s.dt.settings()[0];if(this.s.ctx.checkboxes){return;}settings.checkboxes=this;this._constructor();};Checkboxes.prototype={_constructor:function(){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;var hasCheckboxes=false;var hasCheckboxesSelectRow=false;var state=dt.state.loaded();for(var i=0;i<ctx.aoColumns.length;i++){if(ctx.aoColumns[i].checkboxes){var $colHeader=$(dt.column(i).header());hasCheckboxes=true;if(!$.isPlainObject(ctx.aoColumns[i].checkboxes)){ctx.aoColumns[i].checkboxes={};}ctx.aoColumns[i].checkboxes=$.extend({},Checkboxes.defaults,ctx.aoColumns[i].checkboxes);var colOptions={"searchable":false,"orderable":false};if(ctx.aoColumns[i].sClass===""){colOptions["className"]="dt-checkboxes-cell";}else{colOptions["className"]=ctx.aoColumns[i].sClass+" dt-checkboxes-cell";}if(ctx.aoColumns[i].sWidthOrig===null){colOptions["width"]="1%";}if(ctx.aoColumns[i].mRender===null){colOptions["render"]=function(){return'<input type="checkbox" class="dt-checkboxes">';};}DataTable.ext.internal._fnColumnOptions(ctx,i,colOptions);$colHeader.removeClass("sorting");$colHeader.off(".dt");if(ctx.sAjaxSource===null){var cells=dt.cells("tr",i);cells.invalidate("data");$(cells.nodes()).addClass(colOptions["className"]);}self.s.data[i]={};self.s.dataDisabled[i]={};if(state&&state.checkboxes&&state.checkboxes.hasOwnProperty(i)){self.s.data[i]=state.checkboxes[i];}self.s.columns.push(i);if(ctx.aoColumns[i].checkboxes.selectRow){if(ctx._select){hasCheckboxesSelectRow=true;}else{ctx.aoColumns[i].checkboxes.selectRow=false;}}if(ctx.aoColumns[i].checkboxes.selectAll){$colHeader.data("html",$colHeader.html());if(ctx.aoColumns[i].checkboxes.selectAllRender!==null){var selectAllHtml="";if($.isFunction(ctx.aoColumns[i].checkboxes.selectAllRender)){selectAllHtml=ctx.aoColumns[i].checkboxes.selectAllRender();}else{if(typeof ctx.aoColumns[i].checkboxes.selectAllRender==="string"){selectAllHtml=ctx.aoColumns[i].checkboxes.selectAllRender;}}$colHeader.html(selectAllHtml).addClass("dt-checkboxes-select-all").attr("data-col",i);}}}}if(hasCheckboxes){var $table=$(dt.table().node());var $tableBody=$(dt.table().body());var $tableContainer=$(dt.table().container());if(hasCheckboxesSelectRow){$table.addClass("dt-checkboxes-select");$table.on("user-select.dt.dtCheckboxes",function(e,dt,type,cell,originalEvent){var cellIdx=cell.index();var rowIdx=cellIdx.row;var colIdx=self.getSelectRowColIndex();var cellData=dt.cell({row:rowIdx,column:colIdx}).data();if(!self.isCellSelectable(colIdx,cellData)){e.preventDefault();}});$table.on("select.dt.dtCheckboxes deselect.dt.dtCheckboxes",function(e,api,type,indexes){self.onSelect(e,type,indexes);});dt.select.info(false);$table.on("draw.dt.dtCheckboxes select.dt.dtCheckboxes deselect.dt.dtCheckboxes",function(){self.showInfoSelected();});}$table.on("draw.dt.dtCheckboxes",function(e){self.onDraw(e);});$tableBody.on("click.dtCheckboxes","input.dt-checkboxes",function(e){self.onClick(e,this);});$tableContainer.on("click.dtCheckboxes",'thead th.dt-checkboxes-select-all input[type="checkbox"]',function(e){self.onClickSelectAll(e,this);});$tableContainer.on("click.dtCheckboxes","thead th.dt-checkboxes-select-all",function(e){$('input[type="checkbox"]',this).not(":disabled").trigger("click");});if(!hasCheckboxesSelectRow){$tableContainer.on("click.dtCheckboxes","tbody td.dt-checkboxes-cell",function(e){$('input[type="checkbox"]',this).not(":disabled").trigger("click");});}$tableContainer.on("click.dtCheckboxes","thead th.dt-checkboxes-select-all label, tbody td.dt-checkboxes-cell label",function(e){e.preventDefault();});$(document).on("click.dtCheckboxes",'.fixedHeader-floating thead th.dt-checkboxes-select-all input[type="checkbox"]',function(e){if(ctx._fixedHeader){if(ctx._fixedHeader.dom["header"].floating){self.onClickSelectAll(e,this);}}});$(document).on("click.dtCheckboxes",".fixedHeader-floating thead th.dt-checkboxes-select-all",function(e){if(ctx._fixedHeader){if(ctx._fixedHeader.dom["header"].floating){$('input[type="checkbox"]',this).trigger("click");}}});$table.on("init.dt.dtCheckboxes",function(){if(!ctx.oFeatures.bServerSide){if(ctx.oFeatures.bStateSave){self.updateState();}$table.on("xhr.dt",function(e,settings,json,xhr){$.each(self.s.columns,function(index,colIdx){self.s.data[colIdx]={};});if(ctx.oFeatures.bStateSave){var state=dt.state.loaded();$.each(self.s.columns,function(index,colIdx){if(state&&state.checkboxes&&state.checkboxes.hasOwnProperty(colIdx)){self.s.data[colIdx]=state.checkboxes[colIdx];}});$table.one("draw.dt.dtCheckboxes",function(e){self.updateState();});}});}if(ctx.oFeatures.bStateSave){$table.on("stateSaveParams.dt.dtCheckboxes",function(e,settings,data){data.checkboxes=self.s.data;});}});$table.one("destroy.dt.dtCheckboxes",function(e,settings){$(document).off("click.dtCheckboxes");$tableContainer.on(".dtCheckboxes");$tableBody.off(".dtCheckboxes");$table.off(".dtCheckboxes");self.s.data={};$(".dt-checkboxes-select-all",$table).each(function(index,el){$(el).html($(el).data("html")).removeClass("dt-checkboxes-select-all");});});}},updateData:function(cells,colIdx,isSelected){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(ctx.aoColumns[colIdx].checkboxes){var cellsData=cells.data();cellsData.each(function(cellData,index){if(isSelected){ctx.checkboxes.s.data[colIdx][cellData]=1;}else{delete ctx.checkboxes.s.data[colIdx][cellData];}});if(ctx.oFeatures.bStateSave){dt.state.save();}}},updateSelect:function(selector,isSelected){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(ctx._select){self.s.ignoreSelect=true;if(isSelected){dt.rows(selector).select();}else{dt.rows(selector).deselect();}self.s.ignoreSelect=false;}},updateCheckbox:function(cells,colIdx,isSelected){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;var cellNodes=cells.nodes();if(cellNodes.length){$("input.dt-checkboxes",cellNodes).not(":disabled").prop("checked",isSelected);if($.isFunction(ctx.aoColumns[colIdx].checkboxes.selectCallback)){ctx.aoColumns[colIdx].checkboxes.selectCallback(cellNodes,isSelected);}}},updateState:function(){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;self.updateStateCheckboxes({page:"all",search:"none"});$.each(self.s.columns,function(index,colIdx){self.updateSelectAll(colIdx);});},updateStateCheckboxes:function(opts){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;dt.cells("tr",self.s.columns,opts).every(function(rowIdx,colIdx){var cellData=this.data();var isCellSelectable=self.isCellSelectable(colIdx,cellData);if(ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){self.updateCheckbox(this,colIdx,true);if(ctx.aoColumns[colIdx].checkboxes.selectRow&&isCellSelectable){self.updateSelect(rowIdx,true);}}if(!isCellSelectable){$("input.dt-checkboxes",this.node()).prop("disabled",true);}});},onClick:function(e,ctrl){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;var cellSelector;var $cell=$(ctrl).closest("td");if($cell.parents(".DTFC_Cloned").length){cellSelector=dt.fixedColumns().cellIndex($cell);}else{cellSelector=$cell;}var cell=dt.cell(cellSelector);var cellIdx=cell.index();var colIdx=cellIdx.column;if(!ctx.aoColumns[colIdx].checkboxes.selectRow){cell.checkboxes.select(ctrl.checked);e.stopPropagation();}else{setTimeout(function(){var cellData=cell.data();var hasData=self.s.data[colIdx].hasOwnProperty(cellData);if(hasData!==ctrl.checked){self.updateCheckbox(cell,colIdx,hasData);self.updateSelectAll(colIdx);}},0);}},onSelect:function(e,type,indexes){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(self.s.ignoreSelect){return;}if(type==="row"){var colIdx=self.getSelectRowColIndex();if(colIdx!==null){var cells=dt.cells(indexes,colIdx);self.updateData(cells,colIdx,(e.type==="select")?true:false);self.updateCheckbox(cells,colIdx,(e.type==="select")?true:false);self.updateSelectAll(colIdx);}}},onClickSelectAll:function(e,ctrl){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;var colIdx=null;var $th=$(ctrl).closest("th");if($th.parents(".DTFC_Cloned").length){var cellIdx=dt.fixedColumns().cellIndex($th);colIdx=cellIdx.column;}else{colIdx=dt.column($th).index();}dt.column(colIdx,{page:((ctx.aoColumns[colIdx].checkboxes&&ctx.aoColumns[colIdx].checkboxes.selectAllPages)?"all":"current"),search:"applied"}).checkboxes.select(ctrl.checked);e.stopPropagation();},onDraw:function(e){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(ctx.oFeatures.bServerSide||ctx.oFeatures.bDeferRender){self.updateStateCheckboxes({page:"current",search:"none"});}$.each(self.s.columns,function(index,colIdx){self.updateSelectAll(colIdx);});},updateSelectAll:function(colIdx){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(ctx.aoColumns[colIdx].checkboxes&&ctx.aoColumns[colIdx].checkboxes.selectAll){var cells=dt.cells("tr",colIdx,{page:((ctx.aoColumns[colIdx].checkboxes.selectAllPages)?"all":"current"),search:"applied"});var $tableContainer=dt.table().container();var $checkboxesSelectAll=$('.dt-checkboxes-select-all[data-col="'+colIdx+'"] input[type="checkbox"]',$tableContainer);var countChecked=0;var cellsData=cells.data();$.each(cellsData,function(index,cellData){if(self.s.data[colIdx].hasOwnProperty(cellData)){countChecked++;}});if(ctx._fixedHeader){if(ctx._fixedHeader.dom["header"].floating){$checkboxesSelectAll=$('.fixedHeader-floating .dt-checkboxes-select-all[data-col="'+colIdx+'"] input[type="checkbox"]');}}var isSelected;var isIndeterminate;if(countChecked===0){isSelected=false;isIndeterminate=false;}else{if(countChecked===cellsData.length){isSelected=true;isIndeterminate=false;}else{isSelected=true;isIndeterminate=true;}}$checkboxesSelectAll.prop({"checked":isSelected,"indeterminate":isIndeterminate});if($.isFunction(ctx.aoColumns[colIdx].checkboxes.selectAllCallback)){ctx.aoColumns[colIdx].checkboxes.selectAllCallback($checkboxesSelectAll.closest("th").get(0),isSelected,isIndeterminate);}}},showInfoSelected:function(){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(!ctx.aanFeatures.i){return;}var $output=$('<span class="select-info"/>');var add=function(name,num){$output.append($('<span class="select-item"/>').append(dt.i18n("select."+name+"s",{_:"%d "+name+"s selected",0:"",1:"1 "+name+" selected"},num)));};var colIdx=self.getSelectRowColIndex();if(colIdx!==null){var countRows=0;for(var cellData in ctx.checkboxes.s.data[colIdx]){if(ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){countRows++;}}add("row",countRows);$.each(ctx.aanFeatures.i,function(i,el){var $el=$(el);var $existing=$el.children("span.select-info");if($existing.length){$existing.remove();}if($output.text()!==""){$el.append($output);}});}},isCellSelectable:function(colIdx,cellData){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(ctx.checkboxes.s.dataDisabled[colIdx].hasOwnProperty(cellData)){return false;}else{return true;}},getCellIndex:function(cell){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(ctx._oFixedColumns){return dt.fixedColumns().cellIndex(cell);}else{return dt.cell(cell).index();}},getSelectRowColIndex:function(){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;var colIdx=null;for(var i=0;i<ctx.aoColumns.length;i++){if(ctx.aoColumns[i].checkboxes&&ctx.aoColumns[i].checkboxes.selectRow){colIdx=i;break;}}return colIdx;},updateFixedColumn:function(colIdx){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(ctx._oFixedColumns){var leftCols=ctx._oFixedColumns.s.iLeftColumns;var rightCols=ctx.aoColumns.length-ctx._oFixedColumns.s.iRightColumns-1;if(colIdx<leftCols||colIdx>rightCols){dt.fixedColumns().update();}}}};Checkboxes.defaults={selectRow:false,selectAll:true,selectAllPages:true,selectCallback:null,selectAllCallback:null,selectAllRender:'<input type="checkbox">'};var Api=$.fn.dataTable.Api;Api.register("checkboxes()",function(){return this;});Api.registerPlural("columns().checkboxes.select()","column().checkboxes.select()",function(state){if(typeof state==="undefined"){state=true;}return this.iterator("column-rows",function(ctx,colIdx,i,j,rowsIdx){if(ctx.checkboxes){var selector=[];$.each(rowsIdx,function(index,rowIdx){selector.push({row:rowIdx,column:colIdx});});var cells=this.cells(selector);var cellsData=cells.data();var rowsSelectableIdx=[];selector=[];$.each(cellsData,function(index,cellData){if(ctx.checkboxes.isCellSelectable(colIdx,cellData)){selector.push({row:rowsIdx[index],column:colIdx});rowsSelectableIdx.push(rowsIdx[index]);}});cells=this.cells(selector);ctx.checkboxes.updateData(cells,colIdx,state);ctx.checkboxes.updateCheckbox(cells,colIdx,state);if(ctx.aoColumns[colIdx].checkboxes.selectRow){ctx.checkboxes.updateSelect(rowsSelectableIdx,state);}if(ctx._oFixedColumns){setTimeout(function(){ctx.checkboxes.updateSelectAll(colIdx);},0);}else{ctx.checkboxes.updateSelectAll(colIdx);}ctx.checkboxes.updateFixedColumn(colIdx);}},1);});Api.registerPlural("cells().checkboxes.select()","cell().checkboxes.select()",function(state){if(typeof state==="undefined"){state=true;}return this.iterator("cell",function(ctx,rowIdx,colIdx){if(ctx.checkboxes){var cells=this.cells([{row:rowIdx,column:colIdx}]);var cellData=this.cell({row:rowIdx,column:colIdx}).data();if(ctx.checkboxes.isCellSelectable(colIdx,cellData)){ctx.checkboxes.updateData(cells,colIdx,state);ctx.checkboxes.updateCheckbox(cells,colIdx,state);if(ctx.aoColumns[colIdx].checkboxes.selectRow){ctx.checkboxes.updateSelect(rowIdx,state);}if(ctx._oFixedColumns){setTimeout(function(){ctx.checkboxes.updateSelectAll(colIdx);},0);}else{ctx.checkboxes.updateSelectAll(colIdx);}ctx.checkboxes.updateFixedColumn(colIdx);}}},1);});Api.registerPlural("cells().checkboxes.enable()","cell().checkboxes.enable()",function(state){if(typeof state==="undefined"){state=true;}return this.iterator("cell",function(ctx,rowIdx,colIdx){if(ctx.checkboxes){var cell=this.cell({row:rowIdx,column:colIdx});var cellData=cell.data();if(state){delete ctx.checkboxes.s.dataDisabled[colIdx][cellData];}else{ctx.checkboxes.s.dataDisabled[colIdx][cellData]=1;}var cellNode=cell.node();if(cellNode){$("input.dt-checkboxes",cellNode).prop("disabled",!state);}if(ctx.aoColumns[colIdx].checkboxes.selectRow){if(ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){ctx.checkboxes.updateSelect(rowIdx,state);}}}},1);});Api.registerPlural("cells().checkboxes.disable()","cell().checkboxes.disable()",function(state){if(typeof state==="undefined"){state=true;}return this.checkboxes.enable(!state);});Api.registerPlural("columns().checkboxes.deselect()","column().checkboxes.deselect()",function(state){if(typeof state==="undefined"){state=true;}return this.checkboxes.select(!state);});Api.registerPlural("cells().checkboxes.deselect()","cell().checkboxes.deselect()",function(state){if(typeof state==="undefined"){state=true;}return this.checkboxes.select(!state);});Api.registerPlural("columns().checkboxes.deselectAll()","column().checkboxes.deselectAll()",function(){return this.iterator("column",function(ctx,colIdx){if(ctx.aoColumns[colIdx].checkboxes){ctx.checkboxes.s.data[colIdx]={};this.column(colIdx).checkboxes.select(false);}},1);});Api.registerPlural("columns().checkboxes.selected()","column().checkboxes.selected()",function(){return this.iterator("column",function(ctx,colIdx){if(ctx.aoColumns[colIdx].checkboxes){var data=[];$.each(ctx.checkboxes.s.data[colIdx],function(cellData,countRows){if(ctx.checkboxes.isCellSelectable(colIdx,cellData)){data.push(cellData);}});return data;}else{return[];}},1);});Checkboxes.version="1.2.9";$.fn.DataTable.Checkboxes=Checkboxes;$.fn.dataTable.Checkboxes=Checkboxes;$(document).on("preInit.dt.dtCheckboxes",function(e,settings,json){if(e.namespace!=="dt"){return;}new Checkboxes(settings);});return Checkboxes;})); | ||
(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){var DataTable=$.fn.dataTable;var Checkboxes=function(settings){if(!DataTable.versionCheck||!DataTable.versionCheck("1.10.8")){throw"DataTables Checkboxes requires DataTables 1.10.8 or newer";}this.s={dt:new DataTable.Api(settings),columns:[],data:[],dataDisabled:[],ignoreSelect:false};this.s.ctx=this.s.dt.settings()[0];if(this.s.ctx.checkboxes){return;}settings.checkboxes=this;this._constructor();};Checkboxes.prototype={_constructor:function(){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;var hasCheckboxes=false;var hasCheckboxesSelectRow=false;var state=dt.state.loaded();for(var i=0;i<ctx.aoColumns.length;i++){if(ctx.aoColumns[i].checkboxes){var $colHeader=$(dt.column(i).header());hasCheckboxes=true;if(!$.isPlainObject(ctx.aoColumns[i].checkboxes)){ctx.aoColumns[i].checkboxes={};}ctx.aoColumns[i].checkboxes=$.extend({},Checkboxes.defaults,ctx.aoColumns[i].checkboxes);var colOptions={"searchable":false,"orderable":false};if(ctx.aoColumns[i].sClass===""){colOptions["className"]="dt-checkboxes-cell";}else{colOptions["className"]=ctx.aoColumns[i].sClass+" dt-checkboxes-cell";}if(ctx.aoColumns[i].sWidthOrig===null){colOptions["width"]="1%";}if(ctx.aoColumns[i].mRender===null){colOptions["render"]=function(){return'<input type="checkbox" class="dt-checkboxes">';};}DataTable.ext.internal._fnColumnOptions(ctx,i,colOptions);$colHeader.removeClass("sorting");$colHeader.off(".dt");if(ctx.sAjaxSource===null){var cells=dt.cells("tr",i);cells.invalidate("data");$(cells.nodes()).addClass(colOptions["className"]);}self.s.data[i]={};self.s.dataDisabled[i]={};if(state&&state.checkboxes&&state.checkboxes.hasOwnProperty(i)){if(ctx.aoColumns[i].checkboxes.stateSave){self.s.data[i]=state.checkboxes[i];}}self.s.columns.push(i);if(ctx.aoColumns[i].checkboxes.selectRow){if(ctx._select){hasCheckboxesSelectRow=true;}else{ctx.aoColumns[i].checkboxes.selectRow=false;}}if(ctx.aoColumns[i].checkboxes.selectAll){$colHeader.data("html",$colHeader.html());if(ctx.aoColumns[i].checkboxes.selectAllRender!==null){var selectAllHtml="";if($.isFunction(ctx.aoColumns[i].checkboxes.selectAllRender)){selectAllHtml=ctx.aoColumns[i].checkboxes.selectAllRender();}else{if(typeof ctx.aoColumns[i].checkboxes.selectAllRender==="string"){selectAllHtml=ctx.aoColumns[i].checkboxes.selectAllRender;}}$colHeader.html(selectAllHtml).addClass("dt-checkboxes-select-all").attr("data-col",i);}}}}if(hasCheckboxes){var $table=$(dt.table().node());var $tableBody=$(dt.table().body());var $tableContainer=$(dt.table().container());if(hasCheckboxesSelectRow){$table.addClass("dt-checkboxes-select");$table.on("user-select.dt.dtCheckboxes",function(e,dt,type,cell){var cellIdx=cell.index();var rowIdx=cellIdx.row;var colIdx=self.getSelectRowColIndex();var cellData=dt.cell({row:rowIdx,column:colIdx}).data();if(!self.isCellSelectable(colIdx,cellData)){e.preventDefault();}});$table.on("select.dt.dtCheckboxes deselect.dt.dtCheckboxes",function(e,api,type,indexes){self.onSelect(e,type,indexes);});dt.select.info(false);$table.on("draw.dt.dtCheckboxes select.dt.dtCheckboxes deselect.dt.dtCheckboxes",function(){self.showInfoSelected();});}$table.on("draw.dt.dtCheckboxes",function(e){self.onDraw(e);});$tableBody.on("click.dtCheckboxes","input.dt-checkboxes",function(e){self.onClick(e,this);});$tableContainer.on("click.dtCheckboxes",'thead th.dt-checkboxes-select-all input[type="checkbox"]',function(e){self.onClickSelectAll(e,this);});$tableContainer.on("click.dtCheckboxes","thead th.dt-checkboxes-select-all",function(){$('input[type="checkbox"]',this).not(":disabled").trigger("click");});if(!hasCheckboxesSelectRow){$tableContainer.on("click.dtCheckboxes","tbody td.dt-checkboxes-cell",function(){$('input[type="checkbox"]',this).not(":disabled").trigger("click");});}$tableContainer.on("click.dtCheckboxes","thead th.dt-checkboxes-select-all label, tbody td.dt-checkboxes-cell label",function(e){e.preventDefault();});$(document).on("click.dtCheckboxes",'.fixedHeader-floating thead th.dt-checkboxes-select-all input[type="checkbox"]',function(e){if(ctx._fixedHeader){if(ctx._fixedHeader.dom["header"].floating){self.onClickSelectAll(e,this);}}});$(document).on("click.dtCheckboxes",".fixedHeader-floating thead th.dt-checkboxes-select-all",function(){if(ctx._fixedHeader){if(ctx._fixedHeader.dom["header"].floating){$('input[type="checkbox"]',this).trigger("click");}}});$table.on("init.dt.dtCheckboxes",function(){if(!ctx.oFeatures.bServerSide){if(ctx.oFeatures.bStateSave){self.updateState();}$table.on("xhr.dt.dtCheckboxes",function(){$.each(self.s.columns,function(index,colIdx){self.s.data[colIdx]={};self.s.dataDisabled[colIdx]={};});if(ctx.oFeatures.bStateSave){var state=dt.state.loaded();$.each(self.s.columns,function(index,colIdx){if(state&&state.checkboxes&&state.checkboxes.hasOwnProperty(colIdx)){if(ctx.aoColumns[colIdx].checkboxes.stateSave){self.s.data[colIdx]=state.checkboxes[colIdx];}}});$table.one("draw.dt.dtCheckboxes",function(){self.updateState();});}});}if(ctx.oFeatures.bStateSave){$table.on("stateSaveParams.dt.dtCheckboxes",function(e,settings,data){data.checkboxes=[];$.each(self.s.columns,function(index,colIdx){if(ctx.aoColumns[colIdx].checkboxes.stateSave){data.checkboxes[colIdx]=self.s.data[colIdx];}});});}});$table.one("destroy.dt.dtCheckboxes",function(){$(document).off("click.dtCheckboxes");$tableContainer.on(".dtCheckboxes");$tableBody.off(".dtCheckboxes");$table.off(".dtCheckboxes");self.s.data={};self.s.dataDisabled={};$(".dt-checkboxes-select-all",$table).each(function(index,el){$(el).html($(el).data("html")).removeClass("dt-checkboxes-select-all");});});}},updateData:function(cells,colIdx,isSelected){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(ctx.aoColumns[colIdx].checkboxes){var cellsData=cells.data();cellsData.each(function(cellData){if(isSelected){ctx.checkboxes.s.data[colIdx][cellData]=1;}else{delete ctx.checkboxes.s.data[colIdx][cellData];}});if(ctx.oFeatures.bStateSave){if(ctx.aoColumns[colIdx].checkboxes.stateSave){dt.state.save();}}}},updateSelect:function(selector,isSelected){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(ctx._select){self.s.ignoreSelect=true;if(isSelected){dt.rows(selector).select();}else{dt.rows(selector).deselect();}self.s.ignoreSelect=false;}},updateCheckbox:function(cells,colIdx,isSelected){var self=this;var ctx=self.s.ctx;var cellNodes=cells.nodes();if(cellNodes.length){$("input.dt-checkboxes",cellNodes).not(":disabled").prop("checked",isSelected);if($.isFunction(ctx.aoColumns[colIdx].checkboxes.selectCallback)){ctx.aoColumns[colIdx].checkboxes.selectCallback(cellNodes,isSelected);}}},updateState:function(){var self=this;self.updateStateCheckboxes({page:"all",search:"none"});$.each(self.s.columns,function(index,colIdx){self.updateSelectAll(colIdx);});},updateStateCheckboxes:function(opts){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;dt.cells("tr",self.s.columns,opts).every(function(rowIdx,colIdx){var cellData=this.data();var isCellSelectable=self.isCellSelectable(colIdx,cellData);if(ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){self.updateCheckbox(this,colIdx,true);if(ctx.aoColumns[colIdx].checkboxes.selectRow&&isCellSelectable){self.updateSelect(rowIdx,true);}}if(!isCellSelectable){$("input.dt-checkboxes",this.node()).prop("disabled",true);}});},onClick:function(e,ctrl){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;var cellSelector;var $cell=$(ctrl).closest("td");if($cell.parents(".DTFC_Cloned").length){cellSelector=dt.fixedColumns().cellIndex($cell);}else{cellSelector=$cell;}var cell=dt.cell(cellSelector);var cellIdx=cell.index();var colIdx=cellIdx.column;if(!ctx.aoColumns[colIdx].checkboxes.selectRow){cell.checkboxes.select(ctrl.checked);e.stopPropagation();}else{setTimeout(function(){var cellData=cell.data();var hasData=self.s.data[colIdx].hasOwnProperty(cellData);if(hasData!==ctrl.checked){self.updateCheckbox(cell,colIdx,hasData);self.updateSelectAll(colIdx);}},0);}},onSelect:function(e,type,indexes){var self=this;var dt=self.s.dt;if(self.s.ignoreSelect){return;}if(type==="row"){var colIdx=self.getSelectRowColIndex();if(colIdx!==null){var cells=dt.cells(indexes,colIdx);self.updateData(cells,colIdx,(e.type==="select")?true:false);self.updateCheckbox(cells,colIdx,(e.type==="select")?true:false);self.updateSelectAll(colIdx);}}},onClickSelectAll:function(e,ctrl){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;var colIdx=null;var $th=$(ctrl).closest("th");if($th.parents(".DTFC_Cloned").length){var cellIdx=dt.fixedColumns().cellIndex($th);colIdx=cellIdx.column;}else{colIdx=dt.column($th).index();}$(ctrl).data("is-changed",true);dt.column(colIdx,{page:((ctx.aoColumns[colIdx].checkboxes&&ctx.aoColumns[colIdx].checkboxes.selectAllPages)?"all":"current"),search:"applied"}).checkboxes.select(ctrl.checked);e.stopPropagation();},onDraw:function(){var self=this;var ctx=self.s.ctx;if(ctx.oFeatures.bServerSide||ctx.oFeatures.bDeferRender){self.updateStateCheckboxes({page:"current",search:"none"});}$.each(self.s.columns,function(index,colIdx){self.updateSelectAll(colIdx);});},updateSelectAll:function(colIdx){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(ctx.aoColumns[colIdx].checkboxes&&ctx.aoColumns[colIdx].checkboxes.selectAll){var cells=dt.cells("tr",colIdx,{page:((ctx.aoColumns[colIdx].checkboxes.selectAllPages)?"all":"current"),search:"applied"});var $tableContainer=dt.table().container();var $checkboxesSelectAll=$('.dt-checkboxes-select-all[data-col="'+colIdx+'"] input[type="checkbox"]',$tableContainer);var countChecked=0;var countDisabled=0;var cellsData=cells.data();$.each(cellsData,function(index,cellData){if(self.isCellSelectable(colIdx,cellData)){if(self.s.data[colIdx].hasOwnProperty(cellData)){countChecked++;}}else{countDisabled++;}});if(ctx._fixedHeader){if(ctx._fixedHeader.dom["header"].floating){$checkboxesSelectAll=$('.fixedHeader-floating .dt-checkboxes-select-all[data-col="'+colIdx+'"] input[type="checkbox"]');}}var isSelected;var isIndeterminate;if(countChecked===0){isSelected=false;isIndeterminate=false;}else{if((countChecked+countDisabled)===cellsData.length){isSelected=true;isIndeterminate=false;}else{isSelected=true;isIndeterminate=true;}}var isChanged=$checkboxesSelectAll.data("is-changed");var isSelectedNow=$checkboxesSelectAll.prop("checked");var isIndeterminateNow=$checkboxesSelectAll.prop("indeterminate");if(isChanged||isSelectedNow!==isSelected||isIndeterminateNow!==isIndeterminate){$checkboxesSelectAll.data("is-changed",false);$checkboxesSelectAll.prop({"checked":isSelected,"indeterminate":isIndeterminate});if($.isFunction(ctx.aoColumns[colIdx].checkboxes.selectAllCallback)){ctx.aoColumns[colIdx].checkboxes.selectAllCallback($checkboxesSelectAll.closest("th").get(0),isSelected,isIndeterminate);}}}},showInfoSelected:function(){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(!ctx.aanFeatures.i){return;}var $output=$('<span class="select-info"/>');var add=function(name,num){$output.append($('<span class="select-item"/>').append(dt.i18n("select."+name+"s",{_:"%d "+name+"s selected",0:"",1:"1 "+name+" selected"},num)));};var colIdx=self.getSelectRowColIndex();if(colIdx!==null){var countRows=0;for(var cellData in ctx.checkboxes.s.data[colIdx]){if(ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){countRows++;}}add("row",countRows);$.each(ctx.aanFeatures.i,function(i,el){var $el=$(el);var $existing=$el.children("span.select-info");if($existing.length){$existing.remove();}if($output.text()!==""){$el.append($output);}});}},isCellSelectable:function(colIdx,cellData){var self=this;var ctx=self.s.ctx;if(ctx.checkboxes.s.dataDisabled[colIdx].hasOwnProperty(cellData)){return false;}else{return true;}},getCellIndex:function(cell){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(ctx._oFixedColumns){return dt.fixedColumns().cellIndex(cell);}else{return dt.cell(cell).index();}},getSelectRowColIndex:function(){var self=this;var ctx=self.s.ctx;var colIdx=null;for(var i=0;i<ctx.aoColumns.length;i++){if(ctx.aoColumns[i].checkboxes&&ctx.aoColumns[i].checkboxes.selectRow){colIdx=i;break;}}return colIdx;},updateFixedColumn:function(colIdx){var self=this;var dt=self.s.dt;var ctx=self.s.ctx;if(ctx._oFixedColumns){var leftCols=ctx._oFixedColumns.s.iLeftColumns;var rightCols=ctx.aoColumns.length-ctx._oFixedColumns.s.iRightColumns-1;if(colIdx<leftCols||colIdx>rightCols){dt.fixedColumns().update();}}}};Checkboxes.defaults={stateSave:true,selectRow:false,selectAll:true,selectAllPages:true,selectCallback:null,selectAllCallback:null,selectAllRender:'<input type="checkbox">'};var Api=$.fn.dataTable.Api;Api.register("checkboxes()",function(){return this;});Api.registerPlural("columns().checkboxes.select()","column().checkboxes.select()",function(state){if(typeof state==="undefined"){state=true;}return this.iterator("column-rows",function(ctx,colIdx,i,j,rowsIdx){if(ctx.aoColumns[colIdx].checkboxes){var selector=[];$.each(rowsIdx,function(index,rowIdx){selector.push({row:rowIdx,column:colIdx});});var cells=this.cells(selector);var cellsData=cells.data();var rowsSelectableIdx=[];selector=[];$.each(cellsData,function(index,cellData){if(ctx.checkboxes.isCellSelectable(colIdx,cellData)){selector.push({row:rowsIdx[index],column:colIdx});rowsSelectableIdx.push(rowsIdx[index]);}});cells=this.cells(selector);ctx.checkboxes.updateData(cells,colIdx,state);ctx.checkboxes.updateCheckbox(cells,colIdx,state);if(ctx.aoColumns[colIdx].checkboxes.selectRow){ctx.checkboxes.updateSelect(rowsSelectableIdx,state);}if(ctx._oFixedColumns){setTimeout(function(){ctx.checkboxes.updateSelectAll(colIdx);},0);}else{ctx.checkboxes.updateSelectAll(colIdx);}ctx.checkboxes.updateFixedColumn(colIdx);}},1);});Api.registerPlural("cells().checkboxes.select()","cell().checkboxes.select()",function(state){if(typeof state==="undefined"){state=true;}return this.iterator("cell",function(ctx,rowIdx,colIdx){if(ctx.aoColumns[colIdx].checkboxes){var cells=this.cells([{row:rowIdx,column:colIdx}]);var cellData=this.cell({row:rowIdx,column:colIdx}).data();if(ctx.checkboxes.isCellSelectable(colIdx,cellData)){ctx.checkboxes.updateData(cells,colIdx,state);ctx.checkboxes.updateCheckbox(cells,colIdx,state);if(ctx.aoColumns[colIdx].checkboxes.selectRow){ctx.checkboxes.updateSelect(rowIdx,state);}if(ctx._oFixedColumns){setTimeout(function(){ctx.checkboxes.updateSelectAll(colIdx);},0);}else{ctx.checkboxes.updateSelectAll(colIdx);}ctx.checkboxes.updateFixedColumn(colIdx);}}},1);});Api.registerPlural("cells().checkboxes.enable()","cell().checkboxes.enable()",function(state){if(typeof state==="undefined"){state=true;}return this.iterator("cell",function(ctx,rowIdx,colIdx){if(ctx.aoColumns[colIdx].checkboxes){var cell=this.cell({row:rowIdx,column:colIdx});var cellData=cell.data();if(state){delete ctx.checkboxes.s.dataDisabled[colIdx][cellData];}else{ctx.checkboxes.s.dataDisabled[colIdx][cellData]=1;}var cellNode=cell.node();if(cellNode){$("input.dt-checkboxes",cellNode).prop("disabled",!state);}if(ctx.aoColumns[colIdx].checkboxes.selectRow){if(ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){ctx.checkboxes.updateSelect(rowIdx,state);}}}},1);});Api.registerPlural("cells().checkboxes.disable()","cell().checkboxes.disable()",function(state){if(typeof state==="undefined"){state=true;}return this.checkboxes.enable(!state);});Api.registerPlural("columns().checkboxes.deselect()","column().checkboxes.deselect()",function(state){if(typeof state==="undefined"){state=true;}return this.checkboxes.select(!state);});Api.registerPlural("cells().checkboxes.deselect()","cell().checkboxes.deselect()",function(state){if(typeof state==="undefined"){state=true;}return this.checkboxes.select(!state);});Api.registerPlural("columns().checkboxes.deselectAll()","column().checkboxes.deselectAll()",function(){return this.iterator("column",function(ctx,colIdx){if(ctx.aoColumns[colIdx].checkboxes){ctx.checkboxes.s.data[colIdx]={};this.column(colIdx).checkboxes.select(false);}},1);});Api.registerPlural("columns().checkboxes.selected()","column().checkboxes.selected()",function(){return this.iterator("column-rows",function(ctx,colIdx,i,j,rowsIdx){if(ctx.aoColumns[colIdx].checkboxes){var selector=[];$.each(rowsIdx,function(index,rowIdx){selector.push({row:rowIdx,column:colIdx});});var cells=this.cells(selector);var cellsData=cells.data();var data=[];$.each(cellsData,function(index,cellData){if(ctx.checkboxes.s.data[colIdx].hasOwnProperty(cellData)){if(ctx.checkboxes.isCellSelectable(colIdx,cellData)){data.push(cellData);}}});return data;}else{return[];}},1);});Checkboxes.version="1.2.10";$.fn.DataTable.Checkboxes=Checkboxes;$.fn.dataTable.Checkboxes=Checkboxes;$(document).on("preInit.dt.dtCheckboxes",function(e,settings){if(e.namespace!=="dt"){return;}new Checkboxes(settings);});return Checkboxes;})); |
{ | ||
"name": "jquery-datatables-checkboxes", | ||
"version": "1.2.9", | ||
"version": "1.2.10", | ||
"description": "Checkboxes is an extension for the jQuery DataTables library that provides universal solution for working with checkboxes in a table.", | ||
@@ -5,0 +5,0 @@ "main": "./js/dataTables.checkboxes.js", |
@@ -0,0 +0,0 @@ jQuery DataTables Checkboxes |
62847
8
992