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