diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index d0dc34c2..4d506ffc 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -506,7 +506,7 @@ class calendar extends rcube_plugin $success = $reload = $got_msg = false; // read old event data in order to find changes - if ($event['_notify']) + if ($event['_notify'] && $action != 'new') $old = $this->driver->get_event($event); switch ($action) { @@ -588,7 +588,7 @@ class calendar extends rcube_plugin $event = $this->driver->get_event($event); // only notify if data really changed (TODO: do diff check on client already) - if (self::event_diff($event, $old)) { + if (!$old || self::event_diff($event, $old)) { if ($this->notify_attendees($event, $old) < 0) $this->rc->output->show_message('calendar.errornotifying', 'error'); } @@ -1388,7 +1388,7 @@ class calendar extends rcube_plugin foreach ($fblist as $slot) { list($from, $to, $type) = $slot; - if ($from <= $end && $to > $start) { + if ($from < $end && $to > $start) { $status = isset($type) && $fbtypemap[$type] ? $fbtypemap[$type] : 'BUSY'; break; } @@ -1441,7 +1441,7 @@ class calendar extends rcube_plugin $t = $t_end; } - echo json_encode(array('email' => $email, 'start' => intval($start), 'interval' => $interval, 'slots' => $slots)); + echo json_encode(array('email' => $email, 'start' => intval($start), 'end' => intval($t_end), 'interval' => $interval, 'slots' => $slots)); exit; } diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index f29ea27d..0b2b7049 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -371,7 +371,7 @@ function rcube_calendar_ui(settings) var allday = $('#edit-allday').get(0); var notify = $('#edit-attendees-donotify').get(0); var invite = $('#edit-attendees-invite').get(0); - notify.checked = invite.checked = true; // enable notification by default + notify.checked = false, invite.checked = true; if (event.allDay) { starttime.val("00:00").hide(); @@ -464,11 +464,13 @@ function rcube_calendar_ui(settings) if (calendar.attendees && event.attendees) { for (var j=0; j < event.attendees.length; j++) add_attendee(event.attendees[j], true); - $('#edit-attendees-notify').show(); + + if (event.attendees.length > 1 || event.attendees[0].email != settings.event_owner.email) { + notify.checked = invite.checked = true; // enable notification by default + } } - else - $('#edit-attendees-notify').hide(); - + + $('#edit-attendees-notify')[(notify.checked?'show':'hide')](); $('#edit-attendee-schedule')[(calendar.freebusy?'show':'hide')](); // attachments @@ -763,7 +765,7 @@ function rcube_calendar_ui(settings) // set css class according to working hours css = is_weekend(curdate) || (freebusy_ui.interval <= 60 && !is_workinghour(curdate)) ? 'offhours' : 'workinghours'; - times_row += '' + Q($.fullCalendar.formatDate(curdate, settings['time_format'])) + ''; + times_row += '' + Q($.fullCalendar.formatDate(curdate, settings['time_format'])) + ''; slots_row += ' '; t += freebusy_ui.interval * 60000; @@ -783,6 +785,24 @@ function rcube_calendar_ui(settings) table.children('thead').html(dates_row + times_row); table.children('tbody').html(times_html); + // initialize event handlers on grid + if (!freebusy_ui.grid_events) { + freebusy_ui.grid_events = true; + table.children('thead').click(function(e){ + // move event to the clicked date/time + if (e.target.id && e.target.id.match(/t-(\d+)/)) { + var newstart = new Date(RegExp.$1 * 1000); + // set time to 00:00 + if (me.selected_event.allDay) { + newstart.setMinutes(0); + newstart.setHours(0); + } + update_freebusy_dates(newstart, new Date(newstart.getTime() + freebusy_ui.startdate.data('duration') * 1000)); + render_freebusy_overlay(); + } + }) + } + // if we have loaded free-busy data, show it if (!freebusy_ui.loading) { if (date2unixtime(freebusy_ui.start) < freebusy_data.start || date2unixtime(freebusy_ui.end) > freebusy_data.end || freebusy_ui.interval != freebusy_data.interval) { @@ -958,7 +978,7 @@ function rcube_calendar_ui(settings) var freebusy_find_slot = function(dir) { var event = me.selected_event, - eventstart = date2unixtime(event.start), // calculate with unitimes + eventstart = date2unixtime(event.start), // calculate with unixtimes eventend = date2unixtime(event.end), duration = eventend - eventstart, sinterval = freebusy_data.interval * 60, @@ -992,7 +1012,7 @@ function rcube_calendar_ui(settings) // check freebusy data for all attendees for (var i=0; i < event_attendees.length; i++) { - if ((email = event_attendees[i].email) && freebusy_data[email][slot] > 1) { + if (event_attendees[i].role != 'OPT-PARTICIPANT' && (email = event_attendees[i].email) && freebusy_data[email] && freebusy_data[email][slot] > 1) { candidatestart = candidateend = false; break; } diff --git a/plugins/calendar/skins/default/calendar.css b/plugins/calendar/skins/default/calendar.css index 92e03a97..6c2dae6f 100644 --- a/plugins/calendar/skins/default/calendar.css +++ b/plugins/calendar/skins/default/calendar.css @@ -727,6 +727,10 @@ td.topalign { text-align: center; } +#schedule-freebusy-times tr.times td { + cursor: pointer; +} + #schedule-event-time { position: absolute; border: 2px solid #333;