plugins/tasklist

Thomas Brüderli bruederli at kolabsys.com
Thu Apr 24 20:27:06 CEST 2014


 plugins/tasklist/drivers/database/tasklist_database_driver.php |   10 +++++
 plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php       |   18 ++++++++++
 plugins/tasklist/drivers/tasklist_driver.php                   |    7 +++
 plugins/tasklist/tasklist.php                                  |   10 +++--
 4 files changed, 41 insertions(+), 4 deletions(-)

New commits:
commit 8a613b5b11b1a5982d2fd2b24bd2cb035bcdd697
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date:   Thu Apr 24 20:26:56 2014 +0200

    Reset alarms when re-iterating recurring events; fix computing of weekly recurrence dates

diff --git a/plugins/tasklist/drivers/database/tasklist_database_driver.php b/plugins/tasklist/drivers/database/tasklist_database_driver.php
index cf1885b..dfb2c1b 100644
--- a/plugins/tasklist/drivers/database/tasklist_database_driver.php
+++ b/plugins/tasklist/drivers/database/tasklist_database_driver.php
@@ -471,6 +471,16 @@ class tasklist_database_driver extends tasklist_driver
     }
 
     /**
+     * Remove alarm dismissal or snooze state
+     *
+     * @param  string  Task identifier
+     */
+    public function clear_alarms($id)
+    {
+        // Nothing to do here. Alarms are reset in edit_task()
+    }
+
+    /**
      * Map some internal database values to match the generic "API"
      */
     private function _read_postprocess($rec)
diff --git a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
index 9497b39..ad36777 100644
--- a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
+++ b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php
@@ -573,6 +573,24 @@ class tasklist_kolab_driver extends tasklist_driver
     }
 
     /**
+     * Remove alarm dismissal or snooze state
+     *
+     * @param  string  Task identifier
+     */
+    public function clear_alarms($id)
+    {
+        // delete alarm entry
+        $this->rc->db->query(
+            "DELETE FROM kolab_alarms
+             WHERE alarm_id=? AND user_id=?",
+            $id,
+            $this->rc->user->ID
+        );
+
+        return true;
+    }
+
+    /**
      * Convert from Kolab_Format to internal representation
      */
     private function _to_rcube_task($record)
diff --git a/plugins/tasklist/drivers/tasklist_driver.php b/plugins/tasklist/drivers/tasklist_driver.php
index 382a910..c3b1423 100644
--- a/plugins/tasklist/drivers/tasklist_driver.php
+++ b/plugins/tasklist/drivers/tasklist_driver.php
@@ -153,6 +153,13 @@ abstract class tasklist_driver
     abstract function dismiss_alarm($id, $snooze = 0);
 
     /**
+     * Remove alarm dismissal or snooze state
+     *
+     * @param  string  Task identifier
+     */
+    abstract public function clear_alarms($id);
+
+    /**
      * Return data of a specific task
      *
      * @param mixed  Hash array with task properties or task UID
diff --git a/plugins/tasklist/tasklist.php b/plugins/tasklist/tasklist.php
index be82f82..65376d7 100644
--- a/plugins/tasklist/tasklist.php
+++ b/plugins/tasklist/tasklist.php
@@ -205,6 +205,7 @@ class tasklist extends rcube_plugin
                 // add clone from recurring task
                 if ($clone && $this->driver->create_task($clone)) {
                     $refresh[] = $this->driver->get_task($clone);
+                    $this->driver->clear_alarms($rec['id']);
                 }
 
                 // move all childs if list assignment was changed
@@ -526,13 +527,15 @@ class tasklist extends rcube_plugin
         if ($rec['complete'] == 1.0 && $old && $old['complete'] < 1.0 && is_array($rec['recurrence'])) {
             $engine = libcalendaring::get_recurrence();
             $rrule = $rec['recurrence'];
-            $engine->init($rrule);
             $updates = array();
 
             // compute the next occurrence of date attributes
             foreach (array('date'=>'time', 'startdate'=>'starttime') as $date_key => $time_key) {
+                if (empty($rec[$date_key]))
+                    continue;
+
                 $date = new DateTime($rec[$date_key] . ' ' . $rec[$time_key], $this->timezone);
-                $engine->set_start($date);
+                $engine->init($rrule, $date);
                 if ($next = $engine->next()) {
                     $updates[$date_key] = $next->format('Y-m-d');
                     if (!empty($rec[$time_key]))
@@ -544,11 +547,10 @@ class tasklist extends rcube_plugin
             if (!empty($updates) && is_array($rec['valarms'])) {
                 $updates['valarms'] = array();
                 unset($rrule['UNTIL'], $rrule['COUNT']);  // make recurrence rule unlimited
-                $engine->init($rrule);
 
                 foreach ($rec['valarms'] as $i => $alarm) {
                     if ($alarm['trigger'] instanceof DateTime) {
-                        $engine->set_start($alarm['trigger']);
+                        $engine->init($rrule, $alarm['trigger']);
                         if ($next = $engine->next()) {
                             $alarm['trigger'] = $next;
                         }




More information about the commits mailing list