diff options
Diffstat (limited to 'js/dojo/dojox/grid/_SelectionPreserver.js')
| -rw-r--r-- | js/dojo/dojox/grid/_SelectionPreserver.js | 67 |
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 |
