forked from extern/egroupware
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:
parent
009b5b72e7
commit
17f2882639
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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'];
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user