jquery.tabulator
Version:
Interactive table generation plugin for jQuery UI
148 lines (108 loc) • 4.28 kB
JavaScript
var ResizeColumns = function(table){
this.table = table; //hold Tabulator object
this.startColumn = false;
this.startX = false;
this.startWidth = false;
this.handle = null;
this.prevHandle = null;
};
ResizeColumns.prototype.initializeColumn = function(type, column, element){
var self = this,
variableHeight =false,
mode = this.table.options.resizableColumns;
//set column resize mode
if(type === "header"){
variableHeight = column.definition.formatter == "textarea" || column.definition.variableHeight;
column.extensions.resize = {variableHeight:variableHeight};
}
if(mode === true || mode == type){
var handle = document.createElement('div');
handle.className = "tabulator-col-resize-handle";
var prevHandle = document.createElement('div');
prevHandle.className = "tabulator-col-resize-handle prev";
handle.addEventListener("click", function(e){
e.stopPropagation();
});
handle.addEventListener("mousedown", function(e){
var nearestColumn = column.getLastColumn();
if(nearestColumn && self._checkResizability(nearestColumn)){
self.startColumn = column;
self._mouseDown(e, nearestColumn);
}
});
//reszie column on double click
handle.addEventListener("dblclick", function(e){
if(self._checkResizability(column)){
column.reinitializeWidth(true);
}
});
prevHandle.addEventListener("click", function(e){
e.stopPropagation();
});
prevHandle.addEventListener("mousedown", function(e){
var nearestColumn, colIndex, prevColumn;
nearestColumn = column.getFirstColumn();
if(nearestColumn){
colIndex = self.table.columnManager.findColumnIndex(nearestColumn);
prevColumn = colIndex > 0 ? self.table.columnManager.getColumnByIndex(colIndex - 1) : false;
if(prevColumn && self._checkResizability(prevColumn)){
self.startColumn = column;
self._mouseDown(e, prevColumn);
}
}
});
//resize column on double click
prevHandle.addEventListener("dblclick", function(e){
var nearestColumn, colIndex, prevColumn;
nearestColumn = column.getFirstColumn();
if(nearestColumn){
colIndex = self.table.columnManager.findColumnIndex(nearestColumn);
prevColumn = colIndex > 0 ? self.table.columnManager.getColumnByIndex(colIndex - 1) : false;
if(prevColumn && self._checkResizability(prevColumn)){
prevColumn.reinitializeWidth(true);
}
}
});
element.append(handle)
.append(prevHandle);
}
};
ResizeColumns.prototype._checkResizability = function(column){
return typeof column.definition.resizable != "undefined" ? column.definition.resizable : this.table.options.resizableColumns
};
ResizeColumns.prototype._mouseDown = function(e, column){
var self = this;
self.table.element.addClass("tabulator-block-select");
function mouseMove(e){
column.setWidth(self.startWidth + (e.screenX - self.startX));
if(!self.table.browserSlow && column.extensions.resize && column.extensions.resize.variableHeight){
column.checkCellHeights();
}
}
function mouseUp(e){
//block editor from taking action while resizing is taking place
if(self.startColumn.extensions.edit){
self.startColumn.extensions.edit.blocked = false;
}
if(self.table.browserSlow && column.extensions.resize && column.extensions.resize.variableHeight){
column.checkCellHeights();
}
$("body").off("mouseup", mouseMove);
$("body").off("mousemove", mouseMove);
self.table.element.removeClass("tabulator-block-select");
if(self.table.options.persistentLayout && self.table.extExists("persistence", true)){
self.table.extensions.persistence.save("columns");
}
self.table.options.columnResized(self.startColumn.getComponent())
}
e.stopPropagation(); //prevent resize from interfereing with movable columns
//block editor from taking action while resizing is taking place
if(self.startColumn.extensions.edit){
self.startColumn.extensions.edit.blocked = true;
}
self.startX = e.screenX;
self.startWidth = column.getWidth();
$("body").on("mousemove", mouseMove);
$("body").on("mouseup", mouseUp);
};
Tabulator.registerExtension("resizeColumns", ResizeColumns);