From c0fc38ab9c4585e29abd44d7bdf21ea95fcbeb81 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Fri, 3 Aug 2012 21:29:10 +0200 Subject: [PATCH] Trigger plugin hooks to display and snooze/dismiss alarms --- plugins/calendar/calendar.php | 31 +++++++++++++++++++++++-------- plugins/calendar/calendar_base.js | 25 +++++++++++++++++-------- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index 5061f208..e0c71263 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -772,8 +772,13 @@ class calendar extends rcube_plugin break; case "dismiss": - foreach (explode(',', $event['id']) as $id) - $success |= $this->driver->dismiss_alarm($id, $event['snooze']); + $event['ids'] = explode(',', $event['id']); + $plugin = $this->rc->plugins->exec_hook('dismiss_alarms', $event); + $success = $plugin['success']; + foreach ($event['ids'] as $id) { + if (strpos($id, 'cal:') === 0) + $success |= $this->driver->dismiss_alarm(substr($id, 4), $event['snooze']); + } break; } @@ -833,15 +838,25 @@ class calendar extends rcube_plugin */ function keep_alive($attr) { + $timestamp = time(); $this->load_driver(); - $alarms = $this->driver->pending_alarms(time()); - if ($alarms) { + $alarms = $this->driver->pending_alarms($timestamp); + foreach ($alarms as $i => $alarm) { + $alarms[$i]['id'] = 'cal:' . $alarm['id']; // prefix ID with cal: + } + + $plugin = $this->rc->plugins->exec_hook('pending_alarms', array( + 'time' => $timestamp, + 'alarms' => $alarms, + )); + + if (!$plugin['abort'] && $plugin['alarms']) { // make sure texts and env vars are available on client if ($this->rc->task != 'calendar') { $this->add_texts('localization/', true); $this->rc->output->set_env('snooze_select', $this->ui->snooze_select()); } - $this->rc->output->command('plugin.display_alarms', $this->_alarms_output($alarms)); + $this->rc->output->command('plugin.display_alarms', $this->_alarms_output($plugin['alarms'])); } } @@ -1181,9 +1196,9 @@ class calendar extends rcube_plugin foreach ($alarms as $alarm) { $out[] = array( 'id' => $alarm['id'], - 'start' => $this->adjust_timezone($alarm['start'])->format('c'), - 'end' => $this->adjust_timezone($alarm['end'])->format('c'), - 'allDay' => ($event['allday'] == 1)?true:false, + 'start' => $alarm['start'] ? $this->adjust_timezone($alarm['start'])->format('c') : '', + 'end' => $alarm['end'] ? $this->adjust_timezone($alarm['end'])->format('c') : '', + 'allDay' => ($alarm['allday'] == 1)?true:false, 'title' => $alarm['title'], 'location' => $alarm['location'], 'calendar' => $alarm['calendar'], diff --git a/plugins/calendar/calendar_base.js b/plugins/calendar/calendar_base.js index a77af016..d0a4a58f 100644 --- a/plugins/calendar/calendar_base.js +++ b/plugins/calendar/calendar_base.js @@ -46,15 +46,24 @@ function rcube_calendar(settings) // create a nice human-readable string for the date/time range this.event_date_text = function(event) { + if (!event.start) + return ''; + if (!event.end) + event.end = event.start; + var fromto, duration = event.end.getTime() / 1000 - event.start.getTime() / 1000; - if (event.allDay) - fromto = $.fullCalendar.formatDate(event.start, settings['date_format']) + (duration > 86400 || event.start.getDay() != event.end.getDay() ? ' — ' + $.fullCalendar.formatDate(event.end, settings['date_format']) : ''); - else if (duration < 86400 && event.start.getDay() == event.end.getDay()) - fromto = $.fullCalendar.formatDate(event.start, settings['date_format']) + ' ' + $.fullCalendar.formatDate(event.start, settings['time_format']) + ' — ' - + $.fullCalendar.formatDate(event.end, settings['time_format']); - else - fromto = $.fullCalendar.formatDate(event.start, settings['date_format']) + ' ' + $.fullCalendar.formatDate(event.start, settings['time_format']) + ' — ' - + $.fullCalendar.formatDate(event.end, settings['date_format']) + ' ' + $.fullCalendar.formatDate(event.end, settings['time_format']); + if (event.allDay) { + fromto = $.fullCalendar.formatDate(event.start, settings['date_format']) + + (duration > 86400 || event.start.getDay() != event.end.getDay() ? ' — ' + $.fullCalendar.formatDate(event.end, settings['date_format']) : ''); + } + else if (duration < 86400 && event.start.getDay() == event.end.getDay()) { + fromto = $.fullCalendar.formatDate(event.start, settings['date_format']) + ' ' + $.fullCalendar.formatDate(event.start, settings['time_format']) + + (duration > 0 ? ' — ' + $.fullCalendar.formatDate(event.end, settings['time_format']) : ''); + } + else { + fromto = $.fullCalendar.formatDate(event.start, settings['date_format']) + ' ' + $.fullCalendar.formatDate(event.start, settings['time_format']) + + (duration > 0 ? ' — ' + $.fullCalendar.formatDate(event.end, settings['date_format']) + ' ' + $.fullCalendar.formatDate(event.end, settings['time_format']) : ''); + } return fromto; };