|
|
/*! * Column visibility buttons for Buttons and DataTables. * 2016 SpryMedia Ltd - datatables.net/license */
(function( factory ){ if ( typeof define === 'function' && define.amd ) { // AMD
define( ['jquery', 'datatables.net', 'datatables.net-buttons'], function ( $ ) { return factory( $, window, document ); } ); } else if ( typeof exports === 'object' ) { // CommonJS
module.exports = function (root, $) { if ( ! root ) { // CommonJS environments without a window global must pass a
// root. This will give an error otherwise
root = window; }
if ( ! $ ) { $ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window
require('jquery') : require('jquery')( root ); }
if ( ! $.fn.dataTable ) { require('datatables.net')(root, $); }
if ( ! $.fn.dataTable.Buttons ) { require('datatables.net-buttons')(root, $); }
return factory( $, root, root.document ); }; } else { // Browser
factory( jQuery, window, document ); }}(function( $, window, document, undefined ) {'use strict';var DataTable = $.fn.dataTable;
$.extend( DataTable.ext.buttons, { // A collection of column visibility buttons
colvis: function ( dt, conf ) { var node = null; var buttonConf = { extend: 'collection', init: function ( dt, n ) { node = n; }, text: function ( dt ) { return dt.i18n( 'buttons.colvis', 'Column visibility' ); }, className: 'buttons-colvis', closeButton: false, buttons: [ { extend: 'columnsToggle', columns: conf.columns, columnText: conf.columnText } ] };
// Rebuild the collection with the new column structure if columns are reordered
dt.on( 'column-reorder.dt'+conf.namespace, function (e, settings, details) { dt.button(null, dt.button(null, node).node()).collectionRebuild([{ extend: 'columnsToggle', columns: conf.columns, columnText: conf.columnText }]); });
return buttonConf; },
// Selected columns with individual buttons - toggle column visibility
columnsToggle: function ( dt, conf ) { var columns = dt.columns( conf.columns ).indexes().map( function ( idx ) { return { extend: 'columnToggle', columns: idx, columnText: conf.columnText }; } ).toArray();
return columns; },
// Single button to toggle column visibility
columnToggle: function ( dt, conf ) { return { extend: 'columnVisibility', columns: conf.columns, columnText: conf.columnText }; },
// Selected columns with individual buttons - set column visibility
columnsVisibility: function ( dt, conf ) { var columns = dt.columns( conf.columns ).indexes().map( function ( idx ) { return { extend: 'columnVisibility', columns: idx, visibility: conf.visibility, columnText: conf.columnText }; } ).toArray();
return columns; },
// Single button to set column visibility
columnVisibility: { columns: undefined, // column selector
text: function ( dt, button, conf ) { return conf._columnText( dt, conf ); }, className: 'buttons-columnVisibility', action: function ( e, dt, button, conf ) { var col = dt.columns( conf.columns ); var curr = col.visible();
col.visible( conf.visibility !== undefined ? conf.visibility : ! (curr.length ? curr[0] : false ) ); }, init: function ( dt, button, conf ) { var that = this; button.attr( 'data-cv-idx', conf.columns );
dt .on( 'column-visibility.dt'+conf.namespace, function (e, settings) { if ( ! settings.bDestroying && settings.nTable == dt.settings()[0].nTable ) { that.active( dt.column( conf.columns ).visible() ); } } ) .on( 'column-reorder.dt'+conf.namespace, function (e, settings, details) { // Button has been removed from the DOM
if ( conf.destroying ) { return; }
if ( dt.columns( conf.columns ).count() !== 1 ) { return; }
// This button controls the same column index but the text for the column has
// changed
that.text( conf._columnText( dt, conf ) );
// Since its a different column, we need to check its visibility
that.active( dt.column( conf.columns ).visible() ); } );
this.active( dt.column( conf.columns ).visible() ); }, destroy: function ( dt, button, conf ) { dt .off( 'column-visibility.dt'+conf.namespace ) .off( 'column-reorder.dt'+conf.namespace ); },
_columnText: function ( dt, conf ) { // Use DataTables' internal data structure until this is presented
// is a public API. The other option is to use
// `$( column(col).node() ).text()` but the node might not have been
// populated when Buttons is constructed.
var idx = dt.column( conf.columns ).index(); var title = dt.settings()[0].aoColumns[ idx ].sTitle;
if (! title) { title = dt.column(idx).header().innerHTML; }
title = title .replace(/\n/g," ") // remove new lines
.replace(/<br\s*\/?>/gi, " ") // replace line breaks with spaces
.replace(/<select(.*?)<\/select>/g, "") // remove select tags, including options text
.replace(/<!\-\-.*?\-\->/g, "") // strip HTML comments
.replace(/<.*?>/g, "") // strip HTML
.replace(/^\s+|\s+$/g,""); // trim
return conf.columnText ? conf.columnText( dt, idx, title ) : title; } },
colvisRestore: { className: 'buttons-colvisRestore',
text: function ( dt ) { return dt.i18n( 'buttons.colvisRestore', 'Restore visibility' ); },
init: function ( dt, button, conf ) { conf._visOriginal = dt.columns().indexes().map( function ( idx ) { return dt.column( idx ).visible(); } ).toArray(); },
action: function ( e, dt, button, conf ) { dt.columns().every( function ( i ) { // Take into account that ColReorder might have disrupted our
// indexes
var idx = dt.colReorder && dt.colReorder.transpose ? dt.colReorder.transpose( i, 'toOriginal' ) : i;
this.visible( conf._visOriginal[ idx ] ); } ); } },
colvisGroup: { className: 'buttons-colvisGroup',
action: function ( e, dt, button, conf ) { dt.columns( conf.show ).visible( true, false ); dt.columns( conf.hide ).visible( false, false );
dt.columns.adjust(); },
show: [],
hide: [] }} );
return DataTable;}));
|