Add basic fields to tasks app

This commit is contained in:
Bart Visscher 2011-09-13 22:44:15 +02:00
parent 78863696b7
commit 8826aa8056
10 changed files with 323 additions and 27 deletions

View file

@ -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();

View file

@ -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 )));

View file

@ -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 )));

View file

@ -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();

View file

@ -1,6 +1,7 @@
<?php
$l=new OC_L10N('tasks');
OC::$CLASSPATH['OC_Calendar_Calendar'] = 'apps/calendar/lib/calendar.php';
OC::$CLASSPATH['OC_Task_VTodo'] = 'apps/tasks/lib/vtodo.php';
OC_App::register( array(
'order' => 11,

View file

@ -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;

186
apps/tasks/lib/vtodo.php Normal file
View file

@ -0,0 +1,186 @@
<?php
/**
* ownCloud - Calendar
*
* @author Bart Visscher
* @copyright 2011 Bart Visscher bartv@thisnet.nl
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
/**
* 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;
}
}

View file

@ -1,9 +1,42 @@
<?php if(isset($_['details']->SUMMARY)): ?>
<table>
<?php echo $this->inc('part.property', array('label' => $l->t('Summary'), 'property' => $_['details']->SUMMARY)); ?>
<?php
echo $this->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)):
?>
<tr>
<th>
<?php echo $l->t('Complete') ?>
</th>
<td>
<?php if($_['details']->__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 '</tr>';
endif;
if(isset($_['details']->DESCRIPTION)):
echo $this->inc('part.property', array('label' => $l->t('Description'), 'property' => $_['details']->DESCRIPTION));
endif; ?>
</table>
<form>
<input type="button" id="tasks_delete" value="<?php echo $l->t('Delete');?>">
<input type="button" id="tasks_edit" value="<?php echo $l->t('Edit');?>">
</form>
<?php else: ?>
<?php var_dump($_['details']); ?>
<?php endif ?>

View file

@ -3,6 +3,20 @@
<?php echo $_['label'] ?>
</th>
<td>
<?php echo $_['property']->value ?>
<?php
switch (get_class($_['property']))
{
case 'Sabre_VObject_Element_DateTime':
echo $l->l('datetime', $_['property']->getDateTime());
break;
default:
$value = $_['property']->value;
if (isset($_['options']))
{
$value = $_['options'][$value];
}
echo nl2br($value);
}
?>
</td>
</tr>

View file

@ -1,2 +1,42 @@
<label for="summary"><?php echo $l->t('Summary'); ?></label>
<input type="text" id="summary" name="summary" value="<?php echo isset($_['details']->SUMMARY) ? $_['details']->SUMMARY[0]->value : '' ?>"><br>
<input type="text" id="summary" name="summary" placeholder="<?php echo $l->t('Summary of the task');?>" value="<?php echo isset($_['details']->SUMMARY) ? $_['details']->SUMMARY[0]->value : '' ?>">
<br>
<label for="location"><?php echo $l->t('Location'); ?></label>
<input type="text" id="location" name="location" placeholder="<?php echo $l->t('Location of the task');?>" value="<?php echo isset($_['details']->LOCATION) ? $_['details']->LOCATION[0]->value : '' ?>">
<br>
<label for="categories"><?php echo $l->t('Categories'); ?></label>
<select name="categories[]" multiple="multiple">
<?php
var_dump($_['categories']);
foreach($_['category_options'] as $category){
echo '<option value="' . $category . '"' . (in_array($category, $_['categories']) ? ' selected="selected"' : '') . '>' . $category . '</option>';
}
?>
</select>
<br>
<label for="due"><?php echo $l->t('Due'); ?></label>
<input type="text" id="due" name="due" placeholder="<?php echo $l->t('Due date') ?>" value="<?php echo isset($_['details']->DUE) ? $l->l('datetime', $_['details']->DUE[0]->getDateTime()) : '' ?>">
<br>
<select name="percent_complete" id="percent_complete">
<?php
foreach($_['percent_options'] as $percent){
echo '<option value="' . $percent . '"' . (($_['details']->__get('PERCENT-COMPLETE') && $percent == $_['details']->__get('PERCENT-COMPLETE')->value) ? ' selected="selected"' : '') . '>' . $percent . ' %</option>';
}
?>
</select>
<label for="percent_complete"><?php echo $l->t('Complete'); ?></label>
<span id="complete"<?php echo ($_['details']->__get('PERCENT-COMPLETE') && $_['details']->__get('PERCENT-COMPLETE')->value == 100) ? '' : ' style="display:none;"' ?>><label for="completed"><?php echo $l->t('completed on'); ?></label>
<input type="text" id="completed" name="completed" value="<?php echo isset($_['details']->COMPLETED) ? $l->l('datetime', $_['details']->COMPLETED[0]->getDateTime()) : '' ?>"></span>
<br>
<label for="priority"><?php echo $l->t('Priority'); ?></label>
<select name="priority">
<?php
foreach($_['priority_options'] as $priority => $label){
echo '<option value="' . $priority . '"' . ((isset($_['details']->PRIORITY) && $priority == $_['details']->PRIORITY->value) ? ' selected="selected"' : '') . '>' . $label . '</option>';
}
?>
</select>
<br>
<label for="description"><?php echo $l->t('Description'); ?></label><br>
<textarea placeholder="<?php echo $l->t('Description of the task');?>" name="description"><?php echo isset($_['details']->DESCRIPTION) ? $_['details']->DESCRIPTION[0]->value : '' ?></textarea>
<br>