Mercurial > hg > cmmr2012-drupal-site
diff core/misc/tableheader.js @ 0:c75dbcec494b
Initial commit from drush-created site
author | Chris Cannam |
---|---|
date | Thu, 05 Jul 2018 14:24:15 +0000 |
parents | |
children | a9cd425dd02b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/misc/tableheader.js Thu Jul 05 14:24:15 2018 +0000 @@ -0,0 +1,167 @@ +/** +* DO NOT EDIT THIS FILE. +* See the following change record for more information, +* https://www.drupal.org/node/2815083 +* @preserve +**/ + +(function ($, Drupal, displace) { + Drupal.behaviors.tableHeader = { + attach: function attach(context) { + $(window).one('scroll.TableHeaderInit', { context: context }, tableHeaderInitHandler); + } + }; + + function scrollValue(position) { + return document.documentElement[position] || document.body[position]; + } + + function tableHeaderInitHandler(e) { + var $tables = $(e.data.context).find('table.sticky-enabled').once('tableheader'); + var il = $tables.length; + for (var i = 0; i < il; i++) { + TableHeader.tables.push(new TableHeader($tables[i])); + } + forTables('onScroll'); + } + + function forTables(method, arg) { + var tables = TableHeader.tables; + var il = tables.length; + for (var i = 0; i < il; i++) { + tables[i][method](arg); + } + } + + function tableHeaderResizeHandler(e) { + forTables('recalculateSticky'); + } + + function tableHeaderOnScrollHandler(e) { + forTables('onScroll'); + } + + function tableHeaderOffsetChangeHandler(e, offsets) { + forTables('stickyPosition', offsets.top); + } + + $(window).on({ + 'resize.TableHeader': tableHeaderResizeHandler, + + 'scroll.TableHeader': tableHeaderOnScrollHandler + }); + + $(document).on({ + 'columnschange.TableHeader': tableHeaderResizeHandler, + + 'drupalViewportOffsetChange.TableHeader': tableHeaderOffsetChangeHandler + }); + + function TableHeader(table) { + var $table = $(table); + + this.$originalTable = $table; + + this.$originalHeader = $table.children('thead'); + + this.$originalHeaderCells = this.$originalHeader.find('> tr > th'); + + this.displayWeight = null; + this.$originalTable.addClass('sticky-table'); + this.tableHeight = $table[0].clientHeight; + this.tableOffset = this.$originalTable.offset(); + + this.$originalTable.on('columnschange', { tableHeader: this }, function (e, display) { + var tableHeader = e.data.tableHeader; + if (tableHeader.displayWeight === null || tableHeader.displayWeight !== display) { + tableHeader.recalculateSticky(); + } + tableHeader.displayWeight = display; + }); + + this.createSticky(); + } + + $.extend(TableHeader, { + tables: [] + }); + + $.extend(TableHeader.prototype, { + minHeight: 100, + + tableOffset: null, + + tableHeight: null, + + stickyVisible: false, + + createSticky: function createSticky() { + var $stickyHeader = this.$originalHeader.clone(true); + + this.$stickyTable = $('<table class="sticky-header"/>').css({ + visibility: 'hidden', + position: 'fixed', + top: '0px' + }).append($stickyHeader).insertBefore(this.$originalTable); + + this.$stickyHeaderCells = $stickyHeader.find('> tr > th'); + + this.recalculateSticky(); + }, + 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'; + } + return this.$stickyTable.css(css); + }, + 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) { + visible = true; + } + + this.stickyVisible = visible; + return visible; + }, + onScroll: function onScroll(e) { + this.checkStickyVisible(); + + this.stickyPosition(null, scrollValue('scrollLeft')); + this.$stickyTable.css('visibility', this.stickyVisible ? 'visible' : 'hidden'); + }, + recalculateSticky: function recalculateSticky(event) { + this.tableHeight = this.$originalTable[0].clientHeight; + + displace.offsets.top = displace.calculateOffset('top'); + this.tableOffset = this.$originalTable.offset(); + this.stickyPosition(displace.offsets.top, scrollValue('scrollLeft')); + + var $that = null; + var $stickyCell = null; + var display = null; + + 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('display', 'none'); + } + } + this.$stickyTable.css('width', this.$originalTable.outerWidth()); + } + }); + + Drupal.TableHeader = TableHeader; +})(jQuery, Drupal, window.parent.Drupal.displace); \ No newline at end of file