From ab9f33fbc4b19aef611d35bde43c7d9169a61761 Mon Sep 17 00:00:00 2001 From: "Jeroen van Meeuwen (Kolab Systems)" Date: Tue, 28 Nov 2017 10:39:31 +0100 Subject: [PATCH 1/3] Avoid PHP 7 compatibility warnings --- plugins/libkolab/lib/kolab_storage_folder_user.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/libkolab/lib/kolab_storage_folder_user.php b/plugins/libkolab/lib/kolab_storage_folder_user.php index 7e435002..ec751fdb 100644 --- a/plugins/libkolab/lib/kolab_storage_folder_user.php +++ b/plugins/libkolab/lib/kolab_storage_folder_user.php @@ -80,7 +80,7 @@ class kolab_storage_folder_user extends kolab_storage_folder_virtual * * @return string The owner of this folder. */ - public function get_owner() + public function get_owner($fully_qualified = false) { return $this->ldaprec['mail']; } From 8673bfd15f9140b82aa3929ff1323e2358dc3e47 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 4 Dec 2017 11:52:54 +0100 Subject: [PATCH 2/3] Fix handling reminder trigger definition ... and ignore duplicate reminders --- plugins/libkolab/lib/kolab_format_xcal.php | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/plugins/libkolab/lib/kolab_format_xcal.php b/plugins/libkolab/lib/kolab_format_xcal.php index b4dd2f65..d6d34422 100644 --- a/plugins/libkolab/lib/kolab_format_xcal.php +++ b/plugins/libkolab/lib/kolab_format_xcal.php @@ -498,14 +498,22 @@ abstract class kolab_format_xcal extends kolab_format $this->obj->setRecurrenceDates($rdates); } - // save alarm + // save alarm(s) $valarms = new vectoralarm; + $valarm_hashes = array(); if ($object['valarms']) { foreach ($object['valarms'] as $valarm) { if (!array_key_exists($valarm['action'], $this->alarm_type_map)) { continue; // skip unknown alarm types } + // Get rid of duplicates, some CalDAV clients can set them + $hash = serialize($valarm); + if (in_array($hash, $valarm_hashes)) { + continue; + } + $valarm_hashes[] = $hash; + if ($valarm['action'] == 'EMAIL') { $recipients = new vectorcontactref; foreach (($valarm['attendees'] ?: array($object['_owner'])) as $email) { @@ -530,7 +538,15 @@ abstract class kolab_format_xcal extends kolab_format if (is_object($valarm['trigger']) && $valarm['trigger'] instanceof DateTime) { $alarm->setStart(self::get_datetime($valarm['trigger'], new DateTimeZone('UTC'))); } + else if (preg_match('/^@([0-9]+)$/', $valarm['trigger'], $m)) { + $alarm->setStart(self::get_datetime($m[1], new DateTimeZone('UTC'))); + } else { + // Support also interval in format without PT, e.g. -10M + if (preg_match('/^([-+]*)([0-9]+[DHMS])$/', strtoupper($valarm['trigger']), $m)) { + $valarm['trigger'] = $m[1] . ($m[2][strlen($m[2])-1] == 'D' ? 'P' : 'PT') . $m[2]; + } + try { $period = new DateInterval(preg_replace('/[^0-9PTWDHMS]/', '', $valarm['trigger'])); $duration = new Duration($period->d, $period->h, $period->i, $period->s, $valarm['trigger'][0] == '-'); From 1f0f28204900364d01ba2fd8b9b99e8d44a7b3cc Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 4 Dec 2017 13:36:26 +0100 Subject: [PATCH 3/3] Properly initialize time selection for all reminder time inputs --- plugins/calendar/calendar_ui.js | 2 +- plugins/libcalendaring/libcalendaring.js | 18 +++++++++--------- plugins/tasklist/tasklist.js | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 73bb81b7..8600a5da 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -3994,7 +3994,7 @@ function rcube_calendar_ui(settings) $('#edit-allday').click(function(){ $('#edit-starttime, #edit-endtime')[(this.checked?'hide':'show')](); event_times_changed(); }); // configure drop-down menu on time input fields based on jquery UI autocomplete - $('#edit-starttime, #edit-endtime, #eventedit input.edit-alarm-time').each(function() { + $('#edit-starttime, #edit-endtime').each(function() { me.init_time_autocomplete(this, { container: '#eventedit', change: event_times_changed diff --git a/plugins/libcalendaring/libcalendaring.js b/plugins/libcalendaring/libcalendaring.js index a5f3ef14..6684dde7 100644 --- a/plugins/libcalendaring/libcalendaring.js +++ b/plugins/libcalendaring/libcalendaring.js @@ -391,12 +391,13 @@ function rcube_libcalendaring(settings) }); $(prefix+' select.edit-alarm-offset').change(function(){ var val = $(this).val(), parent = $(this).parent(); - parent.find('.edit-alarm-date, .edit-alarm-time')[val == '@' ? 'show' : 'hide'](); + parent.find('.edit-alarm-date, .edit-alarm-time')[val === '@' ? 'show' : 'hide'](); parent.find('.edit-alarm-value').prop('disabled', val === '@' || val === '0'); - parent.find('.edit-alarm-related')[val == '@' ? 'hide' : 'show'](); + parent.find('.edit-alarm-related')[val === '@' ? 'hide' : 'show'](); }); $(prefix+' .edit-alarm-date').removeClass('hasDatepicker').removeAttr('id').datepicker(datepicker_settings); + this.init_time_autocomplete($(prefix+' .edit-alarm-time')[0], {}); $(prefix).on('click', 'a.delete-alarm', function(e){ if ($(this).closest('.edit-alarm-item').siblings().length > 0) { @@ -434,12 +435,11 @@ function rcube_libcalendaring(settings) if (!alarm.action) alarm.action = 'DISPLAY'; - if (i == 0) { - domnode = $(prefix + ' .edit-alarm-item').eq(0); - } - else { - domnode = $(prefix + ' .edit-alarm-item').eq(0).clone(false).removeClass('first').appendTo(prefix); - this.init_alarms_edit(prefix + ' .edit-alarm-item:eq(' + i + ')', i); + domnode = $(prefix + ' .edit-alarm-item').eq(0); + + if (i > 0) { + domnode = domnode.clone(false).removeClass('first').appendTo(prefix); + this.init_alarms_edit(prefix + ' .edit-alarm-item:eq(' + i + ')', i); } $('select.edit-alarm-type', domnode).val(alarm.action); @@ -588,7 +588,7 @@ function rcube_libcalendaring(settings) var default_props = { delay: 100, minLength: 1, - appendTo: props.container, + appendTo: props.container || $(elem).parents('form'), source: time_autocomplete_list, open: time_autocomplete_open, // change: time_autocomplete_change, diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js index 42f7da3f..67c958ba 100644 --- a/plugins/tasklist/tasklist.js +++ b/plugins/tasklist/tasklist.js @@ -733,7 +733,7 @@ function rcube_tasklist_ui(settings) }); // configure drop-down menu on time input fields based on jquery UI autocomplete - $('#taskedit-starttime, #taskedit-time, #taskedit input.edit-alarm-time').each(function() { + $('#taskedit-starttime, #taskedit-time').each(function() { me.init_time_autocomplete(this, {container: '#taskedit'}); }); }