summaryrefslogtreecommitdiff
path: root/app/Formatter/TaskGanttFormatter.php
diff options
context:
space:
mode:
Diffstat (limited to 'app/Formatter/TaskGanttFormatter.php')
-rw-r--r--app/Formatter/TaskGanttFormatter.php78
1 files changed, 78 insertions, 0 deletions
diff --git a/app/Formatter/TaskGanttFormatter.php b/app/Formatter/TaskGanttFormatter.php
new file mode 100644
index 00000000..3209aa37
--- /dev/null
+++ b/app/Formatter/TaskGanttFormatter.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Kanboard\Formatter;
+
+use Kanboard\Core\Filter\FormatterInterface;
+
+/**
+ * Task Gantt Formatter
+ *
+ * @package formatter
+ * @author Frederic Guillot
+ */
+class TaskGanttFormatter extends BaseFormatter implements FormatterInterface
+{
+ /**
+ * Local cache for project columns
+ *
+ * @access private
+ * @var array
+ */
+ private $columns = array();
+
+ /**
+ * Apply formatter
+ *
+ * @access public
+ * @return array
+ */
+ public function format()
+ {
+ $bars = array();
+
+ foreach ($this->query->findAll() as $task) {
+ $bars[] = $this->formatTask($task);
+ }
+
+ return $bars;
+ }
+
+ /**
+ * Format a single task
+ *
+ * @access private
+ * @param array $task
+ * @return array
+ */
+ private function formatTask(array $task)
+ {
+ if (! isset($this->columns[$task['project_id']])) {
+ $this->columns[$task['project_id']] = $this->column->getList($task['project_id']);
+ }
+
+ $start = $task['date_started'] ?: time();
+ $end = $task['date_due'] ?: $start;
+
+ return array(
+ 'type' => 'task',
+ 'id' => $task['id'],
+ 'title' => $task['title'],
+ 'start' => array(
+ (int) date('Y', $start),
+ (int) date('n', $start),
+ (int) date('j', $start),
+ ),
+ 'end' => array(
+ (int) date('Y', $end),
+ (int) date('n', $end),
+ (int) date('j', $end),
+ ),
+ 'column_title' => $task['column_name'],
+ 'assignee' => $task['assignee_name'] ?: $task['assignee_username'],
+ 'progress' => $this->task->getProgress($task, $this->columns[$task['project_id']]).'%',
+ 'link' => $this->helper->url->href('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])),
+ 'color' => $this->color->getColorProperties($task['color_id']),
+ 'not_defined' => empty($task['date_due']) || empty($task['date_started']),
+ );
+ }
+}