diff options
author | Michael Leibman <michael.leibman@gmail.com> | 2013-11-03 13:19:46 -0800 |
---|---|---|
committer | Michael Leibman <michael.leibman@gmail.com> | 2013-11-03 13:19:46 -0800 |
commit | 35e64491df3730a47089a1022ddf3e672a3add86 (patch) | |
tree | 6b7a7754b6fd4c110c88beef17a0aa495b2921d4 /slick.dataview.js | |
parent | 3377e2df157a103f99ad5a11a5e3ab4b5bcf7528 (diff) | |
download | SlickGrid-35e64491df3730a47089a1022ddf3e672a3add86.zip SlickGrid-35e64491df3730a47089a1022ddf3e672a3add86.tar.gz SlickGrid-35e64491df3730a47089a1022ddf3e672a3add86.tar.bz2 |
Fix #794 - Add an option to keep out-of-the-view items selected when selection changes (preserveHiddenOnSelectionChange)
Diffstat (limited to 'slick.dataview.js')
-rw-r--r-- | slick.dataview.js | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/slick.dataview.js b/slick.dataview.js index 2dabd87..8103714 100644 --- a/slick.dataview.js +++ b/slick.dataview.js @@ -304,7 +304,7 @@ function mapIdsToRows(idArray) { var rows = []; ensureRowsByIdCache(); - for (var i = 0; i < idArray.length; i++) { + for (var i = 0, l = idArray.length; i < l; i++) { var row = rowsById[idArray[i]]; if (row != null) { rows[rows.length] = row; @@ -315,7 +315,7 @@ function mapRowsToIds(rowArray) { var ids = []; - for (var i = 0; i < rowArray.length; i++) { + for (var i = 0, l = rowArray.length; i < l; i++) { if (rowArray[i] < rows.length) { ids[ids.length] = rows[rowArray[i]][idProperty]; } @@ -838,10 +838,26 @@ } } - function syncGridSelection(grid, preserveHidden) { + /*** + * Wires the grid and the DataView together to keep row selection tied to item ids. + * This is useful since, without it, the grid only knows about rows, so if the items + * move around, the same rows stay selected instead of the selection moving along + * with the items. + * + * NOTE: This doesn't work with cell selection model. + * + * @param grid {Slick.Grid} The grid to sync selection with. + * @param preserveHidden {Boolean} Whether to keep selected items that go out of the + * view due to them getting filtered out. + * @param preserveHiddenOnSelectionChange {Boolean} Whether to keep selected items + * that are currently out of the view (see preserveHidden) as selected when selection + * changes. + * @method syncGridSelection + */ + function syncGridSelection(grid, preserveHidden, preserveHiddenOnSelectionChange) { var self = this; - var selectedRowIds = self.mapRowsToIds(grid.getSelectedRows());; var inHandler; + var selectedRowIds = self.mapRowsToIds(grid.getSelectedRows()); function update() { if (selectedRowIds.length > 0) { @@ -857,7 +873,15 @@ grid.onSelectedRowsChanged.subscribe(function(e, args) { if (inHandler) { return; } - selectedRowIds = self.mapRowsToIds(grid.getSelectedRows()); + var newSelectedRowIds = self.mapRowsToIds(grid.getSelectedRows()); + if (!preserveHiddenOnSelectionChange || !grid.getOptions().multiSelect) { + selectedRowIds = newSelectedRowIds; + } else { + // keep the ones that are hidden + selectedRowIds = $.grep(selectedRowIds, function(id) { return self.getRowById(id) === undefined; }); + // add the newly selected ones + selectedRowIds = selectedRowIds.concat(newSelectedRowIds); + } }); this.onRowsChanged.subscribe(update); |