summaryrefslogtreecommitdiff
path: root/js/dojo/dojox/grid/_SelectionPreserver.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo/dojox/grid/_SelectionPreserver.js')
-rw-r--r--js/dojo/dojox/grid/_SelectionPreserver.js67
1 files changed, 67 insertions, 0 deletions
diff --git a/js/dojo/dojox/grid/_SelectionPreserver.js b/js/dojo/dojox/grid/_SelectionPreserver.js
new file mode 100644
index 0000000..c02e92c
--- /dev/null
+++ b/js/dojo/dojox/grid/_SelectionPreserver.js
@@ -0,0 +1,67 @@
+//>>built
+define("dojox/grid/_SelectionPreserver", [
+ "dojo/_base/declare",
+ "dojo/_base/connect",
+ "dojo/_base/lang",
+ "dojo/_base/array"
+], function(declare, connect, lang, array){
+
+return declare("dojox.grid._SelectionPreserver", null, {
+ // summary:
+ // Preserve selections across various user actions.
+ //
+ // description:
+ // When this feature is turned on, Grid will try to preserve selections across actions, e.g. sorting, filtering etc.
+ //
+ // Precondition - Identifier(id) is required for store since id is the only way for differentiating row items.
+ // Known issue - The preserved selections might be inaccurate if some unloaded rows are previously selected by range(e.g.SHIFT + click)
+ //
+ // example:
+ // | //To turn on this - please set 'keepSelection' attribute to true
+ // | <div dojoType="dojox.grid.DataGrid" keepSelection = true .../>
+ // | <div dojoType="dojox.grid.TreeGrid" keepSelection = true .../>
+ // | <div dojoType="dojox.grid.LazyTreeGrid" keepSelection = true .../>
+
+ constructor: function(selection){
+ this.selection = selection;
+ var grid = this.grid = selection.grid;
+ this.reset();
+ this._connects = [
+ connect.connect(grid, '_setStore', this, 'reset'),
+ connect.connect(grid, '_addItem', this, '_reSelectById'),
+ connect.connect(selection, 'addToSelection', lang.hitch(this, '_selectById', true)),
+ connect.connect(selection, 'deselect', lang.hitch(this, '_selectById', false)),
+ connect.connect(selection, 'deselectAll', this, 'reset')
+ ];
+ },
+ destroy: function(){
+ this.reset();
+ array.forEach(this._connects, connect.disconnect);
+ delete this._connects;
+ },
+ reset: function(){
+ this._selectedById = {};
+ },
+ _reSelectById: function(item, index){
+ // summary:
+ // When some rows is fetched, determine whether it should be selected.
+ if(item && this.grid._hasIdentity){
+ this.selection.selected[index] = this._selectedById[this.grid.store.getIdentity(item)];
+ }
+ },
+ _selectById: function(toSelect, inItemOrIndex){
+ // summary:
+ // Record selected rows by ID.
+ if(this.selection.mode == 'none' || !this.grid._hasIdentity){ return; }
+ var item = inItemOrIndex, g = this.grid;
+ if(typeof inItemOrIndex == "number" || typeof inItemOrIndex == "string"){
+ var entry = g._by_idx[inItemOrIndex];
+ item = entry && entry.item;
+ }
+ if(item){
+ this._selectedById[g.store.getIdentity(item)] = !!toSelect;
+ }
+ return item;
+ }
+});
+}); \ No newline at end of file