/* =======================================
STICKY HEADER FOR LIST TABLES
======================================= */
/**
* Third party plugins
*/
import '../../../vendor/jquery.floatThead'; // A fixed version compatible with webpack
import Settings from '../../config/_settings';
import Globals from './_globals';
import StickyColumns from './_sticky-columns';
import Tooltip from '../_tooltip';
export default class StickyHeader {
constructor(
private settings: Settings,
private globals: Globals,
private stickyCols: StickyColumns,
private tooltip: Tooltip
) {
// Add the floating table header.
this.globals.enabledStickyHeader = $('.sticky-header-button').hasClass('active');
if (this.globals.enabledStickyHeader) {
this.addFloatThead();
}
// This event will trigger on the table when the header is floated and unfloated.
this.globals.$atumTable.on('floatThead', (evt: any, isFloated: boolean, $floatContainer: JQuery) => {
if (isFloated) {
$floatContainer.css('height', 'auto');
$('.jspContainer').height($('.jspPane').height());
// Hide search dropdown on sticky.
if (this.settings.get('searchDropdown') === 'yes') {
$('#search_column_dropdown').hide();
}
// Hide on mobile view.
if ($('#wpadminbar').css('position') === 'absolute') {
$floatContainer.hide();
}
else {
$floatContainer.show();
}
// Add the sticky columns to the floating header if needed.
if (this.globals.enabledStickyColumns) {
// Reposition the sticky cols to fit the floating header.
if (this.globals.$stickyCols !== null) {
this.globals.$stickyCols.css('top', -1 * ($floatContainer.height() - 1));
}
let $floatTheadTable = this.globals.$atumList.find('.floatThead-table');
this.globals.$floatTheadStickyCols = this.stickyCols.createStickyColumns($floatTheadTable);
if (this.globals.$floatTheadStickyCols !== null) {
$floatTheadTable.after(this.globals.$floatTheadStickyCols);
this.globals.$floatTheadStickyCols.css('width', this.globals.$stickyCols.width() + 1);
// Add the colgroup tag with column widths.
this.globals.$floatTheadStickyCols.prepend('
');
let $colGroup = this.globals.$floatTheadStickyCols.find('colgroup');
$floatTheadTable.find('thead .item-heads').children().each( (index: number, elem: Element) => {
let $cell = $(elem),
id = $cell.attr('id');
if ($cell.hasClass('hidden')) {
return;
}
if (this.globals.$floatTheadStickyCols.find('thead .item-heads').children('#' + id).length) {
$colGroup.append('');
}
});
// Remove the manage-column class to not conflict with the WP's Screen Options functionality.
this.globals.$floatTheadStickyCols.find('.manage-column').removeClass('manage-column');
$colGroup.prependTo(this.globals.$floatTheadStickyCols);
this.adjustStickyHeaders(this.globals.$floatTheadStickyCols, $floatTheadTable);
}
}
}
else {
$floatContainer.css('height', 0);
if (this.globals.enabledStickyColumns) {
// Reset the sticky columns position.
if (this.globals.$stickyCols !== null) {
this.globals.$stickyCols.css('top', 0);
}
// Remove the floating header's sticky columns.
if (this.globals.$floatTheadStickyCols !== null) {
this.globals.$floatTheadStickyCols.remove();
}
}
}
});
// Bind Scroll-X events.
this.globals.$atumList.on('atum-scroll-bar-scroll-x', (evt: any, origEvt: any, scrollPositionX: number, isAtLeft: boolean, isAtRight: boolean) => {
// Handle the sticky cols position and visibility when scrolling.
if (this.globals.enabledStickyColumns === true && this.globals.$stickyCols !== null) {
// Add the stickyCols table (if enabled).
if (!this.globals.$atumList.find('.atum-list-table.cloned').length) {
this.globals.$atumTable.after(this.globals.$stickyCols);
this.tooltip.addTooltips();
this.globals.$atumList.trigger('atum-added-sticky-columns');
}
// Hide the sticky cols when reaching the left side of the panel.
if (scrollPositionX <= 0) {
this.globals.$stickyCols.hide().css('left', 0);
if (this.globals.$floatTheadStickyCols !== null) {
this.globals.$floatTheadStickyCols.hide().css('left', 0);
}
}
// Reposition the sticky cols while scrolling the pane.
else {
this.globals.$stickyCols.show().css('left', scrollPositionX);
if (this.globals.$floatTheadStickyCols !== null) {
this.globals.$floatTheadStickyCols.show().css('left', scrollPositionX);
}
// Ensure sticky column heights are matching.
this.adjustStickyHeaders(this.globals.$stickyCols, this.globals.$atumTable);
}
}
});
}
/**
* Add the floating header to the table
*/
addFloatThead() {
if (!this.globals.enabledStickyHeader) {
return false;
}
if (typeof this.globals.$atumTable.data('floatTheadAttached') !== 'undefined' && this.globals.$atumTable.data('floatTheadAttached') !== false) {
this.reloadFloatThead();
return;
}
(this.globals.$atumTable).floatThead({
responsiveContainer: ($table: JQuery) => {
return $table.closest('.jspContainer');
},
position : 'absolute',
top : $('#wpadminbar').height(),
autoReflow : true,
});
}
/**
* Reload the floating table header
*/
reloadFloatThead() {
if (this.globals.enabledStickyHeader) {
this.destroyFloatThead();
this.addFloatThead();
}
}
/**
* Destroy the floating table header
*/
destroyFloatThead() {
if (typeof this.globals.$atumTable.data('floatTheadAttached') !== 'undefined' && this.globals.$atumTable.data('floatTheadAttached') !== false) {
(this.globals.$atumTable).floatThead('destroy');
}
}
/**
* Adjust the header heights to match the List Table heights
*
* @param jQuery $stickyTable
* @param jQuery $origTable
*/
adjustStickyHeaders($stickyTable: JQuery, $origTable: JQuery) {
$.each( ['column-groups', 'item-heads'], (index: number, className: string) => {
$stickyTable.find('.' + className + ' > th').first().css('height', $origTable.find('.' + className + ' > th').first().height());
});
}
}