From 4075d18050b8c894fe58c700703ac0844f8b95b8 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Mon, 17 Oct 2011 19:58:56 +0200 Subject: [PATCH] Implement loading of events in calendar --- apps/calendar/ajax/events.php | 46 ++++ apps/calendar/ajax/getcal.php | 70 ------ apps/calendar/index.php | 13 +- apps/calendar/js/calendar.js | 320 +-------------------------- apps/calendar/lib/object.php | 28 +++ apps/calendar/templates/calendar.php | 54 +---- 6 files changed, 88 insertions(+), 443 deletions(-) create mode 100644 apps/calendar/ajax/events.php delete mode 100644 apps/calendar/ajax/getcal.php diff --git a/apps/calendar/ajax/events.php b/apps/calendar/ajax/events.php new file mode 100644 index 00000000000..f9911f0a91d --- /dev/null +++ b/apps/calendar/ajax/events.php @@ -0,0 +1,46 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +require_once ("../../../lib/base.php"); +if(!OC_USER::isLoggedIn()) { + die(""); +} +OC_JSON::checkAppEnabled('calendar'); + +$start = DateTime::createFromFormat('U', $_GET['start']); +$end = DateTime::createFromFormat('U', $_GET['end']); + +$events = OC_Calendar_Object::allInPeriod($_GET['calendar_id'], $start, $end); +$user_timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London"); +$return = array(); +foreach($events as $event) +{ + $object = Sabre_VObject_Reader::read($event['calendardata']); + $vevent = $object->VEVENT; + $dtstart = $vevent->DTSTART; + $dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); + $start_dt = $dtstart->getDateTime(); + $start_dt->setTimezone(new DateTimeZone($user_timezone)); + $end_dt = $dtend->getDateTime(); + $end_dt->setTimezone(new DateTimeZone($user_timezone)); + + $return_event = array(); + $return_event['id'] = $event['id']; + $return_event['title'] = $event['summary']; + $return_event['start'] = $start_dt->format('Y-m-d H:i'); + $return_event['end'] = $end_dt->format('Y-m-d H:i'); + $return_event['allDay'] = false; + if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) + { + $return_event['allDay'] = true; + $end_dt->modify('-1 sec'); + $return_event['end'] = $end_dt->format('Y-m-d H:i'); + } + $return[] = $return_event; +} +OC_JSON::encodedPrint($return); diff --git a/apps/calendar/ajax/getcal.php b/apps/calendar/ajax/getcal.php deleted file mode 100644 index a65c6cf2602..00000000000 --- a/apps/calendar/ajax/getcal.php +++ /dev/null @@ -1,70 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -require_once ("../../../lib/base.php"); -if(!OC_USER::isLoggedIn()) { - die(""); -} -OC_JSON::checkAppEnabled('calendar'); - -$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser(), 1); -$events = array(); -$return = array('calendars'=>array()); -foreach($calendars as $calendar) { - $tmp = OC_Calendar_Object::all($calendar['id']); - $events = array_merge($events, $tmp); - $return['calendars'][$calendar['id']] = array( - 'displayname' => $calendar['displayname'], - 'color' => '#'.$calendar['calendarcolor'] - ); -} - -$select_year = $_GET["year"]; -$user_timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London"); -foreach($events as $event) -{ - if ($select_year != substr($event['startdate'], 0, 4)) - continue; - $object = Sabre_VObject_Reader::read($event['calendardata']); - $vevent = $object->VEVENT; - $dtstart = $vevent->DTSTART; - $dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); - $start_dt = $dtstart->getDateTime(); - $start_dt->setTimezone(new DateTimeZone($user_timezone)); - $end_dt = $dtend->getDateTime(); - $end_dt->setTimezone(new DateTimeZone($user_timezone)); - $year = $start_dt->format('Y'); - $month = $start_dt->format('n') - 1; // return is 0 based - $day = $start_dt->format('j'); - $hour = $start_dt->format('G'); - if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) { - $hour = 'allday'; - } - - $return_event = array(); - foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop) - { - $return_event[$prop] = $event[$prop]; - } - $return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i')); - $return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i')); - $return_event['description'] = $event['summary']; - if ($hour == 'allday') - { - $return_event['allday'] = true; - } - if (isset($return[$year][$month][$day][$hour])) - { - $return[$year][$month][$day][$hour][] = $return_event; - } - else - { - $return[$year][$month][$day][$hour] = array(1 => $return_event); - } -} -OC_JSON::encodedPrint($return); diff --git a/apps/calendar/index.php b/apps/calendar/index.php index 499765b22c4..9584e62e449 100644 --- a/apps/calendar/index.php +++ b/apps/calendar/index.php @@ -15,6 +15,14 @@ if( count($calendars) == 0){ OC_Calendar_Calendar::addCalendar(OC_User::getUser(),'default','Default calendar'); $calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser()); } +$eventSources = array(); +foreach($calendars as $calendar){ + $eventSources[] = array( + 'url' => 'ajax/events.php?calendar_id='.$calendar['id'], + 'color' => '#'.$calendar['calendarcolor'], + 'textColor' => 'black', + ); +} OC_Util::addScript('calendar', 'calendar'); OC_Util::addStyle('calendar', 'style'); OC_Util::addScript('', 'jquery.multiselect'); @@ -22,5 +30,6 @@ OC_Util::addStyle('', 'jquery.multiselect'); OC_Util::addScript('3rdparty/fullcalendar', 'fullcalendar'); OC_Util::addStyle('3rdparty/fullcalendar', 'fullcalendar'); OC_App::setActiveNavigationEntry('calendar_index'); -$output = new OC_Template('calendar', 'calendar', 'user'); -$output -> printPage(); +$tmpl = new OC_Template('calendar', 'calendar', 'user'); +$tmpl->assign('eventSources', $eventSources); +$tmpl->printPage(); diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js index 2917d9f9134..033eec8714c 100644 --- a/apps/calendar/js/calendar.js +++ b/apps/calendar/js/calendar.js @@ -113,9 +113,6 @@ Calendar={ return date[3] + ':' + date[4]; }, updateView:function() { - this.current.removeEvents(); - this.current.renderCal(); - this.current.showEvents(); }, currentview:'none', setCurrentView:function(view){ @@ -174,33 +171,6 @@ Calendar={ }, events:[], loadEvents:function(year){ - if( typeof (year) == 'undefined') { - this.events = []; - year = Calendar.Date.current.getFullYear(); - } - if( typeof (this.events[year]) == "undefined") { - this.events[year] = [] - } - $.getJSON(OC.filePath('calendar', 'ajax', 'getcal.php') + "?year=" + year, function(jsondata, status) { - if(status == "nosession") { - alert("You are not logged in. That can happen if you don't use owncloud for a long time."); - document.location(oc_webroot); - } - if(status == "parsingfail" || typeof (jsondata) == "undefined") { - $.ready(function() { - $( "#parsingfail_dialog" ).dialog(); - }); - } else { - if (typeof(jsondata[year]) != 'undefined'){ - Calendar.UI.calendars = jsondata['calendars']; - Calendar.UI.events[year] = jsondata[year]; - } - $(document).ready(function() { - Calendar.UI.updateView(); - }); - } - }); - window.setTimeout("Calendar.UI.loadEvents(" + year + ")", 120000); }, getEventsForDate:function(date){ var day = date.getDate(); @@ -576,37 +546,7 @@ Calendar={ cancel:function(button, calendarid){ $(button).closest('tr').prev().show().next().remove(); }, - },/* - OneDay:{ - forward:function(){ - Calendar.Date.forward_day(); - }, - backward:function(){ - Calendar.Date.backward_day(); - }, - removeEvents:function(){ - $("#onedayview .calendar_row").empty(); - }, - renderCal:function(){ - $("#datecontrol_date").val(Calendar.UI.formatDayShort() + Calendar.space + Calendar.Date.current.getDate() + Calendar.space + Calendar.UI.formatMonthShort() + Calendar.space + Calendar.Date.current.getFullYear()); - $("#onedayview_today").html(Calendar.UI.formatDayLong() + Calendar.space + Calendar.Date.current.getDate() + Calendar.space + Calendar.UI.formatMonthShort()); - Calendar.UI.addDateInfo('#onedayview_today', new Date(Calendar.Date.current)); - }, - showEvents:function(){ - Calendar.UI.createEventsForDate(Calendar.Date.current, 0); - }, - getEventContainer:function(week, weekday, when){ - return $("#onedayview ." + when); - }, - createEventLabel:function(event){ - var time = ''; - if (!event['allday']){ - time = '' + Calendar.UI.formatTime(event['startdate']) + ' - ' + Calendar.UI.formatTime(event['enddate']) + ' '; - } - return $(document.createElement('p')) - .html(time + event['description']) - }, - },*/ + }, OneWeek:{ forward:function(){ Calendar.Date.forward_week(); @@ -614,48 +554,8 @@ Calendar={ backward:function(){ Calendar.Date.backward_week(); }, - removeEvents:function(){ - for( i = 0; i <= 6; i++) { - $("#oneweekview ." + Calendar.UI.weekdays[i]).empty(); - } - $("#oneweekview .thisday").removeClass("thisday"); - }, renderCal:function(){ $("#datecontrol_date").val(Calendar.UI.cw_label + ": " + Calendar.Date.calw()); - var dates = this.generateDates(); - var today = new Date(); - for(var i = 0; i <= 6; i++){ - $("#oneweekview th." + Calendar.UI.weekdays[i]).html(Calendar.UI.formatDayShort((i+Calendar.firstdayofweek)%7) + Calendar.space + dates[i].getDate() + Calendar.space + Calendar.UI.formatMonthShort(dates[i].getMonth())); - $("#oneweekview td." + Calendar.UI.weekdays[i] + ".allday").attr('title', dates[i].getDate() + "." + String(parseInt(dates[i].getMonth()) + 1) + "." + dates[i].getFullYear() + "-" + "allday"); - $("#oneweekview td." + Calendar.UI.weekdays[i] + ".allday").droppable({ - drop: function() { - Calendar.UI.moveevent(Calendar.UI.drageventid, this.title); - Calendar.UI.loadEvents(); - } - }); - for(var ii = 0;ii <= 23; ii++){ - $("#oneweekview td." + Calendar.UI.weekdays[i] + "." + String(ii)).attr('title', dates[i].getDate() + "." + String(parseInt(dates[i].getMonth()) + 1) + "." + dates[i].getFullYear() + "-" + String(ii) + ":00"); - $("#oneweekview td." + Calendar.UI.weekdays[i] + "." + String(ii)).droppable({ - drop: function() { - Calendar.UI.moveevent(Calendar.UI.drageventid, this.title); - Calendar.UI.loadEvents(); - } - }); - } - if(dates[i].getDate() == today.getDate() && dates[i].getMonth() == today.getMonth() && dates[i].getFullYear() == today.getFullYear()){ - $("#oneweekview ." + Calendar.UI.weekdays[i]).addClass("thisday"); - } - Calendar.UI.addDateInfo('#oneweekview th.' + Calendar.UI.weekdays[i], dates[i]); - } - }, - showEvents:function(){ - var dates = this.generateDates(); - for(var weekday = 0; weekday <= 6; weekday++) { - Calendar.UI.createEventsForDate(dates[weekday], 0); - } - }, - getEventContainer:function(week, weekday, when){ - return $("#oneweekview ." + Calendar.UI.weekdays[weekday] + "." + when); }, createEventLabel:function(event){ var time = ''; @@ -665,122 +565,7 @@ Calendar={ return $(document.createElement('p')) .html(time + event['description']) }, - generateDates:function(){ - var dates = new Array(); - var date = new Date(Calendar.Date.current) - var dayofweek = date.getDay(); - if(dayofweek == 0) { - dayofweek = 7; - } - if(Calendar.firstdayofweek > dayofweek){ - date.setDate(date.getDate() - dayofweek + Calendar.firstdayofweek - 7); - }else{ - date.setDate(date.getDate() - dayofweek + Calendar.firstdayofweek); - } - for(var i = 0; i <= 6; i++) { - dates[i] = new Date(date) - date.setDate(date.getDate() + 1); - } - return dates; - }, - },/* - FourWeeks:{ - forward:function(){ - Calendar.Date.forward_week(); - }, - backward:function(){ - Calendar.Date.backward_week(); - }, - removeEvents:function(){ - $('#fourweeksview .day.thisday').removeClass('thisday'); - $('#fourweeksview .day .events').empty(); - }, - renderCal:function(){ - var calw1 = Calendar.Date.calw(); - var calw2 = calw1 + 1; - var calw3 = calw1 + 2; - var calw4 = calw1 + 3; - switch(calw1) { - case 50: - calw4 = 1; - break; - case 51: - calw3 = 1; - calw4 = 2; - break; - case 52: - calw2 = 1; - calw3 = 2; - calw4 = 3; - break; - } - var calwplusfour = calw4; - var dates = this.generateDates(); - var week = 1; - var weekday = 0; - var today = new Date(); - for(var i = 0; i <= 27; i++){ - var dayofmonth = dates[i].getDate(); - var month = dates[i].getMonth(); - var year = dates[i].getFullYear(); - $("#fourweeksview .week_" + week + " ." + Calendar.UI.weekdays[weekday] + " .dateinfo").html(dayofmonth + Calendar.space + Calendar.UI.formatMonthShort(month)); - if(dayofmonth == today.getDate() && month == today.getMonth() && year == today.getFullYear()){ - $("#fourweeksview .week_" + week + " ." + Calendar.UI.weekdays[weekday]).addClass('thisday'); - } - Calendar.UI.addDateInfo('#fourweeksview .week_' + week + ' .' + Calendar.UI.weekdays[weekday], dates[i]); - if(weekday == 6){ - weekday = 0; - week++; - }else{ - weekday++; - } - } - $("#fourweeksview .week_1 .calw").html(calw1); - $("#fourweeksview .week_2 .calw").html(calw2); - $("#fourweeksview .week_3 .calw").html(calw3); - $("#fourweeksview .week_4 .calw").html(calw4); - $("#datecontrol_date").val(Calendar.UI.cws_label + ": " + Calendar.Date.calw() + " - " + calwplusfour); - }, - showEvents:function(){ - var dates = this.generateDates(); - var weekdaynum = 0; - var weeknum = 1; - for(var i = 0; i <= 27; i++) { - Calendar.UI.createEventsForDate(dates[i], weeknum); - if(weekdaynum == 6){ - weekdaynum = 0; - weeknum++; - }else{ - weekdaynum++; - } - } - }, - getEventContainer:function(week, weekday, when){ - return $("#fourweeksview .week_" + week + " .day." + Calendar.UI.weekdays[weekday] + " .events"); - }, - createEventLabel:function(event){ - var time = ''; - if (!event['allday']){ - time = '' + Calendar.UI.formatTime(event['startdate']) + ' '; - } - return $(document.createElement('p')) - .html(time + event['description']) - }, - generateDates:function(){ - var dates = new Array(); - var date = new Date(Calendar.Date.current) - var dayofweek = date.getDay(); - if(dayofweek == 0) { - dayofweek = 7; - } - date.setDate(date.getDate() - dayofweek + 1); - for(var i = 0; i <= 27; i++) { - dates[i] = new Date(date) - date.setDate(date.getDate() + 1); - } - return dates; - }, - },*/ + }, OneMonth:{ forward:function(){ Calendar.Date.forward_month(); @@ -788,89 +573,8 @@ Calendar={ backward:function(){ Calendar.Date.backward_month(); }, - removeEvents:function(){ - $('#onemonthview .day.thisday').removeClass('thisday'); - $('#onemonthview .day .events').empty(); - }, renderCal:function(){ $("#datecontrol_date").val(Calendar.UI.formatMonthLong() + Calendar.space + Calendar.Date.current.getFullYear()); - var cal = Calendar.Date.getnumberofdays(Calendar.Date.current.getFullYear()); - var monthview_dayofweek = Calendar.Date.current.getDay(); - var monthview_dayofmonth = Calendar.Date.current.getDate(); - for(var i = monthview_dayofmonth; i > 1; i--) { - if(monthview_dayofweek == 0) { - monthview_dayofweek = 6; - } else { - monthview_dayofweek--; - } - } - $("#onemonthview .week_5").hide(); - $("#onemonthview .week_6").hide(); - this.rows = monthview_dayofweek + cal[Calendar.Date.current.getMonth()]; - this.rows = this.rows / 7; - this.rows = Math.ceil(this.rows); - var dates = this.generateDates(); - var week = 1; - var weekday = 0; - var today = new Date(); - for(var i = 0; i <= 41; i++){ - var dayofmonth = dates[i].getDate(); - var month = dates[i].getMonth(); - var year = dates[i].getFullYear(); - $("#onemonthview .week_" + week + " ." + Calendar.UI.weekdays[weekday] + " .dateinfo").html(dayofmonth + Calendar.space + Calendar.UI.formatMonthShort(month)); - $("#onemonthview .week_" + week + " ." + Calendar.UI.weekdays[weekday]).attr('title', dayofmonth + "." + String(parseInt(month) + 1) + "." + year); - $("#onemonthview .week_" + week + " ." + Calendar.UI.weekdays[weekday]).droppable({ - drop: function() { - Calendar.UI.moveevent(Calendar.UI.drageventid, this.title); - Calendar.UI.loadEvents(); - } - }); - if(dayofmonth == today.getDate() && month == today.getMonth() && year == today.getFullYear()){ - $("#onemonthview .week_" + week + " ." + Calendar.UI.weekdays[weekday]).addClass('thisday'); - } - Calendar.UI.addDateInfo('#onemonthview .week_' + week + ' .' + Calendar.UI.weekdays[weekday], dates[i]); - if(weekday == 6){ - weekday = 0; - week++; - }else{ - weekday++; - } - } - if(this.rows == 4){ - for(var i = 1;i <= 6;i++){ - $("#onemonthview .week_" + String(i)).height("23%"); - } - } - if(this.rows == 5) { - $("#onemonthview .week_5").show(); - for(var i = 1;i <= 6;i++){ - $("#onemonthview .week_" + String(i)).height("18%"); - } - } - if(this.rows == 6) { - $("#onemonthview .week_5").show(); - $("#onemonthview .week_6").show(); - for(var i = 1;i <= 6;i++){ - $("#onemonthview .week_" + String(i)).height("14%"); - } - } - }, - showEvents:function(){ - var dates = this.generateDates(); - var weekdaynum = 0; - var weeknum = 1; - for(var i = 0; i <= 41; i++) { - Calendar.UI.createEventsForDate(dates[i], weeknum); - if(weekdaynum == 6){ - weekdaynum = 0; - weeknum++; - }else{ - weekdaynum++; - } - } - }, - getEventContainer:function(week, weekday, when){ - return $("#onemonthview .week_" + week + " .day." + Calendar.UI.weekdays[weekday] + " .events"); }, createEventLabel:function(event){ var time = ''; @@ -880,26 +584,6 @@ Calendar={ return $(document.createElement('p')) .html(time + event['description']) }, - generateDates:function(){ - var dates = new Array(); - var date = new Date(Calendar.Date.current) - date.setDate(1); - var dayofweek = date.getDay(); - if(dayofweek == 0) { - dayofweek = 7; - this.rows++; - } - if(Calendar.firstdayofweek > dayofweek){ - date.setDate(date.getDate() - dayofweek + Calendar.firstdayofweek - 7); - }else{ - date.setDate(date.getDate() - dayofweek + Calendar.firstdayofweek); - } - for(var i = 0; i <= 41; i++) { - dates[i] = new Date(date) - date.setDate(date.getDate() + 1); - } - return dates; - }, }, List:{ removeEvents:function(){ diff --git a/apps/calendar/lib/object.php b/apps/calendar/lib/object.php index 0c3e497d4f2..4afeb341a9c 100644 --- a/apps/calendar/lib/object.php +++ b/apps/calendar/lib/object.php @@ -30,6 +30,34 @@ class OC_Calendar_Object{ return $calendarobjects; } + /** + * @brief Returns all objects of a calendar between $start and $end + * @param integer $id + * @param DateTime $start + * @param DateTime $end + * @return array + * + * The objects are associative arrays. You'll find the original vObject + * in ['calendardata'] + */ + public static function allInPeriod($id, $start, $end){ + $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ?' + .' AND ((startdate >= ? AND startdate <= ? AND repeating = 0)' + .' OR (startdate <= ? AND enddate >= ? AND repeating = 1))' ); + $start = self::getUTCforMDB($start); + $end = self::getUTCforMDB($end); + $result = $stmt->execute(array($id, + $start, $end, + $end, $start)); + + $calendarobjects = array(); + while( $row = $result->fetchRow()){ + $calendarobjects[] = $row; + } + + return $calendarobjects; + } + /** * @brief Returns an object * @param integer $id diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php index e087ce40617..3aa6ef66dc7 100644 --- a/apps/calendar/templates/calendar.php +++ b/apps/calendar/templates/calendar.php @@ -26,62 +26,10 @@