Get calendar home less broken

- Fix actions missing on home reload
- Fix full reload on home reload
- Fix calendar reload removed home events
This commit is contained in:
Nathan Gray 2016-02-23 21:29:13 +00:00
parent 009b5b72e7
commit 17f2882639
9 changed files with 120 additions and 61 deletions

View File

@ -58,6 +58,9 @@ class calendar_favorite_portlet extends home_favorite_portlet
public function exec($id = null, etemplate_new &$etemplate = null) public function exec($id = null, etemplate_new &$etemplate = null)
{ {
// Always load app's javascript, so most actions have a chance of working
egw_framework::validate_file('.','app',$this->context['appname']);
// Always load app's css // Always load app's css
egw_framework::includeCSS('calendar', 'app-'.$GLOBALS['egw_info']['user']['preferences']['common']['theme']) || egw_framework::includeCSS('calendar', 'app-'.$GLOBALS['egw_info']['user']['preferences']['common']['theme']) ||
egw_framework::includeCSS('calendar','app'); egw_framework::includeCSS('calendar','app');
@ -86,8 +89,6 @@ class calendar_favorite_portlet extends home_favorite_portlet
$etemplate->read('home.legacy'); $etemplate->read('home.legacy');
$etemplate->set_dom_id($id); $etemplate->set_dom_id($id);
// Always load app's javascript, so most actions have a chance of working
egw_framework::validate_file('','app',$this->context['appname']);
} }
$content = array('legacy' => ''); $content = array('legacy' => '');
@ -143,7 +144,7 @@ class calendar_favorite_portlet extends home_favorite_portlet
$this->favorite['state']['view'] == 'day' ? 1 : 4 $this->favorite['state']['view'] == 'day' ? 1 : 4
); );
$this->actions =& $etemplate->getElementAttribute('view', 'actions'); $this->actions =& $etemplate->getElementAttribute('view', 'actions');
$ui->week($days, $etemplate); $ui->week($days, $etemplate);
return; return;
} }

View File

@ -612,13 +612,19 @@ class calendar_uiviews extends calendar_ui
$search_params['start'] = $week_start->format('ts'); $search_params['start'] = $week_start->format('ts');
$search_params['end'] = $week_end->format('ts'); $search_params['end'] = $week_end->format('ts');
$content['view'][] = (array)$this->tagWholeDayOnTop($this->bo->search($search_params)); $content['view'][] = (array)$this->tagWholeDayOnTop($this->bo->search($search_params)) +
array(
'id' => $week_start->format('Ymd')
);
$home->setElementAttribute("view[$week]",'onchange',false); $home->setElementAttribute("view[$week]",'onchange',false);
$home->setElementAttribute("view[$week]",'granularity',$granularity); $home->setElementAttribute("view[$week]",'granularity',$granularity);
$home->setElementAttribute("view[$week]",'show_weekend', $this->search_params['weekend']); $home->setElementAttribute("view[$week]",'show_weekend', $this->search_params['weekend']);
$week++; $week++;
} }
// Get the actions
$home->setElementAttribute('view','actions',$this->get_actions());
$home->exec(__METHOD__, $content); $home->exec(__METHOD__, $content);
} }

View File

