| Line 243: |
Line 243: |
| | // 1) table with "header-fixed" class | | // 1) table with "header-fixed" class |
| | // 2) a table row with "header-row" class | | // 2) a table row with "header-row" class |
| − | mw.loader.using('jquery.tablesorter', function() { | + | // TODO: tablesorter, tabbertab, resize |
| − | function initializeStickyHeader() {
| + | // mw.loader.using('jquery.tablesorter', function() { |
| − | var tables = [];
| + | var tables = []; |
| − | var $tables = $('.header-fixed');
| |
| | | | |
| − | if ($tables.length == 0) return;
| + | function initializeStickyHeader() { |
| | + | var $tables = $('.header-fixed'); |
| | | | |
| − | $tables.each(function() {
| + | if ($tables.length == 0) return; |
| − | if ($(this).hasClass('header-fixed-done')) return;
| |
| − | if ($(this).hasClass('mw-collapsed')) {
| |
| − | $(this).find('.mw-collapsible-text').click(function() {
| |
| − | setTimeout(function() { initializeStickyHeader(); }, 100);
| |
| − | })
| |
| − | return;
| |
| − | }
| |
| − | // If this table is under tabber AND is hidden,
| |
| − | // temporarily make element visible so we can pull its width data later
| |
| − | var tabberTabParent = $(this).parent(".tabbertab")[0];
| |
| − | var originalStyleDisplay;
| |
| − | if (tabberTabParent) {
| |
| − | originalStyleDisplay = tabberTabParent.style.display;
| |
| − | tabberTabParent.style.visibility = "hidden";
| |
| − | tabberTabParent.style.display = "block";
| |
| − | }
| |
| | | | |
| − | // Build fixed-header-table content
| + | $tables.each(function() { |
| − | var $headerRow = $(this).find('.header-row');
| + | if ($(this).hasClass('header-fixed-done')) return; |
| − | var $newHeaderContent = $('<tbody>');
| + | if ($(this).hasClass('mw-collapsed')) { |
| − | $newHeaderContent.append($headerRow.clone());
| + | $(this).find('.mw-collapsible-text').click(function() { |
| | + | setTimeout(function() { initializeStickyHeader(); }, 100); |
| | + | }) |
| | + | return; |
| | + | } |
| | + | /* |
| | + | var tabberTabParent = $(this).parent(".tabbertab")[0]; |
| | + | var originalStyleDisplay; |
| | + | if (tabberTabParent) { |
| | + | originalStyleDisplay = tabberTabParent.style.display; |
| | + | tabberTabParent.style.visibility = "hidden"; |
| | + | tabberTabParent.style.display = "block"; |
| | + | } |
| | + | */ |
| | + | var $headerRow = $(this).find('.header-row'); |
| | + | var $newHeaderContent = $('<tbody>'); |
| | + | $newHeaderContent.append($headerRow.clone()); |
| | | | |
| − | // Add fixed-header-table colgroup to fix width
| + | var $columnsOld = $headerRow.find('td:not([colspan]),th:not([colspan])'); |
| − | var $columnsOld = $headerRow.find('td:not([colspan]),th:not([colspan])');
| + | var $newHeaderColgroup = $('<colgroup>'); |
| − | var $newHeaderColgroup = $('<colgroup>');
| + | for (var i = 0; i < $columnsOld.length; i++) { |
| | + | $newHeaderColgroup.append($('<col>').css('width', $columnsOld[i].getBoundingClientRect().width)); |
| | + | } |
| | | | |
| − | for (var i = 0; i < $columnsOld.length; i++) {
| + | $(this).before( |
| − | var width = $columnsOld[i].getBoundingClientRect().width;
| + | $('<table>') |
| − | $newHeaderColgroup.append(
| + | .addClass('header-fixed-helper') |
| − | $('<col>').css('width', width)
| + | .addClass('wikitable') |
| − | );
| + | .css('position', 'sticky') |
| − | }
| + | .css('top', '0') |
| | + | .css('z-index', '9') |
| | + | .css('display', 'none') |
| | + | .css('background-color', '#fff') |
| | + | .css('margin-top', '0') |
| | + | .css('margin-bottom', '0') |
| | + | .css('table-layout', 'fixed') |
| | + | .append($newHeaderColgroup) |
| | + | .append($newHeaderContent) |
| | + | ); |
| | + | tables.push({ table: this, helper: this.previousSibling }); |
| | + | $(this.previousSibling).css('width', $(this).width() + 1); |
| | + | /* |
| | + | if (tabberTabParent) { |
| | + | tabberTabParent.style.visibility = ""; |
| | + | tabberTabParent.style.display = originalStyleDisplay; |
| | + | } |
| | + | */ |
| | + | $(this).addClass('header-fixed-done'); |
| | + | }); |
| | + | } |
| | | | |
| − | $(this).before(
| + | $(window).on('scroll', function() { |
| − | $('<table>')
| + | var scrollOffset = $(this).scrollTop(); |
| − | .addClass('header-fixed-helper')
| + | for (var i = 0; i < tables.length; i++) { |
| − | .addClass('wikitable')
| + | var tableOffset = $(tables[i].table).offset().top; |
| − | .css('position', 'sticky')
| + | var tableHeight = $(tables[i].table).height(); |
| − | .css('top', '0')
| + | var helperHeight = $(tables[i].helper).height(); |
| − | .css('z-index', '9')
| + | if ((scrollOffset > tableOffset) && (scrollOffset < (tableOffset + tableHeight - helperHeight))) { |
| − | .css('display', 'none')
| + | if ($(tables[i].helper).is(':hidden')) { |
| − | .css('background-color', '#fff')
| + | $(tables[i].helper).show(); |
| − | .css('margin-top', '0')
| + | } |
| − | .css('margin-bottom', '0')
| + | } else { |
| − | .css('table-layout', 'fixed')
| + | $(tables[i].helper).hide(); |
| − | .append($newHeaderColgroup)
| + | } |
| − | .append($newHeaderContent)
| |
| − | );
| |
| − | tables.push({
| |
| − | table: this,
| |
| − | helper: this.previousSibling
| |
| − | });
| |
| − | $(this.previousSibling).css('width', $(this).width() + 1);
| |
| − | | |
| − | // Restore original tab display status
| |
| − | // if this table was under tabber and hidden
| |
| − | if (tabberTabParent) {
| |
| − | tabberTabParent.style.visibility = "";
| |
| − | tabberTabParent.style.display = originalStyleDisplay;
| |
| − | }
| |
| − |
| |
| − | $(this).addClass('header-fixed-done');
| |
| − | });
| |
| − | | |
| − | $(window).on('scroll', function() {
| |
| − | var scrollOffset = $(this).scrollTop();
| |
| − | for (var i = 0; i < tables.length; i++) {
| |
| − | var tableOffset = $(tables[i].table).offset().top;
| |
| − | var tableHeight = $(tables[i].table).height();
| |
| − | var helperHeight = $(tables[i].helper).height();
| |
| − | if ((scrollOffset > tableOffset) && (scrollOffset < (tableOffset + tableHeight - helperHeight))) {
| |
| − | if ($(tables[i].helper).is(':hidden'))
| |
| − | $(tables[i].helper).show();
| |
| − | } else {
| |
| − | $(tables[i].helper).hide();
| |
| − | }
| |
| − | }
| |
| − | });
| |
| | } | | } |
| | + | }); |
| | | | |
| − | var ts = $.fn.tablesorter;
| + | /* |
| − | $.fn.tablesorter = function() {
| + | var ts = $.fn.tablesorter; |
| − | ts.apply(this, arguments);
| + | $.fn.tablesorter = function() { |
| − | initializeStickyHeader();
| + | ts.apply(this, arguments); |
| − | }
| + | initializeStickyHeader(); |
| − |
| + | } |
| − | initializeStickyHeader();
| + | */ |
| − | }) | + | initializeStickyHeader(); |
| | + | //}) |
| | }); | | }); |