123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- /* Tabulator v4.8.2 (c) Oliver Folkerd */
-
- var FrozenColumns = function FrozenColumns(table) {
- this.table = table; //hold Tabulator object
- this.leftColumns = [];
- this.rightColumns = [];
- this.leftMargin = 0;
- this.rightMargin = 0;
- this.rightPadding = 0;
- this.initializationMode = "left";
- this.active = false;
- this.scrollEndTimer = false;
- };
-
- //reset initial state
- FrozenColumns.prototype.reset = function () {
- this.initializationMode = "left";
- this.leftColumns = [];
- this.rightColumns = [];
- this.leftMargin = 0;
- this.rightMargin = 0;
- this.rightMargin = 0;
- this.active = false;
-
- this.table.columnManager.headersElement.style.marginLeft = 0;
- this.table.columnManager.element.style.paddingRight = 0;
- };
-
- //initialize specific column
- FrozenColumns.prototype.initializeColumn = function (column) {
- var config = { margin: 0, edge: false };
-
- if (!column.isGroup) {
-
- if (this.frozenCheck(column)) {
-
- config.position = this.initializationMode;
-
- if (this.initializationMode == "left") {
- this.leftColumns.push(column);
- } else {
- this.rightColumns.unshift(column);
- }
-
- this.active = true;
-
- column.modules.frozen = config;
- } else {
- this.initializationMode = "right";
- }
- }
- };
-
- FrozenColumns.prototype.frozenCheck = function (column) {
- var frozen = false;
-
- if (column.parent.isGroup && column.definition.frozen) {
- console.warn("Frozen Column Error - Parent column group must be frozen, not individual columns or sub column groups");
- }
-
- if (column.parent.isGroup) {
- return this.frozenCheck(column.parent);
- } else {
- return column.definition.frozen;
- }
-
- return frozen;
- };
-
- //quick layout to smooth horizontal scrolling
- FrozenColumns.prototype.scrollHorizontal = function () {
- var _this = this;
-
- var rows;
-
- if (this.active) {
- clearTimeout(this.scrollEndTimer);
-
- //layout all rows after scroll is complete
- this.scrollEndTimer = setTimeout(function () {
- _this.layout();
- }, 100);
-
- rows = this.table.rowManager.getVisibleRows();
-
- this.calcMargins();
-
- this.layoutColumnPosition();
-
- this.layoutCalcRows();
-
- rows.forEach(function (row) {
- if (row.type === "row") {
- _this.layoutRow(row);
- }
- });
-
- this.table.rowManager.tableElement.style.marginRight = this.rightMargin;
- }
- };
-
- //calculate margins for rows
- FrozenColumns.prototype.calcMargins = function () {
- this.leftMargin = this._calcSpace(this.leftColumns, this.leftColumns.length) + "px";
- this.table.columnManager.headersElement.style.marginLeft = this.leftMargin;
-
- this.rightMargin = this._calcSpace(this.rightColumns, this.rightColumns.length) + "px";
- this.table.columnManager.element.style.paddingRight = this.rightMargin;
-
- //calculate right frozen columns
- this.rightPadding = this.table.rowManager.element.clientWidth + this.table.columnManager.scrollLeft;
- };
-
- //layout calculation rows
- FrozenColumns.prototype.layoutCalcRows = function () {
- if (this.table.modExists("columnCalcs")) {
- if (this.table.modules.columnCalcs.topInitialized && this.table.modules.columnCalcs.topRow) {
- this.layoutRow(this.table.modules.columnCalcs.topRow);
- }
- if (this.table.modules.columnCalcs.botInitialized && this.table.modules.columnCalcs.botRow) {
- this.layoutRow(this.table.modules.columnCalcs.botRow);
- }
- }
- };
-
- //calculate column positions and layout headers
- FrozenColumns.prototype.layoutColumnPosition = function (allCells) {
- var _this2 = this;
-
- var leftParents = [];
-
- this.leftColumns.forEach(function (column, i) {
- column.modules.frozen.margin = _this2._calcSpace(_this2.leftColumns, i) + _this2.table.columnManager.scrollLeft + "px";
-
- if (i == _this2.leftColumns.length - 1) {
- column.modules.frozen.edge = true;
- } else {
- column.modules.frozen.edge = false;
- }
-
- if (column.parent.isGroup) {
- var parentEl = _this2.getColGroupParentElement(column);
- if (!leftParents.includes(parentEl)) {
- _this2.layoutElement(parentEl, column);
- leftParents.push(parentEl);
- }
-
- if (column.modules.frozen.edge) {
- parentEl.classList.add("tabulator-frozen-" + column.modules.frozen.position);
- }
- } else {
- _this2.layoutElement(column.getElement(), column);
- }
-
- if (allCells) {
- column.cells.forEach(function (cell) {
- _this2.layoutElement(cell.getElement(), column);
- });
- }
- });
-
- this.rightColumns.forEach(function (column, i) {
- column.modules.frozen.margin = _this2.rightPadding - _this2._calcSpace(_this2.rightColumns, i + 1) + "px";
-
- if (i == _this2.rightColumns.length - 1) {
- column.modules.frozen.edge = true;
- } else {
- column.modules.frozen.edge = false;
- }
-
- if (column.parent.isGroup) {
- _this2.layoutElement(_this2.getColGroupParentElement(column), column);
- } else {
- _this2.layoutElement(column.getElement(), column);
- }
-
- if (allCells) {
- column.cells.forEach(function (cell) {
- _this2.layoutElement(cell.getElement(), column);
- });
- }
- });
- };
-
- FrozenColumns.prototype.getColGroupParentElement = function (column) {
- return column.parent.isGroup ? this.getColGroupParentElement(column.parent) : column.getElement();
- };
-
- //layout columns appropropriatly
- FrozenColumns.prototype.layout = function () {
- var self = this,
- rightMargin = 0;
-
- if (self.active) {
-
- //calculate row padding
- this.calcMargins();
-
- // self.table.rowManager.activeRows.forEach(function(row){
- // self.layoutRow(row);
- // });
-
- // if(self.table.options.dataTree){
- self.table.rowManager.getDisplayRows().forEach(function (row) {
- if (row.type === "row") {
- self.layoutRow(row);
- }
- });
- // }
-
- this.layoutCalcRows();
-
- //calculate left columns
- this.layoutColumnPosition(true);
-
- // if(tableHolder.scrollHeight > tableHolder.clientHeight){
- // rightMargin -= tableHolder.offsetWidth - tableHolder.clientWidth;
- // }
-
- this.table.rowManager.tableElement.style.marginRight = this.rightMargin;
- }
- };
-
- FrozenColumns.prototype.layoutRow = function (row) {
- var _this3 = this;
-
- var rowEl = row.getElement();
-
- rowEl.style.paddingLeft = this.leftMargin;
- // rowEl.style.paddingRight = this.rightMargin + "px";
-
- this.leftColumns.forEach(function (column) {
- var cell = row.getCell(column);
-
- if (cell) {
- _this3.layoutElement(cell.getElement(), column);
- }
- });
-
- this.rightColumns.forEach(function (column) {
- var cell = row.getCell(column);
-
- if (cell) {
- _this3.layoutElement(cell.getElement(), column);
- }
- });
- };
-
- FrozenColumns.prototype.layoutElement = function (element, column) {
-
- if (column.modules.frozen) {
- element.style.position = "absolute";
- element.style.left = column.modules.frozen.margin;
-
- element.classList.add("tabulator-frozen");
-
- if (column.modules.frozen.edge) {
- element.classList.add("tabulator-frozen-" + column.modules.frozen.position);
- }
- }
- };
-
- FrozenColumns.prototype._calcSpace = function (columns, index) {
- var width = 0;
-
- for (var i = 0; i < index; i++) {
- if (columns[i].visible) {
- width += columns[i].getWidth();
- }
- }
-
- return width;
- };
-
- Tabulator.prototype.registerModule("frozenColumns", FrozenColumns);
|