static.js.lib.dataTables.colVis.js Maven / Gradle / Ivy
/*! ColVis 1.1.2
* ©2010-2015 SpryMedia Ltd - datatables.net/license
*/
/**
* @summary ColVis
* @description Controls for column visibility in DataTables
* @version 1.1.2
* @file dataTables.colReorder.js
* @author SpryMedia Ltd (www.sprymedia.co.uk)
* @contact www.sprymedia.co.uk/contact
* @copyright Copyright 2010-2015 SpryMedia Ltd.
*
* This source file is free software, available under the following license:
* MIT license - http://datatables.net/license/mit
*
* This source file is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
*
* For details please refer to: http://www.datatables.net
*/
(function(window, document, undefined) {
var factory = function( $, DataTable ) {
"use strict";
/**
* ColVis provides column visibility control for DataTables
*
* @class ColVis
* @constructor
* @param {object} DataTables settings object. With DataTables 1.10 this can
* also be and API instance, table node, jQuery collection or jQuery selector.
* @param {object} ColVis configuration options
*/
var ColVis = function( oDTSettings, oInit )
{
/* Santiy check that we are a new instance */
if ( !this.CLASS || this.CLASS != "ColVis" )
{
alert( "Warning: ColVis must be initialised with the keyword 'new'" );
}
if ( typeof oInit == 'undefined' )
{
oInit = {};
}
var camelToHungarian = $.fn.dataTable.camelToHungarian;
if ( camelToHungarian ) {
camelToHungarian( ColVis.defaults, ColVis.defaults, true );
camelToHungarian( ColVis.defaults, oInit );
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Public class variables
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
* @namespace Settings object which contains customisable information for
* ColVis instance. Augmented by ColVis.defaults
*/
this.s = {
/**
* DataTables settings object
* @property dt
* @type Object
* @default null
*/
"dt": null,
/**
* Customisation object
* @property oInit
* @type Object
* @default passed in
*/
"oInit": oInit,
/**
* Flag to say if the collection is hidden
* @property hidden
* @type boolean
* @default true
*/
"hidden": true,
/**
* Store the original visibility settings so they could be restored
* @property abOriginal
* @type Array
* @default []
*/
"abOriginal": []
};
/**
* @namespace Common and useful DOM elements for the class instance
*/
this.dom = {
/**
* Wrapper for the button - given back to DataTables as the node to insert
* @property wrapper
* @type Node
* @default null
*/
"wrapper": null,
/**
* Activation button
* @property button
* @type Node
* @default null
*/
"button": null,
/**
* Collection list node
* @property collection
* @type Node
* @default null
*/
"collection": null,
/**
* Background node used for shading the display and event capturing
* @property background
* @type Node
* @default null
*/
"background": null,
/**
* Element to position over the activation button to catch mouse events when using mouseover
* @property catcher
* @type Node
* @default null
*/
"catcher": null,
/**
* List of button elements
* @property buttons
* @type Array
* @default []
*/
"buttons": [],
/**
* List of group button elements
* @property groupButtons
* @type Array
* @default []
*/
"groupButtons": [],
/**
* Restore button
* @property restore
* @type Node
* @default null
*/
"restore": null
};
/* Store global reference */
ColVis.aInstances.push( this );
/* Constructor logic */
this.s.dt = $.fn.dataTable.Api ?
new $.fn.dataTable.Api( oDTSettings ).settings()[0] :
oDTSettings;
this._fnConstruct( oInit );
return this;
};
ColVis.prototype = {
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Public methods
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
* Get the ColVis instance's control button so it can be injected into the
* DOM
* @method button
* @returns {node} ColVis button
*/
button: function ()
{
return this.dom.wrapper;
},
/**
* Alias of `rebuild` for backwards compatibility
* @method fnRebuild
*/
"fnRebuild": function ()
{
this.rebuild();
},
/**
* Rebuild the list of buttons for this instance (i.e. if there is a column
* header update)
* @method fnRebuild
*/
rebuild: function ()
{
/* Remove the old buttons */
for ( var i=this.dom.buttons.length-1 ; i>=0 ; i-- ) {
this.dom.collection.removeChild( this.dom.buttons[i] );
}
this.dom.buttons.splice( 0, this.dom.buttons.length );
this.dom.groupButtons.splice(0, this.dom.groupButtons.length);
if ( this.dom.restore ) {
this.dom.restore.parentNode( this.dom.restore );
}
/* Re-add them (this is not the optimal way of doing this, it is fast and effective) */
this._fnAddGroups();
this._fnAddButtons();
/* Update the checkboxes */
this._fnDrawCallback();
},
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Private methods (they are of course public in JS, but recommended as private)
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
* Constructor logic
* @method _fnConstruct
* @returns void
* @private
*/
"_fnConstruct": function ( init )
{
this._fnApplyCustomisation( init );
var that = this;
var i, iLen;
this.dom.wrapper = document.createElement('div');
this.dom.wrapper.className = "ColVis";
this.dom.button = $( '', {
'class': !this.s.dt.bJUI ?
"ColVis_Button ColVis_MasterButton" :
"ColVis_Button ColVis_MasterButton ui-button ui-state-default"
} )
.append( ''+this.s.buttonText+'' )
.bind( this.s.activate=="mouseover" ? "mouseover" : "click", function (e) {
e.preventDefault();
that._fnCollectionShow();
} )
.appendTo( this.dom.wrapper )[0];
this.dom.catcher = this._fnDomCatcher();
this.dom.collection = this._fnDomCollection();
this.dom.background = this._fnDomBackground();
this._fnAddGroups();
this._fnAddButtons();
/* Store the original visibility information */
for ( i=0, iLen=this.s.dt.aoColumns.length ; i'+
this.s.restore+
''
)
.click( function (e) {
for ( var i=0, iLen=that.s.abOriginal.length ; i'+
str+
''
)
.click( function (e) {
for ( var i=0, iLen=that.s.abOriginal.length ; i'+
''+
''
)
.click( function (e) {
var showHide = !$('input', this).is(":checked");
if ( e.target.nodeName.toLowerCase() !== "li" )
{
showHide = ! showHide;
}
for ( var j=0 ; j < oGroup.aiColumns.length ; j++ )
{
that.s.dt.oInstance.fnSetColumnVis( oGroup.aiColumns[j], showHide );
}
} )[0];
},
/**
* Create the DOM for a show / hide button
* @method _fnDomColumnButton
* @param {int} i Column in question
* @returns {Node} Created button
* @private
*/
"_fnDomColumnButton": function ( i )
{
var
that = this,
column = this.s.dt.aoColumns[i],
dt = this.s.dt;
var title = this.s.fnLabel===null ?
column.sTitle :
this.s.fnLabel( i, column.sTitle, column.nTh );
return $(
''+
''+
' '
)
.click( function (e) {
var showHide = !$('input', this).is(":checked");
if ( e.target.nodeName.toLowerCase() !== "li" )
{
if ( e.target.nodeName.toLowerCase() == "input" || that.s.fnStateChange === null )
{
showHide = ! showHide;
}
}
/* Need to consider the case where the initialiser created more than one table - change the
* API index that DataTables is using
*/
var oldIndex = $.fn.dataTableExt.iApiIndex;
$.fn.dataTableExt.iApiIndex = that._fnDataTablesApiIndex.call(that);
// Optimisation for server-side processing when scrolling - don't do a full redraw
if ( dt.oFeatures.bServerSide )
{
that.s.dt.oInstance.fnSetColumnVis( i, showHide, false );
that.s.dt.oInstance.fnAdjustColumnSizing( false );
if (dt.oScroll.sX !== "" || dt.oScroll.sY !== "" )
{
that.s.dt.oInstance.oApi._fnScrollDraw( that.s.dt );
}
that._fnDrawCallback();
}
else
{
that.s.dt.oInstance.fnSetColumnVis( i, showHide );
}
$.fn.dataTableExt.iApiIndex = oldIndex; /* Restore */
if ( that.s.fnStateChange !== null )
{
if ( e.target.nodeName.toLowerCase() == "span" )
{
e.preventDefault();
}
that.s.fnStateChange.call( that, i, showHide );
}
} )[0];
},
/**
* Get the position in the DataTables instance array of the table for this
* instance of ColVis
* @method _fnDataTablesApiIndex
* @returns {int} Index
* @private
*/
"_fnDataTablesApiIndex": function ()
{
for ( var i=0, iLen=this.s.dt.oInstance.length ; i ', {
'class': !this.s.dt.bJUI ?
"ColVis_collection" :
"ColVis_collection ui-buttonset ui-buttonset-multi"
} )
.css( {
'display': 'none',
'opacity': 0,
'position': ! this.s.bCssPosition ?
'absolute' :
''
} )[0];
},
/**
* An element to be placed on top of the activate button to catch events
* @method _fnDomCatcher
* @returns {Node} div container for the collection
* @private
*/
"_fnDomCatcher": function ()
{
var
that = this,
nCatcher = document.createElement('div');
nCatcher.className = "ColVis_catcher";
$(nCatcher).click( function () {
that._fnCollectionHide.call( that, null, null );
} );
return nCatcher;
},
/**
* Create the element used to shade the background, and capture hide events (it is shown and
* hidden as needed)
* @method _fnDomBackground
* @returns {Node} div container for the background
* @private
*/
"_fnDomBackground": function ()
{
var that = this;
var background = $('')
.addClass( 'ColVis_collectionBackground' )
.css( 'opacity', 0 )
.click( function () {
that._fnCollectionHide.call( that, null, null );
} );
/* When considering a mouse over action for the activation, we also consider a mouse out
* which is the same as a mouse over the background - without all the messing around of
* bubbling events. Use the catcher element to avoid messing around with bubbling
*/
if ( this.s.activate == "mouseover" )
{
background.mouseover( function () {
that.s.overcollection = false;
that._fnCollectionHide.call( that, null, null );
} );
}
return background[0];
},
/**
* Show the show / hide list and the background
* @method _fnCollectionShow
* @returns void
* @private
*/
"_fnCollectionShow": function ()
{
var that = this, i, iLen, iLeft;
var oPos = $(this.dom.button).offset();
var nHidden = this.dom.collection;
var nBackground = this.dom.background;
var iDivX = parseInt(oPos.left, 10);
var iDivY = parseInt(oPos.top + $(this.dom.button).outerHeight(), 10);
if ( ! this.s.bCssPosition )
{
nHidden.style.top = iDivY+"px";
nHidden.style.left = iDivX+"px";
}
$(nHidden).css( {
'display': 'block',
'opacity': 0
} );
nBackground.style.bottom ='0px';
nBackground.style.right = '0px';
var oStyle = this.dom.catcher.style;
oStyle.height = $(this.dom.button).outerHeight()+"px";
oStyle.width = $(this.dom.button).outerWidth()+"px";
oStyle.top = oPos.top+"px";
oStyle.left = iDivX+"px";
document.body.appendChild( nBackground );
document.body.appendChild( nHidden );
document.body.appendChild( this.dom.catcher );
/* This results in a very small delay for the end user but it allows the animation to be
* much smoother. If you don't want the animation, then the setTimeout can be removed
*/
$(nHidden).animate({"opacity": 1}, that.s.iOverlayFade);
$(nBackground).animate({"opacity": 0.1}, that.s.iOverlayFade, 'linear', function () {
/* In IE6 if you set the checked attribute of a hidden checkbox, then this is not visually
* reflected. As such, we need to do it here, once it is visible. Unbelievable.
*/
if ( $.browser && $.browser.msie && $.browser.version == "6.0" )
{
that._fnDrawCallback();
}
});
/* Visual corrections to try and keep the collection visible */
if ( !this.s.bCssPosition )
{
iLeft = ( this.s.sAlign=="left" ) ?
iDivX :
iDivX - $(nHidden).outerWidth() + $(this.dom.button).outerWidth();
nHidden.style.left = iLeft+"px";
var iDivWidth = $(nHidden).outerWidth();
var iDivHeight = $(nHidden).outerHeight();
var iDocWidth = $(document).width();
if ( iLeft + iDivWidth > iDocWidth )
{
nHidden.style.left = (iDocWidth-iDivWidth)+"px";
}
}
this.s.hidden = false;
},
/**
* Hide the show / hide list and the background
* @method _fnCollectionHide
* @returns void
* @private
*/
"_fnCollectionHide": function ( )
{
var that = this;
if ( !this.s.hidden && this.dom.collection !== null )
{
this.s.hidden = true;
$(this.dom.collection).animate({"opacity": 0}, that.s.iOverlayFade, function (e) {
this.style.display = "none";
} );
$(this.dom.background).animate({"opacity": 0}, that.s.iOverlayFade, function (e) {
document.body.removeChild( that.dom.background );
document.body.removeChild( that.dom.catcher );
} );
}
},
/**
* Alter the colspan on any fnOpen rows
*/
"_fnAdjustOpenRows": function ()
{
var aoOpen = this.s.dt.aoOpenRows;
var iVisible = this.s.dt.oApi._fnVisbleColumns( this.s.dt );
for ( var i=0, iLen=aoOpen.length ; i
© 2015 - 2025 Weber Informatics LLC | Privacy Policy