Followup fixes for multi-row nodes

rel-1.0
Vitaliy Filippov 2016-10-08 23:49:28 +03:00
parent ec7a3e702d
commit 6073f97c4a
1 changed files with 40 additions and 20 deletions

View File

@ -1,7 +1,7 @@
/**
* Very simple and fast tree grid/table, compatible with dynamic loading and stickyheaders.js
* License: MPL 2.0+, (c) Vitaliy Filippov 2016+
* Version: 2016-10-07
* Version: 2016-10-08
*/
/**
@ -56,16 +56,16 @@
* // called before expanding node. should return false if you want to prevent expanding the node
* TG.onExpand = function(node) {};
* // called before a cell is selected with mouse
* TG.onCellSelect = function(node, colIndex, td) { return <whether to allow selection (boolean)>; }
* TG.onCellSelect = function(node, subrowIndex, colIndex, td) { return <whether to allow selection (boolean)>; }
* // called when all currently selected cells are deselected
* TG.onDeselectAllCells = function(node, colIndex, td) {}
* TG.onDeselectAllCells = function() {}
* // called before a cell is edited
* TG.onStartCellEdit = function(node, colIndex, td) { return {
* TG.onStartCellEdit = function(node, subrowIndex, colIndex, td) { return {
* abort: <whether to prevent editing>,
* value: <override initial textbox value>
* } }
* // called before a cell is stopped being edited
* TG.onStopCellEdit = function (node, colIndex, value, td) { return { html: <new cell content> } }
* TG.onStopCellEdit = function (node, subrowIndex, colIndex, value, td) { return { html: <new cell content> } }
*
*/
function TreeGrid(options)
@ -165,6 +165,17 @@ TreeGrid.prototype._getCellIndex = function(n, sticky)
return i;
}
TreeGrid.prototype._getSubrow = function(cell)
{
var row = cell.parentNode, subrow = 0;
while (row.previousSibling && row.previousSibling._node == row._node)
{
row = row.previousSibling;
subrow++;
}
return subrow;
}
TreeGrid.prototype.initCellEditing = function()
{
var self = this;
@ -177,7 +188,8 @@ TreeGrid.prototype.initCellEditing = function()
td = td.parentNode;
if (td.nodeName == 'TD' && td.parentNode._node && td.previousSibling && td.className != 'celleditor')
{
var params = self.onStartCellEdit && self.onStartCellEdit(td.parentNode._node, self._getCellIndex(td, true), td) || {};
var params = self.onStartCellEdit &&
self.onStartCellEdit(td.parentNode._node, self._getSubrow(td), self._getCellIndex(td, true), td) || {};
if (params.abort)
return;
self.editedCells.push(td);
@ -211,10 +223,12 @@ TreeGrid.prototype.initCellEditing = function()
TreeGrid.prototype.stopCellEditing = function(td, _int)
{
var i = this._getCellIndex(td, true);
var subrow = this._getSubrow(td);
var node = td.parentNode._node;
node._oldCells[i] = undefined;
var params = this.onStopCellEdit && this.onStopCellEdit(node, i, td.firstChild ? td.firstChild.value : null, td) || {};
node.render(i);
var params = this.onStopCellEdit &&
this.onStopCellEdit(node, subrow, i, td.firstChild ? td.firstChild.value : null, td) || {};
node.render(i, subrow, true);
if (!_int)
{
for (var i = 0; i < this.editedCells.length; i++)
@ -242,7 +256,8 @@ TreeGrid.prototype.initCellSelection = function(restrictToNode)
if (!cell.parentNode._node || cell.className.indexOf(' selected') >= 0)
return;
var i = self._getCellIndex(cell, true);
if (!self.onCellSelect || self.onCellSelect(cell.parentNode._node, i, cell))
var subrow = self._getSubrow(cell);
if (!self.onCellSelect || self.onCellSelect(cell.parentNode._node, subrow, i, cell))
cell.className += ' selected';
};
@ -481,7 +496,7 @@ TreeGridNode.prototype._hashEqual = function(a, b)
return true;
}
TreeGridNode.prototype._renderCell = function(rowIndex, colIndex, cell)
TreeGridNode.prototype._renderCell = function(rowIndex, colIndex, cell, force)
{
// this may be the first render of a row inside a stickyheaders grid
var tr = this.tr[rowIndex];
@ -489,35 +504,40 @@ TreeGridNode.prototype._renderCell = function(rowIndex, colIndex, cell)
while (!tr.cells[ri])
tr.appendChild(document.createElement('td'));
// virtualDOM-like approach: compare old HTML properties
if (!this._oldCells[rowIndex] || !this._oldCells[rowIndex][colIndex] ||
if (force || !this._oldCells[rowIndex] || !this._oldCells[rowIndex][colIndex] ||
cell && !this._hashEqual(this._oldCells[rowIndex][colIndex], cell))
{
this.grid._setProps(tr.cells[ri], cell);
if (rowIndex == 0 && colIndex == 0)
this._addCollapser();
if (colIndex == 0)
{
if (rowIndex == 0)
this._addCollapser();
else
tr.cells[ri].style.paddingLeft = (this.grid._initialPadding + this.grid.levelIndent * this.level + 20) + 'px';
}
}
}
TreeGridNode.prototype.render = function(colidx, rowidx)
TreeGridNode.prototype.render = function(colidx, rowidx, force)
{
var cells = this.grid.renderer(this, colidx, rowidx);
if (this.tr.length == 1)
cells = [ cells ];
if (!(colidx !== null && colidx !== undefined && colidx >= 0 && colidx < this.grid.header.length))
if (colidx === null || colidx < 0 || colidx >= this.grid.header.length)
colidx = undefined;
if (!(this.tr.length > 1 && rowidx !== null && rowidx !== undefined && rowidx >= 0 && rowidx < this.tr.length))
if (rowidx === null || rowidx < 0 || rowidx >= this.tr.length)
rowidx = undefined;
if (rowidx !== undefined)
{
if (colidx !== undefined)
{
this._renderCell(rowidx, colidx, cells[rowidx] && cells[rowidx][colidx]);
this._renderCell(rowidx, colidx, cells[rowidx] && cells[rowidx][colidx], force);
this._oldCells[rowidx][colidx] = cells[rowidx] && cells[rowidx][colidx];
}
else
{
for (var j = 0; j < this.grid.header.length; j++)
this._renderCell(rowidx, j, cells[rowidx] && cells[rowidx][j]);
this._renderCell(rowidx, j, cells[rowidx] && cells[rowidx][j], force);
this._oldCells[rowidx] = cells[rowidx];
}
}
@ -525,7 +545,7 @@ TreeGridNode.prototype.render = function(colidx, rowidx)
{
for (var i = 0; i < this.tr.length; i++)
{
this._renderCell(i, colidx, cells[i] && cells[i][colidx]);
this._renderCell(i, colidx, cells[i] && cells[i][colidx], force);
this._oldCells[i][colidx] = cells[i] && cells[i][colidx];
}
}
@ -533,7 +553,7 @@ TreeGridNode.prototype.render = function(colidx, rowidx)
{
for (var i = 0; i < this.tr.length; i++)
for (var j = 0; j < this.grid.header.length; j++)
this._renderCell(i, j, cells[i] && cells[i][j]);
this._renderCell(i, j, cells[i] && cells[i][j], force);
this._oldCells = cells;
}
}