Add/show/manage event attendees inclusing basic availability check

This commit is contained in:
Thomas Bruederli 2011-07-14 12:38:10 +02:00
parent a8d7cd279a
commit d7df8c76a9
4 changed files with 69 additions and 20 deletions

View file

@ -259,6 +259,24 @@ function rcube_calendar_ui(settings)
// fetch attachments, some drivers doesn't set 'attachments' popr of the event // fetch attachments, some drivers doesn't set 'attachments' popr of the event
} }
// list event attendees
if (calendar.attendees && event.attendees) {
var data, dispname, html = '';
for (var j=0; j < event.attendees.length; j++) {
data = event.attendees[j];
dispname = Q(data.name || data.email);
if (data.email)
dispname = '<a href="mailto:' + data.email + '" title="' + Q(data.email) + '" class="mailtolink">' + dispname + '</a>';
html += '<span class="attendee ' + String(data.status).toLowerCase() + '">' + dispname + '</span> ';
}
if (html) {
$('#event-attendees').show()
.children('.event-text')
.html(html)
.find('a.mailtolink').click(function(e) { rcmail.redirect(rcmail.url('mail/compose', { _to:this.href.substr(7) })); return false; });
}
}
var buttons = {}; var buttons = {};
if (calendar.editable && event.editable !== false) { if (calendar.editable && event.editable !== false) {
buttons[rcmail.gettext('edit', 'calendar')] = function() { buttons[rcmail.gettext('edit', 'calendar')] = function() {
@ -606,13 +624,13 @@ function rcube_calendar_ui(settings)
// update event properties and attendees availability if event times have changed // update event properties and attendees availability if event times have changed
var event_times_changed = function() var event_times_changed = function()
{ {
alert('event_times_changed')
if (me.selected_event) { if (me.selected_event) {
var allday = $('#edit-allday').get(0); var allday = $('#edit-allday').get(0);
me.selected_event.start = parse_datetime(allday.checked ? '00:00' : $('#edit-starttime').val(), $('#edit-startdate').val()); me.selected_event.start = parse_datetime(allday.checked ? '00:00' : $('#edit-starttime').val(), $('#edit-startdate').val());
me.selected_event.end = parse_datetime(allday.checked ? '23:59' : $('#edit-endtime').val(), $('#edit-enddate').val()); me.selected_event.end = parse_datetime(allday.checked ? '23:59' : $('#edit-endtime').val(), $('#edit-enddate').val());
if (me.selected_event.attendees) if (me.selected_event.attendees)
update_freebusy_status(me.selected_event); update_freebusy_status(me.selected_event);
$('#edit-startdate').data('duration', Math.round((me.selected_event.end.getTime() - me.selected_event.start.getTime()) / 1000));
} }
}; };
@ -664,7 +682,7 @@ function rcube_calendar_ui(settings)
var dispname = Q(data.name || data.email); var dispname = Q(data.name || data.email);
if (data.email) if (data.email)
dispname = '<span title="' + Q(data.email) + '">' + dispname + '</span>'; dispname = '<a href="mailto:' + data.email + '" title="' + Q(data.email) + '" class="mailtolink">' + dispname + '</a>';
// role selection // role selection
var opts = { var opts = {
@ -699,6 +717,7 @@ function rcube_calendar_ui(settings)
.appendTo(attendees_list); .appendTo(attendees_list);
tr.find('a.deletelink').click({ id:(data.email || data.name) }, function(e) { remove_attendee(this, e.data.id); return false; }); tr.find('a.deletelink').click({ id:(data.email || data.name) }, function(e) { remove_attendee(this, e.data.id); return false; });
tr.find('a.mailtolink').click(function(e) { rcmail.redirect(rcmail.url('mail/compose', { _to:this.href.substr(7) })); return false; });
// check free-busy status // check free-busy status
if (avail == 'loading') { if (avail == 'loading') {
@ -1303,6 +1322,7 @@ function rcube_calendar_ui(settings)
var newstart = parse_datetime('0', dateText); var newstart = parse_datetime('0', dateText);
var newend = new Date(newstart.getTime() + $('#edit-startdate').data('duration') * 1000); var newend = new Date(newstart.getTime() + $('#edit-startdate').data('duration') * 1000);
$('#edit-enddate').val($.fullCalendar.formatDate(newend, me.settings['date_format'])); $('#edit-enddate').val($.fullCalendar.formatDate(newend, me.settings['date_format']));
event_times_changed();
}; };
// init event dialog // init event dialog
@ -1313,8 +1333,8 @@ function rcube_calendar_ui(settings)
} }
}); });
$('#edit-enddate, input.edit-alarm-date').datepicker(datepicker_settings); $('#edit-enddate, input.edit-alarm-date').datepicker(datepicker_settings);
$('#edit-startdate').datepicker(datepicker_settings).datepicker('option', 'onSelect', shift_enddate).change(function(){ shift_enddate(this.value); event_times_changed(); }); $('#edit-startdate').datepicker(datepicker_settings).datepicker('option', 'onSelect', shift_enddate).change(function(){ shift_enddate(this.value); });
$('#edit-enddate, #edit-starttime, #edit-endtime').change(function(){ event_times_changed(); }); $('#edit-enddate').datepicker('option', 'onSelect', event_times_changed).change(event_times_changed);
$('#edit-allday').click(function(){ $('#edit-starttime, #edit-endtime')[(this.checked?'hide':'show')](); }); $('#edit-allday').click(function(){ $('#edit-starttime, #edit-endtime')[(this.checked?'hide':'show')](); });
// configure drop-down menu on time input fields based on jquery UI autocomplete // configure drop-down menu on time input fields based on jquery UI autocomplete
@ -1365,7 +1385,8 @@ function rcube_calendar_ui(settings)
menu.activate($.Event({ type: 'mouseenter' }), li); menu.activate($.Event({ type: 'mouseenter' }), li);
}); });
widget.scrollTop(offset - 1); widget.scrollTop(offset - 1);
} },
change: event_times_changed
}) })
.click(function() { // show drop-down upon clicks .click(function() { // show drop-down upon clicks
$(this).autocomplete('search', $(this).val() ? $(this).val().replace(/\D.*/, "") : " "); $(this).autocomplete('search', $(this).val() ? $(this).val().replace(/\D.*/, "") : " ");

View file

@ -25,7 +25,7 @@ class kolab_driver extends calendar_driver
{ {
// features this backend supports // features this backend supports
public $alarms = true; public $alarms = true;
public $attendees = false; public $attendees = true;
public $attachments = true; public $attachments = true;
public $categoriesimmutable = true; public $categoriesimmutable = true;

View file

@ -331,6 +331,32 @@ a.miniColors-trigger {
margin: 0.5em 0; margin: 0.5em 0;
} }
#event-attendees span.attendee {
padding-right: 18px;
margin-right: 0.5em;
background: url('images/attendee-status.gif') right 0 no-repeat;
}
#event-attendees span.attendee a.mailtolink {
text-decoration: none;
white-space: nowrap;
}
#event-attendees span.attendee a.mailtolink:hover {
text-decoration: underline;
}
#event-attendees span.accepted {
background-position: right -20px;
}
#event-attendees span.declined {
background-position: right -40px;
}
#event-attendees span.tentative {
background-position: right -60px;
}
/* jQuery UI overrides */ /* jQuery UI overrides */
@ -484,12 +510,9 @@ td.topalign {
width: 8em; width: 8em;
} }
#edit-attendees-table td.availability { #edit-attendees-table td.availability,
width: 4em;
}
#edit-attendees-table td.confirmstate { #edit-attendees-table td.confirmstate {
width: 6em; width: 4em;
} }
#edit-attendees-table td.options { #edit-attendees-table td.options {
@ -520,8 +543,9 @@ td.topalign {
} }
#edit-attendees-table img.availabilityicon { #edit-attendees-table img.availabilityicon {
width: 16px; margin: 1px;
height: 16px; width: 14px;
height: 14px;
border-radius: 4px; border-radius: 4px;
-moz-border-radius: 4px; -moz-border-radius: 4px;
} }
@ -542,32 +566,36 @@ td.topalign {
background: #c00; background: #c00;
} }
#edit-attendees-table img.availabilityicon.out-of-office {
background: #f0b400;
}
#edit-attendees-table tbody td.confirmstate { #edit-attendees-table tbody td.confirmstate {
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
font-size: 75%; text-indent: -2000%;
/* text-indent: -2000%; */
} }
#edit-attendees-table td.confirmstate span { #edit-attendees-table td.confirmstate span {
display: block; display: block;
width: 20px; width: 20px;
background: url('images/attendee-status.gif') 5px 0 no-repeat;
} }
#edit-attendees-table td.confirmstate span.needs-action { #edit-attendees-table td.confirmstate span.needs-action {
} }
#edit-attendees-table td.confirmstate span.tentative { #edit-attendees-table td.confirmstate span.accepted {
background-position: 5px -20px;
} }
#edit-attendees-table td.confirmstate span.declined { #edit-attendees-table td.confirmstate span.declined {
background-position: 5px -40px;
} }
#edit-attendees-table td.confirmstate span.accepted { #edit-attendees-table td.confirmstate span.tentative {
background-position: 5px -60px;
} }
span.edit-alarm-set { span.edit-alarm-set {

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB