2 commits - plugins/calendar plugins/libkolab

Thomas Brüderli bruederli at kolabsys.com
Thu Mar 19 14:38:11 CET 2015


 plugins/calendar/calendar_ui.js                 |   18 +++++++++++++++-
 plugins/calendar/drivers/kolab/kolab_driver.php |   27 ++++++++++++++++++++++--
 plugins/libkolab/lib/kolab_bonnie_api.php       |   11 ++++++++-
 3 files changed, 51 insertions(+), 5 deletions(-)

New commits:
commit d91e12fa22c1ddb6ec57606e40ba0cc04aa3dfb0
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Thu Mar 19 14:38:04 2015 +0100

    Disable revision selectors not valid for comparison (#4019)

diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js
index ba0760f..91ad382 100644
--- a/plugins/calendar/calendar_ui.js
+++ b/plugins/calendar/calendar_ui.js
@@ -1113,6 +1113,20 @@ function rcube_calendar_ui(settings)
             me.loading_lock = rcmail.set_busy(true, 'loading', me.loading_lock);
             rcmail.http_post('event', { action:action, e:{ id:event.id, calendar:event.calendar, rev: rev } }, me.loading_lock);
             return false;
+        })
+        .on('click', 'input.diff-rev1', function(e) {
+          if (!this.checked) return true;
+
+          var rev1 = this.value, selection_valid = false;
+          $('#event-changelog-table input.diff-rev2').each(function(i, elem) {
+            $(elem).prop('disabled', elem.value <= rev1);
+            if (elem.checked && elem.value > rev1) {
+              selection_valid = true;
+            }
+          });
+          if (!selection_valid) {
+            $('#event-changelog-table input.diff-rev2:not([disabled])').last().prop('checked', true);
+          }
         });
 
         $dialog.data('initialized', true);
@@ -1163,8 +1177,10 @@ function rcube_calendar_ui(settings)
           .appendTo(tbody);
       }
 
-      if (first > 0)
+      if (first > 0) {
         $('#eventhistory .compare-button').fadeIn(200);
+        $('#event-changelog-table tr.last input.diff-rev1').click();
+      }
 
       // set dialog size according to content
       me.dialog_resize($dialog.get(0), $dialog.height(), 600);


commit 7dbb0d1b2f600223d39c92de4a04a3f344628a6c
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Thu Mar 19 12:34:08 2015 +0100

    Handle old revisions and diffs for recurrence instances; forward instance identifier to API for diff requests

diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php
index c1cace9..2c0869e 100644
--- a/plugins/calendar/drivers/kolab/kolab_driver.php
+++ b/plugins/calendar/drivers/kolab/kolab_driver.php
@@ -2059,8 +2059,11 @@ class kolab_driver extends calendar_driver
 
     list($uid, $mailbox, $msguid) = $this->_resolve_event_identity($event);
 
+    // get diff for the requested recurrence instance
+    $instance_id = $event['id'] != $uid ? substr($event['id'], strlen($uid) + 1) : null;
+
     // call Bonnie API
-    $result = $this->bonnie_api->diff('event', $uid, $rev1, $rev2, $mailbox, $msguid);
+    $result = $this->bonnie_api->diff('event', $uid, $rev1, $rev2, $mailbox, $msguid, $instance_id);
     if (is_array($result) && $result['uid'] == $uid) {
       $result['rev1'] = $rev1;
       $result['rev2'] = $rev2;
@@ -2175,6 +2178,7 @@ class kolab_driver extends calendar_driver
       return false;
     }
 
+    $eventid = $event['id'];
     $calid = $event['calendar'];
     list($uid, $mailbox, $msguid) = $this->_resolve_event_identity($event);
 
@@ -2186,7 +2190,26 @@ class kolab_driver extends calendar_driver
       $event = $format->to_array();
       $format->get_attachments($event, true);
 
-      // TODO: get the right instance from a recurring event
+      // get the right instance from a recurring event
+      if ($eventid != $event['uid']) {
+        $instance_id = substr($eventid, strlen($event['uid']) + 1);
+
+        // check for recurrence exception first
+        if ($instance = $format->get_instance($instance_id)) {
+          $event = $instance;
+        }
+        else {
+          // not a exception, compute recurrence...
+          $event['_formatobj'] = $format;
+          $recurrence_date = rcube_utils::anytodatetime($instance_id, $event['start']->getTimezone());
+          foreach ($this->get_recurring_events($event, $event['start'], $recurrence_date) as $instance) {
+            if ($instance['id'] == $eventid) {
+              $event = $instance;
+              break;
+            }
+          }
+        }
+      }
 
       if ($format->is_valid()) {
         $event['calendar'] = $calid;
diff --git a/plugins/libkolab/lib/kolab_bonnie_api.php b/plugins/libkolab/lib/kolab_bonnie_api.php
index 11d4845..a243cce 100644
--- a/plugins/libkolab/lib/kolab_bonnie_api.php
+++ b/plugins/libkolab/lib/kolab_bonnie_api.php
@@ -58,9 +58,16 @@ class kolab_bonnie_api
     /**
      * Wrapper function for <object>.diff() API call
      */
-    public function diff($type, $uid, $rev1, $rev2, $mailbox, $msguid=null)
+    public function diff($type, $uid, $rev1, $rev2, $mailbox, $msguid=null, $instance=null)
     {
-        return $this->client->execute($type.'.diff', array('uid' => $uid, 'rev1' => $rev1, 'rev2' => $rev2, 'mailbox' => $mailbox, 'msguid' => $msguid));
+        return $this->client->execute($type.'.diff', array(
+          'uid' => $uid,
+          'rev1' => $rev1,
+          'rev2' => $rev2,
+          'mailbox' => $mailbox,
+          'msguid' => $msguid,
+          'instance' => $instance,
+        ));
     }
 
     /**




More information about the commits mailing list