Use BoardFormatter to generate the board

This commit is contained in:
Frederic Guillot
2016-06-24 08:50:57 -04:00
parent d560f84b37
commit 9e278a9370
16 changed files with 667 additions and 217 deletions

View File

@@ -3,8 +3,8 @@
namespace Kanboard\Formatter;
use Kanboard\Core\Base;
use Kanboard\Core\Filter\FormatterInterface;
use PicoDb\Table;
use Pimple\Container;
/**
* Class BaseFormatter
@@ -22,12 +22,25 @@ abstract class BaseFormatter extends Base
*/
protected $query;
/**
* Get object instance
*
* @static
* @access public
* @param Container $container
* @return static
*/
public static function getInstance(Container $container)
{
return new static($container);
}
/**
* Set query
*
* @access public
* @param Table $query
* @return FormatterInterface
* @return $this
*/
public function withQuery(Table $query)
{

View File

@@ -0,0 +1,79 @@
<?php
namespace Kanboard\Formatter;
use Kanboard\Core\Filter\FormatterInterface;
/**
* Board Column Formatter
*
* @package formatter
* @author Frederic Guillot
*/
class BoardColumnFormatter extends BaseFormatter implements FormatterInterface
{
protected $swimlaneId = 0;
protected $columns = array();
protected $tasks = array();
/**
* Set swimlaneId
*
* @access public
* @param integer $swimlaneId
* @return $this
*/
public function withSwimlaneId($swimlaneId)
{
$this->swimlaneId = $swimlaneId;
return $this;
}
/**
* Set columns
*
* @access public
* @param array $columns
* @return $this
*/
public function withColumns(array $columns)
{
$this->columns = $columns;
return $this;
}
/**
* Set tasks
*
* @access public
* @param array $tasks
* @return $this
*/
public function withTasks(array $tasks)
{
$this->tasks = $tasks;
return $this;
}
/**
* Apply formatter
*
* @access public
* @return array
*/
public function format()
{
foreach ($this->columns as &$column) {
$column['tasks'] = BoardTaskFormatter::getInstance($this->container)
->withTasks($this->tasks)
->withSwimlaneId($this->swimlaneId)
->withColumnId($column['id'])
->format();
$column['nb_tasks'] = count($column['tasks']);
$column['score'] = (int) array_column_sum($column['tasks'], 'score');
}
return $this->columns;
}
}

View File

@@ -28,7 +28,7 @@ class BoardFormatter extends BaseFormatter implements FormatterInterface
* @param integer $projectId
* @return $this
*/
public function setProjectId($projectId)
public function withProjectId($projectId)
{
$this->projectId = $projectId;
return $this;
@@ -42,15 +42,22 @@ class BoardFormatter extends BaseFormatter implements FormatterInterface
*/
public function format()
{
$swimlanes = $this->swimlaneModel->getSwimlanes($this->projectId);
$columns = $this->columnModel->getAll($this->projectId);
$tasks = $this->query
->eq(TaskModel::TABLE.'.project_id', $this->projectId)
->asc(TaskModel::TABLE.'.position')
->findAll();
return $this->boardModel->getBoard($this->projectId, function ($project_id, $column_id, $swimlane_id) use ($tasks) {
return array_filter($tasks, function (array $task) use ($column_id, $swimlane_id) {
return $task['column_id'] == $column_id && $task['swimlane_id'] == $swimlane_id;
});
});
if (empty($swimlanes) || empty($columns)) {
return array();
}
return BoardSwimlaneFormatter::getInstance($this->container)
->withSwimlanes($swimlanes)
->withColumns($columns)
->withTasks($tasks)
->format();
}
}

View File

@@ -0,0 +1,105 @@
<?php
namespace Kanboard\Formatter;
use Kanboard\Core\Filter\FormatterInterface;
/**
* Board Swimlane Formatter
*
* @package formatter
* @author Frederic Guillot
*/
class BoardSwimlaneFormatter extends BaseFormatter implements FormatterInterface
{
protected $swimlanes = array();
protected $columns = array();
protected $tasks = array();
/**
* Set swimlanes
*
* @access public
* @param array $swimlanes
* @return $this
*/
public function withSwimlanes($swimlanes)
{
$this->swimlanes = $swimlanes;
return $this;
}
/**
* Set columns
*
* @access public
* @param array $columns
* @return $this
*/
public function withColumns($columns)
{
$this->columns = $columns;
return $this;
}
/**
* Set tasks
*
* @access public
* @param array $tasks
* @return $this
*/
public function withTasks(array $tasks)
{
$this->tasks = $tasks;
return $this;
}
/**
* Apply formatter
*
* @access public
* @return array
*/
public function format()
{
$nb_swimlanes = count($this->swimlanes);
$nb_columns = count($this->columns);
foreach ($this->swimlanes as &$swimlane) {
$swimlane['columns'] = BoardColumnFormatter::getInstance($this->container)
->withSwimlaneId($swimlane['id'])
->withColumns($this->columns)
->withTasks($this->tasks)
->format();
$swimlane['nb_swimlanes'] = $nb_swimlanes;
$swimlane['nb_columns'] = $nb_columns;
$swimlane['nb_tasks'] = array_column_sum($swimlane['columns'], 'nb_tasks');
$swimlane['score'] = array_column_sum($swimlane['columns'], 'score');
$this->calculateStatsByColumnAcrossSwimlanes($swimlane['columns']);
}
return $this->swimlanes;
}
/**
* Calculate stats for each column acrosss all swimlanes
*
* @access protected
* @param array $columns
*/
protected function calculateStatsByColumnAcrossSwimlanes(array $columns)
{
foreach ($columns as $columnIndex => $column) {
if (! isset($this->swimlanes[0]['columns'][$columnIndex]['column_nb_tasks'])) {
$this->swimlanes[0]['columns'][$columnIndex]['column_nb_tasks'] = 0;
$this->swimlanes[0]['columns'][$columnIndex]['column_score'] = 0;
}
$this->swimlanes[0]['columns'][$columnIndex]['column_nb_tasks'] += $column['nb_tasks'];
$this->swimlanes[0]['columns'][$columnIndex]['column_score'] += $column['score'];
}
}
}

View File

@@ -0,0 +1,80 @@
<?php
namespace Kanboard\Formatter;
use Kanboard\Core\Filter\FormatterInterface;
/**
* Board Task Formatter
*
* @package formatter
* @author Frederic Guillot
*/
class BoardTaskFormatter extends BaseFormatter implements FormatterInterface
{
protected $tasks = array();
protected $columnId = 0;
protected $swimlaneId = 0;
/**
* Set tasks
*
* @access public
* @param array $tasks
* @return $this
*/
public function withTasks(array $tasks)
{
$this->tasks = $tasks;
return $this;
}
/**
* Set columnId
*
* @access public
* @param integer $columnId
* @return $this
*/
public function withColumnId($columnId)
{
$this->columnId = $columnId;
return $this;
}
/**
* Set swimlaneId
*
* @access public
* @param integer $swimlaneId
* @return $this
*/
public function withSwimlaneId($swimlaneId)
{
$this->swimlaneId = $swimlaneId;
return $this;
}
/**
* Apply formatter
*
* @access public
* @return array
*/
public function format()
{
return array_values(array_filter($this->tasks, array($this, 'filterTasks')));
}
/**
* Keep only tasks of the given column and swimlane
*
* @access public
* @param array $task
* @return bool
*/
public function filterTasks(array $task)
{
return $task['column_id'] == $this->columnId && $task['swimlane_id'] == $this->swimlaneId;
}
}