Approximate alarms data format to vcalendar sepc; render localized text for alarm settings; priorize TODOs
This commit is contained in:
parent
3c542abc3f
commit
a8edda1b72
9 changed files with 103 additions and 27 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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)
|
||||
)
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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">
|
||||
|
|
Loading…
Add table
Reference in a new issue