From a8edda1b72cd1990a4235eeab6fbda06bd99c85a Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Sun, 22 May 2011 18:45:04 +0200 Subject: [PATCH] Approximate alarms data format to vcalendar sepc; render localized text for alarm settings; priorize TODOs --- plugins/calendar/TODO | 16 ++++--- plugins/calendar/calendar.js | 6 +-- plugins/calendar/calendar.php | 43 ++++++++++++++++++- plugins/calendar/drivers/calendar_driver.php | 10 +++++ .../drivers/database/database_driver.php | 11 +++++ .../calendar/drivers/kolab/kolab_driver.php | 11 +++++ plugins/calendar/lib/calendar_ui.php | 13 ++---- plugins/calendar/localization/en_US.inc | 18 +++++--- .../skins/default/templates/calendar.html | 2 +- 9 files changed, 103 insertions(+), 27 deletions(-) diff --git a/plugins/calendar/TODO b/plugins/calendar/TODO index d01a8fdf..4751843f 100644 --- a/plugins/calendar/TODO +++ b/plugins/calendar/TODO @@ -4,26 +4,30 @@ + Edit: 3.15: Show time as: Busy, Free, Out of office - Edit: 3.16: Reminder set + Edit: 3.17: Priority: High/Low +- Edit: 3.18: Recurrence (in line with Kontact) - Edit: 3.19: Attachment Upload - Edit: 3.20: Print -- Recurring events - Add/Manage Attendees - Edit: 3.21: Required / Optional / Resource specification - Edit: 3.22: Conflict Handling (Free/Busy Check for attendees) -- Edit: 3.23: Specify folder for new event (prefs) -- View: 3.1: Folder list - View: 3.3: Display modes (agenda / day / week / month) + Day / Week / Month - List (Agenda) view - Individual days selection -- View: 3.4: Fish-Eye View For Busy Days -- View: 3.5: Search + Show list of calendars in a (hideable) drawer + - View: 3.1: Folder list + - View: 3.2: Add / Remove / Rename / Share Folders + View: 3.6: Combined calendar view (Turn calendars on/off) + View: 3.7: Small month overview calendar -- View: 3.8: Color according to calendar and category (similar to Kontact) +- View: 3.5: Search + View: 3.9: Alter event with drag/drop - Option: 4.12: Set default reminder time +- Edit: 3.23: Specify folder for new event (prefs) +- Receive: 1.20: Invitation handling + +- View: 3.4: Fish-Eye View For Busy Days +- View: 3.8: Color according to calendar and category (similar to Kontact) + + Support for multiple calendars (replace categories) - Remember last visited view - Allow user to create/edit/delete calendars diff --git a/plugins/calendar/calendar.js b/plugins/calendar/calendar.js index 27ed452e..6630dfa2 100644 --- a/plugins/calendar/calendar.js +++ b/plugins/calendar/calendar.js @@ -88,8 +88,8 @@ window.rcmail && rcmail.addEventListener('init', function(evt) { if (event.recurrence && event.recurrence_text) $('#event-repeat').show().children('.event-text').html(Q(event.recurrence_text)); - if (event.reminders && event.reminders_text) - $('#event-alarm').show().children('.event-text').html(Q(event.reminders_text)); + if (event.alarms && event.alarms_text) + $('#event-alarm').show().children('.event-text').html(Q(event.alarms_text)); if (calendar.name) $('#event-calendar').show().children('.event-text').html(Q(calendar.name)).removeClass().addClass('event-text').addClass('cal-'+calendar.id); @@ -194,7 +194,7 @@ window.rcmail && rcmail.addEventListener('init', function(evt) { $('input.edit-alarm-date').val($.fullCalendar.formatDate(ondate, settings['date_format'])); $('input.edit-alarm-time').val($.fullCalendar.formatDate(ondate, settings['time_format'])); } - else if (alarm[1].match(/([-+])(\d+)([mhd])/)) { + else if (alarm[1].match(/([-+])(\d+)([MHD])/)) { $('input.edit-alarm-value').val(RegExp.$2); $('select.edit-alarm-offset').val(''+RegExp.$1+RegExp.$3); } diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index f963dbc3..eaf4cef5 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -433,7 +433,12 @@ class calendar extends rcube_plugin { $json = array(); foreach ($events as $event) { - // TODO: compose a human readable string for recurrence_text + // TODO: compose a human readable string for alarms_text and recurrence_text + if ($event['alarms']) + $event['alarms_text'] = $this->_alarms_text($event['alarms']); + if ($event['recurrence']) + $event['recurrence_text'] = $this->_recurrence_text($event['recurrence']); + $json[] = array( 'start' => date('c', $event['start']), // ISO 8601 date (added in PHP 5) 'end' => date('c', $event['end']), // ISO 8601 date (added in PHP 5) @@ -446,5 +451,41 @@ class calendar extends rcube_plugin return json_encode($json); } + /** + * Render localized text for alarm settings + */ + private function _alarms_text($alarm) + { + list($action, $trigger) = explode(':', $alarm); + + $text = ''; + switch ($action) { + case 'EMAIL': + $text = $this->gettext('alarmemail'); + break; + case 'DISPLAY': + $text = $this->gettext('alarmdisplay'); + break; + } + + if (preg_match('/@(\d+)/', $trigger, $m)) { + $text .= ' ' . $this->gettext(array('name' => 'alarmat', 'vars' => array('datetime' => format_date($m[1])))); + } + else if (preg_match('/([+-])(\d+)([HMD])/', $trigger, $m)) { + $text .= ' ' . intval($m[2]) . ' ' . $this->gettext('trigger' . $m[1] . $m[3]); + } + else + return false; + + return $text; + } + + /** + * Render localized text for recurrence settings + */ + private function _recurrence_text($rrule) + { + + } } diff --git a/plugins/calendar/drivers/calendar_driver.php b/plugins/calendar/drivers/calendar_driver.php index e386d75b..c479adfb 100644 --- a/plugins/calendar/drivers/calendar_driver.php +++ b/plugins/calendar/drivers/calendar_driver.php @@ -126,6 +126,16 @@ abstract class calendar_driver */ abstract function search_events($start, $end, $query, $calendars = null); + /** + * Get a list of pending alarms to be displayed to the user + * + * @param integer Current time (unix timestamp) + * @param mixed List of calendar IDs to show alarms for (either as array or comma-separated string) + * @return array A list of alarms + */ + abstract function pending_alarms($time, $calendars = null); + + /** * Save an attachment related to the given event */ diff --git a/plugins/calendar/drivers/database/database_driver.php b/plugins/calendar/drivers/database/database_driver.php index dea0eeed..9f151230 100644 --- a/plugins/calendar/drivers/database/database_driver.php +++ b/plugins/calendar/drivers/database/database_driver.php @@ -350,6 +350,17 @@ class database_driver extends calendar_driver } + /** + * Get a list of pending alarms to be displayed to the user + * + * @see Driver:pending_alarms() + */ + public function pending_alarms($time, $calendars = null) + { + // TBD. + return array(); + } + /** * Save an attachment related to the given event */ diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php index d5e4bec7..3edcf6f9 100644 --- a/plugins/calendar/drivers/kolab/kolab_driver.php +++ b/plugins/calendar/drivers/kolab/kolab_driver.php @@ -222,6 +222,17 @@ class kolab_driver extends calendar_driver return array(); } + /** + * Get a list of pending alarms to be displayed to the user + * + * @see Driver:pending_alarms() + */ + public function pending_alarms($time, $calendars = null) + { + // TBD. + return array(); + } + /** * Save an attachment related to the given event */ diff --git a/plugins/calendar/lib/calendar_ui.php b/plugins/calendar/lib/calendar_ui.php index 2675498a..96e39e64 100644 --- a/plugins/calendar/lib/calendar_ui.php +++ b/plugins/calendar/lib/calendar_ui.php @@ -211,20 +211,15 @@ class calendar_ui $select_type = new html_select(array('name' => 'alarmtype[]', 'class' => 'edit-alarm-type')); $select_type->add( array($this->calendar->gettext('none'), $this->calendar->gettext('showmessage'), $this->calendar->gettext('byemail')), - array('','message','email')); + array('','DISPLAY','EMAIL')); $input_value = new html_inputfield(array('name' => 'alarmvalue[]', 'class' => 'edit-alarm-value', 'size' => 3)); $input_date = new html_inputfield(array('name' => 'alarmdate[]', 'class' => 'edit-alarm-date', 'size' => 10)); $input_time = new html_inputfield(array('name' => 'alarmtime[]', 'class' => 'edit-alarm-time', 'size' => 6)); $select_offset = new html_select(array('name' => 'alarmoffset[]', 'class' => 'edit-alarm-offset')); - $select_offset->add( - array( - $this->calendar->gettext('minutesbefore'), $this->calendar->gettext('hoursbefore'), $this->calendar->gettext('daysbefore'), - $this->calendar->gettext('minutesafter'), $this->calendar->gettext('hoursafter'), $this->calendar->gettext('daysafter'), - $this->calendar->gettext('ondate'), - ), - array('-m','-h','-d','+m','+h','+d','@')); + foreach (array('-M','-H','-D','+M','+H','+D','@') as $trigger) + $select_offset->add($this->calendar->gettext('trigger' . $trigger), $trigger); // TODO: pre-set with default values from user settings $hidden = array('style' => 'display:none'); @@ -232,7 +227,7 @@ class calendar_ui $select_type->show('') . ' ' . html::span(array('class' => 'edit-alarm-values', 'style' => 'display:none'), $input_value->show(15) . ' ' . - $select_offset->show('-m') . ' ' . + $select_offset->show('-M') . ' ' . $input_date->show('', $hidden) . ' ' . $input_time->show('', $hidden) ) diff --git a/plugins/calendar/localization/en_US.inc b/plugins/calendar/localization/en_US.inc index 10c58eb5..d7bcb5b5 100644 --- a/plugins/calendar/localization/en_US.inc +++ b/plugins/calendar/localization/en_US.inc @@ -51,15 +51,19 @@ $labels['choose_date'] = 'Choose date'; $labels['showmessage'] = 'Message'; $labels['byemail'] = 'E-mail'; -$labels['ondate'] = 'on date'; -$labels['minutesbefore'] = 'minutes before'; -$labels['hoursbefore'] = 'hours before'; -$labels['daysbefore'] = 'days before'; -$labels['minutesafter'] = 'minutes after'; -$labels['hoursafter'] = 'hours after'; -$labels['daysafter'] = 'days after'; +$labels['trigger@'] = 'on date'; +$labels['trigger-M'] = 'minutes before'; +$labels['trigger-H'] = 'hours before'; +$labels['trigger-D'] = 'days before'; +$labels['trigger+M'] = 'minutes after'; +$labels['trigger+H'] = 'hours after'; +$labels['trigger+D'] = 'days after'; $labels['addalarm'] = 'add alarm'; +$labels['alarmemail'] = 'Send E-mail'; +$labels['alarmdisplay'] = 'Show message'; +$labels['alarmat'] = 'at $datetime'; + $labels['tabsummary'] = 'Summary'; $labels['tabrecurrence'] = 'Recurrence'; $labels['tabattendees'] = 'Participants'; diff --git a/plugins/calendar/skins/default/templates/calendar.html b/plugins/calendar/skins/default/templates/calendar.html index 41e4ee96..1b0a4e0f 100644 --- a/plugins/calendar/skins/default/templates/calendar.html +++ b/plugins/calendar/skins/default/templates/calendar.html @@ -40,7 +40,7 @@
-
+