handsontable
Version:
Handsontable is a JavaScript Data Grid available for React, Angular and Vue.
102 lines (101 loc) • 4.48 kB
JavaScript
import { getStyle, getTrimmingContainer, isVisible } from "./../../../../helpers/dom/element.mjs";
import Table from "../table.mjs";
import calculatedRows from "./mixin/calculatedRows.mjs";
import calculatedColumns from "./mixin/calculatedColumns.mjs";
import { mixin } from "./../../../../helpers/object.mjs";
/**
* Subclass of `Table` that provides the helper methods relevant to the master table (not overlays), implemented through mixins.
*
* @mixes calculatedRows
* @mixes calculatedColumns
*/
class MasterTable extends Table {
/**
* @param {TableDao} dataAccessObject The data access object.
* @param {FacadeGetter} facadeGetter Function which return proper facade.
* @param {DomBindings} domBindings Bindings into DOM.
* @param {Settings} wtSettings The Walkontable settings.
*/
constructor(dataAccessObject, facadeGetter, domBindings, wtSettings) {
super(dataAccessObject, facadeGetter, domBindings, wtSettings, 'master');
}
alignOverlaysWithTrimmingContainer() {
const trimmingElement = getTrimmingContainer(this.wtRootElement);
const {
rootWindow
} = this.domBindings;
if (trimmingElement === rootWindow) {
const preventOverflow = this.wtSettings.getSetting('preventOverflow');
if (!preventOverflow) {
this.holder.style.overflow = 'visible';
this.wtRootElement.style.overflow = 'visible';
}
} else {
const trimmingElementParent = trimmingElement.parentElement;
const trimmingHeight = getStyle(trimmingElement, 'height', rootWindow);
const trimmingOverflow = getStyle(trimmingElement, 'overflow', rootWindow);
const holderStyle = this.holder.style;
const {
scrollWidth,
scrollHeight
} = trimmingElement;
let width = trimmingElement.offsetWidth;
let height = trimmingElement.offsetHeight;
const overflow = ['auto', 'hidden', 'scroll'];
if (trimmingElementParent && overflow.includes(trimmingOverflow)) {
const cloneNode = trimmingElement.cloneNode(false);
// Before calculating the height of the trimming element, set overflow: auto to hide scrollbars.
// An issue occurred on Firefox, where an empty element with overflow: scroll returns an element height higher than 0px
// despite an empty content within.
cloneNode.style.overflow = 'auto';
// Issue #9545 shows problem with calculating height for HOT on Firefox while placing instance in some
// flex containers and setting overflow for some `div` section.
cloneNode.style.position = 'absolute';
if (trimmingElement.nextElementSibling) {
trimmingElementParent.insertBefore(cloneNode, trimmingElement.nextElementSibling);
} else {
trimmingElementParent.appendChild(cloneNode);
}
const cloneHeight = parseInt(rootWindow.getComputedStyle(cloneNode).height, 10);
trimmingElementParent.removeChild(cloneNode);
if (cloneHeight === 0) {
height = 0;
}
}
height = Math.min(height, scrollHeight);
holderStyle.height = trimmingHeight === 'auto' ? 'auto' : `${height}px`;
width = Math.min(width, scrollWidth);
holderStyle.width = `${width}px`;
holderStyle.overflow = '';
this.hasTableHeight = holderStyle.height === 'auto' ? true : height > 0;
this.hasTableWidth = width > 0;
}
this.isTableVisible = isVisible(this.TABLE);
}
markOversizedColumnHeaders() {
const {
wtSettings
} = this;
const {
wtViewport
} = this.dataAccessObject;
const overlayName = 'master';
const columnHeaders = wtSettings.getSetting('columnHeaders');
const columnHeadersCount = columnHeaders.length;
if (columnHeadersCount && !wtViewport.hasOversizedColumnHeadersMarked[overlayName]) {
const rowHeaders = wtSettings.getSetting('rowHeaders');
const rowHeaderCount = rowHeaders.length;
const columnCount = this.getRenderedColumnsCount();
for (let i = 0; i < columnHeadersCount; i++) {
for (let renderedColumnIndex = -1 * rowHeaderCount; renderedColumnIndex < columnCount; renderedColumnIndex++) {
// eslint-disable-line max-len
this.markIfOversizedColumnHeader(renderedColumnIndex);
}
}
wtViewport.hasOversizedColumnHeadersMarked[overlayName] = true;
}
}
}
mixin(MasterTable, calculatedRows);
mixin(MasterTable, calculatedColumns);
export default MasterTable;