diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index 1e908861..776f0d5c 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -2070,11 +2070,8 @@ class calendar extends rcube_plugin // convert dates into DateTime objects in user's current timezone $event['start'] = new DateTime($event['start'], $this->timezone); $event['end'] = new DateTime($event['end'], $this->timezone); - $event['allday'] = (bool) (isset($event['allDay']) ? $event['allDay'] : $event['allday']); - - if ($event['allday']) { - - } + $event['allday'] = !empty($event['allDay']); + unset($event['allDay']); // start/end is all we need for 'move' action (#1480) if ($action == 'move') { diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index fb35226d..8ded8d08 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -793,7 +793,7 @@ function rcube_calendar_ui(settings) calendar: event.calendar, start: date2servertime(start), end: date2servertime(end), - allday: allday.checked?1:0, + allDay: allday.checked?1:0, title: title.val(), description: description.val(), location: location.val(), @@ -2474,13 +2474,20 @@ function rcube_calendar_ui(settings) // render event temporarily into the calendar if ((data.start && data.end) || data.id) { - var event = data.id ? $.extend(fc.fullCalendar('clientEvents', data.id)[0], data) : data; + var tmp, event = data.id ? $.extend(fc.fullCalendar('clientEvents', data.id)[0], data) : data; + if (data.start) event.start = data.start; if (data.end) event.end = data.end; if (data.allDay !== undefined) event.allDay = !!data.allDay; // must be boolean for fullcalendar + + // For fullCalendar all-day event's end date must be exclusive + if (event.allDay && data.end && (tmp = moment(data.end)) && tmp.format('Hms') !== '000') { + event.end = moment().year(tmp.year()).month(tmp.month()).date(tmp.date()).hour(0).minute(0).second(0).add(1, 'days'); + } + event.editable = false; event.temp = true; event.className = ['fc-event-cal-'+data.calendar, 'fc-event-temp']; @@ -3837,33 +3844,18 @@ function rcube_calendar_ui(settings) }, // callback when an event was dragged and finally dropped eventDrop: function(event, delta, revertFunc) { - var allday = !event.start.hasTime(); + if (!event.end || event.end.diff(event.start) < 0) { + if (event.allDay) + event.end = moment(event.start).hour(13).minute(0).second(0); + else + event.end = moment(event.start).add(2, 'hours'); + } + else if (event.allDay) { + event.end.subtract(1, 'days').hour(13); + } - if (!event.end || event.end.format('x') < event.start.format('x')) { - event.end = new Date(event.start.format('x') + (allday ? DAY_MS : HOUR_MS)); - } - // moved to all-day section: set times to 12:00 - 13:00 - if (allday && !event.allDay) { - event.start.hours(12); - event.start.minutes(0); - event.start.seconds(0); - event.end.hours(13); - event.end.minutes(0); - event.end.seconds(0); - } - // moved from all-day section: set times to working hours - else if (event.allDay && !allday) { - var newstart = event.start.format('x'); - revertFunc(); // revert to get original duration - var numdays = Math.max(1, Math.round((event.end.format('x') - event.start.format('x')) / DAY_MS)) - 1; - event.start = moment(newstart); - event.end = moment(newstart + numdays * DAY_MS); - event.end.hours(settings.work_end || 18); - event.end.minutes(0); - - if (event.end.diff(event.start) < 0) - event.end = new Date(newstart + HOUR_MS); - } + if (event.allDay) + event.start.hour(12); // send move request to server var data = { @@ -3871,17 +3863,18 @@ function rcube_calendar_ui(settings) calendar: event.calendar, start: date2servertime(event.start), end: date2servertime(event.end), - allDay: allday?1:0 + allDay: event.allDay?1:0 }; + update_event_confirm('move', event, data); }, // callback for event resizing eventResize: function(event, delta) { // sanitize event dates - if (event.allDay) + if (event.allDay) { event.start.hours(12); - if (!event.end || event.end.diff(event.start) < 0) - event.end = new Date(event.start.format('x') + HOUR_MS); + event.end.hour(13).subtract(1, 'days'); + } // send resize request to server var data = { @@ -3891,6 +3884,7 @@ function rcube_calendar_ui(settings) end: date2servertime(event.end), allDay: event.allDay?1:0 }; + update_event_confirm('resize', event, data); }, viewRender: function(view) { diff --git a/plugins/libcalendaring/libcalendaring.js b/plugins/libcalendaring/libcalendaring.js index 9c151bbb..f4e9dc91 100644 --- a/plugins/libcalendaring/libcalendaring.js +++ b/plugins/libcalendaring/libcalendaring.js @@ -81,7 +81,7 @@ function rcube_libcalendaring(settings) // Support Moment.js objects var start = 'toDate' in event.start ? event.start.toDate() : event.start, - end = 'toDate' in event.end ? event.end.toDate() : event.end; + end = event.end && 'toDate' in event.end ? event.end.toDate() : event.end; var fromto, duration = end.getTime() / 1000 - start.getTime() / 1000, until = voice ? ' ' + rcmail.gettext('until','libcalendaring') + ' ' : ' — '; @@ -240,6 +240,9 @@ function rcube_libcalendaring(settings) */ this.date2ISO8601 = function(date) { + if (!date) + return null; + if ('toDate' in date) return date.format('YYYY-MM-DD[T]HH:mm:ss'); // MomentJS @@ -311,7 +314,7 @@ function rcube_libcalendaring(settings) */ this.date2unixtime = function(date) { - var dt = 'toDate' in date ? date.toDate() : date, + var dt = date && 'toDate' in date ? date.toDate() : date, dst_offset = (client_timezone - dt.getTimezoneOffset()) * 60; // adjust DST offset return Math.round(dt.getTime()/1000 + gmt_offset * 3600 + dst_offset);