X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmisc%2Ftableheader.js;h=bce54ec7d43d9cf9d6bbac087ba22a455b9fa088;hp=8fc1b048963c90fabad8b08e864e875a51714bc7;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hpb=aea91e65e895364e460983b890e295aa5d5540a5 diff --git a/web/core/misc/tableheader.js b/web/core/misc/tableheader.js index 8fc1b0489..bce54ec7d 100644 --- a/web/core/misc/tableheader.js +++ b/web/core/misc/tableheader.js @@ -1,23 +1,14 @@ /** - * @file - * Sticky table headers. - */ +* DO NOT EDIT THIS FILE. +* See the following change record for more information, +* https://www.drupal.org/node/2815083 +* @preserve +**/ (function ($, Drupal, displace) { - - 'use strict'; - - /** - * Attaches sticky table headers. - * - * @type {Drupal~behavior} - * - * @prop {Drupal~behaviorAttach} attach - * Attaches the sticky table header behavior. - */ Drupal.behaviors.tableHeader = { - attach: function (context) { - $(window).one('scroll.TableHeaderInit', {context: context}, tableHeaderInitHandler); + attach: function attach(context) { + $(window).one('scroll.TableHeaderInit', { context: context }, tableHeaderInitHandler); } }; @@ -25,7 +16,6 @@ return document.documentElement[position] || document.body[position]; } - // Select and initialize sticky table headers. function tableHeaderInitHandler(e) { var $tables = $(e.data.context).find('table.sticky-enabled').once('tableheader'); var il = $tables.length; @@ -35,7 +25,6 @@ forTables('onScroll'); } - // Helper method to loop through tables and execute a method. function forTables(method, arg) { var tables = TableHeader.tables; var il = tables.length; @@ -56,85 +45,33 @@ forTables('stickyPosition', offsets.top); } - // Bind event that need to change all tables. $(window).on({ - - /** - * When resizing table width can change, recalculate everything. - * - * @ignore - */ 'resize.TableHeader': tableHeaderResizeHandler, - /** - * Bind only one event to take care of calling all scroll callbacks. - * - * @ignore - */ 'scroll.TableHeader': tableHeaderOnScrollHandler }); - // Bind to custom Drupal events. - $(document).on({ - /** - * Recalculate columns width when window is resized and when show/hide - * weight is triggered. - * - * @ignore - */ + $(document).on({ 'columnschange.TableHeader': tableHeaderResizeHandler, - /** - * Recalculate TableHeader.topOffset when viewport is resized. - * - * @ignore - */ 'drupalViewportOffsetChange.TableHeader': tableHeaderOffsetChangeHandler }); - /** - * Constructor for the tableHeader object. Provides sticky table headers. - * - * TableHeader will make the current table header stick to the top of the page - * if the table is very long. - * - * @constructor Drupal.TableHeader - * - * @param {HTMLElement} table - * DOM object for the table to add a sticky header to. - * - * @listens event:columnschange - */ function TableHeader(table) { var $table = $(table); - /** - * @name Drupal.TableHeader#$originalTable - * - * @type {HTMLElement} - */ this.$originalTable = $table; - /** - * @type {jQuery} - */ this.$originalHeader = $table.children('thead'); - /** - * @type {jQuery} - */ this.$originalHeaderCells = this.$originalHeader.find('> tr > th'); - /** - * @type {null|bool} - */ this.displayWeight = null; this.$originalTable.addClass('sticky-table'); this.tableHeight = $table[0].clientHeight; this.tableOffset = this.$originalTable.offset(); - // React to columns change to avoid making checks in the scroll callback. - this.$originalTable.on('columnschange', {tableHeader: this}, function (e, display) { + this.$originalTable.on('columnschange', { tableHeader: this }, function (e, display) { var tableHeader = e.data.tableHeader; if (tableHeader.displayWeight === null || tableHeader.displayWeight !== display) { tableHeader.recalculateSticky(); @@ -142,167 +79,83 @@ tableHeader.displayWeight = display; }); - // Create and display sticky header. this.createSticky(); } - /** - * Store the state of TableHeader. - */ - $.extend(TableHeader, /** @lends Drupal.TableHeader */{ - - /** - * This will store the state of all processed tables. - * - * @type {Array.} - */ + $.extend(TableHeader, { tables: [] }); - /** - * Extend TableHeader prototype. - */ - $.extend(TableHeader.prototype, /** @lends Drupal.TableHeader# */{ - - /** - * Minimum height in pixels for the table to have a sticky header. - * - * @type {number} - */ + $.extend(TableHeader.prototype, { minHeight: 100, - /** - * Absolute position of the table on the page. - * - * @type {?Drupal~displaceOffset} - */ tableOffset: null, - /** - * Absolute position of the table on the page. - * - * @type {?number} - */ tableHeight: null, - /** - * Boolean storing the sticky header visibility state. - * - * @type {bool} - */ stickyVisible: false, - /** - * Create the duplicate header. - */ - createSticky: function () { - // Clone the table header so it inherits original jQuery properties. + createSticky: function createSticky() { var $stickyHeader = this.$originalHeader.clone(true); - // Hide the table to avoid a flash of the header clone upon page load. - this.$stickyTable = $('') - .css({ - visibility: 'hidden', - position: 'fixed', - top: '0px' - }) - .append($stickyHeader) - .insertBefore(this.$originalTable); + + this.$stickyTable = $('').css({ + visibility: 'hidden', + position: 'fixed', + top: '0px' + }).append($stickyHeader).insertBefore(this.$originalTable); this.$stickyHeaderCells = $stickyHeader.find('> tr > th'); - // Initialize all computations. this.recalculateSticky(); }, - - /** - * Set absolute position of sticky. - * - * @param {number} offsetTop - * The top offset for the sticky header. - * @param {number} offsetLeft - * The left offset for the sticky header. - * - * @return {jQuery} - * The sticky table as a jQuery collection. - */ - stickyPosition: function (offsetTop, offsetLeft) { + stickyPosition: function stickyPosition(offsetTop, offsetLeft) { var css = {}; if (typeof offsetTop === 'number') { css.top = offsetTop + 'px'; } if (typeof offsetLeft === 'number') { - css.left = (this.tableOffset.left - offsetLeft) + 'px'; + css.left = this.tableOffset.left - offsetLeft + 'px'; } return this.$stickyTable.css(css); }, - - /** - * Returns true if sticky is currently visible. - * - * @return {bool} - * The visibility status. - */ - checkStickyVisible: function () { + checkStickyVisible: function checkStickyVisible() { var scrollTop = scrollValue('scrollTop'); var tableTop = this.tableOffset.top - displace.offsets.top; var tableBottom = tableTop + this.tableHeight; var visible = false; - if (tableTop < scrollTop && scrollTop < (tableBottom - this.minHeight)) { + if (tableTop < scrollTop && scrollTop < tableBottom - this.minHeight) { visible = true; } this.stickyVisible = visible; return visible; }, - - /** - * Check if sticky header should be displayed. - * - * This function is throttled to once every 250ms to avoid unnecessary - * calls. - * - * @param {jQuery.Event} e - * The scroll event. - */ - onScroll: function (e) { + onScroll: function onScroll(e) { this.checkStickyVisible(); - // Track horizontal positioning relative to the viewport. + this.stickyPosition(null, scrollValue('scrollLeft')); this.$stickyTable.css('visibility', this.stickyVisible ? 'visible' : 'hidden'); }, - - /** - * Event handler: recalculates position of the sticky table header. - * - * @param {jQuery.Event} event - * Event being triggered. - */ - recalculateSticky: function (event) { - // Update table size. + recalculateSticky: function recalculateSticky(event) { this.tableHeight = this.$originalTable[0].clientHeight; - // Update offset top. displace.offsets.top = displace.calculateOffset('top'); this.tableOffset = this.$originalTable.offset(); this.stickyPosition(displace.offsets.top, scrollValue('scrollLeft')); - // Update columns width. var $that = null; var $stickyCell = null; var display = null; - // Resize header and its cell widths. - // Only apply width to visible table cells. This prevents the header from - // displaying incorrectly when the sticky header is no longer visible. + var il = this.$originalHeaderCells.length; for (var i = 0; i < il; i++) { $that = $(this.$originalHeaderCells[i]); $stickyCell = this.$stickyHeaderCells.eq($that.index()); display = $that.css('display'); if (display !== 'none') { - $stickyCell.css({width: $that.css('width'), display: display}); - } - else { + $stickyCell.css({ width: $that.css('width'), display: display }); + } else { $stickyCell.css('display', 'none'); } } @@ -310,7 +163,5 @@ } }); - // Expose constructor in the public space. Drupal.TableHeader = TableHeader; - -}(jQuery, Drupal, window.parent.Drupal.displace)); +})(jQuery, Drupal, window.parent.Drupal.displace); \ No newline at end of file