App-Netdisco
view release on metacpan or search on metacpan
share/public/javascripts/jquery.floatThead.js view on Meta::CPAN
/** @preserve jQuery.floatThead 2.2.5 - https://mkoryak.github.io/floatThead/ - Copyright (c) 2012 - 2023 Misha Koryak **/
// @license MIT
/* @author Misha Koryak
* @projectDescription position:fixed on steroids. Lock a table header in place while scrolling.
*
* Dependencies:
* jquery 1.9.0+ [required] OR jquery 1.7.0+ jquery UI core
*
* https://mkoryak.github.io/floatThead/
*
* Tested on FF13+, Chrome 21+, IE9, IE10, IE11, EDGE
*/
(function( $ ) {
/**
* provides a default config object. You can modify this after including this script if you want to change the init defaults
* @type {!Object}
*/
$.floatThead = $.floatThead || {};
$.floatThead.defaults = {
headerCellSelector: 'tr:visible:first>*:visible', //thead cells are this.
zIndex: 1001, //zindex of the floating thead (actually a container div)
position: 'auto', // 'fixed', 'absolute', 'auto'. auto picks the best for your table scrolling type.
top: 0, //String or function($table) - offset from top of window where the header should not pass above
bottom: 0, //String or function($table) - offset from the bottom of the table where the header should stop scrolling
scrollContainer: function($table) { // or boolean 'true' (use offsetParent) | function -> if the table has horizontal scroll bars then this is the container that has overflow:auto and causes those scroll bars
return $([]);
},
responsiveContainer: function($table) { // only valid if scrollContainer is not used (ie window scrolling). this is the container which will control y scrolling at some mobile breakpoints
return $([]);
},
getSizingRow: function($table, $cols, $fthCells){ // this is only called when using IE,
// override it if the first row of the table is going to contain colgroups (any cell spans greater than one col)
// it should return a jquery object containing a wrapped set of table cells comprising a row that contains no col spans and is visible
return $table.find('tbody tr:visible:first>*:visible');
},
ariaLabel: function($table, $headerCell, columnIndex) { // This function will run for every header cell that exists in the table when we add aria-labels.
// Override to customize the aria-label. NOTE: These labels will be added to the 'sizer cells' which get added to the real table and are not visible by the user (only screen readers),
// The number of sizer columns might not match the header columns in your real table - I insert one sizer header cell per column. This means that if your table uses colspans or multiple header rows,
// this will not be reflected by sizer cells. This is why I am giving you the `columnIndex`.
return $headerCell.text();
},
floatTableClass: 'floatThead-table',
floatWrapperClass: 'floatThead-wrapper',
floatContainerClass: 'floatThead-container',
copyTableClass: true, //copy 'class' attribute from table into the floated table so that the styles match.
autoReflow: false, //(undocumented) - use MutationObserver api to reflow automatically when internal table DOM changes
debug: false, //print possible issues (that don't prevent script loading) to console, if console exists.
support: { //should we bind events that expect these frameworks to be present and/or check for them?
bootstrap: true,
datatables: true,
jqueryUI: true,
perfectScrollbar: true
},
floatContainerCss: {"overflow-x": "hidden"} // undocumented - css applied to the floatContainer
};
var util = (function underscoreShim(){
var that = {};
var hasOwnProperty = Object.prototype.hasOwnProperty, isThings = ['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'];
that.has = function(obj, key) {
return hasOwnProperty.call(obj, key);
};
that.keys = Object.keys || function(obj) {
if (obj !== Object(obj)) throw new TypeError('Invalid object');
var keys = [];
for (var key in obj) if (that.has(obj, key)) keys.push(key);
return keys;
};
var idCounter = 0;
that.uniqueId = function(prefix) {
var id = ++idCounter + '';
return prefix ? prefix + id : id;
};
$.each(isThings, function(){
var name = this;
that['is' + name] = function(obj) {
return Object.prototype.toString.call(obj) === '[object ' + name + ']';
};
});
that.debounce = function(func, wait, immediate) {
var timeout, args, context, timestamp, result;
return function() {
context = this;
args = arguments;
timestamp = new Date();
var later = function() {
var last = (new Date()) - timestamp;
if (last < wait) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
if (!immediate) result = func.apply(context, args);
}
};
var callNow = immediate && !timeout;
if (!timeout) {
timeout = setTimeout(later, wait);
}
if (callNow) result = func.apply(context, args);
return result;
};
};
return that;
})();
var globalCanObserveMutations = typeof MutationObserver !== 'undefined';
//browser stuff
( run in 0.621 second using v1.01-cache-2.11-cpan-2e0ccfb7a10 )