From 8826aa8056062d608db962ca2e1b55cf3e204c13 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Tue, 13 Sep 2011 22:44:15 +0200 Subject: [PATCH] Add basic fields to tasks app --- apps/tasks/ajax/addtask.php | 19 ++- apps/tasks/ajax/edittask.php | 24 ++-- apps/tasks/ajax/edittaskform.php | 14 ++ apps/tasks/ajax/getdetails.php | 3 + apps/tasks/appinfo/app.php | 1 + apps/tasks/js/tasks.js | 10 +- apps/tasks/lib/vtodo.php | 186 +++++++++++++++++++++++++ apps/tasks/templates/part.details.php | 35 ++++- apps/tasks/templates/part.property.php | 16 ++- apps/tasks/templates/part.taskform.php | 42 +++++- 10 files changed, 323 insertions(+), 27 deletions(-) create mode 100644 apps/tasks/lib/vtodo.php diff --git a/apps/tasks/ajax/addtask.php b/apps/tasks/ajax/addtask.php index 434fbc5fdd..81905666ff 100644 --- a/apps/tasks/ajax/addtask.php +++ b/apps/tasks/ajax/addtask.php @@ -18,20 +18,19 @@ if( $calendar === false || $calendar['userid'] != OC_USER::getUser()){ exit(); } -$summary = $_POST['summary']; +$errors = OC_Task_VTodo::validateRequest($_POST, $l10n); +if (!empty($errors)) { + echo json_encode( array( 'status' => 'error', 'data' => array( 'errors' => $errors ))); + exit(); +} -$vcalendar = new Sabre_VObject_Component('VCALENDAR'); -$vcalendar->add(new Sabre_VObject_Property('PRODID', 'ownCloud Calendar')); -$vcalendar->add(new Sabre_VObject_Property('VERSION', '2.0')); -$vtodo = new Sabre_VObject_Component('VTODO'); -$vtodo->add(new Sabre_VObject_Property('SUMMARY',$summary)); -$vtodo->add(new Sabre_VObject_Property('UID',OC_Calendar_Calendar::createUID())); -$vcalendar->add($vtodo); +$vcalendar = OC_Task_VTodo::createVCalendarFromRequest($_POST); $id = OC_Calendar_Object::add($cid, $vcalendar->serialize()); -$details = OC_Contacts_Addressbook::structureContact($vtodo); +$priority_options = OC_Task_VTodo::getPriorityOptions($l10n); $tmpl = new OC_Template('tasks','part.details'); -$tmpl->assign('details',$details); +$tmpl->assign('priority_options', $priority_options); +$tmpl->assign('details',$vcalendar->VTODO); $tmpl->assign('id',$id); $page = $tmpl->fetchPage(); diff --git a/apps/tasks/ajax/edittask.php b/apps/tasks/ajax/edittask.php index f98bcf3f59..9f836f1f8a 100644 --- a/apps/tasks/ajax/edittask.php +++ b/apps/tasks/ajax/edittask.php @@ -24,23 +24,21 @@ if( $calendar === false || $calendar['userid'] != OC_USER::getUser()){ exit(); } -$summary = $_POST['summary']; +$errors = OC_Task_VTodo::validateRequest($_POST, $l10n); +if (!empty($errors)) { + echo json_encode( array( 'status' => 'error', 'data' => array( 'errors' => $errors ))); + exit(); +} -$vtodo = Sabre_VObject_Reader::read($task['calendardata'])->VTODO[0]; -$uid = $vtodo->UID[0]->value; - -$vcalendar = new Sabre_VObject_Component('VCALENDAR'); -$vcalendar->add(new Sabre_VObject_Property('PRODID', 'ownCloud Calendar')); -$vcalendar->add(new Sabre_VObject_Property('VERSION', '2.0')); -$vtodo = new Sabre_VObject_Component('VTODO'); -$vtodo->add(new Sabre_VObject_Property('SUMMARY',$summary)); -$vtodo->add(new Sabre_VObject_Property('UID', $uid)); -$vcalendar->add($vtodo); +$vcalendar = Sabre_VObject_Reader::read($task['calendardata']); +OC_Task_VTodo::updateVCalendarFromRequest($_POST, $vcalendar); OC_Calendar_Object::edit($id, $vcalendar->serialize()); +$priority_options = OC_Task_VTodo::getPriorityOptions($l10n); $tmpl = new OC_Template('tasks','part.details'); -$tmpl->assign('details',$vtodo); -$tmpl->assign('id',$id); +$tmpl->assign('priority_options', $priority_options); +$tmpl->assign('details', $vcalendar->VTODO); +$tmpl->assign('id', $id); $page = $tmpl->fetchPage(); echo json_encode( array( 'status' => 'success', 'data' => array( 'id' => $id, 'page' => $page ))); diff --git a/apps/tasks/ajax/edittaskform.php b/apps/tasks/ajax/edittaskform.php index 6cc7d2787c..dc8bb60e64 100644 --- a/apps/tasks/ajax/edittaskform.php +++ b/apps/tasks/ajax/edittaskform.php @@ -25,9 +25,23 @@ if( $calendar === false || $calendar['userid'] != OC_USER::getUser()){ } $details = Sabre_VObject_Reader::read($task['calendardata'])->VTODO; +$categories = array(); +if (isset($details->CATEGORIES)){ + $categories = explode(',', $details->CATEGORIES->value); + $categories = array_map('trim', $categories); +} + +$category_options = OC_Calendar_Object::getCategoryOptions($l10n); +$percent_options = range(0, 100, 10); +$priority_options = OC_Task_VTodo::getPriorityOptions($l10n); + $tmpl = new OC_Template('tasks','part.edittaskform'); +$tmpl->assign('category_options', $category_options); +$tmpl->assign('percent_options', $percent_options); +$tmpl->assign('priority_options', $priority_options); $tmpl->assign('task',$task); $tmpl->assign('details',$details); +$tmpl->assign('categories', $categories); $page = $tmpl->fetchPage(); echo json_encode( array( 'status' => 'success', 'data' => array( 'page' => $page ))); diff --git a/apps/tasks/ajax/getdetails.php b/apps/tasks/ajax/getdetails.php index d264aeab85..f111a399b3 100644 --- a/apps/tasks/ajax/getdetails.php +++ b/apps/tasks/ajax/getdetails.php @@ -14,7 +14,10 @@ if( !OC_User::isLoggedIn()){ $id = $_GET['id']; $task = OC_Calendar_Object::find($id); $details = Sabre_VObject_Reader::read($task['calendardata'])->VTODO; + +$priority_options = OC_Task_VTodo::getPriorityOptions($l10n); $tmpl = new OC_Template('tasks','part.details'); +$tmpl->assign('priority_options', $priority_options); $tmpl->assign('details',$details); $tmpl->assign('id',$id); $page = $tmpl->fetchPage(); diff --git a/apps/tasks/appinfo/app.php b/apps/tasks/appinfo/app.php index 8bcc6085ec..e94f991f73 100644 --- a/apps/tasks/appinfo/app.php +++ b/apps/tasks/appinfo/app.php @@ -1,6 +1,7 @@ 11, diff --git a/apps/tasks/js/tasks.js b/apps/tasks/js/tasks.js index 528363f423..e145389a95 100644 --- a/apps/tasks/js/tasks.js +++ b/apps/tasks/js/tasks.js @@ -82,6 +82,14 @@ $(document).ready(function(){ return false; }); + $('#tasks_edittaskform #percent_complete').live('change',function(event){ + if ($(event.target).val() == 100){ + $('#tasks_edittaskform #complete').show(); + }else{ + $('#tasks_edittaskform #complete').hide(); + } + }); + $('#tasks_edittaskform input[type="submit"]').live('click',function(){ $.post('ajax/edittask.php',$('#tasks_edittaskform').serialize(),function(jsondata){ if(jsondata.status == 'success'){ @@ -89,7 +97,7 @@ $(document).ready(function(){ $('#task_details').html(jsondata.data.page); } else{ - alert(jsondata.data.message); + alert(jsondata.data.errors);//TODO } }, 'json'); return false; diff --git a/apps/tasks/lib/vtodo.php b/apps/tasks/lib/vtodo.php new file mode 100644 index 0000000000..925ad77dea --- /dev/null +++ b/apps/tasks/lib/vtodo.php @@ -0,0 +1,186 @@ +. + * + */ + +/** + * This class manages our calendars + */ +class OC_Task_VTodo extends OC_Calendar_Object{ + public static function getPriorityOptions($l10n) + { + return array( + '' => $l10n->t('Unspecified'), + '1' => $l10n->t('1=highest'), + '2' => '2', + '3' => '3', + '4' => '4', + '5' => $l10n->t('5=medium'), + '6' => '6', + '7' => '7', + '8' => '8', + '9' => $l10n->t('9=lowest'), + ); + } + public static function validateRequest($request, $l10n) + { + $errors = array(); + if($request['summary'] == ''){ + $errors['summary'] = $l10n->t('Empty Summary'); + } + + if(isset($request['categories']) && !is_array($request['categories'])){ + $errors['categories'] = $l10n->t('Not an array'); + } + + try { + $timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London"); + $timezone = new DateTimeZone($timezone); + new DateTime($request['due'], $timezone); + } catch (Exception $e) { + $errors['due'] = $l10n->t('Invalid date/time'); + } + + if ($request['percent_complete'] < 0 || $request['percent_complete'] > 100){ + $errors['percent_complete'] = $l10n->t('Invalid percent complete'); + } + if ($request['percent_complete'] == 100 && !empty($request['completed'])){ + try { + $timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London"); + $timezone = new DateTimeZone($timezone); + new DateTime($request['completed'], $timezone); + } catch (Exception $e) { + $errors['completed'] = $l10n->t('Invalid date/time'); + } + } + + $priority_options = OC_Task_VTodo::getPriorityOptions($l10n); + if (!in_array($request['priority'], array_keys($priority_options))) { + $errors['priority'] = $l10n->t('Invalid priority'); + } + return $errors; + } + + public static function createVCalendarFromRequest($request) + { + $vcalendar = new Sabre_VObject_Component('VCALENDAR'); + $vcalendar->add('PRODID', 'ownCloud Calendar'); + $vcalendar->add('VERSION', '2.0'); + + $now = new DateTime(); + + $vtodo = new Sabre_VObject_Component('VTODO'); + $vcalendar->add($vtodo); + + $created = new Sabre_VObject_Element_DateTime('CREATED'); + $created->setDateTime($now, Sabre_VObject_Element_DateTime::UTC); + $vtodo->add($created); + + $uid = self::createUID(); + $vtodo->add('UID',$uid); + + return self::updateVCalendarFromRequest($request, $vcalendar); + } + + public static function updateVCalendarFromRequest($request, $vcalendar) + { + $summary = $request['summary']; + $categories = $request['categories']; + $priority = $request['priority']; + $percent_complete = $request['percent_complete']; + $completed = $request['completed']; + $location = $request['location']; + $due = $request['due']; + $description = $request['description']; + + $now = new DateTime(); + $vtodo = $vcalendar->VTODO[0]; + + $last_modified = new Sabre_VObject_Element_DateTime('LAST-MODIFIED'); + $last_modified->setDateTime($now, Sabre_VObject_Element_DateTime::UTC); + $vtodo->__set('LAST-MODIFIED', $last_modified); + + $dtstamp = new Sabre_VObject_Element_DateTime('DTSTAMP'); + $dtstamp->setDateTime($now, Sabre_VObject_Element_DateTime::UTC); + $vtodo->DTSTAMP = $dtstamp; + + $vtodo->SUMMARY = $summary; + + if ($location != '') { + $vtodo->LOCATION = $location; + }else{ + unset($vtodo->LOCATION); + } + + if ($categories != '') { + $vtodo->CATEGORIES = join(',',$categories); + }else{ + unset($vtodo->CATEGORIES); + } + + if ($priority != '') { + $vtodo->PRIORITY = $priority; + }else{ + unset($vtodo->PRIORITY); + } + + if ($description != '') { + $vtodo->DESCRIPTION = $description; + }else{ + unset($vtodo->DESCRIPTION); + } + + if ($due) { + $due_property = new Sabre_VObject_Element_DateTime('DUE'); + $timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London"); + $timezone = new DateTimeZone($timezone); + $due_property->setDateTime(new DateTime($due, $timezone)); + $vtodo->DUE = $due_property; + } else { + unset($vtodo->DUE); + } + + if (!empty($percent_complete)) { + $vtodo->__set('PERCENT-COMPLETE', $percent_complete); + }else{ + $vtodo->__unset('PERCENT-COMPLETE'); + } + + if ($percent_complete == 100){ + if (!$completed){ + $completed = 'now'; + } + } else { + $completed = null; + } + if ($completed) { + $completed_property = new Sabre_VObject_Element_DateTime('COMPLETED'); + $timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London"); + $timezone = new DateTimeZone($timezone); + $completed_property->setDateTime(new DateTime($completed, $timezone)); + $vtodo->COMPLETED = $completed_property; + } else { + unset($vtodo->COMPLETED); + } + + return $vcalendar; + } +} + diff --git a/apps/tasks/templates/part.details.php b/apps/tasks/templates/part.details.php index 574f4c6b8e..a6561d97be 100644 --- a/apps/tasks/templates/part.details.php +++ b/apps/tasks/templates/part.details.php @@ -1,9 +1,42 @@ SUMMARY)): ?> -inc('part.property', array('label' => $l->t('Summary'), 'property' => $_['details']->SUMMARY)); ?> +inc('part.property', array('label' => $l->t('Summary'), 'property' => $_['details']->SUMMARY)); +if(isset($_['details']->LOCATION)): + echo $this->inc('part.property', array('label' => $l->t('Location'), 'property' => $_['details']->LOCATION)); +endif; +if(isset($_['details']->CATEGORIES)): + echo $this->inc('part.property', array('label' => $l->t('Categories'), 'property' => $_['details']->CATEGORIES)); +endif; +if(isset($_['details']->DUE)): + echo $this->inc('part.property', array('label' => $l->t('Due'), 'property' => $_['details']->DUE[0])); +endif; +if(isset($_['details']->PRIORITY)): + echo $this->inc('part.property', array('label' => $l->t('Priority'), 'property' => $_['details']->PRIORITY[0], 'options' => $_['priority_options'])); +endif; +if($_['details']->__isset('PERCENT-COMPLETE') || isset($_['details']->COMPLETED)): +?> + + + '; +endif; +if(isset($_['details']->DESCRIPTION)): + echo $this->inc('part.property', array('label' => $l->t('Description'), 'property' => $_['details']->DESCRIPTION)); +endif; ?>
+ t('Complete') ?> + +__isset('PERCENT-COMPLETE')): + echo $_['details']->__get('PERCENT-COMPLETE')->value.' % '; + endif; + if(isset($_['details']->COMPLETED)): + echo $l->t('on '). $l->l('datetime', $_['details']->COMPLETED[0]->getDateTime()); + endif; + echo '
+ + diff --git a/apps/tasks/templates/part.property.php b/apps/tasks/templates/part.property.php index 68acd68954..591fd363e6 100644 --- a/apps/tasks/templates/part.property.php +++ b/apps/tasks/templates/part.property.php @@ -3,6 +3,20 @@ - value ?> + l('datetime', $_['property']->getDateTime()); + break; + default: + $value = $_['property']->value; + if (isset($_['options'])) + { + $value = $_['options'][$value]; + } + echo nl2br($value); + } + ?> diff --git a/apps/tasks/templates/part.taskform.php b/apps/tasks/templates/part.taskform.php index 8fe917c946..139693c0e9 100644 --- a/apps/tasks/templates/part.taskform.php +++ b/apps/tasks/templates/part.taskform.php @@ -1,2 +1,42 @@ -
+ +
+ + +
+ + +
+ + +
+ + + __get('PERCENT-COMPLETE') && $_['details']->__get('PERCENT-COMPLETE')->value == 100) ? '' : ' style="display:none;"' ?>> + +
+ + +
+
+ +