Fix recurring event handling when first instance is modified and excluded (#1505)
This commit is contained in:
parent
cbb7db9361
commit
5f06d62ceb
2 changed files with 40 additions and 9 deletions
|
@ -248,7 +248,21 @@ class kolab_calendar
|
|||
// list events in requested time window
|
||||
if ($event['start'] <= $end && $event['end'] >= $start) {
|
||||
unset($event['_attendees']);
|
||||
$events[] = $event;
|
||||
$add = true;
|
||||
|
||||
// skip the first instance of a recurring event if listed in exdate
|
||||
if ($virtual && !empty($event['recurrence']['EXDATE'])) {
|
||||
$event_date = $event['start']->format('Ymd');
|
||||
foreach ($event['recurrence']['EXDATE'] as $exdate) {
|
||||
if ($exdate->format('Ymd') == $event_date) {
|
||||
$add = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($add)
|
||||
$events[] = $event;
|
||||
}
|
||||
|
||||
// resolve recurring events
|
||||
|
@ -409,9 +423,9 @@ class kolab_calendar
|
|||
else if ($next_event['start'] > $end) // stop loop if out of range
|
||||
break;
|
||||
|
||||
// avoid endless recursion loops
|
||||
if ($i > 1000)
|
||||
break;
|
||||
// avoid endless recursion loops
|
||||
if ($i > 1000)
|
||||
break;
|
||||
}
|
||||
|
||||
return $events;
|
||||
|
@ -458,6 +472,10 @@ class kolab_calendar
|
|||
if (is_array($record['categories']))
|
||||
$record['categories'] = $record['categories'][0];
|
||||
|
||||
// remove empty recurrence array
|
||||
if (empty($record['recurrence']))
|
||||
unset($record['recurrence']);
|
||||
|
||||
// remove internals
|
||||
unset($record['_mailbox'], $record['_msguid'], $record['_formatobj'], $record['_attachments']);
|
||||
|
||||
|
|
|
@ -406,10 +406,10 @@ class kolab_driver extends calendar_driver
|
|||
public function remove_event($event, $force = true)
|
||||
{
|
||||
$success = false;
|
||||
$_savemode = $event['_savemode'];
|
||||
$savemode = $event['_savemode'];
|
||||
|
||||
if (($storage = $this->calendars[$event['calendar']]) && ($event = $storage->get_event($event['id']))) {
|
||||
$event['_savemode'] = $_savemode;
|
||||
$event['_savemode'] = $savemode;
|
||||
$savemode = 'all';
|
||||
$master = $event;
|
||||
|
||||
|
@ -424,7 +424,7 @@ class kolab_driver extends calendar_driver
|
|||
switch ($savemode) {
|
||||
case 'current':
|
||||
$_SESSION['calendar_restore_event_data'] = $master;
|
||||
|
||||
|
||||
// removing the first instance => just move to next occurence
|
||||
if ($master['id'] == $event['id']) {
|
||||
$limit = clone $event['end'];
|
||||
|
@ -584,13 +584,26 @@ class kolab_driver extends calendar_driver
|
|||
break;
|
||||
|
||||
case 'current':
|
||||
// add exception to master event
|
||||
$master['recurrence']['EXDATE'][] = $old['start'];
|
||||
// modifying the first instance => just move to next occurence
|
||||
if ($master['id'] == $event['id']) {
|
||||
$limit = clone $old['end'];
|
||||
$limit->add(new DateInterval('P370D'));
|
||||
$recurring = reset($storage->_get_recurring_events($event, $event['start'], $limit, $event['id'].'-1'));
|
||||
$master['start'] = $recurring['start'];
|
||||
$master['end'] = $recurring['end'];
|
||||
if ($master['recurrence']['COUNT'])
|
||||
$master['recurrence']['COUNT']--;
|
||||
}
|
||||
else { // add exception to master event
|
||||
$master['recurrence']['EXDATE'][] = $old['start'];
|
||||
}
|
||||
|
||||
$storage->update_event($master);
|
||||
|
||||
// insert new event for this occurence
|
||||
$event += $old;
|
||||
$event['recurrence'] = array();
|
||||
unset($event['recurrence_id']);
|
||||
$event['uid'] = $this->cal->generate_uid();
|
||||
$success = $storage->insert_event($event);
|
||||
break;
|
||||
|
|
Loading…
Add table
Reference in a new issue