T1760: Recurrence exception not displayed when its date was changed
This commit is contained in:
parent
b8b749aa6a
commit
4022e76ede
2 changed files with 50 additions and 23 deletions
|
@ -670,22 +670,34 @@ class kolab_calendar extends kolab_storage_folder_api
|
|||
|
||||
$i = 0;
|
||||
while ($next_event = $recurrence->next_instance()) {
|
||||
$datestr = $next_event['start']->format('Ymd');
|
||||
$datestr = $next_event['start']->format('Ymd');
|
||||
$instance_id = $next_event['start']->format($recurrence_id_format);
|
||||
|
||||
// use this event data for future recurring instances
|
||||
if ($futuredata[$datestr])
|
||||
$overlay_data = $futuredata[$datestr];
|
||||
|
||||
$rec_id = $event['uid'] . '-' . $instance_id;
|
||||
$exception = $exdata[$datestr] ?: $overlay_data;
|
||||
$event_start = $next_event['start'];
|
||||
$event_end = $next_event['end'];
|
||||
|
||||
// copy some event from exception to get proper start/end dates
|
||||
if ($exception) {
|
||||
$event_copy = $next_event;
|
||||
kolab_driver::merge_exception_dates($event_copy, $exception);
|
||||
$event_start = $event_copy['start'];
|
||||
$event_end = $event_copy['end'];
|
||||
}
|
||||
|
||||
// add to output if in range
|
||||
$rec_id = $event['uid'] . '-' . $instance_id;
|
||||
if (($next_event['start'] <= $end && $next_event['end'] >= $start) || ($event_id && $rec_id == $event_id)) {
|
||||
if (($event_start <= $end && $event_end >= $start) || ($event_id && $rec_id == $event_id)) {
|
||||
$rec_event = $this->_to_driver_event($next_event, false, false);
|
||||
$rec_event['_instance'] = $instance_id;
|
||||
$rec_event['_count'] = $i + 1;
|
||||
|
||||
if ($overlay_data || $exdata[$datestr]) // copy data from exception
|
||||
kolab_driver::merge_exception_data($rec_event, $exdata[$datestr] ?: $overlay_data);
|
||||
if ($exception) // copy data from exception
|
||||
kolab_driver::merge_exception_data($rec_event, $exception);
|
||||
|
||||
$rec_event['id'] = $rec_id;
|
||||
$rec_event['recurrence_id'] = $event['uid'];
|
||||
|
|
|
@ -1393,7 +1393,6 @@ class kolab_driver extends calendar_driver
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Merge certain properties from the overlay event to the base event object
|
||||
*
|
||||
|
@ -1408,25 +1407,9 @@ class kolab_driver extends calendar_driver
|
|||
if (is_array($blacklist))
|
||||
$forbidden = array_merge($forbidden, $blacklist);
|
||||
|
||||
// compute date offset from the exception
|
||||
if ($overlay['start'] instanceof DateTime && $overlay['recurrence_date'] instanceof DateTime) {
|
||||
$date_offset = $overlay['recurrence_date']->diff($overlay['start']);
|
||||
}
|
||||
|
||||
foreach ($overlay as $prop => $value) {
|
||||
if ($prop == 'start' || $prop == 'end') {
|
||||
if (is_object($event[$prop]) && $event[$prop] instanceof DateTime) {
|
||||
// set date value if overlay is an exception of the current instance
|
||||
if (substr($overlay['_instance'], 0, 8) == substr($event['_instance'], 0, 8)) {
|
||||
$event[$prop]->setDate(intval($value->format('Y')), intval($value->format('n')), intval($value->format('j')));
|
||||
}
|
||||
// apply date offset
|
||||
else if ($date_offset) {
|
||||
$event[$prop]->add($date_offset);
|
||||
}
|
||||
// adjust time of the recurring event instance
|
||||
$event[$prop]->setTime($value->format('G'), intval($value->format('i')), intval($value->format('s')));
|
||||
}
|
||||
// handled by merge_exception_dates() below
|
||||
}
|
||||
else if ($prop == 'thisandfuture' && $overlay['_instance'] == $event['_instance']) {
|
||||
$event[$prop] = $value;
|
||||
|
@ -1434,6 +1417,38 @@ class kolab_driver extends calendar_driver
|
|||
else if ($prop[0] != '_' && !in_array($prop, $forbidden))
|
||||
$event[$prop] = $value;
|
||||
}
|
||||
|
||||
self::merge_exception_dates($event, $overlay);
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge start/end date from the overlay event to the base event object
|
||||
*
|
||||
* @param array The event object to be altered
|
||||
* @param array The overlay event object to be merged over $event
|
||||
*/
|
||||
public static function merge_exception_dates(&$event, $overlay)
|
||||
{
|
||||
// compute date offset from the exception
|
||||
if ($overlay['start'] instanceof DateTime && $overlay['recurrence_date'] instanceof DateTime) {
|
||||
$date_offset = $overlay['recurrence_date']->diff($overlay['start']);
|
||||
}
|
||||
|
||||
foreach (array('start', 'end') as $prop) {
|
||||
$value = $overlay[$prop];
|
||||
if (is_object($event[$prop]) && $event[$prop] instanceof DateTime) {
|
||||
// set date value if overlay is an exception of the current instance
|
||||
if (substr($overlay['_instance'], 0, 8) == substr($event['_instance'], 0, 8)) {
|
||||
$event[$prop]->setDate(intval($value->format('Y')), intval($value->format('n')), intval($value->format('j')));
|
||||
}
|
||||
// apply date offset
|
||||
else if ($date_offset) {
|
||||
$event[$prop]->add($date_offset);
|
||||
}
|
||||
// adjust time of the recurring event instance
|
||||
$event[$prop]->setTime($value->format('G'), intval($value->format('i')), intval($value->format('s')));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Reference in a new issue