From 17354a88e33696e8a54438dba48c45cde8a86d33 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 18 Jul 2013 16:37:00 +0200 Subject: [PATCH] Improve iTip handling when decline events (#1670) - Remove events from calendar when declined (user's choice) - Set busy status to free when decling but keep the event in calendar - Update RSVP status display in email view after change --- plugins/calendar/calendar.php | 18 +++++++++++--- plugins/calendar/calendar_base.js | 31 +++++++++++++++++++++---- plugins/calendar/localization/de_CH.inc | 1 + plugins/calendar/localization/de_DE.inc | 1 + plugins/calendar/localization/en_US.inc | 1 + 5 files changed, 45 insertions(+), 7 deletions(-) diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index f3316dc6..67614323 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -821,6 +821,7 @@ class calendar extends rcube_plugin $this->rc->output->command('plugin.update_event_rsvp_status', array( 'uid' => $event['uid'], 'id' => asciiwords($event['uid'], true), + 'saved' => $existing ? true : false, 'status' => $status, 'action' => $action, 'html' => $html, @@ -1831,7 +1832,7 @@ class calendar extends rcube_plugin foreach (array('accepted','tentative','declined') as $method) { $rsvp_buttons .= html::tag('input', array( 'type' => 'button', - 'class' => 'button', + 'class' => "button $method", 'onclick' => "rcube_calendar.add_event_from_mail('" . JQ($mime_id.':'.$idx) . "', '$method')", 'value' => $this->gettext('itip' . $method), )); @@ -1905,7 +1906,7 @@ class calendar extends rcube_plugin if ($html) { $this->ui->init(); $p['content'] = $html . $p['content']; - $this->rc->output->add_label('calendar.savingdata','calendar.deleteventconfirm'); + $this->rc->output->add_label('calendar.savingdata','calendar.deleteventconfirm','calendar.declinedeleteconfirm'); } return $p; @@ -1921,6 +1922,7 @@ class calendar extends rcube_plugin $mbox = get_input_value('_mbox', RCUBE_INPUT_POST); $mime_id = get_input_value('_part', RCUBE_INPUT_POST); $status = get_input_value('_status', RCUBE_INPUT_POST); + $delete = intval(get_input_value('_del', RCUBE_INPUT_POST)); $charset = RCMAIL_CHARSET; // establish imap connection @@ -2005,14 +2007,23 @@ class calendar extends rcube_plugin $error_msg = $this->gettext('newerversionexists'); } } + // delete the event when declined (#1670) + else if ($status == 'declined' && $delete) { + $deleted = $this->driver->remove_event($existing, true); + $success = true; + } // import the (newer) event else if ($event['sequence'] >= $existing['sequence'] || $event['changed'] >= $existing['changed']) { $event['id'] = $existing['id']; $event['calendar'] = $existing['calendar']; + if ($status == 'declined') // show me as free when declined (#1670) + $event['free_busy'] = 'free'; $success = $this->driver->edit_event($event); } else if (!empty($status)) { $existing['attendees'] = $event['attendees']; + if ($status == 'declined') // show me as free when declined (#1670) + $existing['free_busy'] = 'free'; $success = $this->driver->edit_event($existing); } else @@ -2031,8 +2042,9 @@ class calendar extends rcube_plugin } if ($success) { - $message = $this->ical->method == 'REPLY' ? 'attendeupdateesuccess' : 'importedsuccessfully'; + $message = $this->ical->method == 'REPLY' ? 'attendeupdateesuccess' : ($deleted ? 'successremoval' : 'importedsuccessfully'); $this->rc->output->command('display_message', $this->gettext(array('name' => $message, 'vars' => array('calendar' => $calendar['name']))), 'confirmation'); + $this->rc->output->command('plugin.fetch_event_rsvp_status', array('uid' => $event['uid'], 'changed' => $event['changed']->format('U'), 'sequence' => intval($event['sequence']), 'fallback' => strtoupper($status))); $error_msg = null; } else if ($error_msg) diff --git a/plugins/calendar/calendar_base.js b/plugins/calendar/calendar_base.js index 234bad4d..fb776c8b 100644 --- a/plugins/calendar/calendar_base.js +++ b/plugins/calendar/calendar_base.js @@ -81,14 +81,22 @@ function rcube_calendar(settings) // static methods rcube_calendar.add_event_from_mail = function(mime_id, status) { + // ask user to delete the declined event from the local calendar (#1670) + var del = false; + if (rcmail.env.rsvp_saved && status == 'declined') { + del = confirm(rcmail.gettext('calendar.declinedeleteconfirm')); + } + var lock = rcmail.set_busy(true, 'calendar.savingdata'); rcmail.http_post('calendar/mailimportevent', { '_uid': rcmail.env.uid, '_mbox': rcmail.env.mailbox, '_part': mime_id, '_calendar': $('#calendar-saveto').val(), - '_status': status + '_status': status, + '_del': del?1:0 }, lock); + return false; }; @@ -123,13 +131,28 @@ window.rcmail && rcmail.addEventListener('init', function(evt) { var cal = new rcube_calendar($.extend(rcmail.env.calendar_settings, rcmail.env.libcal_settings)); rcmail.addEventListener('plugin.update_event_rsvp_status', function(p){ - if (p.html) + rcmail.env.rsvp_saved = p.saved; + + if (p.html) { + // append/replace rsvp status display + $('#loading-'+p.id).next('.rsvp-status').remove(); $('#loading-'+p.id).hide().after(p.html); - else + } + else { $('#loading-'+p.id).hide(); - + } + + // enable/disable rsvp buttons + $('.rsvp-buttons input.button').prop('disabled', false) + .filter('.'+String(p.status).toLowerCase()).prop('disabled', true); + + // show rsvp/import buttons with or without calendar selector + if (!p.select) + $('#rsvp-'+p.id+' .calendar-select').remove(); $('#'+p.action+'-'+p.id).show().append(p.select); }); + + rcmail.addEventListener('plugin.fetch_event_rsvp_status', rcube_calendar.fetch_event_rsvp_status); // register create-from-mail command to message_commands array if (rcmail.env.task == 'mail') { diff --git a/plugins/calendar/localization/de_CH.inc b/plugins/calendar/localization/de_CH.inc index fb87f9ae..a418cb8e 100644 --- a/plugins/calendar/localization/de_CH.inc +++ b/plugins/calendar/localization/de_CH.inc @@ -145,6 +145,7 @@ $labels['itipmailbodyaccepted'] = "\$sender hat die Einladung zum folgenden Term $labels['itipmailbodytentative'] = "\$sender hat die Einladung mit Vorbehalt zum folgenden Termin angenommen:\n\n*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees"; $labels['itipmailbodydeclined'] = "\$sender hat die Einladung zum folgenden Termin abgelehnt:\n\n*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees"; $labels['itipdeclineevent'] = 'Möchten Sie die Einladung zu diesem Termin ablehnen?'; +$labels['declinedeleteconfirm'] = 'Möchten Sie den abgelehnten Termin ebenfalls aus Ihrem Kalender löschen?'; $labels['importtocalendar'] = 'In Kalender übernehmen'; $labels['removefromcalendar'] = 'Aus meinem Kalender löschen'; $labels['updateattendeestatus'] = 'Teilnehmerstatus aktualisieren'; diff --git a/plugins/calendar/localization/de_DE.inc b/plugins/calendar/localization/de_DE.inc index edf93557..f5faa6fe 100644 --- a/plugins/calendar/localization/de_DE.inc +++ b/plugins/calendar/localization/de_DE.inc @@ -145,6 +145,7 @@ $labels['itipmailbodyaccepted'] = "\$sender hat die Einladung zum folgenden Term $labels['itipmailbodytentative'] = "\$sender hat die Einladung mit Vorbehalt zum folgenden Termin angenommen:\n\n*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees"; $labels['itipmailbodydeclined'] = "\$sender hat die Einladung zum folgenden Termin abgelehnt:\n\n*\$title*\n\nWann: \$date\n\nTeilnehmer: \$attendees"; $labels['itipdeclineevent'] = 'Möchten Sie die Einladung zu diesem Termin ablehnen?'; +$labels['declinedeleteconfirm'] = 'Möchten Sie den abgelehnten Termin ebenfalls aus Ihrem Kalender löschen?'; $labels['importtocalendar'] = 'In Kalender übernehmen'; $labels['removefromcalendar'] = 'Aus meinem Kalender löschen'; $labels['updateattendeestatus'] = 'Teilnehmerstatus aktualisieren'; diff --git a/plugins/calendar/localization/en_US.inc b/plugins/calendar/localization/en_US.inc index fd3352f8..7eb7063d 100644 --- a/plugins/calendar/localization/en_US.inc +++ b/plugins/calendar/localization/en_US.inc @@ -150,6 +150,7 @@ $labels['itipmailbodyaccepted'] = "\$sender has accepted the invitation to the f $labels['itipmailbodytentative'] = "\$sender has tentatively accepted the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; $labels['itipmailbodydeclined'] = "\$sender has declined the invitation to the following event:\n\n*\$title*\n\nWhen: \$date\n\nInvitees: \$attendees"; $labels['itipdeclineevent'] = 'Do you want to decline your invitation to this event?'; +$labels['declinedeleteconfirm'] = 'Do you also want to delete this declined event from your calendar?'; $labels['importtocalendar'] = 'Save to my calendar'; $labels['removefromcalendar'] = 'Remove from my calendar'; $labels['updateattendeestatus'] = 'Update the participant\'s status';