Branch 'dev/recurring-invitations' - 2 commits - plugins/calendar

Thomas Brüderli bruederli at kolabsys.com
Fri Feb 20 10:18:27 CET 2015


 plugins/calendar/calendar.php                   |    3 +-
 plugins/calendar/calendar_ui.js                 |   24 ++++++++--------------
 plugins/calendar/drivers/kolab/kolab_driver.php |   26 ++++++++++++++++++++----
 3 files changed, 33 insertions(+), 20 deletions(-)

New commits:
commit f972f4a511a7c3710ec5f5cee001133837797923
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Fri Feb 20 10:18:21 2015 +0100

    Disable the 'future' savemode for event deletion if attendees are involved

diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js
index 5a26c18..eb57fa7 100644
--- a/plugins/calendar/calendar_ui.js
+++ b/plugins/calendar/calendar_ui.js
@@ -2603,25 +2603,19 @@ function rcube_calendar_ui(settings)
       
       // recurring event: user needs to select the savemode
       if (event.recurrence) {
-        var disabled_state = '', message_label = (action == 'remove' ? 'removerecurringeventwarning' : 'changerecurringeventwarning');
-/*
-        if (_has_attendees) {
-          if (action == 'remove') {
-            if (!_is_organizer) {
-              message_label = 'removerecurringallonly';
-              disabled_state = ' disabled';
-            }
-          }
-          else if (is_organizer(event)) {
-            disabled_state = ' disabled';
-          }
+        var future_disabled = '', message_label = (action == 'remove' ? 'removerecurringeventwarning' : 'changerecurringeventwarning');
+
+        // disable the 'future' savemode if attendees are involved
+        // reason: no calendaring system supports the thisandfuture range parameter
+        if (action == 'remove' && _has_attendees && is_organizer(event)) {
+          future_disabled = ' disabled';
         }
-*/
+
         html += '<div class="message"><span class="ui-icon ui-icon-alert"></span>' +
           rcmail.gettext(message_label, 'calendar') + '</div>' +
           '<div class="savemode">' +
-            '<a href="#current" class="button' + disabled_state + '">' + rcmail.gettext('currentevent', 'calendar') + '</a>' +
-            '<a href="#future" class="button' + disabled_state + '">' + rcmail.gettext('futurevents', 'calendar') + '</a>' +
+            '<a href="#current" class="button">' + rcmail.gettext('currentevent', 'calendar') + '</a>' +
+            '<a href="#future" class="button' + future_disabled + '">' + rcmail.gettext('futurevents', 'calendar') + '</a>' +
             '<a href="#all" class="button">' + rcmail.gettext('allevents', 'calendar') + '</a>' +
             (action != 'remove' ? '<a href="#new" class="button">' + rcmail.gettext('saveasnew', 'calendar') + '</a>' : '') +
           '</div>';


commit 515a7d9ef6dcdc1c1de2488745a511bdac256896
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Fri Feb 20 09:25:24 2015 +0100

    Small fixes to recurring event invitations (#4387)

diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php
index 8be5956..f6079db 100644
--- a/plugins/calendar/calendar.php
+++ b/plugins/calendar/calendar.php
@@ -1171,11 +1171,12 @@ class calendar extends rcube_plugin
         $sent = $this->notify_attendees($master, null, $action, $event['_comment']);
         if ($sent < 0)
           $this->rc->output->show_message('calendar.errornotifying', 'error');
+
+        $event['attendees'] = $master['attendees'];  // this tricks us into the next if clause
       }
 
       $event['id'] = $success;
       $event['_savemode'] = 'all';
-      $event['attendees'] = $master['attendees'];  // this tricks us into the next if clause
       $old = null;
     }
 
diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php
index d6fb55a..88c2a38 100644
--- a/plugins/calendar/drivers/kolab/kolab_driver.php
+++ b/plugins/calendar/drivers/kolab/kolab_driver.php
@@ -993,24 +993,37 @@ class kolab_driver extends calendar_driver
   
         // remove recurrence exceptions on re-scheduling
         if ($reschedule) {
-          unset($event['recurrence']['EXCEPTIONS']);
+          unset($event['recurrence']['EXCEPTIONS'], $master['recurrence']['EXDATE']);
         }
         else if (is_array($event['recurrence']['EXCEPTIONS'])) {
           // only keep relevant exceptions
           $event['recurrence']['EXCEPTIONS'] = array_filter($event['recurrence']['EXCEPTIONS'], function($exception) use ($event) {
             return $exception['start'] > $event['start'];
           });
+          if (is_array($event['recurrence']['EXDATE'])) {
+            $event['recurrence']['EXDATE'] = array_filter($event['recurrence']['EXDATE'], function($exdate) use ($event) {
+              return $exdate > $event['start'];
+            });
+          }
         }
 
         // compute remaining occurrences
         if ($event['recurrence']['COUNT']) {
           if (!$old['_count'])
-            $old['_count'] = $this->get_recurrence_count($object, $event['start']);
+            $old['_count'] = $this->get_recurrence_count($object, $old['start']);
           $event['recurrence']['COUNT'] -= intval($old['_count']);
         }
 
+        // remove fixed weekday when date changed
+        if ($old['start']->format('Y-m-d') != $event['start']->format('Y-m-d')) {
+          if (strlen($event['recurrence']['BYDAY']) == 2)
+            unset($event['recurrence']['BYDAY']);
+          if ($old['recurrence']['BYMONTH'] == $old['start']->format('n'))
+            unset($event['recurrence']['BYMONTH']);
+        }
+
         // set until-date on master event
-        $master['recurrence']['UNTIL'] = clone $event['start'];
+        $master['recurrence']['UNTIL'] = clone $old['start'];
         $master['recurrence']['UNTIL']->sub(new DateInterval('P1D'));
         unset($master['recurrence']['COUNT']);
 
@@ -1020,6 +1033,11 @@ class kolab_driver extends calendar_driver
             return $exception['start'] < $event['start'];
           });
         }
+        if (is_array($master['recurrence']['EXDATE'])) {
+          $master['recurrence']['EXDATE'] = array_filter($master['recurrence']['EXDATE'], function($exdate) use ($event) {
+            return $exdate < $event['start'];
+          });
+        }
 
         // save new event
         if ($success = $storage->insert_event($event)) {
@@ -1115,7 +1133,7 @@ class kolab_driver extends calendar_driver
 
         // when saving an instance in 'all' mode, copy recurrence exceptions over
         if ($old['recurrence_id']) {
-          $event['recurrence'] = $master['recurrence'];
+          $event['recurrence']['EXCEPTIONS'] = $master['recurrence']['EXCEPTIONS'];
         }
 
         // TODO: forward changes to exceptions (which do not yet have differing values stored)




More information about the commits mailing list