jquery.tabulator
Version:
Interactive table generation plugin for jQuery UI
162 lines (124 loc) • 4.25 kB
JavaScript
var FrozenColumns = function(table){
this.table = table; //hold Tabulator object
this.leftColumns = [];
this.rightColumns = [];
this.leftMargin = 0;
this.rightMargin = 0;
this.initializationMode = "left";
this.active = false;
};
//reset initial state
FrozenColumns.prototype.reset = function(){
this.initializationMode = "left";
this.leftColumns = [];
this.rightColumns = [];
this.active = false;
};
//initialize specific column
FrozenColumns.prototype.initializeColumn = function(column){
var config = {margin:0, edge:false};
if(column.definition.frozen){
if(!column.parent.isGroup){
if(!column.isGroup){
config.position = this.initializationMode;
if(this.initializationMode == "left"){
this.leftColumns.push(column);
}else{
this.rightColumns.unshift(column);
}
this.active = true;
column.extensions.frozen = config;
}else{
console.warn("Frozen Column Error - Column Groups cannot be frozen");
}
}else{
console.warn("Frozen Column Error - Grouped columns cannot be frozen");
}
}else{
this.initializationMode = "right";
}
};
//layout columns appropropriatly
FrozenColumns.prototype.layout = function(){
var self = this,
tableHolder = this.table.rowManager.element,
rightMargin = 0;
if(self.active){
//calculate row padding
self.leftMargin = self._calcSpace(self.leftColumns, self.leftColumns.length);
self.table.columnManager.headersElement.css("margin-left", self.leftMargin);
self.rightMargin = self._calcSpace(self.rightColumns, self.rightColumns.length);
self.table.columnManager.element.css("padding-right", self.rightMargin);
self.table.rowManager.activeRows.forEach(function(row){
self.layoutRow(row);
});
if(self.table.extExists("columnCalcs")){
if(self.table.extensions.columnCalcs.topInitialized && self.table.extensions.columnCalcs.topRow){
self.layoutRow(self.table.extensions.columnCalcs.topRow);
}
if(self.table.extensions.columnCalcs.botInitialized && self.table.extensions.columnCalcs.botRow){
self.layoutRow(self.table.extensions.columnCalcs.botRow);
}
}
//calculate left columns
self.leftColumns.forEach(function(column, i){
column.extensions.frozen.margin = self._calcSpace(self.leftColumns, i) + self.table.columnManager.scrollLeft;
if(i == self.leftColumns.length - 1){
column.extensions.frozen.edge = true;
}else{
column.extensions.frozen.edge = false;
}
self.layoutColumn(column);
});
//calculate right frozen columns
rightMargin = self.table.rowManager.element.innerWidth() + self.table.columnManager.scrollLeft;
if(tableHolder[0].scrollHeight > tableHolder.innerHeight()){
rightMargin -= tableHolder[0].offsetWidth - tableHolder[0].clientWidth;
}
self.rightColumns.forEach(function(column, i){
column.extensions.frozen.margin = rightMargin - self._calcSpace(self.rightColumns, i + 1);
if(i == self.rightColumns.length - 1){
column.extensions.frozen.edge = true;
}else{
column.extensions.frozen.edge = false;
}
self.layoutColumn(column);
});
}
};
FrozenColumns.prototype.layoutColumn = function(column){
var self = this;
self.layoutElement(column.element, column);
column.cells.forEach(function(cell){
self.layoutElement(cell.element, column);
});
};
FrozenColumns.prototype.layoutRow = function(row){
row.getElement().css({
"padding-left": this.leftMargin,
"padding-right": this.rightMargin,
});
};
FrozenColumns.prototype.layoutElement = function(element, column){
if(column.extensions.frozen){
var css = {
position:"absolute",
left:column.extensions.frozen.margin
}
element.css(css);
element.addClass("tabulator-frozen");
if(column.extensions.frozen.edge){
element.addClass("tabulator-frozen-" + column.extensions.frozen.position);
}
}
};
FrozenColumns.prototype._calcSpace = function(columns, index){
var width = 0;
for (let i = 0; i < index; i++){
if(columns[i].visible){
width += columns[i].getWidth();
}
}
return width;
};
Tabulator.registerExtension("frozenColumns", FrozenColumns);