@ -75,6 +75,9 @@ app.classes.calendar = AppJS.extend(
// up to date as state is changed. // up to date as state is changed.
sidebox_hooked_templates: [], sidebox_hooked_templates: [],
// List of queries in progress, to prevent home from requesting the same thing
_queries_in_progress: [],
/** /**
* Constructor * Constructor
* *
@ -2724,6 +2727,14 @@ app.classes.calendar = AppJS.extend(
// Show ajax loader // Show ajax loader
framework.applications.calendar.sidemenuEntry.showAjaxLoader() framework.applications.calendar.sidemenuEntry.showAjaxLoader()
// Already in progress?
var query_string = JSON.stringify(query);
if(this._queries_in_progress.indexOf(query_string) != -1)
{
return;
}
this._queries_in_progress.push(query_string);
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,
@ -2731,7 +2742,13 @@ app.classes.calendar = AppJS.extend(
query, query,
this.id, this.id,
function calendar_handleResponse(data) { function calendar_handleResponse(data) {
console.log(data); var idx = this._queries_in_progress.indexOf(query_string);
if(idx >= 0)
{
this._queries_in_progress.splice(idx,1);
}
//console.log(data);
// Look for any updated select options // Look for any updated select options
if(data.rows && data.rows.sel_options && this.sidebox_et2) if(data.rows && data.rows.sel_options && this.sidebox_et2)
{ {

View File

@ -27,37 +27,46 @@ observer: function(_msg, _app, _id, _type, _msg_type, _targetapp)
// List view, we can just update it // List view, we can just update it
this.portlet.getWidgetById('nm').refresh(_id,_type); this.portlet.getWidgetById('nm').refresh(_id,_type);
} }
else if (_id)
{
// Calendar app should handle it in its observer()
}
else if (app.classes.calendar && app.calendar)
{
// No ID, probably a refresh of app. Calendar will discard the cache.
// Only make a request if:
// - portlet date range is outside calendar state range
// - portlet owner is not in calendar state owner
// Otherwise, we'll kill the connection with several overlapping requests
var value = [];
var state = this.portlet.options.settings.favorite.state;
if(state.owner == 0) state.owner = [egw.user('account_id')];
this.portlet.iterateOver(function(view) {
value.push({
owner: view.options.owner,
start_date: view.options.start_date,
end_date: view.options.end_date
})
state.first = !state.first || state.first > view.options.start_date ? view.options.start_date : state.first;
state.last = !state.last || state.last < view.options.end_date ? view.options.end_date : state.last;
},this, et2_calendar_view);
if(state.first < new Date(app.calendar.state.first) || state.last > new Date(app.calendar.state.last) ||
state.owner != app.calendar.state.owner)
{
app.calendar.et2 = this.portlet._children[0]
app.calendar._need_data(value, state);
}
}
else else
{ {
var event = egw.dataGetUIDdata('calendar::'+_id); // No intelligence since we don't have access to the state
if(event && event.data && event.data.date) // (app.calendar.getState() is for the calendar tab, not home)
// just refresh on every calendar or infolog change
if(_app == 'calendar' || _app == 'infolog')
{ {
var new_cache_id = app.classes.calendar._daywise_cache_id( app.home.refresh(this.portlet.id);
event.data.date,
// Make sure to use the right owner, not current calendar state
this.portlet.settings.favorite.state.owner || ''
);
var daywise = egw.dataGetUIDdata(new_cache_id);
daywise = daywise ? daywise.data : [];
if(_type === 'delete')
{
daywise.splice(daywise.indexOf(_id),1);
}
else if (daywise.indexOf(_id) < 0)
{
daywise.push(_id);
}
egw.dataStoreUID(new_cache_id,daywise);
}
else
{
// No intelligence since we don't have access to the state
// (app.calendar.getState() is for the calendar tab, not home)
// just refresh on every calendar or infolog change
if(_app == 'calendar' || _app == 'infolog')
{
app.home.refresh(this.portlet.id);
}
} }
} }
} }

View File

@ -235,7 +235,19 @@ var et2_calendar_event = et2_valueWidget.extend([et2_IDetachedDOM],
} }
// Copy actions set in parent // Copy actions set in parent
this._link_actions(this._parent._parent._parent.options.actions||{}); var action_parent = this;
while(action_parent != null && !action_parent.options.actions &&
!action_parent.instanceOf(et2_container)
)
{
action_parent = action_parent.getParent();
}
try {
this._link_actions(action_parent.options.actions||{});
} catch (e) {
// something went wrong, but keep quiet about it
debugger;
}
// Make sure category stuff is there // Make sure category stuff is there
// Fake it to use the cache / call - if already there, these will return // Fake it to use the cache / call - if already there, these will return
@ -853,7 +865,7 @@ var et2_calendar_event = et2_valueWidget.extend([et2_IDetachedDOM],
// objects // objects
this._actionObject = objectManager.insertObject(false, new egwActionObject( this._actionObject = objectManager.insertObject(false, new egwActionObject(
'calendar::'+this.options.value.row_id, objectManager, new et2_event_action_object_impl(this,this.getDOMNode()), 'calendar::'+this.options.value.row_id, objectManager, new et2_event_action_object_impl(this,this.getDOMNode()),
this._actionManager || objectManager.manager.getActionById(this.options.value.row_id) || objectManager.manager this._actionManager || objectManager.manager.getActionById('calendar::'+this.options.value.row_id) || objectManager.manager
)); ));
} }
else else

View File

@ -732,7 +732,7 @@ var et2_calendar_planner = et2_calendar_view.extend([et2_IDetachedDOM, et2_IResi
this.widget.update_timer = null; this.widget.update_timer = null;
this.widget.doInvalidate = true; this.widget.doInvalidate = true;
window.setTimeout(jQuery.proxy(function() {this.loader.hide();},this.widget),100); window.setTimeout(jQuery.proxy(function() {if(this.loader) this.loader.hide();},this.widget),100);
},{widget:this,"trigger":trigger}),ET2_GRID_INVALIDATE_TIMEOUT); },{widget:this,"trigger":trigger}),ET2_GRID_INVALIDATE_TIMEOUT);
}, },

View File

@ -950,6 +950,8 @@ var et2_calendar_timegrid = et2_calendar_view.extend([et2_IDetachedDOM, et2_IRes
*/ */
_scroll: function(event) _scroll: function(event)
{ {
if(!this.day_widgets) return;
// Loop through days, let them deal with it // Loop through days, let them deal with it
for(var day = 0; day < this.day_widgets.length; day++) for(var day = 0; day < this.day_widgets.length; day++)
{ {
@ -1013,7 +1015,7 @@ var et2_calendar_timegrid = et2_calendar_view.extend([et2_IDetachedDOM, et2_IRes
for(var i = 0; i < parent.children.length; i++) for(var i = 0; i < parent.children.length; i++)
{ {
var parent_finder = jQuery(this.div, parent.children[i].iface.doGetDOMNode()); var parent_finder = jQuery(parent.children[i].iface.doGetDOMNode()).find(this.div);
if(parent_finder.length > 0) if(parent_finder.length > 0)
{ {
parent = parent.children[i]; parent = parent.children[i];
@ -1303,7 +1305,7 @@ var et2_calendar_timegrid = et2_calendar_view.extend([et2_IDetachedDOM, et2_IRes
* necessarily an entry from the resource app), or a list containing a * necessarily an entry from the resource app), or a list containing a
* combination of both. * combination of both.
*/ */
set_value: function(events) set_value: function set_value(events)
{ {
if(typeof events !== 'object') return false; if(typeof events !== 'object') return false;
@ -1329,26 +1331,35 @@ var et2_calendar_timegrid = et2_calendar_view.extend([et2_IDetachedDOM, et2_IRes
this.set_end_date(day_list[day_list.length-1]); this.set_end_date(day_list[day_list.length-1]);
} }
// Sub widgets actually get their own data from egw.data, so we'll // We need to check if we're attached already, as the datastore can cause
// stick it there // conflicts across other events (especially home) if we call it too early
var consolidated = et2_calendar_view.is_consolidated(this.options.owner, this.day_list.length == 1 ? 'day' : 'week'); if(this.isAttached())
for(var day in events)
{ {
var day_list = []; // Sub widgets actually get their own data from egw.data, so we'll
for(var i = 0; i < events[day].length; i++) // stick it there
var consolidated = et2_calendar_view.is_consolidated(this.options.owner, this.day_list.length == 1 ? 'day' : 'week');
for(var day in events)
{ {
day_list.push(events[day][i].row_id); var day_list = [];
egw.dataStoreUID('calendar::'+events[day][i].row_id, events[day][i]); for(var i = 0; i < events[day].length; i++)
} {
// Might be split by user, so we have to check that too day_list.push(events[day][i].row_id);
for(var i = 0; i < this.options.owner.length; i++) egw.dataStoreUID('calendar::'+events[day][i].row_id, events[day][i]);
{ }
var owner = consolidated ? this.options.owner : this.options.owner[i]; // Might be split by user, so we have to check that too
var day_id = app.classes.calendar._daywise_cache_id(day,owner); for(var i = 0; i < this.options.owner.length; i++)
egw.dataStoreUID(day_id, day_list); {
if(consolidated) break; var owner = consolidated ? this.options.owner : this.options.owner[i];
var day_id = app.classes.calendar._daywise_cache_id(day,owner);
egw.dataStoreUID(day_id, day_list);
if(consolidated) break;
}
} }
} }
else
{
this.value = events;
}
} }
// Reset and calculate instead of just use the keys so we can get the weekend preference // Reset and calculate instead of just use the keys so we can get the weekend preference
@ -1781,9 +1792,10 @@ var et2_calendar_timegrid = et2_calendar_view.extend([et2_IDetachedDOM, et2_IRes
{ {
this.options.height = Math.max(this.options.height, needed); this.options.height = Math.max(this.options.height, needed);
// Set all others to match // Set all others to match
if(!_too_small && rowCount > 1) if(!_too_small && rowCount > 1 && this._parent)
{ {
window.setTimeout(jQuery.proxy(function() { window.setTimeout(jQuery.proxy(function() {
if(!this._parent) return;
this._parent.iterateOver(function(widget) { this._parent.iterateOver(function(widget) {
if(!widget.disabled) widget.resize(true); if(!widget.disabled) widget.resize(true);
},this, et2_calendar_timegrid); },this, et2_calendar_timegrid);

View File

@ -125,7 +125,7 @@ class home_favorite_portlet extends home_portlet
egw_framework::includeCSS($this->context['appname'],'app'); egw_framework::includeCSS($this->context['appname'],'app');
// Always load app's javascript, so most actions have a chance of working // Always load app's javascript, so most actions have a chance of working
egw_framework::validate_file('','app',$this->context['appname']); egw_framework::validate_file('.','app',$this->context['appname']);
// Set this so app's JS gets initialized // Set this so app's JS gets initialized
$old_app = $GLOBALS['egw_info']['flags']['currentapp']; $old_app = $GLOBALS['egw_info']['flags']['currentapp'];

View File

@ -157,13 +157,15 @@ app.classes.home = AppJS.extend(
// Check for existing etemplate, this one loaded over it // Check for existing etemplate, this one loaded over it
// NOTE: Moving them around like this can cause problems with event handlers // NOTE: Moving them around like this can cause problems with event handlers
var existing = etemplate2.getById(et2.uniqueId); var existing = etemplate2.getById(et2.uniqueId);
if(portlet && existing && existing.etemplate_exec_id != et2.etemplate_exec_id) if(portlet && existing)
{ {
for(var i = 0; i < portlet._children.length; i++) for(var i = 0; i < portlet._children.length; i++)
{ {
if(portlet._children[i]._inst) portlet._children[i]._inst.clear(); if(typeof portlet._children[i]._init == 'undefined')
{
portlet.removeChild(portlet._children[i])
}
} }
portlet._children = [];
} }
// It's in the right place for original load, but move it into portlet // It's in the right place for original load, but move it into portlet
var misplaced = $j(etemplate2.getById('home-index').DOMContainer).siblings('#'+et2.DOMContainer.id); var misplaced = $j(etemplate2.getById('home-index').DOMContainer).siblings('#'+et2.DOMContainer.id);