Forum
Hi Tony,
great work so far... but could you integrate a storage function for the grid-selection? what do you think?
My intention was the problem getting all selected rows eg. for editing or mass-delete... but on paging, sorting or with a live-grid, the selection gets lost! I wrote a small plugin to solve this, but it's "wasting" some events...
/**
* keeps selection on paging and sorting
*
* @author Patrick Kracht
*/
//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(elt /*, from*/)
{
var len = this.length;
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++)
{
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
;(function($)
{
var _stored = [];
var _active = [];
function _addDiff(grid,data_old,data_new)
{
var id = grid.attr('id');
for (var i = 0; i < data_new.length; i++)
{
//neuer Wert
var val = data_new[i];
//wenn im alten Array der neue Wert nicht vorkommt und noch nicht gespeichert
if ( data_old.indexOf(val) < 0 && _stored[id].indexOf(val) < 0 && val.length != 0 )
{
//ID adden
_stored[id].push(val);
}
}
};
function _delDiff(grid,data_old,data_new)
{
var id = grid.attr('id');
for (var i = 0; i < data_old.length; i++)
{
//Position des alten Werts im Speicher suchen
var pos = _stored[id].indexOf(data_old[i]);
//wenn in aktueller Auswahl nicht mehr und noch im Speicher
if ( data_new.indexOf(data_old[i]) < 0 && pos >= 0 )
{
//Element löschen
_stored[id].splice(pos, 1);
}
}
};
function _reSelect(grid)
{
var id = grid.attr('id');
//Selektion zurücksetzen
grid.jqGrid('resetSelection');
//neue Haken setzen
for (var i = 0; i < _stored[id].length; i++)
{
//Haken setzen
grid.jqGrid('setSelection',_stored[id][i]);
}
//aktuelle Selektion = aktive Selektion
_active[id] = new String( grid.getGridParam('selarrrow') ).split(',');
};
function fn_add(grid,data)
{
//Speicher beschreiben
_addDiff(grid,[],data);
//Selektion zurücksetzen
_reSelect(grid);
};
function fn_set(grid,data)
{
//Speicher beschreiben
_stored[grid.attr('id')] = new String(data).split(',');
//Selektion zurücksetzen
_reSelect(grid);
};
function fn_del(grid,data)
{
var id = grid.attr('id');
//zuerst aktuelle Selektion speichern
fn_save(grid);
//komplett ToString wandeln
data = new String(data).split(',');
//suchen, welche Zeile entfernt worden sind
for (var i = 0; i < data.length; i++)
{
//suchen, ob sich die ID im Speicher befindet
var pos = _stored[id].indexOf(data[i]);
//wenn ID vorhanden
if ( pos >= 0 )
{
//Position des entfernten Elements im Speicher löschen
_stored[id].splice(pos, 1);
}
}
//Selektion zurücksetzen
_reSelect(grid);
};
function fn_clear(grid)
{
var id = grid.attr('id');
//aktuelle und gespeicherte Selektion löschen
_active[id] = [];
_stored[id] = [];
//Grid zurücksetzen und Selektion löschen
grid.setGridParam({selarrrow:[],page:1});
grid.jqGrid('resetSelection').trigger('reloadGrid');
};
function fn_get(grid)
{
fn_save(grid);
return _stored[grid.attr('id')];
};
function fn_save(grid)
{
//aktuelle Selektion merken
var current = new String( grid.getGridParam('selarrrow') ).split(',');
var id = grid.attr('id');
//Änderungen übernehmen, seit dem letzten Laden
_addDiff(grid,_active[id],current);
_delDiff(grid,_active[id],current);
//aktive Selektion = neue Selektion
_active[id] = current;
};
function fn_load(grid)
{
var id = grid.attr('id');
//nur wenn etwas gespeichert wurde, Selektion herstellen
if( typeof(_stored[id]) == 'object' )
{
$.each(_stored[id], function(index,id)
{
grid.jqGrid('setSelection',id);
});
}
//aktive Selektion auf der aktuellen Seite merken
_active[id] = new String( grid.getGridParam('selarrrow') ).split(',');
};
$.fn.jqGridSelectionStorage = function(action,data)
{
//Objekt und ID des Grids holen
var ret = [];
var o = $(this);
var id = o.attr('id');
//macht nur Sinn bei MultiSelect
if ( !o.getGridParam('multiselect') ) return false;
//wenn noch keine Selektion gespeichert, leeres Objekt erstellen
if( typeof( _stored[id] ) == 'undefined' )
{
_stored[id] = [];
_active[id] = [];
}
//Aktion wählen
switch( action )
{
case 'get': ret = fn_get(o); break;
case 'set': fn_set(o,data); break;
case 'add': fn_add(o,data); break;
case 'del': fn_del(o,data); break;
case 'save': fn_save(o); break;
case 'load': fn_load(o); break;
case 'clear': fn_clear(o); break;
default: alert('jqGridSelectionStorage(\''+action+'\') not defined!'); break;
}
return ret;
};
})(jQuery);
* Behält die Selektion im Grid beim Seitenwechsel
*
* @author Patrick Kracht
*/
//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(elt /*, from*/)
{
var len = this.length;
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++)
{
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
;(function($)
{
var _stored = [];
var _active = [];
function _addDiff(grid,data_old,data_new)
{
var id = grid.attr('id');
for (var i = 0; i < data_new.length; i++)
{
//neuer Wert
var val = data_new[i];
//wenn im alten Array der neue Wert nicht vorkommt und noch nicht gespeichert
if ( data_old.indexOf(val) < 0 && _stored[id].indexOf(val) < 0 && val.length != 0 )
{
//ID adden
_stored[id].push(val);
}
}
};
function _delDiff(grid,data_old,data_new)
{
var id = grid.attr('id');
for (var i = 0; i < data_old.length; i++)
{
//Position des alten Werts im Speicher suchen
var pos = _stored[id].indexOf(data_old[i]);
//wenn in aktueller Auswahl nicht mehr und noch im Speicher
if ( data_new.indexOf(data_old[i]) < 0 && pos >= 0 )
{
//Element löschen
_stored[id].splice(pos, 1);
}
}
};
function _reSelect(grid)
{
var id = grid.attr('id');
//Selektion zurücksetzen
grid.jqGrid('resetSelection');
//neue Haken setzen
for (var i = 0; i < _stored[id].length; i++)
{
//Haken setzen
grid.jqGrid('setSelection',_stored[id][i]);
}
//aktuelle Selektion = aktive Selektion
_active[id] = new String( grid.getGridParam('selarrrow') ).split(',');
};
function fn_add(grid,data)
{
//Speicher beschreiben
_addDiff(grid,[],data);
//Selektion zurücksetzen
_reSelect(grid);
};
function fn_set(grid,data)
{
//Speicher beschreiben
_stored[grid.attr('id')] = new String(data).split(',');
//Selektion zurücksetzen
_reSelect(grid);
};
function fn_del(grid,data)
{
var id = grid.attr('id');
//zuerst aktuelle Selektion speichern
fn_save(grid);
//komplett ToString wandeln
data = new String(data).split(',');
//suchen, welche Zeile entfernt worden sind
for (var i = 0; i < data.length; i++)
{
//suchen, ob sich die ID im Speicher befindet
var pos = _stored[id].indexOf(data[i]);
//wenn ID vorhanden
if ( pos >= 0 )
{
//Position des entfernten Elements im Speicher löschen
_stored[id].splice(pos, 1);
}
}
//Selektion zurücksetzen
_reSelect(grid);
};
function fn_clear(grid)
{
var id = grid.attr('id');
//aktuelle und gespeicherte Selektion löschen
_active[id] = [];
_stored[id] = [];
//Grid zurücksetzen und Selektion löschen
grid.setGridParam({selarrrow:[],page:1});
grid.jqGrid('resetSelection').trigger('reloadGrid');
};
function fn_get(grid)
{
fn_save(grid);
return _stored[grid.attr('id')];
};
function fn_save(grid)
{
//aktuelle Selektion merken
var current = new String( grid.getGridParam('selarrrow') ).split(',');
var id = grid.attr('id');
//Änderungen übernehmen, seit dem letzten Laden
_addDiff(grid,_active[id],current);
_delDiff(grid,_active[id],current);
//aktive Selektion = neue Selektion
_active[id] = current;
};
function fn_load(grid)
{
var id = grid.attr('id');
//nur wenn etwas gespeichert wurde, Selektion herstellen
if( typeof(_stored[id]) == 'object' )
{
$.each(_stored[id], function(index,id)
{
grid.jqGrid('setSelection',id);
});
}
//aktive Selektion auf der aktuellen Seite merken
_active[id] = new String( grid.getGridParam('selarrrow') ).split(',');
};
$.fn.jqGridSelectionStorage = function(action,data)
{
//Objekt und ID des Grids holen
var ret = [];
var o = $(this);
var id = o.attr('id');
//macht nur Sinn bei MultiSelect
if ( !o.getGridParam('multiselect') ) return false;
//wenn noch keine Selektion gespeichert, leeres Objekt erstellen
if( typeof( _stored[id] ) == 'undefined' )
{
_stored[id] = [];
_active[id] = [];
}
//Aktion wählen
switch( action )
{
case 'get': ret = fn_get(o); break;
case 'set': fn_set(o,data); break;
case 'add': fn_add(o,data); break;
case 'del': fn_del(o,data); break;
case 'save': fn_save(o); break;
case 'load': fn_load(o); break;
case 'clear': fn_clear(o); break;
default: alert('jqGridSelectionStorage(\''+action+'\') not defined!'); break;
}
return ret;
};
})(jQuery);
Most Users Ever Online: 715
Currently Online:
65 Guest(s)
Currently Browsing this Page:
1 Guest(s)
Top Posters:
OlegK: 1255
markw65: 179
kobruleht: 144
phicarre: 132
YamilBracho: 124
Renso: 118
Member Stats:
Guest Posters: 447
Members: 11373
Moderators: 2
Admins: 1
Forum Stats:
Groups: 1
Forums: 8
Topics: 10592
Posts: 31289
Newest Members:
, razia, Prankie, psky, praveen neelam, greg.valainis@pa-tech.comModerators: tony: 7721, Rumen[Trirand]: 81
Administrators: admin: 66