Add the ability to specify the client-side data cache prefix, to avoid collisions in applications where there can be more than one type of data

This commit is contained in:
Nathan Gray 2013-02-06 10:49:46 +00:00
parent de2c9756f1
commit 616e94a7b4
4 changed files with 42 additions and 6 deletions

View File

@ -55,6 +55,7 @@
* array with name=>label or name=>array('label'=>label,'type'=>type) pairs (type is a eT widget-type)
* or name of import/export definition
* 'row_id' => // I key into row content to set it's value as tr id, eg. 'id'
* 'dataStorePrefix' => // I Optional prefix for client side cache to prevent collisions in applications that have more than one data set, such as ProjectManager / Project elements. Defaults to appname if not set.
* 'actions' => // I array with actions, see nextmatch_widget::egw_actions
* 'action_links' => // I array with enabled actions or ones which should be checked if they are enabled
* optional, default id of all first level actions plus the ones with enabled='javaScript:...'
@ -224,7 +225,7 @@ class etemplate_widget_nextmatch extends etemplate_widget
foreach($rows as $n => $row)
{
if (is_int($n))
if (is_int($n) && $row)
{
if (!isset($row[$row_id])) unset($row_id); // unset default row_id of 'id', if not used
if (!isset($row[$row_modified])) unset($row_modified);

View File

@ -179,6 +179,16 @@ var et2_dataview_controller = Class.extend({
return 0;
},
/**
* Set the data cache prefix
* The default is to use appname, but if you need to set it explicitly to
* something else to avoid conflicts. Use the same prefix everywhere for
* each type of data. eg. infolog for infolog entries, even if accessed via addressbook
*/
setPrefix: function(prefix) {
this.dataStorePrefix = prefix;
},
/* -- PRIVATE FUNCTIONS -- */
@ -427,6 +437,10 @@ var et2_dataview_controller = Class.extend({
"start": query.start,
"count": query.num_rows,
};
if(this.dataStorePrefix)
{
ctx.prefix = this.dataStorePrefix;
}
// Call the callback
this._dataProvider.dataFetch(query, this._fetchCallback, ctx);

View File

@ -591,6 +591,12 @@ var et2_nextmatch = et2_DOMWidget.extend([et2_IResizeable, et2_IInput], {
this.options.settings.actions
);
// Set custom data cache prefix
if(this.options.settings.dataStorePrefix)
{
this.controller.setPrefix(this.options.settings.dataStorePrefix);
}
// Load the initial order
/*this.controller.loadInitialOrder(this._getInitialOrder(
this.options.settings.rows, this.options.settings.row_id

View File

@ -25,9 +25,10 @@ egw.extend("data", egw.MODULE_APP_LOCAL, function (_app, _wnd) {
* The uid function generates a session-unique id for the current
* application by appending the application name to the given uid.
*/
function UID(_uid)
function UID(_uid, prefix)
{
return _app + "::" + _uid;
prefix = prefix ? prefix : _app;
return prefix + "::" + _uid;
}
function parseServerResponse(_result, _callback, _context)
@ -53,13 +54,13 @@ egw.extend("data", egw.MODULE_APP_LOCAL, function (_app, _wnd) {
// Assemble the correct order uids
for (var i = 0; i < _result.order.length; i++)
{
_result.order[i] = UID(_result.order[i]);
_result.order[i] = UID(_result.order[i], _context.prefix);
}
// Load all data entries that have been sent or delete them
for (var key in _result.data)
{
var uid = UID(key);
var uid = UID(key, _context.prefix);
if (_result.data[key] === null)
{
egw.dataDeleteUID(uid);
@ -162,7 +163,7 @@ egw.extend("data", egw.MODULE_APP_LOCAL, function (_app, _wnd) {
_queriedRange,
_filters,
_widgetId,
_knownUids ? _knownUids : egw.dataKnownUIDs(_app),
_knownUids ? _knownUids : egw.dataKnownUIDs(_context.prefix ? _context.prefix : _app),
lm
],
function(result) {
@ -433,6 +434,20 @@ egw.extend("data_storage", egw.MODULE_GLOBAL, function (_app, _wnd) {
// Unregister all callbacks for that uid
this.dataUnregisterUID(_uid);
}
},
/**
* Force a refreash of the given uid from the server, and
* calls all associated callbacks
*
* @param uid is the uid which should be refreshed.
*/
dataRefreshUID: function (_uid) {
if (typeof localStorage[_uid] === "undefined") return;
this.dataFetch(_execId, {'refresh':_uid}, _filters, _widgetId,
_callback, _context, _knownUids);
}
};