67 lines
2.4 KiB
JavaScript
67 lines
2.4 KiB
JavaScript
|
//>>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;
|
||
|
}
|
||
|
});
|
||
|
});
|