import { fastInnerHTML } from '../../../helpers/dom/element';
import { clone } from '../../../helpers/object';
class GhostTable {
constructor(plugin) {
/**
* Reference to NestedHeaders plugin.
*
* @type {NestedHeaders}
*/
this.nestedHeaders = plugin;
/**
* Temporary element created to get minimal headers widths.
*
* @type {*}
*/
this.container = void 0;
/**
* Cached the headers widths.
*
* @type {Array}
*/
this.widthsCache = [];
}
/**
* Build cache of the headers widths.
*
* @private
*/
buildWidthsMapper() {
this.container = document.createElement('div');
this.buildGhostTable(this.container);
this.nestedHeaders.hot.rootElement.appendChild(this.container);
const columns = this.container.querySelectorAll('tr:last-of-type th');
const maxColumns = columns.length;
for (let i = 0; i < maxColumns; i++) {
this.widthsCache.push(columns[i].offsetWidth);
}
this.container.parentNode.removeChild(this.container);
this.container = null;
this.nestedHeaders.hot.render();
}
/**
* Build temporary table for getting minimal columns widths.
*
* @private
* @param {HTMLElement} container
*/
buildGhostTable(container) {
const d = document;
const fragment = d.createDocumentFragment();
const table = d.createElement('table');
let lastRowColspan = false;
const isDropdownEnabled = !!this.nestedHeaders.hot.getSettings().dropdownMenu;
const maxRows = this.nestedHeaders.colspanArray.length;
const maxCols = this.nestedHeaders.hot.countCols();
const lastRowIndex = maxRows - 1;
for (let row = 0; row < maxRows; row++) {
const tr = d.createElement('tr');
lastRowColspan = false;
for (let col = 0; col < maxCols; col++) {
const td = d.createElement('th');
const headerObj = clone(this.nestedHeaders.colspanArray[row][col]);
if (headerObj && !headerObj.hidden) {
if (row === lastRowIndex) {
if (headerObj.colspan > 1) {
lastRowColspan = true;
}
if (isDropdownEnabled) {
headerObj.label += '';
}
}
fastInnerHTML(td, headerObj.label);
td.colSpan = headerObj.colspan;
tr.appendChild(td);
}
}
table.appendChild(tr);
}
// We have to be sure the last row contains only the single columns.
if (lastRowColspan) {
{
const tr = d.createElement('tr');
for (let col = 0; col < maxCols; col++) {
const td = d.createElement('th');
tr.appendChild(td);
}
table.appendChild(tr);
}
}
fragment.appendChild(table);
container.appendChild(fragment);
}
/**
* Clear the widths cache.
*/
clear() {
this.container = null;
this.widthsCache.length = 0;
}
}
export default GhostTable;