diff options
| author | Tristan Zur <tzur@web.web.ccwn.org> | 2014-03-27 22:27:47 +0100 |
|---|---|---|
| committer | Tristan Zur <tzur@web.web.ccwn.org> | 2014-03-27 22:27:47 +0100 |
| commit | b62676ca5d3d6f6ba3f019ea3f99722e165a98d8 (patch) | |
| tree | 86722cb80f07d4569f90088eeaea2fc2f6e2ef94 /js/dojo-1.7.2/dojox/grid/enhanced/plugins/_SelectionPreserver.js | |
Diffstat (limited to 'js/dojo-1.7.2/dojox/grid/enhanced/plugins/_SelectionPreserver.js')
| -rw-r--r-- | js/dojo-1.7.2/dojox/grid/enhanced/plugins/_SelectionPreserver.js | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/js/dojo-1.7.2/dojox/grid/enhanced/plugins/_SelectionPreserver.js b/js/dojo-1.7.2/dojox/grid/enhanced/plugins/_SelectionPreserver.js new file mode 100644 index 0000000..dff96c1 --- /dev/null +++ b/js/dojo-1.7.2/dojox/grid/enhanced/plugins/_SelectionPreserver.js @@ -0,0 +1,109 @@ +//>>built +define("dojox/grid/enhanced/plugins/_SelectionPreserver", [ + "dojo/_base/declare", + "dojo/_base/lang", + "dojo/_base/connect", + '../../_SelectionPreserver' +], function(declare, lang, connect, _SelectionPreserver){ + +return declare("dojox.grid.enhanced.plugins._SelectionPreserver", _SelectionPreserver, { + // summary: + // Preserve selections across various user actions. + // + // description: + // Extends dojox.grid._SelectionPreserver adding a bit more support to make selection persistence working well + // with various EnhancedGrid features, e.g. filtering, nested sorting, pagination, select all etc. + // + // Precondition - Identifier(id) is required for store, as id is used 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 - set 'keepSelection' attribute to true + // | <div dojoType="dojox.grid.EnhancedGrid" keepSelection = true .../> + + constructor: function(selection){ + var grid = this.grid; + grid.onSelectedById = this.onSelectedById; + this._oldClearData = grid._clearData; + var self = this; + grid._clearData = function(){ + self._updateMapping(!grid._noInternalMapping); + self._trustSelection = []; + self._oldClearData.apply(grid, arguments); + }; + this._connects.push( + connect.connect(selection, 'selectRange', lang.hitch(this, '_updateMapping', true, true, false)), + connect.connect(selection, 'deselectRange', lang.hitch(this, '_updateMapping', true, false, false)), + connect.connect(selection, 'deselectAll', lang.hitch(this, '_updateMapping', true, false, true)) + ); + }, + destroy: function(){ + this.inherited(arguments); + this.grid._clearData = this._oldClearData; + }, + reset: function(){ + this.inherited(arguments); + this._idMap = []; + this._trustSelection = []; + this._defaultSelected = false; + }, + _reSelectById: function(item, index){ + // summary: + // Overwritten + var s = this.selection, g = this.grid; + if(item && g._hasIdentity){ + var id = g.store.getIdentity(item); + if(this._selectedById[id] === undefined){ + if(!this._trustSelection[index]){ + s.selected[index] = this._defaultSelected; + } + }else{ + s.selected[index] = this._selectedById[id]; + } + this._idMap.push(id); + g.onSelectedById(id, index, s.selected[index]); + } + }, + _selectById: function(toSelect, inItemOrIndex){ + // summary: + // Overwritten + if(!this.inherited(arguments)){ + this._trustSelection[inItemOrIndex] = true; + } + }, + onSelectedById: function(id, rowIndex, value){}, + + _updateMapping: function(trustSelection, isSelect, isForAll, from, to){ + // summary: + // This function try to keep the selection info updated when range selection is performed. + // 1. Calculate how many unloaded rows are there; + // 2. update _selectedById data if grid.selection._selected can be trusted, so loaded but unselected rows can + // be properly recorded. + var s = this.selection, g = this.grid, flag = 0, unloaded = 0, i, id; + for(i = g.rowCount - 1; i >= 0; --i){ + if(!g._by_idx[i]){ + ++unloaded; + flag += s.selected[i] ? 1 : -1; + }else{ + id = g._by_idx[i].idty; + if(id && (trustSelection || this._selectedById[id] === undefined)){ + this._selectedById[id] = !!s.selected[i]; + } + } + } + if(unloaded){ + this._defaultSelected = flag > 0; + } + if(!isForAll && from !== undefined && to !== undefined){ + isForAll = !g.usingPagination && Math.abs(to - from + 1) === g.rowCount; + } + // When deselectAll, make sure every thing is deselected, even if it was selected but not loaded now. + // This occurs only when pagination's "All" is used. + if(isForAll && (!g.usingPagination || g.selectionMode === 'single')){ + for(i = this._idMap.length - 1; i >= 0; --i){ + this._selectedById[this._idMap[i]] = isSelect; + } + } + } +}); +}); |
