diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js
index 7ee3d250..ec64480c 100644
--- a/plugins/calendar/calendar_ui.js
+++ b/plugins/calendar/calendar_ui.js
@@ -258,6 +258,24 @@ function rcube_calendar_ui(settings)
else if (calendar.attachments) {
// 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 = '' + dispname + '';
+ html += '' + dispname + ' ';
+ }
+ 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 = {};
if (calendar.editable && event.editable !== false) {
@@ -606,13 +624,13 @@ function rcube_calendar_ui(settings)
// update event properties and attendees availability if event times have changed
var event_times_changed = function()
{
- alert('event_times_changed')
if (me.selected_event) {
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.end = parse_datetime(allday.checked ? '23:59' : $('#edit-endtime').val(), $('#edit-enddate').val());
if (me.selected_event.attendees)
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);
if (data.email)
- dispname = '' + dispname + '';
+ dispname = '' + dispname + '';
// role selection
var opts = {
@@ -699,6 +717,7 @@ function rcube_calendar_ui(settings)
.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.mailtolink').click(function(e) { rcmail.redirect(rcmail.url('mail/compose', { _to:this.href.substr(7) })); return false; });
// check free-busy status
if (avail == 'loading') {
@@ -1303,6 +1322,7 @@ function rcube_calendar_ui(settings)
var newstart = parse_datetime('0', dateText);
var newend = new Date(newstart.getTime() + $('#edit-startdate').data('duration') * 1000);
$('#edit-enddate').val($.fullCalendar.formatDate(newend, me.settings['date_format']));
+ event_times_changed();
};
// init event dialog
@@ -1313,8 +1333,8 @@ function rcube_calendar_ui(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-enddate, #edit-starttime, #edit-endtime').change(function(){ event_times_changed(); });
+ $('#edit-startdate').datepicker(datepicker_settings).datepicker('option', 'onSelect', shift_enddate).change(function(){ shift_enddate(this.value); });
+ $('#edit-enddate').datepicker('option', 'onSelect', event_times_changed).change(event_times_changed);
$('#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
@@ -1365,7 +1385,8 @@ function rcube_calendar_ui(settings)
menu.activate($.Event({ type: 'mouseenter' }), li);
});
widget.scrollTop(offset - 1);
- }
+ },
+ change: event_times_changed
})
.click(function() { // show drop-down upon clicks
$(this).autocomplete('search', $(this).val() ? $(this).val().replace(/\D.*/, "") : " ");
diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php
index 18aa19e7..1bc26d78 100644
--- a/plugins/calendar/drivers/kolab/kolab_driver.php
+++ b/plugins/calendar/drivers/kolab/kolab_driver.php
@@ -25,7 +25,7 @@ class kolab_driver extends calendar_driver
{
// features this backend supports
public $alarms = true;
- public $attendees = false;
+ public $attendees = true;
public $attachments = true;
public $categoriesimmutable = true;
diff --git a/plugins/calendar/skins/default/calendar.css b/plugins/calendar/skins/default/calendar.css
index b155b790..ff1cb367 100644
--- a/plugins/calendar/skins/default/calendar.css
+++ b/plugins/calendar/skins/default/calendar.css
@@ -331,6 +331,32 @@ a.miniColors-trigger {
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 */
@@ -484,12 +510,9 @@ td.topalign {
width: 8em;
}
-#edit-attendees-table td.availability {
- width: 4em;
-}
-
+#edit-attendees-table td.availability,
#edit-attendees-table td.confirmstate {
- width: 6em;
+ width: 4em;
}
#edit-attendees-table td.options {
@@ -520,8 +543,9 @@ td.topalign {
}
#edit-attendees-table img.availabilityicon {
- width: 16px;
- height: 16px;
+ margin: 1px;
+ width: 14px;
+ height: 14px;
border-radius: 4px;
-moz-border-radius: 4px;
}
@@ -542,32 +566,36 @@ td.topalign {
background: #c00;
}
+#edit-attendees-table img.availabilityicon.out-of-office {
+ background: #f0b400;
+}
+
#edit-attendees-table tbody td.confirmstate {
overflow: hidden;
white-space: nowrap;
- font-size: 75%;
-/* text-indent: -2000%; */
+ text-indent: -2000%;
}
#edit-attendees-table td.confirmstate span {
display: block;
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.tentative {
-
+#edit-attendees-table td.confirmstate span.accepted {
+ background-position: 5px -20px;
}
#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 {
diff --git a/plugins/calendar/skins/default/images/attendee-status.gif b/plugins/calendar/skins/default/images/attendee-status.gif
new file mode 100644
index 00000000..3ef59e88
Binary files /dev/null and b/plugins/calendar/skins/default/images/attendee-status.gif differ