Created
September 19, 2011 23:25
-
-
Save JLynch7/1227887 to your computer and use it in GitHub Desktop.
Patch for 1.4.3 to add frozen column support.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 8b675f4bfc1fc90f854a167fb31aa59d8b2b9bb8 Mon Sep 17 00:00:00 2001 | |
From: User <user@email.com> | |
Date: Fri, 16 Sep 2011 21:13:07 -0400 | |
Subject: [PATCH] Add frozen column support | |
--- | |
examples/example4-model.html | 11 +- | |
slick.grid.js | 358 +++++++++++++++++++++++++++++++++++++---- | |
2 files changed, 331 insertions(+), 38 deletions(-) | |
diff --git a/examples/example4-model.html b/examples/example4-model.html | |
index d800c70..ec0fc08 100644 | |
--- a/examples/example4-model.html | |
+++ b/examples/example4-model.html | |
@@ -107,7 +107,11 @@ | |
{id:"%", name:"% Complete", field:"percentComplete", width:80, resizable:false, formatter:GraphicalPercentCompleteCellFormatter, editor:PercentCompleteCellEditor, sortable:true}, | |
{id:"start", name:"Start", field:"start", minWidth:60, editor:DateCellEditor, sortable:true}, | |
{id:"finish", name:"Finish", field:"finish", minWidth:60, editor:DateCellEditor, sortable:true}, | |
- {id:"effort-driven", name:"Effort Driven", width:80, minWidth:20, maxWidth:80, cssClass:"cell-effort-driven", field:"effortDriven", formatter:BoolCellFormatter, editor:YesNoCheckboxCellEditor, cannotTriggerInsert:true, sortable:true} | |
+ {id:"effort-driven", name:"Effort Driven", width:80, minWidth:20, maxWidth:80, cssClass:"cell-effort-driven", field:"effortDriven", formatter:BoolCellFormatter, editor:YesNoCheckboxCellEditor, cannotTriggerInsert:true, sortable:true}, | |
+ {id:"title1", name:"Title1", field:"title1", width:120, minWidth:120, cssClass:"cell-title", editor:TextCellEditor, validator:requiredFieldValidator, sortable:true}, | |
+ {id:"title2", name:"Title2", field:"title2", width:120, minWidth:120, cssClass:"cell-title", editor:TextCellEditor, validator:requiredFieldValidator, sortable:true}, | |
+ {id:"title3", name:"Title3", field:"title3", width:120, minWidth:120, cssClass:"cell-title", editor:TextCellEditor, validator:requiredFieldValidator, sortable:true}, | |
+ {id:"title4", name:"Title4", field:"title4", width:120, minWidth:120, cssClass:"cell-title", editor:TextCellEditor, validator:requiredFieldValidator, sortable:true} | |
]; | |
var options = { | |
@@ -116,7 +120,8 @@ | |
enableCellNavigation: true, | |
asyncEditorLoading: true, | |
forceFitColumns: false, | |
- secondaryHeaderRowHeight: 25 | |
+ secondaryHeaderRowHeight: 25, | |
+ frozenColumn: 4 | |
}; | |
var sortcol = "title"; | |
@@ -203,7 +208,7 @@ | |
.show(); | |
grid.onCellChange = function(row,col,item) { | |
- dataView.updateItem(item.id,item); | |
+ dataView.updateItem(item.id,item); | |
}; | |
grid.onAddNewRow = addItem; | |
diff --git a/slick.grid.js b/slick.grid.js | |
index 13b8a7a..74d98cb 100644 | |
--- a/slick.grid.js | |
+++ b/slick.grid.js | |
@@ -8,7 +8,6 @@ | |
* SlickGrid v1.4.3 | |
* | |
* TODO: | |
- * - frozen columns | |
* - consistent events (EventHelper? jQuery events?) | |
* | |
* | |
@@ -41,6 +40,7 @@ | |
* editorFactory - (default null) A factory object responsible to creating an editor for a given cell. | |
* Must implement getEditor(column). | |
* multiSelect - (default true) Enable multiple row selection. | |
+ * frozenColumn - (default -1) If greater than Cero, then columns whose index are less than or equal to this number will be frozen | |
* | |
* COLUMN DEFINITION (columns) OPTIONS: | |
* id - Column ID. | |
@@ -243,7 +243,9 @@ if (!jQuery.fn.drag) { | |
editorFactory: null, | |
cellHighlightCssClass: "highlighted", | |
cellFlashingCssClass: "flashing", | |
- multiSelect: true | |
+ multiSelect: true, | |
+ frozenColumn: -1 | |
+ | |
}, | |
gridData, gridDataGetLength, gridDataGetItem; | |
@@ -317,6 +319,10 @@ if (!jQuery.fn.drag) { | |
var counter_rows_rendered = 0; | |
var counter_rows_removed = 0; | |
+ // appended for split funtionality | |
+ var canvas0, canvas1, headers0, headers1, viewp0, | |
+ uis = "dbhp" + Math.round(1000000 * Math.random()); | |
+ | |
////////////////////////////////////////////////////////////////////////////////////////////// | |
// Initialization | |
@@ -335,8 +341,16 @@ if (!jQuery.fn.drag) { | |
maxSupportedCssHeight = getMaxSupportedCssHeight(); | |
+ // @author DB 5/Jan/2011 | |
+ // for frozen column | |
+ var $headerScroller1, $headers1, $secondaryHeaderScroller1, $secondaryHeaders1, | |
+ $viewport1, $canvas1, $scrollerContainer, totalFrozenWidth = 0; | |
scrollbarDimensions = scrollbarDimensions || measureScrollbar(); // skip measurement if already have dimensions | |
options = $.extend({},defaults,options); | |
+ // validate frozenColumn | |
+ // @author(modify)DB | |
+ options.frozenColumn = ( options.frozenColumn >= 0 | |
+ && options.frozenColumn < columns.length ) ? parseInt(options.frozenColumn) : -1; | |
columnDefaults.width = options.defaultColumnWidth; | |
// validate loaded JavaScript modules against requested options | |
@@ -362,18 +376,78 @@ if (!jQuery.fn.drag) { | |
if (!/relative|absolute|fixed/.test($container.css("position"))) | |
$container.css("position","relative"); | |
- $headerScroller = $("<div class='slick-header ui-state-default' style='overflow:hidden;position:relative;' />").appendTo($container); | |
- $headers = $("<div class='slick-header-columns' style='width:100000px; left:-10000px' />").appendTo($headerScroller); | |
- | |
- $secondaryHeaderScroller = $("<div class='slick-header-secondary ui-state-default' style='overflow:hidden;position:relative;' />").appendTo($container); | |
- $secondaryHeaders = $("<div class='slick-header-columns-secondary' style='width:100000px' />").appendTo($secondaryHeaderScroller); | |
+ //$headerScroller = $("<div class='slick-header ui-state-default' style='overflow:hidden;position:relative;' />").appendTo($container); | |
+ //$headers = $("<div class='slick-header-columns' style='width:100000px; left:-10000px' />").appendTo($headerScroller); | |
+ | |
+ // modified (attribute 'id' appended) | |
+ // @author(modify)DB | |
+ $headerScroller = $("<div id='hs" + uis + "' class='slick-header ui-state-default' style='overflow:hidden;position:relative;' />").appendTo($container); | |
+ $headers = $("<div id='h" + uis + "' class='slick-header-columns' style='width:100000px; left:-10000px' />").appendTo($headerScroller); | |
+ | |
+ // modified (attribute 'id' appended) | |
+ // @author(modify)DB | |
+ $secondaryHeaderScroller = $("<div id='shs" + uis + "' class='slick-header-secondary ui-state-default' style='overflow:hidden;position:relative;' />").appendTo($container); | |
+ $secondaryHeaders = $("<div id='sh" + uis + "' class='slick-header-columns-secondary' style='width:100000px' />").appendTo($secondaryHeaderScroller); | |
+ | |
+ // split in two | |
+ // @author(modify)DB | |
+ if (options.frozenColumn > -1){ | |
+ $scrollerContainer = $("<div id='splittedC" + uis + "' style='overflow:hidden;position:absolute;top:0px;' />"); | |
+ $headerScroller1 = $("<div id='hs1" + uis + "' class='slick-header ui-state-default' style='overflow:hidden;position:relative;' />").appendTo($scrollerContainer); | |
+ $headers1 = $("<div id='h1" + uis + "' class='slick-header-columns' style='width:100000px; left:-10000px' />").appendTo($headerScroller1); | |
+ $headers = $().add($headers).add($headers1); | |
+ // TODO REFACTORING | |
+ // @author DB | |
+ $secondaryHeaderScroller1 = $("<div id='shs1" + uis + "' class='slick-header-secondary ui-state-default' style='overflow:hidden;position:relative;' />").appendTo($scrollerContainer); | |
+ $secondaryHeaders1 = $("<div id='sh1" + uis + "' class='slick-header-columns-secondary' style='width:100000px' />").appendTo($secondaryHeaderScroller1); | |
+ $secondaryHeaderScroller = $().add($secondaryHeaderScroller).add($secondaryHeaderScroller1); | |
+ $headerScroller = $().add($headerScroller).add($headerScroller1); | |
+ $secondaryHeaders = $().add($secondaryHeaders).add($secondaryHeaders1); | |
+ } | |
+ | |
+ //$secondaryHeaderScroller = $("<div class='slick-header-secondary ui-state-default' style='overflow:hidden;position:relative;' />").appendTo($container); | |
+ //$secondaryHeaders = $("<div class='slick-header-columns-secondary' style='width:100000px' />").appendTo($secondaryHeaderScroller); | |
if (!options.showSecondaryHeaderRow) { | |
$secondaryHeaderScroller.hide(); | |
} | |
- $viewport = $("<div class='slick-viewport' tabIndex='0' hideFocus style='width:100%;overflow-x:auto;outline:0;position:relative;overflow-y:auto;'>").appendTo($container); | |
- $canvas = $("<div class='grid-canvas' tabIndex='0' hideFocus />").appendTo($viewport); | |
+ //$viewport = $("<div class='slick-viewport' tabIndex='0' hideFocus style='width:100%;overflow-x:auto;outline:0;position:relative;overflow-y:auto;'>").appendTo($container); | |
+ //$canvas = $("<div class='grid-canvas' tabIndex='0' hideFocus />").appendTo($viewport); | |
+ | |
+ // original code for msStyle was modified | |
+ // @author DB 27/Jan/2011 | |
+ var msStyle = ""; | |
+ | |
+ if (options.frozenColumn > -1){ | |
+ msStyle = "width:100%;outline:0;position:relative;overflow-x: scroll; overflow-y: hidden;" | |
+ }else { | |
+ // with autoHeight, we can set the mainscroller's y-overflow to auto, since the scroll bar will not appear | |
+ msStyle = "width:100%;overflow-x:auto;outline:0;position:relative;overflow-y:auto;" | |
+ } | |
+ // modified (attribute 'id' appended) | |
+ // @author(modify)DB | |
+ $viewport = $("<div id='v" + uis + "' class='slick-viewport' tabIndex='0' hideFocus style='" + msStyle + "'>").appendTo($container); | |
+ $canvas = $("<div id='c" + uis + "' class='grid-canvas' tabIndex='0' hideFocus style='overflow:hidden' />").appendTo($viewport); | |
+ | |
+ // split in two | |
+ // @author(modify)DB | |
+ if (options.frozenColumn > -1){ | |
+ var msStyle1 = "width:100%;overflow-x:scroll;overflow-y:auto;outline:0;position:relative;overflow-y:auto;"; | |
+ $viewport1 = $("<div id='v1" + uis + "' class='slick-viewport' tabIndex='0' hideFocus style='" + msStyle1 + "'>").appendTo($scrollerContainer); | |
+ $canvas1 = $("<div id='c1" + uis + "' class='grid-canvas' tabIndex='0' hideFocus style='overflow:hidden' />").appendTo($viewport1); | |
+ $viewport = $().add($viewport).add($viewport1); | |
+ $canvas = $().add($canvas).add($canvas1); | |
+ $scrollerContainer.appendTo($container); | |
+ // canvas | |
+ canvas0 = $("#c" + uis, $container)[0]; | |
+ canvas1 = $("#c1" + uis, $container)[0]; | |
+ // headers | |
+ headers0 = $("#h" + uis, $container)[0]; | |
+ headers1 = $("#h1" + uis, $container)[0]; | |
+ // viewport | |
+ viewp0 = $("#v" + uis, $container)[0]; | |
+ } | |
// header columns and cells may have different padding/border skewing width calculations (box-sizing, hello?) | |
// calculate the diff so we can set consistent sizes | |
@@ -397,6 +471,22 @@ if (!jQuery.fn.drag) { | |
setupDragEvents(); | |
createCssRules(); | |
+ // appended | |
+ // @author DB | |
+ if (options.frozenColumn > -1){ | |
+ // set width | |
+ // problems with cache when recovering item by index | |
+ // e.g headers0 = $headers.get(0) | |
+ totalFrozenWidth = getWidthSplittedCanvas().widthFixed; | |
+ $("#hs" + uis , $container).width(totalFrozenWidth); | |
+ $("#shs" + uis, $container).width(totalFrozenWidth); | |
+ $("#v" + uis, $container).width(totalFrozenWidth); | |
+ var rightW = $container.width() - totalFrozenWidth; | |
+ $scrollerContainer.css("left", totalFrozenWidth); | |
+ //.width(rightW); | |
+ //$("#v1" + uis, $container).width(rightW); | |
+ } | |
+ | |
resizeAndRender(); | |
bindAncestorScrollEvents(); | |
@@ -493,6 +583,9 @@ if (!jQuery.fn.drag) { | |
function createColumnHeaders() { | |
var i; | |
+ // @author Diego Boris(modified for frozen Column) (6/Jan/2011) | |
+ var $headerTarget; | |
+ | |
function hoverBegin() { | |
$(this).addClass("ui-state-hover"); | |
} | |
@@ -501,18 +594,37 @@ if (!jQuery.fn.drag) { | |
} | |
$headers.empty(); | |
+ | |
columnsById = {}; | |
for (i = 0; i < columns.length; i++) { | |
var m = columns[i] = $.extend({},columnDefaults,columns[i]); | |
columnsById[m.id] = i; | |
+ // @author Diego Boris(modify for frozen Column) (7/Jan/2011) | |
+ $headerTarget = (options.frozenColumn > -1 ) ? | |
+ ((i <= options.frozenColumn) ? $(headers0): $(headers1)) : $headers; | |
+ if (options.frozenColumn > -1){ | |
+ if (i <= options.frozenColumn){ | |
+ $headerTarget = $(headers0); | |
+ // TODO.. | |
+ // make it resizable | |
+ // @author DB | |
+ m.resizable = false; | |
+ }else{ | |
+ $headerTarget = $(headers1); | |
+ } | |
+ }else{ | |
+ $headerTarget = $headers; | |
+ } | |
+ | |
var header = $("<div class='ui-state-default slick-header-column' id='" + uid + m.id + "' />") | |
.html("<span class='slick-column-name'>" + m.name + "</span>") | |
.width((m.currentWidth || m.width) - headerColumnWidthDiff) | |
.attr("title", m.toolTip || m.name || "") | |
.data("fieldId", m.id) | |
- .appendTo($headers); | |
+ //.appendTo($headers); | |
+ .appendTo($headerTarget); | |
if (options.enableColumnReorder || m.sortable) { | |
header.hover(hoverBegin, hoverEnd); | |
@@ -578,7 +690,13 @@ if (!jQuery.fn.drag) { | |
return; | |
} | |
- var reorderedIds = $headers.sortable("toArray"); | |
+ if ( options.frozenColumn > -1 ) { | |
+ var reorderedIds = $(headers0).sortable("toArray"); | |
+ reorderedIds = reorderedIds.concat( $(headers1).sortable("toArray") ); | |
+ } else { | |
+ var reorderedIds = $headers.sortable("toArray"); | |
+ } | |
+ | |
var reorderedColumns = []; | |
for (var i=0; i<reorderedIds.length; i++) { | |
reorderedColumns.push(columns[getColumnIndex(reorderedIds[i].replace(uid,""))]); | |
@@ -950,10 +1068,20 @@ if (!jQuery.fn.drag) { | |
if (self.onBeforeDestroy) | |
self.onBeforeDestroy(); | |
- if (options.enableColumnReorder && $headers.sortable) | |
+ if (options.enableColumnReorder && $headers.sortable) | |
$headers.sortable("destroy"); | |
unbindAncestorScrollEvents(); | |
+ | |
+ // changed | |
+ // @author DB | |
+ // if ($headers.sortable){$headers.sortable("destroy");} | |
+ $headers.each(function(){ | |
+ if ($(this).sortable){ | |
+ $(this).sortable("destroy"); | |
+ } | |
+ }); | |
+ | |
$container.unbind(".slickgrid"); | |
removeCssRules(); | |
@@ -1239,7 +1367,14 @@ if (!jQuery.fn.drag) { | |
if (currentEditor) { | |
makeSelectedCellNormal(); | |
} | |
- $canvas[0].innerHTML = ""; | |
+ | |
+ // modified | |
+ // @author DB | |
+ // $canvas[0].innerHTML = ""; | |
+ $canvas.each(function(){ | |
+ this.innerHTML = ""; | |
+ }); | |
+ | |
rowsCache= {}; | |
postProcessedRows = {}; | |
counter_rows_removed += renderedRows; | |
@@ -1249,7 +1384,13 @@ if (!jQuery.fn.drag) { | |
function removeRowFromCache(row) { | |
var node = rowsCache[row]; | |
if (!node) { return; } | |
- $canvas[0].removeChild(node); | |
+ //$canvas[0].removeChild(node); | |
+ | |
+ // comment added and changed original code | |
+ // remove from DOM | |
+ // @auhor DB | |
+ // node.parentNode.removeChild(node); | |
+ $canvas.find(".slick-row[row=" + row + "]").detach(); | |
delete rowsCache[row]; | |
delete postProcessedRows[row]; | |
@@ -1332,6 +1473,11 @@ if (!jQuery.fn.drag) { | |
(options.showSecondaryHeaderRow ? $secondaryHeaderScroller.outerHeight() : 0)); | |
} | |
+ // FIXME.. although | |
+ // when read, resizeCanvas() method is always invoked | |
+ // so it appears it gives no problem | |
+ // @author DB | |
+ | |
viewportW = $viewport.innerWidth(); | |
viewportH = $viewport.innerHeight(); | |
numVisibleRows = Math.ceil(viewportH / options.rowHeight); | |
@@ -1340,8 +1486,18 @@ if (!jQuery.fn.drag) { | |
$headers.find(".slick-header-column").each(function() { | |
totalWidth += $(this).outerWidth(); | |
}); | |
+ | |
setCanvasWidth(totalWidth); | |
+ // modified to support split functionality | |
+ // @author DB | |
+ if(options.frozenColumn > -1 ){ | |
+ var o = getWidthSplittedCanvas(); | |
+ $(canvas0).width(o.widthFixed); | |
+ $(canvas1).width(o.widthScrolled); | |
+ $("#splittedC" + uis, $container).width($container.width() - o.widthFixed); | |
+ } | |
+ | |
updateRowCount(); | |
render(); | |
} | |
@@ -1444,27 +1600,72 @@ if (!jQuery.fn.drag) { | |
parentNode = $canvas[0], | |
rowsBefore = renderedRows, | |
stringArray = [], | |
+ // appended | |
+ // @author DB | |
+ stringArrayRight = [], | |
rows = [], | |
startTimestamp = new Date(), | |
needToReselectCell = false; | |
- for (i = range.top; i <= range.bottom; i++) { | |
- if (rowsCache[i]) { continue; } | |
- renderedRows++; | |
- rows.push(i); | |
- appendRowHtml(stringArray,i); | |
- if (currentCellNode && currentRow === i) | |
- needToReselectCell = true; | |
- counter_rows_rendered++; | |
- } | |
+ //for (i = range.top; i <= range.bottom; i++) { | |
+ // if (rowsCache[i]) { continue; } | |
+ // renderedRows++; | |
+ // rows.push(i); | |
+ // appendRowHtml(stringArray,i); | |
+ // if (currentCellNode && currentRow === i) | |
+ // needToReselectCell = true; | |
+ // counter_rows_rendered++; | |
+ //} | |
+ | |
+ if ( options.frozenColumn > -1 ) { | |
+ for (i = range.top; i <= range.bottom; i++) { | |
+ if (rowsCache[i]) { | |
+ continue; | |
+ } | |
+ renderedRows++; | |
+ rows.push(i); | |
+ appendSplitedHtmlRow(stringArray, stringArrayRight, i); | |
+ if (currentCellNode && currentRow === i) | |
+ needToReselectCell = true; | |
+ counter_rows_rendered++; | |
+ } | |
+ | |
+ var x = document.createElement("div"), | |
+ xRight = document.createElement("div"); | |
- var x = document.createElement("div"); | |
- x.innerHTML = stringArray.join(""); | |
+ x.innerHTML = stringArray.join(""); | |
+ xRight.innerHTML = stringArrayRight.join(""); | |
- for (i = 0, l = x.childNodes.length; i < l; i++) { | |
- rowsCache[rows[i]] = parentNode.appendChild(x.firstChild); | |
+ for (i = 0, l = x.childNodes.length; i < l; i++) { | |
+ rowsCache[rows[i]] = $().add($(x.firstChild).appendTo(canvas0)) | |
+ .add($(xRight.firstChild).appendTo(canvas1)); | |
+ } | |
+ } else { | |
+ for (i = range.top; i <= range.bottom; i++) { | |
+ if (rowsCache[i]) { continue; } | |
+ renderedRows++; | |
+ rows.push(i); | |
+ appendRowHtml(stringArray,i); | |
+ if (currentCellNode && currentRow === i) | |
+ needToReselectCell = true; | |
+ counter_rows_rendered++; | |
+ } | |
+ | |
+ x = document.createElement("div"); | |
+ x.innerHTML = stringArray.join(""); | |
+ | |
+ for (i = 0, l = x.childNodes.length; i < l; i++) { | |
+ rowsCache[rows[i]] = parentNode.appendChild(x.firstChild); | |
+ } | |
} | |
+ //var x = document.createElement("div"); | |
+ //x.innerHTML = stringArray.join(""); | |
+ | |
+ //for (i = 0, l = x.childNodes.length; i < l; i++) { | |
+ // rowsCache[rows[i]] = parentNode.appendChild(x.firstChild); | |
+ //} | |
+ | |
if (needToReselectCell) { | |
currentCellNode = $(rowsCache[currentRow]).children().eq(currentCell)[0]; | |
setSelectedCell(currentCellNode,false); | |
@@ -1475,6 +1676,78 @@ if (!jQuery.fn.drag) { | |
} | |
} | |
+ /** | |
+ * Split htmlRow into the appropiate canvas according | |
+ * to options.frozenColumn value 26/Jan/2011 | |
+ * @author DB | |
+ */ | |
+ function appendSplitedHtmlRow(stringArray, stringArrayRight, row) { | |
+ | |
+ var d = gridDataGetItem(row); | |
+ var dataLoading = row < gridDataGetLength() && !d; | |
+ var css = "slick-row " + | |
+ (dataLoading ? " loading" : "") + | |
+ (selectedRowsLookup[row] ? " selected ui-state-active" : "") + | |
+ (row % 2 == 1 ? ' odd' : ' even'); | |
+ | |
+ // if the user has specified a function to provide additional per-row css classes, call it here | |
+ if (options.rowCssClasses) { | |
+ css += ' ' + options.rowCssClasses(d); | |
+ } | |
+ | |
+ stringArray.push("<div class='ui-widget-content " + css + "' row='" + row + "' style='top:" + (options.rowHeight*row) + "px'>"); | |
+ stringArrayRight.push("<div class='ui-widget-content " + css + "' row='" + row + "' style='top:" + (options.rowHeight*row) + "px'>"); | |
+ | |
+ // left row | |
+ for (var i=0, cols=options.frozenColumn + 1; i<cols; i++) { | |
+ var m = columns[i]; | |
+ if (m.hidden) continue; | |
+ | |
+ stringArray.push("<div " + (m.unselectable ? "tabIndex=-1 " : "hideFocus tabIndex=0 ") + "class='slick-cell c" + i + (m.cssClass ? " " + m.cssClass : "") + "' cell=" + i + ">"); | |
+ | |
+ // if there is a corresponding row (if not, this is the Add New row or this data hasn't been loaded yet) | |
+ if (d && row < gridDataGetLength()) { | |
+ stringArray.push(getFormatter(m)(row, i, d[m.field], m, d)); | |
+ } | |
+ | |
+ stringArray.push("</div>"); | |
+ } | |
+ stringArray.push("</div>"); | |
+ | |
+ // right row | |
+ for (i=options.frozenColumn + 1, cols=columns.length; i<cols; i++) { | |
+ m = columns[i]; | |
+ if (m.hidden) continue; | |
+ | |
+ stringArrayRight.push("<div " + (m.unselectable ? "tabIndex=-1 " : "hideFocus tabIndex=0 ") + "class='slick-cell c" + i + (m.cssClass ? " " + m.cssClass : "") + "' cell=" + i + ">"); | |
+ | |
+ // if there is a corresponding row (if not, this is the Add New row or this data hasn't been loaded yet) | |
+ if (d && row < gridDataGetLength()) { | |
+ stringArrayRight.push(getFormatter(m)(row, i, d[m.field], m, d)); | |
+ } | |
+ | |
+ stringArrayRight.push("</div>"); | |
+ } | |
+ stringArrayRight.push("</div>"); | |
+ | |
+ } | |
+ | |
+ // Return an object containing the two newly created canvas' width | |
+ // @author DB 28/Jan/2011 | |
+ function getWidthSplittedCanvas(){ | |
+ var widthFixed = 0, widthScrolled = 0; | |
+ | |
+ $(headers0).find('.slick-header-column:visible').each(function () { | |
+ widthFixed += $(this).outerWidth(); | |
+ }); | |
+ | |
+ $(headers1).find('.slick-header-column:visible').each(function () { | |
+ widthScrolled += $(this).outerWidth(); | |
+ }); | |
+ | |
+ return {widthFixed : widthFixed, widthScrolled : widthScrolled}; | |
+ } | |
+ | |
function startPostProcessing() { | |
if (!options.enableAsyncPostRender) { return; } | |
clearTimeout(h_postrender); | |
@@ -1513,15 +1786,16 @@ if (!jQuery.fn.drag) { | |
} | |
function handleScroll() { | |
- scrollTop = $viewport[0].scrollTop; | |
- var scrollLeft = $viewport[0].scrollLeft; | |
+ var sufix = ((options.frozenColumn > -1 ) ? "1" : "") + uis; | |
+ var vwp = $("#v" + sufix, $container)[0]; | |
+ // changed | |
+ scrollTop = vwp.scrollTop; | |
+ var scrollLeft = vwp.scrollLeft; | |
+ | |
var scrollDist = Math.abs(scrollTop - prevScrollTop); | |
- if (scrollLeft !== prevScrollLeft) { | |
- prevScrollLeft = scrollLeft; | |
- $headerScroller[0].scrollLeft = scrollLeft; | |
- $secondaryHeaderScroller[0].scrollLeft = scrollLeft; | |
- } | |
+ $("#hs" + sufix, $container)[0].scrollLeft = scrollLeft; | |
+ $("#shs" + sufix, $container)[0].scrollLeft = scrollLeft; | |
if (!scrollDist) return; | |
@@ -1540,6 +1814,11 @@ if (!jQuery.fn.drag) { | |
removeAllRows(); | |
} | |
+ // appended | |
+ if (options.frozenColumn > -1 ){ | |
+ viewp0.scrollTop = scrollTop; | |
+ } | |
+ | |
if (h_render) | |
clearTimeout(h_render); | |
@@ -1559,7 +1838,11 @@ if (!jQuery.fn.drag) { | |
var rowNode = rowsCache[row]; | |
if (!rowNode || postProcessedRows[row] || row>=gridDataGetLength()) { continue; } | |
- var d = gridDataGetItem(row), cellNodes = rowNode.childNodes; | |
+ // modified | |
+ // @author DB | |
+ //var d = gridDataGetItem(row), cellNodes = rowNode.childNodes; | |
+ var d = gridDataGetItem(row), cellNodes = $(rowNode).children(); | |
+ | |
for (var i=0, j=0, l=columns.length; i<l; ++i) { | |
var m = columns[i]; | |
if (m.asyncPostRender) { m.asyncPostRender(cellNodes[j], postProcessFromRow, d, m); } | |
@@ -2190,6 +2473,11 @@ if (!jQuery.fn.drag) { | |
var rowAtTop = row * options.rowHeight; | |
var rowAtBottom = (row + 1) * options.rowHeight - viewportH + (viewportHasHScroll?scrollbarDimensions.height:0); | |
+ var sufix = ((options.frozenColumn > -1 ) ? "1" : "") + uis; | |
+ var vwp = $("#v" + sufix, $container)[0]; | |
+ // changed | |
+ scrollTop = vwp.scrollTop; | |
+ | |
// need to page down? | |
if ((row + 1) * options.rowHeight > scrollTop + viewportH + offset) { | |
scrollTo(doPaging ? rowAtTop : rowAtBottom); | |
-- | |
1.7.6.msysgit.0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment