You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.3 KiB
66 lines
2.3 KiB
define([ |
|
"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, 'onSelected', lang.hitch(this, '_selectById', true)), |
|
connect.connect(selection, 'onDeselected', 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; |
|
} |
|
}); |
|
}); |