|
<?php |
|
|
|
namespace Kanboard\Formatter; |
|
|
|
use DateTime; |
|
use Eluceo\iCal\Component\Calendar; |
|
use Eluceo\iCal\Component\Event; |
|
use Eluceo\iCal\Property\Event\Attendees; |
|
use Eluceo\iCal\Property\Event\Organizer; |
|
use Kanboard\Core\Filter\FormatterInterface; |
|
use PicoDb\Table; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TaskICalFormatter extends BaseFormatter implements FormatterInterface |
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
protected $vCalendar; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function format() |
|
{ |
|
return $this->vCalendar->render(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function setCalendar(Calendar $vCalendar) |
|
{ |
|
$this->vCalendar = $vCalendar; |
|
return $this; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function addTasksWithStartAndDueDate(Table $query, $startColumn, $endColumn) |
|
{ |
|
foreach ($query->findAll() as $task) { |
|
$start = new DateTime; |
|
$start->setTimestamp($task[$startColumn]); |
|
|
|
$end = new DateTime; |
|
$end->setTimestamp($task[$endColumn] ?: time()); |
|
|
|
$vEvent = $this->getTaskIcalEvent($task, 'task-#'.$task['id'].'-'.$startColumn.'-'.$endColumn); |
|
$vEvent->setDtStart($start); |
|
$vEvent->setDtEnd($end); |
|
|
|
$this->vCalendar->addComponent($vEvent); |
|
} |
|
|
|
return $this; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function addTasksWithDueDateOnly(Table $query) |
|
{ |
|
foreach ($query->findAll() as $task) { |
|
$date = new DateTime; |
|
$date->setTimestamp($task['date_due']); |
|
|
|
$vEvent = $this->getTaskIcalEvent($task, 'task-#'.$task['id'].'-date_due'); |
|
$vEvent->setDtStart($date); |
|
$vEvent->setDtEnd($date); |
|
|
|
if ($date->format('Hi') === '0000') { |
|
$vEvent->setNoTime(true); |
|
} |
|
|
|
$this->vCalendar->addComponent($vEvent); |
|
} |
|
|
|
return $this; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected function getTaskIcalEvent(array &$task, $uid) |
|
{ |
|
$dateCreation = new DateTime; |
|
$dateCreation->setTimestamp($task['date_creation']); |
|
|
|
$dateModif = new DateTime; |
|
$dateModif->setTimestamp($task['date_modification']); |
|
|
|
$vEvent = new Event($uid); |
|
$vEvent->setCreated($dateCreation); |
|
$vEvent->setModified($dateModif); |
|
$vEvent->setUseTimezone(true); |
|
$vEvent->setSummary(t('#%d', $task['id']).' '.$task['title']); |
|
$vEvent->setDescription($task['description']); |
|
$vEvent->setDescriptionHTML($this->helper->text->markdown($task['description'])); |
|
$vEvent->setUrl($this->helper->url->base().$this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id']))); |
|
|
|
if (! empty($task['owner_id'])) { |
|
$attendees = new Attendees; |
|
$attendees->add( |
|
'MAILTO:'.($task['assignee_email'] ?: $task['assignee_username'].'@kanboard.local'), |
|
array('CN' => $task['assignee_name'] ?: $task['assignee_username']) |
|
); |
|
$vEvent->setAttendees($attendees); |
|
} |
|
|
|
if (! empty($task['creator_id'])) { |
|
$vEvent->setOrganizer(new Organizer( |
|
'MAILTO:' . $task['creator_email'] ?: $task['creator_username'].'@kanboard.local', |
|
array('CN' => $task['creator_name'] ?: $task['creator_username']) |
|
)); |
|
} |
|
|
|
return $vEvent; |
|
} |
|
} |
|
|