Approximate alarms data format to vcalendar sepc; render localized text for alarm settings; priorize TODOs

This commit is contained in:
Thomas Bruederli 2011-05-22 18:45:04 +02:00
parent 3c542abc3f
commit a8edda1b72
9 changed files with 103 additions and 27 deletions

View file

@ -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

View file

@ -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);
}

View file

@ -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)
{
}
}

View file

@ -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
*/

View file

@ -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
*/

View file

@ -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
*/

View file

@ -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)
)

View file

@ -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';

View file

@ -40,7 +40,7 @@
<div class="event-text"></div>
</div>
<div class="event-section" id="event-alarm">
<h5 class="label"><roundcube:label name="calendar.alam" /></h5>
<h5 class="label"><roundcube:label name="calendar.alarms" /></h5>
<div class="event-text"></div>
</div>
<div class="event-section" id="event-attendees">