Calendar: handle push updates for integrated apps

This commit is contained in:
nathangray 2021-03-09 16:42:34 -07:00
parent dc41db9741
commit 231b135b1b
4 changed files with 71 additions and 44 deletions

View File

@ -777,6 +777,12 @@ class calendar_so
$private_filter = '(cal_public=1 OR cal_public=0 AND '.$this->db->expression($this->cal_table, array('cal_owner' => $params['private_grants'])) . ')'; $private_filter = '(cal_public=1 OR cal_public=0 AND '.$this->db->expression($this->cal_table, array('cal_owner' => $params['private_grants'])) . ')';
$where[] = $private_filter; $where[] = $private_filter;
} }
if($params['sql_filter']['cal_id'])
{
$params['query']['cal_id'] = $params['sql_filter']['cal_id'];
$where[] = $this->db->column_data_implode(", ", [$this->cal_table.'.cal_id' => $params['sql_filter']['cal_id']], True, False);
unset($params['sql_filter']['cal_id']);
}
if (!empty($params['sql_filter'])) if (!empty($params['sql_filter']))
{ {
if (is_string($params['sql_filter'])) if (is_string($params['sql_filter']))
@ -1287,7 +1293,7 @@ class calendar_so
} }
if (isset($app_cols[$col])) if (isset($app_cols[$col]))
{ {
$return_cols[] = $app_cols[$col]; $return_cols[] = $app_cols[$col] . " AS $col";
} }
else else
{ {

View File

@ -412,6 +412,10 @@ class calendar_uilist extends calendar_ui
{ {
$col_filter[$name] = $val; $col_filter[$name] = $val;
} }
else if ( $name == 'row_id' && (string)$val !== '')
{
$col_filter['cal_id'] = $val;
}
} }
} }
$rows = $js_integration_data = array(); $rows = $js_integration_data = array();
@ -427,7 +431,7 @@ class calendar_uilist extends calendar_ui
foreach((array) $this->bo->search($search_params, !empty($col_filter) ? $col_filter : null) as $event) foreach((array) $this->bo->search($search_params, !empty($col_filter) ? $col_filter : null) as $event)
{ {
if ($params['csv_export']) if ($params['csv_export'] && $params['csv_export'] !== "refresh")
{ {
$event['participants'] = implode(",\n",$this->bo->participants($event,true)); $event['participants'] = implode(",\n",$this->bo->participants($event,true));
} }

View File

@ -545,9 +545,18 @@ var CalendarApp = /** @class */ (function (_super) {
if (pushData.app == "infolog") { if (pushData.app == "infolog") {
return this.push_infolog(pushData); return this.push_infolog(pushData);
} }
// Other integration here else {
// TODO // Modify the pushData so it looks like one of ours
debugger; var integrated_pushData = jQuery.extend(pushData, {
id: pushData.app + pushData.id,
app: this.appname
});
if (integrated_pushData.type == "delete" || egw.dataHasUID(this.uid(integrated_pushData))) {
return _super.prototype.push.call(this, integrated_pushData);
}
// Ask for the real data, we don't have it
this._fetch_data(this.state, undefined, 0, [integrated_pushData.id]);
}
} }
} }
}; };
@ -602,12 +611,9 @@ var CalendarApp = /** @class */ (function (_super) {
if (pushData.type === 'delete') { if (pushData.type === 'delete') {
return this.egw.dataStoreUID(info_uid, null); return this.egw.dataStoreUID(info_uid, null);
} }
// We could try to be a little smarter, but this will work
// Discard cache
this._clear_cache();
// Calendar is the current application, refresh now // Calendar is the current application, refresh now
if (framework.activeApp.appName === this.appname) { if (framework.activeApp.appName === this.appname) {
this.setState({ state: this.state }); this._fetch_data(this.state, undefined, 0, [pushData.app + pushData.id]);
} }
// Bind once to trigger a refresh when tab is activated again // Bind once to trigger a refresh when tab is activated again
else if (framework.applications.calendar && framework.applications.calendar.tab && else if (framework.applications.calendar && framework.applications.calendar.tab &&
@ -817,15 +823,7 @@ var CalendarApp = /** @class */ (function (_super) {
integration_preference.splice(index, 1); integration_preference.splice(index, 1);
} }
// Clear any events from that app // Clear any events from that app
var events = egw.dataKnownUIDs('calendar'); this._clear_cache(app);
for (var i = 0; i < events.length; i++) {
var event_data = egw.dataGetUIDdata("calendar::" + events[i]).data || { app: "calendar" };
if (event_data && event_data.app === app) {
// Remove entry, then delete it from the cache
egw.dataStoreUID("calendar::" + events[i], null);
egw.dataDeleteUID('calendar::' + events[i]);
}
}
} }
egw.set_preference("calendar", "integration_toggle", integration_preference, callback); egw.set_preference("calendar", "integration_toggle", integration_preference, callback);
}; };
@ -2934,12 +2932,21 @@ var CalendarApp = /** @class */ (function (_super) {
/** /**
* Clear all calendar data from egw.data cache * Clear all calendar data from egw.data cache
*/ */
CalendarApp.prototype._clear_cache = function () { CalendarApp.prototype._clear_cache = function (integration_app) {
// Full refresh, clear the caches // Full refresh, clear the caches
var events = egw.dataKnownUIDs('calendar'); var events = egw.dataKnownUIDs('calendar');
for (var i = 0; i < events.length; i++) { for (var i = 0; i < events.length; i++) {
egw.dataDeleteUID('calendar::' + events[i]); var event_data = egw.dataGetUIDdata("calendar::" + events[i]).data || { app: "calendar" };
if (!integration_app || integration_app && event_data && event_data.app === integration_app) {
// Remove entry
egw.dataStoreUID("calendar::" + events[i], null);
// Delete from cache
egw.dataDeleteUID('calendar::' + events[i]);
}
} }
// If just removing one app, leave the columns alone
if (integration_app)
return;
var daywise = egw.dataKnownUIDs(CalendarApp.DAYWISE_CACHE_ID); var daywise = egw.dataKnownUIDs(CalendarApp.DAYWISE_CACHE_ID);
for (var i = 0; i < daywise.length; i++) { for (var i = 0; i < daywise.length; i++) {
// Empty to clear existing widgets // Empty to clear existing widgets
@ -3020,8 +3027,9 @@ var CalendarApp = /** @class */ (function (_super) {
* @param {etemplate2} [instance] If the full calendar app isn't loaded * @param {etemplate2} [instance] If the full calendar app isn't loaded
* (home app), pass a different instance to use it to get the data * (home app), pass a different instance to use it to get the data
* @param {number} [start] Result offset. Internal use only * @param {number} [start] Result offset. Internal use only
* @param {string[]} [specific_ids] Only request the given IDs
*/ */
CalendarApp.prototype._fetch_data = function (state, instance, start) { CalendarApp.prototype._fetch_data = function (state, instance, start, specific_ids) {
if (!this.sidebox_et2 && !instance) { if (!this.sidebox_et2 && !instance) {
return; return;
} }
@ -3067,7 +3075,7 @@ var CalendarApp = /** @class */ (function (_super) {
} }
this._queries_in_progress.push(query_string); this._queries_in_progress.push(query_string);
this.egw.dataFetch(instance ? instance.etemplate_exec_id : this.egw.dataFetch(instance ? instance.etemplate_exec_id :
this.sidebox_et2.getInstanceManager().etemplate_exec_id, { start: start, num_rows: 400 }, query, this.appname, function calendar_handleResponse(data) { this.sidebox_et2.getInstanceManager().etemplate_exec_id, specific_ids ? { refresh: specific_ids } : { start: start, num_rows: 400 }, query, this.appname, function calendar_handleResponse(data) {
var idx = this._queries_in_progress.indexOf(query_string); var idx = this._queries_in_progress.indexOf(query_string);
if (idx >= 0) { if (idx >= 0) {
this._queries_in_progress.splice(idx, 1); this._queries_in_progress.splice(idx, 1);

View File

@ -480,9 +480,20 @@ class CalendarApp extends EgwApp
{ {
return this.push_infolog(pushData); return this.push_infolog(pushData);
} }
// Other integration here else
// TODO {
debugger; // Modify the pushData so it looks like one of ours
let integrated_pushData = jQuery.extend(pushData, {
id: pushData.app+pushData.id,
app: this.appname
});
if(integrated_pushData.type == "delete" || egw.dataHasUID(this.uid(integrated_pushData)))
{
return super.push(integrated_pushData);
}
// Ask for the real data, we don't have it
this._fetch_data(this.state,undefined,0,[integrated_pushData.id]);
}
} }
} }
} }
@ -554,14 +565,11 @@ class CalendarApp extends EgwApp
{ {
return this.egw.dataStoreUID(info_uid, null); return this.egw.dataStoreUID(info_uid, null);
} }
// We could try to be a little smarter, but this will work
// Discard cache
this._clear_cache();
// Calendar is the current application, refresh now // Calendar is the current application, refresh now
if(framework.activeApp.appName === this.appname) if(framework.activeApp.appName === this.appname)
{ {
this.setState({state: this.state}); this._fetch_data(this.state,undefined,0,[pushData.app+pushData.id]);
} }
// Bind once to trigger a refresh when tab is activated again // Bind once to trigger a refresh when tab is activated again
else if(framework.applications.calendar && framework.applications.calendar.tab && else if(framework.applications.calendar && framework.applications.calendar.tab &&
@ -818,17 +826,7 @@ class CalendarApp extends EgwApp
} }
// Clear any events from that app // Clear any events from that app
let events = egw.dataKnownUIDs('calendar'); this._clear_cache(app);
for(let i = 0; i < events.length; i++)
{
let event_data = egw.dataGetUIDdata("calendar::" + events[i]).data || {app: "calendar"};
if(event_data && event_data.app === app)
{
// Remove entry, then delete it from the cache
egw.dataStoreUID("calendar::"+events[i], null);
egw.dataDeleteUID('calendar::' + events[i]);
}
}
} }
egw.set_preference("calendar","integration_toggle",integration_preference, callback); egw.set_preference("calendar","integration_toggle",integration_preference, callback);
} }
@ -3435,14 +3433,24 @@ class CalendarApp extends EgwApp
/** /**
* Clear all calendar data from egw.data cache * Clear all calendar data from egw.data cache
*/ */
_clear_cache( ) _clear_cache( integration_app?:string )
{ {
// Full refresh, clear the caches // Full refresh, clear the caches
var events = egw.dataKnownUIDs('calendar'); var events = egw.dataKnownUIDs('calendar');
for(var i = 0; i < events.length; i++) for(var i = 0; i < events.length; i++)
{ {
egw.dataDeleteUID('calendar::' + events[i]); let event_data = egw.dataGetUIDdata("calendar::" + events[i]).data || {app: "calendar"};
if(!integration_app || integration_app && event_data && event_data.app === integration_app)
{
// Remove entry
egw.dataStoreUID("calendar::" + events[i], null);
// Delete from cache
egw.dataDeleteUID('calendar::' + events[i]);
}
} }
// If just removing one app, leave the columns alone
if(integration_app) return;
var daywise = egw.dataKnownUIDs(CalendarApp.DAYWISE_CACHE_ID); var daywise = egw.dataKnownUIDs(CalendarApp.DAYWISE_CACHE_ID);
for(var i = 0; i < daywise.length; i++) for(var i = 0; i < daywise.length; i++)
{ {
@ -3552,8 +3560,9 @@ class CalendarApp extends EgwApp
* @param {etemplate2} [instance] If the full calendar app isn't loaded * @param {etemplate2} [instance] If the full calendar app isn't loaded
* (home app), pass a different instance to use it to get the data * (home app), pass a different instance to use it to get the data
* @param {number} [start] Result offset. Internal use only * @param {number} [start] Result offset. Internal use only
* @param {string[]} [specific_ids] Only request the given IDs
*/ */
_fetch_data(state, instance, start?) _fetch_data(state, instance, start?, specific_ids?)
{ {
if(!this.sidebox_et2 && !instance) if(!this.sidebox_et2 && !instance)
{ {
@ -3613,7 +3622,7 @@ class CalendarApp extends EgwApp
this.egw.dataFetch( this.egw.dataFetch(
instance ? instance.etemplate_exec_id : instance ? instance.etemplate_exec_id :
this.sidebox_et2.getInstanceManager().etemplate_exec_id, this.sidebox_et2.getInstanceManager().etemplate_exec_id,
{start: start, num_rows:400}, specific_ids ? {refresh: specific_ids} : {start: start, num_rows:400},
query, query,
this.appname, this.appname,
function calendar_handleResponse(data) { function calendar_handleResponse(data) {