From c077ed555f7326823580cf7955c3f557c37ecb7b Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 17 Apr 2013 09:15:34 +0200 Subject: [PATCH 1/4] Set savemode to 'current' for recurrence exceptions (#1725) --- plugins/calendar/calendar_ui.js | 2 +- plugins/calendar/drivers/kolab/kolab_calendar.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 40997764..10d65217 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -523,7 +523,7 @@ function rcube_calendar_ui(settings) // show warning if editing a recurring event if (event.id && event.recurrence) { - var sel = event.thisandfuture ? 'future' : 'all'; + var sel = event.thisandfuture ? 'future' : (event.isexception ? 'current' : 'all'); $('#edit-recurring-warning').show(); $('input.edit-recurring-savemode[value="'+sel+'"]').prop('checked', true); } diff --git a/plugins/calendar/drivers/kolab/kolab_calendar.php b/plugins/calendar/drivers/kolab/kolab_calendar.php index 764f619f..98041c8f 100644 --- a/plugins/calendar/drivers/kolab/kolab_calendar.php +++ b/plugins/calendar/drivers/kolab/kolab_calendar.php @@ -434,6 +434,7 @@ class kolab_calendar $rec_event['recurrence_id'] = $event['uid']; $rec_event['recurrence'] = $recurrence_rule; $rec_event['_instance'] = $i; + $rec_event['isexception'] = 1; $events[] = $rec_event; // found the specifically requested instance, exiting... From 5c84fd55aa11d10471fbfc293265af03d67bb051 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 17 Apr 2013 09:19:26 +0200 Subject: [PATCH 2/4] Little code cleanup --- plugins/calendar/drivers/kolab/kolab_calendar.php | 13 +++++++------ plugins/calendar/drivers/kolab/kolab_driver.php | 3 +++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/plugins/calendar/drivers/kolab/kolab_calendar.php b/plugins/calendar/drivers/kolab/kolab_calendar.php index 98041c8f..590bb559 100644 --- a/plugins/calendar/drivers/kolab/kolab_calendar.php +++ b/plugins/calendar/drivers/kolab/kolab_calendar.php @@ -580,10 +580,8 @@ class kolab_calendar */ private function _from_rcube_event($event, $old = array()) { - $object = &$event; - // in kolab_storage attachments are indexed by content-id - $object['_attachments'] = array(); + $event['_attachments'] = array(); if (is_array($event['attachments'])) { foreach ($event['attachments'] as $idx => $attachment) { $key = null; @@ -600,15 +598,15 @@ class kolab_calendar // flagged for deletion => set to false if ($attachment['_deleted']) { - $object['_attachments'][$key] = false; + $event['_attachments'][$key] = false; } // replace existing entry else if ($key) { - $object['_attachments'][$key] = $attachment; + $event['_attachments'][$key] = $attachment; } // append as new attachment else { - $object['_attachments'][] = $attachment; + $event['_attachments'][] = $attachment; } } @@ -625,6 +623,9 @@ class kolab_calendar $event['_owner'] = $identity['email']; + // remove some internal properties which should not be saved + unset($event['_savemode'], $event['_fromcalendar'], $event['_identity']); + // copy meta data (starting with _) from old object foreach ((array)$old as $key => $val) { if (!isset($event[$key]) && $key[0] == '_') diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php index 12d60c28..6b980cd8 100644 --- a/plugins/calendar/drivers/kolab/kolab_driver.php +++ b/plugins/calendar/drivers/kolab/kolab_driver.php @@ -610,6 +610,9 @@ class kolab_driver extends calendar_driver $event['recurrence'] = array(); $event['thisandfuture'] = $savemode == 'future'; + // remove some internal properties which should not be saved + unset($event['_savemode'], $event['_fromcalendar'], $event['_identity']); + // save properties to a recurrence exception instance if ($old['recurrence_id']) { $i = $old['_instance'] - 1; From 395d55a6807ad6613f4e095ce9c71d4d2c737b77 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 18 Apr 2013 15:13:00 +0200 Subject: [PATCH 3/4] Don't apply default alarm settings when editing an object that has no alarm set (#1764) --- plugins/calendar/calendar_ui.js | 4 ++-- plugins/tasklist/tasklist.js | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 10d65217..000cc3cd 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -44,7 +44,7 @@ function rcube_calendar_ui(settings) var client_timezone = new Date().getTimezoneOffset(); var day_clicked = day_clicked_ts = 0; var ignore_click = false; - var event_defaults = { free_busy:'busy' }; + var event_defaults = { free_busy:'busy', alarms:'' }; var event_attendees = []; var attendees_list; var freebusy_ui = { workinhoursonly:false, needsupdate:false }; @@ -446,7 +446,7 @@ function rcube_calendar_ui(settings) // set alarm(s) // TODO: support multiple alarm entries - if (event.alarms) { + if (event.alarms || action != 'new') { if (typeof event.alarms == 'string') event.alarms = event.alarms.split(';'); diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js index 7a104844..7fa17f67 100644 --- a/plugins/tasklist/tasklist.js +++ b/plugins/tasklist/tasklist.js @@ -966,7 +966,8 @@ function rcube_tasklist_ui(settings) if (rcmail.busy || !list.editable || (action == 'edit' && (!rec || rec.readonly))) return false; - me.selected_task = $.extend({}, rec); // clone task object + me.selected_task = $.extend({ alarms:'' }, rec); // clone task object + rec = me.selected_task; // assign temporary id if (!me.selected_task.id) @@ -1006,7 +1007,7 @@ function rcube_tasklist_ui(settings) }); // set alarm(s) - if (rec.alarms) { + if (rec.alarms || action != 'new') { if (typeof rec.alarms == 'string') rec.alarms = rec.alarms.split(';'); From 82907b0a0921f6b7657f70f142c5f30032ec7131 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 18 Apr 2013 15:28:03 +0200 Subject: [PATCH 4/4] Improve fix for wrong alarm settings (#1764) --- plugins/calendar/calendar_ui.js | 5 +++-- plugins/tasklist/tasklist.js | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 000cc3cd..64210f89 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -450,8 +450,9 @@ function rcube_calendar_ui(settings) if (typeof event.alarms == 'string') event.alarms = event.alarms.split(';'); - for (var alarm, i=0; i < event.alarms.length; i++) { - alarm = String(event.alarms[i]).split(':'); + var valarms = event.alarms || ['']; + for (var alarm, i=0; i < valarms.length; i++) { + alarm = String(valarms[i]).split(':'); if (!alarm[1] && alarm[0]) alarm[1] = 'DISPLAY'; $('#eventedit select.edit-alarm-type').val(alarm[1]); diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js index 7fa17f67..530bb25d 100644 --- a/plugins/tasklist/tasklist.js +++ b/plugins/tasklist/tasklist.js @@ -1011,8 +1011,9 @@ function rcube_tasklist_ui(settings) if (typeof rec.alarms == 'string') rec.alarms = rec.alarms.split(';'); - for (var alarm, i=0; i < rec.alarms.length; i++) { - alarm = String(rec.alarms[i]).split(':'); + var valarms = rec.alarms || ['']; + for (var alarm, i=0; i < valarms.length; i++) { + alarm = String(valarms[i]).split(':'); if (!alarm[1] && alarm[0]) alarm[1] = 'DISPLAY'; $('#taskedit select.edit-alarm-type').val(alarm[1]);