diff --git a/calendar/inc/class.calendar_favorite_portlet.inc.php b/calendar/inc/class.calendar_favorite_portlet.inc.php
index 1e876593e5..1962822713 100644
--- a/calendar/inc/class.calendar_favorite_portlet.inc.php
+++ b/calendar/inc/class.calendar_favorite_portlet.inc.php
@@ -24,6 +24,8 @@ class calendar_favorite_portlet extends home_favorite_portlet
public function __construct(Array &$context = array(), &$need_reload = false)
{
$context['appname'] = 'calendar';
+ // Reload is NULL when changing properties via AJAX
+ $reload = !is_null($need_reload);
// Let parent handle the basic stuff
parent::__construct($context,$need_reload);
@@ -48,7 +50,9 @@ class calendar_favorite_portlet extends home_favorite_portlet
'default_cols' => 'cal_start_cal_end,cal_title'
);
}
- $need_reload = true;
+
+ // Checking against NULL allows us to skip the reload for resizing
+ $need_reload = $reload && $need_reload;
}
public function exec($id = null, etemplate_new &$etemplate = null)
@@ -95,8 +99,14 @@ class calendar_favorite_portlet extends home_favorite_portlet
case 'planner_user':
case 'planner_cat':
case 'planner':
- $content = array('legacy' => $ui->planner(true));
- break;
+ $content = array();
+ $etemplate->read('calendar.planner');
+ $etemplate->set_dom_id($id);
+ $this->actions =& $etemplate->getElementAttribute('planner', 'actions');
+ // Don't notify the calendar app of date changes
+ $etemplate->setElementAttribute('planner','onchange',false);
+ $ui->planner(array(), $etemplate);
+ return;
case 'year':
$content = array('legacy' => $ui->year(true));
break;
@@ -109,15 +119,21 @@ class calendar_favorite_portlet extends home_favorite_portlet
case 'week':
$etemplate->read('calendar.view');
$etemplate->set_dom_id($id);
+ $this->actions =& $etemplate->getElementAttribute('view', 'actions');
+ // Don't notify the calendar app of date changes
+ $etemplate->setElementAttribute('view[0]','onchange',false);
$ui->week(array(), $etemplate);
return;
- break;
case 'day':
- $content = array('legacy' => $ui->day(true));
- break;
case 'day4':
- $content = array('legacy' => $ui->week(4,true));
- break;
+ $etemplate->read('calendar.view');
+ $etemplate->set_dom_id($id);
+ $days = $this->favorite['state']['days'] ? $this->favorite['state']['days'] : (
+ $this->favorite['state']['view'] == 'day' ? 1 : 4
+ );
+ $this->actions =& $etemplate->getElementAttribute('view', 'actions');
+ $ui->week($days, $etemplate);
+ return;
}
unset($GLOBALS['egw_info']['flags']['app_header']);
@@ -218,4 +234,15 @@ class calendar_favorite_portlet extends home_favorite_portlet
}
return $properties;
}
- }
\ No newline at end of file
+
+ public function get_actions() {
+ if($this->favorite['state']['view'] == 'listview' || !$this->actions)
+ {
+ return array();
+ }
+ else
+ {
+ return $this->actions;
+ }
+ }
+}
diff --git a/calendar/inc/class.calendar_uiforms.inc.php b/calendar/inc/class.calendar_uiforms.inc.php
index fcceb02e2a..d43ce40df4 100644
--- a/calendar/inc/class.calendar_uiforms.inc.php
+++ b/calendar/inc/class.calendar_uiforms.inc.php
@@ -2552,7 +2552,7 @@ class calendar_uiforms extends calendar_ui
* @param string $_eventId id of the event which has to be moved
* @param string $calendarOwner the owner of the calendar the event is in
* @param string $targetDateTime the datetime where the event should be moved to, format: YYYYMMDD
- * @param string $targetOwner the owner of the target calendar
+ * @param string|string[] $targetOwner the owner of the target calendar
* @param string $durationT the duration to support resizable calendar event
* @return string XML response if no error occurs
*/
@@ -2563,6 +2563,10 @@ class calendar_uiforms extends calendar_ui
{
$targetOwner = array($targetOwner);
}
+ if($targetOwner == 0 || is_array($targetOwner) && $targetOwner[0] == 0)
+ {
+ $targetOwner = $calendarOwner;
+ }
if($calendarOwner !== $targetOwner && !is_array($targetOwner))
{
return false;
diff --git a/calendar/inc/class.calendar_uiviews.inc.php b/calendar/inc/class.calendar_uiviews.inc.php
index 44b540692f..8571c9f6fa 100644
--- a/calendar/inc/class.calendar_uiviews.inc.php
+++ b/calendar/inc/class.calendar_uiviews.inc.php
@@ -336,9 +336,9 @@ class calendar_uiviews extends calendar_ui
/**
* Displays the planner view
*
- * @param boolean $home = false if true return content suitable for home-page
+ * @param boolean|etemplate_new $home = false if etemplate return content suitable for home-page
*/
- function &planner($home=false)
+ function &planner($content = array(), $home=false)
{
if ($this->sortby == 'month') // yearly planner with month rows
{
@@ -401,20 +401,23 @@ class calendar_uiviews extends calendar_ui
$search_params['start'] = $this->first;
$search_params['end'] = $this->last;
$search_params['enum_groups'] = $this->sortby == 'user';
- $events =& $this->bo->search($search_params);
+ $content['planner'] = $this->bo->search($search_params);
+ foreach($content['planner'] as &$event)
+ {
+ $this->to_client($event);
+ }
if ($this->debug > 0) $this->bo->debug_message('uiviews::planner() date=%1: first=%2, last=%3',False,$this->date,$this->bo->date2string($this->first),$this->bo->date2string($this->last));
- $content =& $this->plannerWidget($events,$this->first,$this->last,$this->sortby != 'category' ? $this->sortby : (int) $this->cat_id);
+ $tmpl = $home ? $home :new etemplate_new('calendar.planner');
+ $tmpl->setElementAttribute('planner','start_date', egw_time::to($this->first, egw_time::ET2));
+ $tmpl->setElementAttribute('planner','end_date', egw_time::to($this->last, egw_time::ET2));
+ $tmpl->setElementAttribute('planner','group_by', $this->sortby);
+ // Get the actions
+ $tmpl->setElementAttribute('planner','actions',$this->get_actions());
- if (!$home)
- {
- $this->do_header();
-
- echo $content;
- }
- return $content;
+ $tmpl->exec(__METHOD__, $content);
}
/**
@@ -878,7 +881,7 @@ class calendar_uiviews extends calendar_ui
else
{
$wd_start = $this->first = $this->datetime->get_weekday_start($this->year,$this->month,$this->day);
- if ($days == 5) // no weekend-days
+ if ($days <= 5) // no weekend-days
{
switch($this->cal_prefs['weekdaystarts'])
{
@@ -905,7 +908,7 @@ class calendar_uiviews extends calendar_ui
$content = array('view' => array());
// Always do 7 days for a week so scrolling works properly
- $this->last = ($days == 4 ? $this->last : $search_params['end'] = strtotime("+7 days",$this->first) - 1);
+ $this->last = ($days == 4 ? $this->last : $search_params['end'] = strtotime("+$days days",$this->first) - 1);
if (count($users) == 1 || count($users) > $this->bo->calview_no_consolidate) // for more then X users, show all in one row
{
$content['view'][] = $this->tagWholeDayOnTop($this->bo->search($search_params)) +
@@ -2925,6 +2928,11 @@ class calendar_uiviews extends calendar_ui
$actions['timesheet']['open'] = '{"app": "timesheet", "type": "add", "extra": "link_app[]=$app&link_id[]=$id"}';
$actions['timesheet']['onExecute'] = 'javaScript:app.calendar.action_open';
}
+ if ($actions['documents'])
+ {
+ // TODO: See if we can get this working sensibly
+ $actions['documents']['enabled'] = false;
+ }
$actions['delete']['onExecute'] = 'javaScript:app.calendar.delete';
diff --git a/calendar/js/app.js b/calendar/js/app.js
index 5feaf082ca..2e5781853d 100644
--- a/calendar/js/app.js
+++ b/calendar/js/app.js
@@ -63,13 +63,6 @@ app.classes.calendar = AppJS.extend(
owner: egw.user('account_id'),
days: egw.preference('days_in_weekview','calendar')
},
-
- /**
- * This is the data cache prefix for the daywise event index cache
- * Daywise cache IDs look like: calendar_daywise::20150101 and
- * contain a list of event IDs for that day (or empty array)
- */
- DAYWISE_CACHE_ID: 'calendar_daywise',
/**
* Constructor
@@ -250,7 +243,7 @@ app.classes.calendar = AppJS.extend(
var event = egw.dataGetUIDdata('calendar::'+_id);
if(event && event.data && event.data.date)
{
- var new_cache_id = this._daywise_cache_id(event.data.date)
+ var new_cache_id = app.classes.calendar._daywise_cache_id(event.data.date)
var daywise = egw.dataGetUIDdata(new_cache_id);
daywise = daywise ? daywise.data : [];
if(_type === 'delete')
@@ -411,14 +404,51 @@ app.classes.calendar = AppJS.extend(
var start = new Date(app.calendar.state.date);
var end = null;
+ // Find the template
+ var id = $j(this).closest('.et2_container').attr('id');
+ if(!id) return;
+ var template = etemplate2.getById(id);
+ if(!template) return;
+
+
// Get the view to calculate
var view = app.classes.calendar.views[app.calendar.state.view] || false;
- if (view)
+ if (view && view.etemplates.indexOf(template) !== -1)
{
start = view.scroll(direction * delta);
+ app.calendar.update_state({date:app.calendar.date.toString(start)});
}
+ else
+ {
+ // Home - always 1 week
+ // TODO
+ return false;
+ var widget = [];
+ var value = [];
+ template.widgetContainer.iterateOver(function(w) {
+ if(typeof w.set_start_date === 'function' && typeof w.set_value === 'function')
+ {
+ widget.push(w);
+ }
+ },this,et2_valueWidget);
+ for(var i = 0; i < widget.length; i++)
+ {
+ var state = template.widgetContainer.getParent().settings.favorite.state || {};
+ debugger;
+ var start = new Date(widget[i].options.start_date || state.start);
+ start.setUTCDate(start.getUTCDate() + (7 * direction * delta));
+ var end = new Date(widget[i].options.end_date || state.end);
+ end.setUTCDate(end.getUTCDate() + (7 * direction * delta));
- app.calendar.update_state({date:app.calendar.date.toString(start)});
+ // Get data
+ value[i] = {
+ start_date: start,
+ end_date: end
+ };
+ app.calendar._need_data([value[i]], state);
+ widget[i].set_value(value[i]);
+ }
+ }
return false;
}
@@ -1773,22 +1803,6 @@ app.classes.calendar = AppJS.extend(
}
},
- /**
- * Create a cache ID for the daywise cache
- *
- * @param {String|Date} date
- * @param {String|integer|String[]} owner
- * @returns {String} Cache ID
- */
- _daywise_cache_id: function(date, owner)
- {
- if(typeof date === 'object')
- {
- date = date.getUTCFullYear() + sprintf('%02d',date.getUTCMonth()+1) + sprintf('%02d',date.getUTCDate());
- }
- return this.DAYWISE_CACHE_ID+'::'+date+(owner && owner.toString() !== (this.state.owner.toString()||'') ? '-' + owner : '');
- },
-
/**
* Take the date range(s) in the value and decide if we need to fetch data
* for the date ranges, or if they're already cached fill them in.
@@ -1815,7 +1829,7 @@ app.classes.calendar = AppJS.extend(
{
// Cache is by date (and owner, if seperate)
var date = t.getUTCFullYear() + sprintf('%02d',t.getUTCMonth()+1) + sprintf('%02d',t.getUTCDate());
- var cache_id = this._daywise_cache_id(date, seperate_owners ? value[i].owner : false);
+ var cache_id = app.classes.calendar._daywise_cache_id(date, seperate_owners ? value[i].owner : false);
if(egw.dataHasUID(cache_id))
{
@@ -1940,7 +1954,7 @@ app.classes.calendar = AppJS.extend(
}
for(var day in updated_days)
{
- this.egw.dataStoreUID(this._daywise_cache_id(day, state.owner), updated_days[day]);
+ this.egw.dataStoreUID(app.classes.calendar._daywise_cache_id(day, state.owner), updated_days[day]);
}
}, this,null
);
@@ -2041,6 +2055,9 @@ app.classes.calendar = AppJS.extend(
var hidden = typeof this.state.view !== 'undefined';
var all_loaded = true;
+ // Avoid home portlets using our templates, and get them right
+ if(_et2.uniqueId.indexOf('portlet') === 0) return;
+
// Flag to make sure we don't hide non-view templates
var view_et2 = false;
@@ -2054,7 +2071,7 @@ app.classes.calendar = AppJS.extend(
// If a template disappears, we want to release it
$j(_et2.DOMContainer).one('clear',jQuery.proxy(function() {
this.view[index] = _name;
- },{view: app.classes.calendar.views[view], index: index, name: _name}));
+ },jQuery.extend({},{view: app.classes.calendar.views[view], index: ""+index, name: _name})));
if(this.state.view === view)
{
@@ -2160,17 +2177,49 @@ app.classes.calendar = AppJS.extend(
}
});
-/**
-* Etemplates and settings for the different views. Some (day view)
-* use more than one template, some use the same template as others,
-* most need different handling for their various attributes.
-*
-* Not using the standard Class.extend here because it hides the members,
-* and we want to be able to look inside them. This is done seperately instead
-* of inside the normal object to allow access to the View object.
-*/
jQuery.extend(app.classes.calendar,{
+
+ /**
+ * This is the data cache prefix for the daywise event index cache
+ * Daywise cache IDs look like: calendar_daywise::20150101 and
+ * contain a list of event IDs for that day (or empty array)
+ */
+ DAYWISE_CACHE_ID: 'calendar_daywise',
+
+
+ /**
+ * Create a cache ID for the daywise cache
+ *
+ * @param {String|Date} date
+ * @param {String|integer|String[]} owner
+ * @returns {String} Cache ID
+ */
+ _daywise_cache_id: function(date, owner)
+ {
+ if(typeof date === 'object')
+ {
+ date = date.getUTCFullYear() + sprintf('%02d',date.getUTCMonth()+1) + sprintf('%02d',date.getUTCDate());
+ }
+
+ // If the owner is not set, 0, or the current user, don't bother adding it
+ var _owner = (owner && owner.toString() != '0' && owner !== (app.calendar.state.owner.toString()||'')) ? owner.toString() : '';
+ if(_owner == egw.user('account_id'))
+ {
+ _owner = '';
+ }
+ return app.classes.calendar.DAYWISE_CACHE_ID+'::'+date+(_owner ? '-' + _owner : '');
+ },
+
+ /**
+ * Etemplates and settings for the different views. Some (day view)
+ * use more than one template, some use the same template as others,
+ * most need different handling for their various attributes.
+ *
+ * Not using the standard Class.extend here because it hides the members,
+ * and we want to be able to look inside them. This is done seperately instead
+ * of inside the normal object to allow access to the View object.
+ */
views: {
day: app.classes.calendar.prototype.View.extend({
header: function(state) {
diff --git a/calendar/js/calendar_favorite_portlet.js b/calendar/js/calendar_favorite_portlet.js
index 3b71446654..494d0d8aa3 100644
--- a/calendar/js/calendar_favorite_portlet.js
+++ b/calendar/js/calendar_favorite_portlet.js
@@ -7,6 +7,9 @@
* @author Nathan Gray
* @version $Id$
*/
+/*egw:uses
+ /calendar/js/app.js;
+*/
/**
* Custom code for calendar favorite home page portlets.
@@ -26,12 +29,31 @@ observer: function(_msg, _app, _id, _type, _msg_type, _targetapp)
}
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')
+ var event = egw.dataGetUIDdata('calendar::'+_id);
+ if(event && event.data && event.data.date)
{
- app.home.refresh(this.portlet.id);
+ var new_cache_id = app.classes.calendar._daywise_cache_id(event.data.date);
+ 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);
+ }
}
}
}
diff --git a/calendar/js/et2_widget_daycol.js b/calendar/js/et2_widget_daycol.js
index b27a238fce..0cb5c78a3b 100644
--- a/calendar/js/et2_widget_daycol.js
+++ b/calendar/js/et2_widget_daycol.js
@@ -207,7 +207,10 @@ var et2_calendar_daycol = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResizea
return;
}
- egw.dataUnregisterUID(app.calendar._daywise_cache_id+(this.options.date,this.options.owner),false,this);
+ if(this.options.date)
+ {
+ egw.dataUnregisterUID(app.classes.calendar._daywise_cache_id(this.options.date,this.options.owner),false,this);
+ }
this.options.date = new_date;
@@ -221,7 +224,8 @@ var et2_calendar_daycol = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResizea
// Register for updates on events for this day
- egw.dataRegisterUID(app.calendar._daywise_cache_id(new_date,this.options.owner), function(event_ids) {
+ var cache_id = app.classes.calendar._daywise_cache_id(new_date,this.options.owner);
+ egw.dataRegisterUID(cache_id, function(event_ids) {
var events = [];
for(var i = 0; i < event_ids.length; i++)
{
@@ -247,13 +251,13 @@ var et2_calendar_daycol = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResizea
set_owner: function(_owner) {
if(_owner !== this.options.owner)
{
- egw.dataUnregisterUID(app.calendar._daywise_cache_id+(this.options.date,this.options.owner),false,this);
+ egw.dataUnregisterUID(app.classes.calendar._daywise_cache_id+(this.options.date,this.options.owner),false,this);
this.options.owner = parseInt(_owner);
this.div.attr('data-sortable-id', this.options.owner);
// Register for updates on events for this day
- egw.dataRegisterUID(app.calendar._daywise_cache_id(this.options.date,this.options.owner), function(event_ids) {
+ egw.dataRegisterUID(app.classes.calendar._daywise_cache_id(this.options.date,this.options.owner), function(event_ids) {
var events = [];
for(var i = 0; i < event_ids.length; i++)
{
diff --git a/calendar/js/et2_widget_event.js b/calendar/js/et2_widget_event.js
index 534c03e6af..7064fc6dc4 100644
--- a/calendar/js/et2_widget_event.js
+++ b/calendar/js/et2_widget_event.js
@@ -470,7 +470,8 @@ var et2_calendar_event = et2_valueWidget.extend([et2_IDetachedDOM],
_link_actions: function(actions)
{
// Get the top level element - timegrid or so
- var objectManager = egw_getAppObjectManager(true).getObjectById(this._parent._parent._parent.id) || egw_getAppObjectManager(true);
+ var objectManager = this.getParent().getParent()._actionObject ||
+ egw_getAppObjectManager(true).getObjectById(this._parent._parent._parent.id) || egw_getAppObjectManager(true);
var widget_object = objectManager.getObjectById('calendar::'+this.id);
if (widget_object == null) {
// Add a new container to the object manager which will hold the widget
@@ -576,7 +577,6 @@ et2_calendar_event.recur_prompt = function(event_data, callback)
};
et2_calendar_event.drag_helper = function(event,ui) {
- debugger;
ui.helper.width(ui.width());
};
/**
diff --git a/calendar/js/et2_widget_planner.js b/calendar/js/et2_widget_planner.js
index b10019d6ba..88520daca1 100644
--- a/calendar/js/et2_widget_planner.js
+++ b/calendar/js/et2_widget_planner.js
@@ -343,7 +343,13 @@ var et2_calendar_planner = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResize
rows[event.category].push(event);
if(typeof labels[event.category] === 'undefined')
{
- var categories = et2_selectbox.cat_options({_type:'select-cat'}, {application: 'calendar'});
+ labels[event.category] = '';
+ var im = this.getInstanceManager();
+ // Fake it to use the cache / call
+ var categories = et2_selectbox.cat_options({
+ _type:'select-cat',
+ getInstanceManager: function() {return im;}
+ }, {application: 'calendar'});
for(var i in categories )
{
if(parseInt(categories[i].value) === parseInt(event.category))
@@ -727,6 +733,8 @@ var et2_calendar_planner = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResize
{
var prev = new Date(t);
prev.setUTCDate(prev.getUTCDate() - 1);
+ prev.setUTCHours(0);
+ prev.setUTCMinutes(0);
title = this._scroll_button('left',prev.toJSON()) + title;
}
if (i == days-1) // next day only for the last day
@@ -864,18 +872,37 @@ var et2_calendar_planner = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResize
// Get the parent? Might be a grid row, might not. Either way, it is
// just a container with no valid actions
var objectManager = egw_getAppObjectManager(true);
- var parent = objectManager.getObjectById(this._parent.id);
- if(!parent) return;
-
- for(var i = 0; i < parent.children.length; i++)
+ var parent = this;
+ var om = false;
+ while(parent && om !== objectManager)
{
- var parent_finder = jQuery(this.div, parent.children[i].iface.doGetDOMNode());
- if(parent_finder.length > 0)
+ if(parent.id && objectManager.getObjectById(parent.id))
{
- parent = parent.children[i];
+ om = objectManager.getObjectById(parent.id);
break;
}
+ parent = parent.getParent();
}
+ if(!om)
+ {
+ om = objectManager.getObjectById(this.getInstanceManager().uniqueId);
+ }
+
+ if(!om) return;
+
+ var widget_object = om.getObjectById(this.id);
+ if(widget_object == null)
+ {
+ widget_object = om.addObject(this.id, null, EGW_AO_FLAG_IS_CONTAINER);
+ }
+ // Go over the widget & add links - this is where we decide which actions are
+ // 'allowed' for this widget at this time
+ var action_links = this._get_action_links(actions);
+
+ this._init_links_dnd(widget_object.manager, action_links);
+
+ widget_object.updateActionLinks(action_links);
+ this._actionObject = widget_object;
},
/**
@@ -888,8 +915,8 @@ var et2_calendar_planner = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResize
var drag_action = mgr.getActionById('egw_link_drag');
// Check if this app supports linking
- if(!egw.link_get_registry(this.dataStorePrefix || this.egw().appName, 'query') ||
- egw.link_get_registry(this.dataStorePrefix || this.egw().appName, 'title'))
+ if(!egw.link_get_registry(this.dataStorePrefix || 'calendar', 'query') ||
+ egw.link_get_registry(this.dataStorePrefix || 'calendar', 'title'))
{
if(drop_action)
{
@@ -962,17 +989,6 @@ var et2_calendar_planner = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResize
{
// Create drag action that allows linking
drag_action = mgr.addAction('drag', 'egw_link_drag', egw.lang('link'), 'link', function(action, selected) {
- // Drag helper - list titles. Arbitrarily limited to 10.
- var helper = $j(document.createElement("div"));
- for(var i = 0; i < selected.length && i < 10; i++)
- {
- var id = selected[i].id.split('::');
- var span = $j(document.createElement('span')).appendTo(helper);
- egw.link_title(id[0],id[1], function(title) {
- this.append(title);
- this.append('
');
- }, span);
- }
// As we wanted to have a general defaul helper interface, we return null here and not using customize helper for links
// TODO: Need to decide if we need to create a customized helper interface for links anyway
//return helper;
@@ -1026,7 +1042,7 @@ var et2_calendar_planner = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResize
{
// Cache is by date (and owner, if seperate)
var date = t.getUTCFullYear() + sprintf('%02d',t.getUTCMonth()+1) + sprintf('%02d',t.getUTCDate());
- var cache_id = app.calendar._daywise_cache_id(date, this.options.owner);
+ var cache_id = app.classes.calendar._daywise_cache_id(date, this.options.owner);
if(egw.dataHasUID(cache_id))
{
@@ -1082,7 +1098,20 @@ var et2_calendar_planner = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResize
delete events.end_date;
}
- this.value = events || [];
+ if(typeof events.length === "undefined" && events)
+ {
+ for(var key in events)
+ {
+ if(typeof events[key] === 'object' && events[key] !== null)
+ {
+ this.value.push(events[key]);
+ }
+ }
+ }
+ else
+ {
+ this.value = events || [];
+ }
},
/**
@@ -1297,6 +1326,7 @@ var et2_calendar_planner = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResize
{
// Click on a header, we can go there
_ev.data = jQuery.extend({},_ev.target.parentNode.dataset, _ev.target.dataset);
+ debugger;
this.change(_ev);
}
else
diff --git a/calendar/js/et2_widget_planner_row.js b/calendar/js/et2_widget_planner_row.js
index b62869d4be..1c2a4b5488 100644
--- a/calendar/js/et2_widget_planner_row.js
+++ b/calendar/js/et2_widget_planner_row.js
@@ -93,7 +93,7 @@ var et2_calendar_planner_row = et2_valueWidget.extend([et2_IDetachedDOM],
*/
_draw: function() {
// Remove any existing
- this.rows.empty().nextAll().remove();
+ this.rows.remove('.calendar_eventRowsMarkedDay,.calendar_eventRowsFiller').nextAll().remove();
var days = 31;
var width = 85;
@@ -195,7 +195,7 @@ var et2_calendar_planner_row = et2_valueWidget.extend([et2_IDetachedDOM],
}
// Copy actions set in parent
- event._link_actions(this._parent._parent.options.actions||{});
+ event._link_actions(this._parent._parent.options.actions||this._parent.options.actions||{});
}
// Seperate loop so column sorting finds all children in the right place
diff --git a/calendar/js/et2_widget_timegrid.js b/calendar/js/et2_widget_timegrid.js
index c47a4eb5ec..4a268c5e01 100644
--- a/calendar/js/et2_widget_timegrid.js
+++ b/calendar/js/et2_widget_timegrid.js
@@ -372,9 +372,9 @@ var et2_calendar_timegrid = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResiz
this.widget.update_timer = null;
// Update actions
- if(this._actionManager)
+ if(this.widget._actionManager)
{
- this._link_actions(this._actionManager.children);
+ this.widget._link_actions(this.widget._actionManager.children);
}
this.widget._drawDays();
@@ -542,7 +542,7 @@ var et2_calendar_timegrid = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResiz
// Set the date, and pass any data we have
if(typeof this.value[this.day_list[i]] === 'undefined')
{
- var ids = (egw.dataGetUIDdata(app.calendar._daywise_cache_id(this.day_list[i],this.options.owner))||{data:[]});
+ var ids = (egw.dataGetUIDdata(app.classes.calendar._daywise_cache_id(this.day_list[i],this.options.owner))||{data:[]});
for(var j = 0; j < ids.length; j++)
{
this.value[this.day_list[i]] = [];
@@ -620,9 +620,15 @@ var et2_calendar_timegrid = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResiz
{
// Get the parent? Might be a grid row, might not. Either way, it is
// just a container with no valid actions
- var objectManager = egw_getAppObjectManager(true);
- var parent = objectManager.getObjectById(this._parent.id);
- if(!parent) return;
+ var objectManager = egw_getObjectManager(this.getInstanceManager().app,true,1);
+ objectManager = objectManager.getObjectById(this.getInstanceManager().uniqueId,2) || objectManager;
+ var parent = objectManager.getObjectById(this.id,3) || objectManager.getObjectById(this._parent.id,3) || objectManager;
+ if(!parent)
+ {
+ debugger;
+ egw.debug('error','No parent objectManager found')
+ return;
+ }
for(var i = 0; i < parent.children.length; i++)
{
@@ -720,6 +726,7 @@ var et2_calendar_timegrid = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResiz
this._init_links_dnd(widget_object.manager, action_links);
widget_object.updateActionLinks(action_links);
+ this._actionObject = widget_object;
},
/**
@@ -732,8 +739,8 @@ var et2_calendar_timegrid = et2_valueWidget.extend([et2_IDetachedDOM, et2_IResiz
var drag_action = mgr.getActionById('egw_link_drag');
// Check if this app supports linking
- if(!egw.link_get_registry(this.dataStorePrefix || this.egw().appName, 'query') ||
- egw.link_get_registry(this.dataStorePrefix || this.egw().appName, 'title'))
+ if(!egw.link_get_registry(this.dataStorePrefix || 'calendar', 'query') ||
+ egw.link_get_registry(this.dataStorePrefix || 'calendar', 'title'))
{
if(drop_action)
{
diff --git a/calendar/templates/default/planner.xet b/calendar/templates/default/planner.xet
index 22ad247ae0..27e72572d4 100644
--- a/calendar/templates/default/planner.xet
+++ b/calendar/templates/default/planner.xet
@@ -14,7 +14,7 @@ Egroupware
diff --git a/etemplate/js/et2_core_DOMWidget.js b/etemplate/js/et2_core_DOMWidget.js
index 716ad2b37d..c07bf513ec 100644
--- a/etemplate/js/et2_core_DOMWidget.js
+++ b/etemplate/js/et2_core_DOMWidget.js
@@ -463,9 +463,13 @@ var et2_DOMWidget = et2_widget.extend(et2_IDOMNode,
var gam = egw_getActionManager(this.egw().appName,true,1);
if(typeof this._actionManager != "object")
{
- if(gam.getActionById(this.id) != null)
+ if(gam.getActionById(this.getInstanceManager().uniqueId,1) !== null)
{
- this._actionManager = gam.getActionById(this.id);
+ gam = gam.getActionById(this.getInstanceManager().uniqueId,1);
+ }
+ if(gam.getActionById(this.id,1) != null)
+ {
+ this._actionManager = gam.getActionById(this.id,1);
}
else
{
diff --git a/etemplate/js/et2_widget_grid.js b/etemplate/js/et2_widget_grid.js
index cc008aed97..349d106b44 100644
--- a/etemplate/js/et2_widget_grid.js
+++ b/etemplate/js/et2_widget_grid.js
@@ -927,6 +927,7 @@ var et2_grid = et2_DOMWidget.extend([et2_IDetachedDOM, et2_IAligned, et2_IResize
{
// Get the top level element for the tree
var objectManager = egw_getAppObjectManager(true);
+ objectManager = objectManager.getObjectById(this.getInstanceManager().uniqueId,2) || objectManager;
var widget_object = objectManager.getObjectById(this.id);
if (widget_object == null) {
// Add a new container to the object manager which will hold the widget