diff --git a/apps/calendar/ajax/events.php b/apps/calendar/ajax/events.php index 2499c5163a..b84f5b4c60 100755 --- a/apps/calendar/ajax/events.php +++ b/apps/calendar/ajax/events.php @@ -22,4 +22,3 @@ foreach($events as $event){ $output[] = OC_Calendar_App::generateEventOutput($event, $start, $end); } OCP\JSON::encodedPrint($output); -?> diff --git a/apps/calendar/lib/app.php b/apps/calendar/lib/app.php index e8fdbe8c78..e457aac2c7 100755 --- a/apps/calendar/lib/app.php +++ b/apps/calendar/lib/app.php @@ -381,7 +381,17 @@ class OC_Calendar_App{ $start_dt->setTimezone(new DateTimeZone(self::$tz)); $end_dt->setTimezone(new DateTimeZone(self::$tz)); } - + + // Handle exceptions to recurring events + $exceptionDateObjects = $vevent->select('EXDATE'); + $exceptionDateMap = Array(); + foreach ($exceptionDateObjects as $exceptionObject) { + foreach($exceptionObject->getDateTimes() as $datetime) { + $ts = $datetime->getTimestamp(); + $exceptionDateMap[idate('Y',$ts)][idate('m', $ts)][idate('d', $ts)] = true; + } + } + if($event['repeating'] == 1){ $duration = (double) $end_dt->format('U') - (double) $start_dt->format('U'); $r = new When(); @@ -398,6 +408,13 @@ class OC_Calendar_App{ if($result > $end){ break; } + // Check for exceptions to recurring events + $ts = $result->getTimestamp(); + if (isset($exceptionDateMap[idate('Y',$ts)][idate('m', $ts)][idate('d', $ts)])) { + continue; + } + unset($ts); + if($output['allDay'] == true){ $output['start'] = $result->format('Y-m-d'); $output['end'] = date('Y-m-d', $result->format('U') + --$duration);