123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- /**
- * 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);
|