Animal
4 Dec 2009, 7:36 AM
RowSelectionModel.onRefresh attempts to reselect Records with the same id as were selected prior to the refresh.
This will fire a rowselect event again when the event was already fired for that Record, and client Components have been notified and updated themselves.
Now, just doing a local sort operation will reselect the previous selection and fire the event.
Also, selection of every row fires the selectionchange event. This is then programatically fired in the onRefresh method.
This affecting my use case. They select a quote from a GridPanel, and the event triggers an Ajax request which starts the Consignment creation process, returns the JSON representation of a Consignment, and switches to the next tab to view the resulting data. Then they switch back to the Grid tab, idly click a header to sort the Grid, and boom! It recreates the consignment all over again.
This is a case for individually suspendable events as requested in my other thread.
Then the fix would be
onRefresh : function(){
var ds = this.grid.store, index;
var s = this.getSelections();
this.clearSelections(true);
// In the loop, we are reselecting previously selected IDs, so don't re-fire the rowselect event.
this.suspendEvent("rowselect");
// Each individual selectRow call would fire the event otherwise!
this.suspendEvent("selectionchange");
for(var i = 0, len = s.length; i < len; i++){
var r = s[i];
if((index = ds.indexOfId(r.id)) != -1){
this.selectRow(index, true);
}
}
this.resumeEvent("rowselect");
this.resumeEvent("selectionchange");
if(s.length != this.selections.getCount()){
this.fireEvent('selectionchange', this);
}
},
Either that or call selectRow passing a new 4th parameter:
selectRow : function(index, keepExisting, preventViewNotify, /* private */ suspendEvents){
if(this.isLocked() || (index < 0 || index >= this.grid.store.getCount()) || (keepExisting && this.isSelected(index))){
return;
}
var r = this.grid.store.getAt(index);
if(r && (suspendEvents || this.fireEvent('beforerowselect', this, index, keepExisting, r)) !== false){
if(!keepExisting || this.singleSelect){
this.clearSelections();
}
this.selections.add(r);
this.last = this.lastActive = index;
if(!preventViewNotify){
this.grid.getView().onRowSelect(index);
}
if (!suspendEvents) {
this.fireEvent('rowselect', this, index, r);
this.fireEvent('selectionchange', this);
}
}
},
Not critical, let's just remember this for 3.1.1
This will fire a rowselect event again when the event was already fired for that Record, and client Components have been notified and updated themselves.
Now, just doing a local sort operation will reselect the previous selection and fire the event.
Also, selection of every row fires the selectionchange event. This is then programatically fired in the onRefresh method.
This affecting my use case. They select a quote from a GridPanel, and the event triggers an Ajax request which starts the Consignment creation process, returns the JSON representation of a Consignment, and switches to the next tab to view the resulting data. Then they switch back to the Grid tab, idly click a header to sort the Grid, and boom! It recreates the consignment all over again.
This is a case for individually suspendable events as requested in my other thread.
Then the fix would be
onRefresh : function(){
var ds = this.grid.store, index;
var s = this.getSelections();
this.clearSelections(true);
// In the loop, we are reselecting previously selected IDs, so don't re-fire the rowselect event.
this.suspendEvent("rowselect");
// Each individual selectRow call would fire the event otherwise!
this.suspendEvent("selectionchange");
for(var i = 0, len = s.length; i < len; i++){
var r = s[i];
if((index = ds.indexOfId(r.id)) != -1){
this.selectRow(index, true);
}
}
this.resumeEvent("rowselect");
this.resumeEvent("selectionchange");
if(s.length != this.selections.getCount()){
this.fireEvent('selectionchange', this);
}
},
Either that or call selectRow passing a new 4th parameter:
selectRow : function(index, keepExisting, preventViewNotify, /* private */ suspendEvents){
if(this.isLocked() || (index < 0 || index >= this.grid.store.getCount()) || (keepExisting && this.isSelected(index))){
return;
}
var r = this.grid.store.getAt(index);
if(r && (suspendEvents || this.fireEvent('beforerowselect', this, index, keepExisting, r)) !== false){
if(!keepExisting || this.singleSelect){
this.clearSelections();
}
this.selections.add(r);
this.last = this.lastActive = index;
if(!preventViewNotify){
this.grid.getView().onRowSelect(index);
}
if (!suspendEvents) {
this.fireEvent('rowselect', this, index, r);
this.fireEvent('selectionchange', this);
}
}
},
Not critical, let's just remember this for 3.1.1