summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--app/Action/CommentCreationMoveTaskColumn.php2
-rw-r--r--app/Action/TaskDuplicateAnotherProject.php2
-rw-r--r--app/Analytic/AverageTimeSpentColumnAnalytic.php2
-rw-r--r--app/Analytic/TaskDistributionAnalytic.php2
-rw-r--r--app/Api/Board.php35
-rw-r--r--app/Api/Column.php42
-rw-r--r--app/Controller/Action.php4
-rw-r--r--app/Controller/BoardPopover.php4
-rw-r--r--app/Controller/Column.php16
-rw-r--r--app/Controller/Gantt.php2
-rw-r--r--app/Controller/Task.php4
-rw-r--r--app/Controller/Taskcreation.php2
-rw-r--r--app/Controller/Taskduplication.php2
-rw-r--r--app/Formatter/TaskFilterGanttFormatter.php2
-rw-r--r--app/Helper/Task.php2
-rw-r--r--app/Model/ActionParameter.php4
-rw-r--r--app/Model/Board.php268
-rw-r--r--app/Model/Column.php145
-rw-r--r--app/Model/Project.php4
-rw-r--r--app/Model/ProjectDailyColumnStats.php2
-rw-r--r--app/Model/TaskAnalytic.php2
-rw-r--r--app/Model/TaskCreation.php2
-rw-r--r--app/Model/TaskDuplication.php8
-rw-r--r--app/Model/TaskFilter.php2
-rw-r--r--app/Model/TaskFinder.php10
-rw-r--r--app/Model/TaskImport.php2
-rw-r--r--app/Model/TaskLink.php6
-rw-r--r--app/Model/Transition.php8
-rw-r--r--app/Subscriber/RecurringTaskSubscriber.php4
-rw-r--r--jsonrpc.php2
-rw-r--r--tests/integration/ApiTest.php70
-rw-r--r--tests/integration/BoardTest.php21
-rw-r--r--tests/integration/ColumnTest.php65
-rw-r--r--tests/units/Model/ActionTest.php6
-rw-r--r--tests/units/Model/BoardTest.php227
-rw-r--r--tests/units/Model/ColumnTest.php168
-rw-r--r--tests/units/Model/ProjectTest.php2
-rw-r--r--tests/units/Model/TaskPositionTest.php14
39 files changed, 511 insertions, 655 deletions
diff --git a/ChangeLog b/ChangeLog
index ae7919bf..190a57ad 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -16,6 +16,7 @@ Improvements:
* Improve image thumbnails and files table
* Add confirmation inline popup to remove custom filter
* Increase client_max_body_size value for Nginx
+* Split Board model into multiple classes
Bug fixes:
diff --git a/app/Action/CommentCreationMoveTaskColumn.php b/app/Action/CommentCreationMoveTaskColumn.php
index 4473cf91..11224d67 100644
--- a/app/Action/CommentCreationMoveTaskColumn.php
+++ b/app/Action/CommentCreationMoveTaskColumn.php
@@ -71,7 +71,7 @@ class CommentCreationMoveTaskColumn extends Base
return false;
}
- $column = $this->board->getColumn($data['column_id']);
+ $column = $this->column->getById($data['column_id']);
return (bool) $this->comment->create(array(
'comment' => t('Moved to column %s', $column['title']),
diff --git a/app/Action/TaskDuplicateAnotherProject.php b/app/Action/TaskDuplicateAnotherProject.php
index 5bcdce08..5f05136e 100644
--- a/app/Action/TaskDuplicateAnotherProject.php
+++ b/app/Action/TaskDuplicateAnotherProject.php
@@ -74,7 +74,7 @@ class TaskDuplicateAnotherProject extends Base
*/
public function doAction(array $data)
{
- $destination_column_id = $this->board->getFirstColumn($this->getParam('project_id'));
+ $destination_column_id = $this->column->getFirstColumnId($this->getParam('project_id'));
return (bool) $this->taskDuplication->duplicateToProject($data['task_id'], $this->getParam('project_id'), null, $destination_column_id);
}
diff --git a/app/Analytic/AverageTimeSpentColumnAnalytic.php b/app/Analytic/AverageTimeSpentColumnAnalytic.php
index c3cff548..bef55419 100644
--- a/app/Analytic/AverageTimeSpentColumnAnalytic.php
+++ b/app/Analytic/AverageTimeSpentColumnAnalytic.php
@@ -40,7 +40,7 @@ class AverageTimeSpentColumnAnalytic extends Base
private function initialize($project_id)
{
$stats = array();
- $columns = $this->board->getColumnsList($project_id);
+ $columns = $this->column->getList($project_id);
foreach ($columns as $column_id => $column_title) {
$stats[$column_id] = array(
diff --git a/app/Analytic/TaskDistributionAnalytic.php b/app/Analytic/TaskDistributionAnalytic.php
index 614c5f72..838652e3 100644
--- a/app/Analytic/TaskDistributionAnalytic.php
+++ b/app/Analytic/TaskDistributionAnalytic.php
@@ -23,7 +23,7 @@ class TaskDistributionAnalytic extends Base
{
$metrics = array();
$total = 0;
- $columns = $this->board->getColumns($project_id);
+ $columns = $this->column->getAll($project_id);
foreach ($columns as $column) {
$nb_tasks = $this->taskFinder->countByColumnId($project_id, $column['id']);
diff --git a/app/Api/Board.php b/app/Api/Board.php
index d615b1dc..185ac51a 100644
--- a/app/Api/Board.php
+++ b/app/Api/Board.php
@@ -15,39 +15,4 @@ class Board extends Base
$this->checkProjectPermission($project_id);
return $this->board->getBoard($project_id);
}
-
- public function getColumns($project_id)
- {
- return $this->board->getColumns($project_id);
- }
-
- public function getColumn($column_id)
- {
- return $this->board->getColumn($column_id);
- }
-
- public function moveColumnUp($project_id, $column_id)
- {
- return $this->board->moveUp($project_id, $column_id);
- }
-
- public function moveColumnDown($project_id, $column_id)
- {
- return $this->board->moveDown($project_id, $column_id);
- }
-
- public function updateColumn($column_id, $title, $task_limit = 0, $description = '')
- {
- return $this->board->updateColumn($column_id, $title, $task_limit, $description);
- }
-
- public function addColumn($project_id, $title, $task_limit = 0, $description = '')
- {
- return $this->board->addColumn($project_id, $title, $task_limit, $description);
- }
-
- public function removeColumn($column_id)
- {
- return $this->board->removeColumn($column_id);
- }
}
diff --git a/app/Api/Column.php b/app/Api/Column.php
new file mode 100644
index 00000000..ddc3a5d0
--- /dev/null
+++ b/app/Api/Column.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Kanboard\Api;
+
+/**
+ * Column API controller
+ *
+ * @package api
+ * @author Frederic Guillot
+ */
+class Column extends Base
+{
+ public function getColumns($project_id)
+ {
+ return $this->column->getAll($project_id);
+ }
+
+ public function getColumn($column_id)
+ {
+ return $this->column->getById($column_id);
+ }
+
+ public function updateColumn($column_id, $title, $task_limit = 0, $description = '')
+ {
+ return $this->column->update($column_id, $title, $task_limit, $description);
+ }
+
+ public function addColumn($project_id, $title, $task_limit = 0, $description = '')
+ {
+ return $this->column->create($project_id, $title, $task_limit, $description);
+ }
+
+ public function removeColumn($column_id)
+ {
+ return $this->column->remove($column_id);
+ }
+
+ public function changeColumnPosition($project_id, $column_id, $position)
+ {
+ return $this->column->changePosition($project_id, $column_id, $position);
+ }
+}
diff --git a/app/Controller/Action.php b/app/Controller/Action.php
index 482a210b..6c324324 100644
--- a/app/Controller/Action.php
+++ b/app/Controller/Action.php
@@ -27,7 +27,7 @@ class Action extends Base
'available_actions' => $this->actionManager->getAvailableActions(),
'available_events' => $this->eventManager->getAll(),
'available_params' => $this->actionManager->getAvailableParameters($actions),
- 'columns_list' => $this->board->getColumnsList($project['id']),
+ 'columns_list' => $this->column->getList($project['id']),
'users_list' => $this->projectUserRole->getAssignableUsersList($project['id']),
'projects_list' => $this->projectUserRole->getProjectsByUser($this->userSession->getId()),
'colors_list' => $this->color->getList(),
@@ -86,7 +86,7 @@ class Action extends Base
$this->response->html($this->helper->layout->project('action/params', array(
'values' => $values,
'action_params' => $action_params,
- 'columns_list' => $this->board->getColumnsList($project['id']),
+ 'columns_list' => $this->column->getList($project['id']),
'users_list' => $this->projectUserRole->getAssignableUsersList($project['id']),
'projects_list' => $projects_list,
'colors_list' => $this->color->getList(),
diff --git a/app/Controller/BoardPopover.php b/app/Controller/BoardPopover.php
index 965669ff..63dab302 100644
--- a/app/Controller/BoardPopover.php
+++ b/app/Controller/BoardPopover.php
@@ -112,7 +112,7 @@ class BoardPopover extends Base
$this->response->html($this->template->render('board/popover_close_all_tasks_column', array(
'project' => $project,
'nb_tasks' => $this->taskFinder->countByColumnAndSwimlaneId($project['id'], $column_id, $swimlane_id),
- 'column' => $this->board->getColumnTitleById($column_id),
+ 'column' => $this->column->getColumnTitleById($column_id),
'swimlane' => $this->swimlane->getNameById($swimlane_id) ?: t($project['default_swimlane']),
'values' => array('column_id' => $column_id, 'swimlane_id' => $swimlane_id),
)));
@@ -129,7 +129,7 @@ class BoardPopover extends Base
$values = $this->request->getValues();
$this->taskStatus->closeTasksBySwimlaneAndColumn($values['swimlane_id'], $values['column_id']);
- $this->flash->success(t('All tasks of the column "%s" and the swimlane "%s" have been closed successfully.', $this->board->getColumnTitleById($values['column_id']), $this->swimlane->getNameById($values['swimlane_id']) ?: t($project['default_swimlane'])));
+ $this->flash->success(t('All tasks of the column "%s" and the swimlane "%s" have been closed successfully.', $this->column->getColumnTitleById($values['column_id']), $this->swimlane->getNameById($values['swimlane_id']) ?: t($project['default_swimlane'])));
$this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $project['id'])));
}
}
diff --git a/app/Controller/Column.php b/app/Controller/Column.php
index 329413ef..e02c7dcb 100644
--- a/app/Controller/Column.php
+++ b/app/Controller/Column.php
@@ -18,7 +18,7 @@ class Column extends Base
public function index()
{
$project = $this->getProject();
- $columns = $this->board->getColumns($project['id']);
+ $columns = $this->column->getAll($project['id']);
$this->response->html($this->helper->layout->project('column/index', array(
'columns' => $columns,
@@ -35,7 +35,7 @@ class Column extends Base
public function create(array $values = array(), array $errors = array())
{
$project = $this->getProject();
- $columns = $this->board->getColumnsList($project['id']);
+ $columns = $this->column->getList($project['id']);
if (empty($values)) {
$values = array('project_id' => $project['id']);
@@ -62,7 +62,7 @@ class Column extends Base
list($valid, $errors) = $this->columnValidator->validateCreation($values);
if ($valid) {
- if ($this->board->addColumn($project['id'], $values['title'], $values['task_limit'], $values['description'])) {
+ if ($this->column->create($project['id'], $values['title'], $values['task_limit'], $values['description'])) {
$this->flash->success(t('Column created successfully.'));
return $this->response->redirect($this->helper->url->to('column', 'index', array('project_id' => $project['id'])), true);
} else {
@@ -81,7 +81,7 @@ class Column extends Base
public function edit(array $values = array(), array $errors = array())
{
$project = $this->getProject();
- $column = $this->board->getColumn($this->request->getIntegerParam('column_id'));
+ $column = $this->column->getById($this->request->getIntegerParam('column_id'));
$this->response->html($this->helper->layout->project('column/edit', array(
'errors' => $errors,
@@ -105,7 +105,7 @@ class Column extends Base
list($valid, $errors) = $this->columnValidator->validateModification($values);
if ($valid) {
- if ($this->board->updateColumn($values['id'], $values['title'], $values['task_limit'], $values['description'])) {
+ if ($this->column->update($values['id'], $values['title'], $values['task_limit'], $values['description'])) {
$this->flash->success(t('Board updated successfully.'));
$this->response->redirect($this->helper->url->to('column', 'index', array('project_id' => $project['id'])));
} else {
@@ -144,7 +144,7 @@ class Column extends Base
$project = $this->getProject();
$this->response->html($this->helper->layout->project('column/remove', array(
- 'column' => $this->board->getColumn($this->request->getIntegerParam('column_id')),
+ 'column' => $this->column->getById($this->request->getIntegerParam('column_id')),
'project' => $project,
'title' => t('Remove a column from a board')
)));
@@ -159,9 +159,9 @@ class Column extends Base
{
$project = $this->getProject();
$this->checkCSRFParam();
- $column = $this->board->getColumn($this->request->getIntegerParam('column_id'));
+ $column_id = $this->request->getIntegerParam('column_id');
- if (! empty($column) && $this->board->removeColumn($column['id'])) {
+ if ($this->column->remove($column_id)) {
$this->flash->success(t('Column removed successfully.'));
} else {
$this->flash->failure(t('Unable to remove this column.'));
diff --git a/app/Controller/Gantt.php b/app/Controller/Gantt.php
index 5dbd1243..9ffa277f 100644
--- a/app/Controller/Gantt.php
+++ b/app/Controller/Gantt.php
@@ -103,7 +103,7 @@ class Gantt extends Base
$values = $values + array(
'project_id' => $project['id'],
- 'column_id' => $this->board->getFirstColumn($project['id']),
+ 'column_id' => $this->column->getFirstColumnId($project['id']),
'position' => 1
);
diff --git a/app/Controller/Task.php b/app/Controller/Task.php
index 98b7a041..539d377b 100644
--- a/app/Controller/Task.php
+++ b/app/Controller/Task.php
@@ -36,7 +36,7 @@ class Task extends Base
'subtasks' => $this->subtask->getAll($task['id']),
'links' => $this->taskLink->getAllGroupedByLabel($task['id']),
'task' => $task,
- 'columns_list' => $this->board->getColumnsList($task['project_id']),
+ 'columns_list' => $this->column->getList($task['project_id']),
'colors_list' => $this->color->getList(),
'title' => $task['title'],
'no_layout' => true,
@@ -74,7 +74,7 @@ class Task extends Base
'task' => $task,
'values' => $values,
'link_label_list' => $this->link->getList(0, false),
- 'columns_list' => $this->board->getColumnsList($task['project_id']),
+ 'columns_list' => $this->column->getList($task['project_id']),
'colors_list' => $this->color->getList(),
'users_list' => $this->projectUserRole->getAssignableUsersList($task['project_id'], true, false, false),
'title' => $task['project_name'].' &gt; '.$task['title'],
diff --git a/app/Controller/Taskcreation.php b/app/Controller/Taskcreation.php
index f1ac7272..1d8a0e29 100644
--- a/app/Controller/Taskcreation.php
+++ b/app/Controller/Taskcreation.php
@@ -36,7 +36,7 @@ class Taskcreation extends Base
'project' => $project,
'errors' => $errors,
'values' => $values + array('project_id' => $project['id']),
- 'columns_list' => $this->board->getColumnsList($project['id']),
+ 'columns_list' => $this->column->getList($project['id']),
'users_list' => $this->projectUserRole->getAssignableUsersList($project['id'], true, false, true),
'colors_list' => $this->color->getList(),
'categories_list' => $this->category->getList($project['id']),
diff --git a/app/Controller/Taskduplication.php b/app/Controller/Taskduplication.php
index 7e7fccd6..7641a48d 100644
--- a/app/Controller/Taskduplication.php
+++ b/app/Controller/Taskduplication.php
@@ -115,7 +115,7 @@ class Taskduplication extends Base
$dst_project_id = $this->request->getIntegerParam('dst_project_id', key($projects_list));
$swimlanes_list = $this->swimlane->getList($dst_project_id, false, true);
- $columns_list = $this->board->getColumnsList($dst_project_id);
+ $columns_list = $this->column->getList($dst_project_id);
$categories_list = $this->category->getList($dst_project_id);
$users_list = $this->projectUserRole->getAssignableUsersList($dst_project_id);
diff --git a/app/Formatter/TaskFilterGanttFormatter.php b/app/Formatter/TaskFilterGanttFormatter.php
index 08059d4c..a4eef1ee 100644
--- a/app/Formatter/TaskFilterGanttFormatter.php
+++ b/app/Formatter/TaskFilterGanttFormatter.php
@@ -47,7 +47,7 @@ class TaskFilterGanttFormatter extends TaskFilter implements FormatterInterface
private function formatTask(array $task)
{
if (! isset($this->columns[$task['project_id']])) {
- $this->columns[$task['project_id']] = $this->board->getColumnsList($task['project_id']);
+ $this->columns[$task['project_id']] = $this->column->getList($task['project_id']);
}
$start = $task['date_started'] ?: time();
diff --git a/app/Helper/Task.php b/app/Helper/Task.php
index e85d6e30..6058c099 100644
--- a/app/Helper/Task.php
+++ b/app/Helper/Task.php
@@ -178,7 +178,7 @@ class Task extends Base
public function getProgress($task)
{
if (! isset($this->columns[$task['project_id']])) {
- $this->columns[$task['project_id']] = $this->board->getColumnsList($task['project_id']);
+ $this->columns[$task['project_id']] = $this->column->getList($task['project_id']);
}
return $this->task->getProgress($task, $this->columns[$task['project_id']]);
diff --git a/app/Model/ActionParameter.php b/app/Model/ActionParameter.php
index 62b03142..53edcbc8 100644
--- a/app/Model/ActionParameter.php
+++ b/app/Model/ActionParameter.php
@@ -150,8 +150,8 @@ class ActionParameter extends Base
case 'dest_column_id':
case 'dst_column_id':
case 'column_id':
- $column = $this->board->getColumn($value);
- return empty($column) ? false : $this->board->getColumnIdByTitle($project_id, $column['title']) ?: false;
+ $column = $this->column->getById($value);
+ return empty($column) ? false : $this->column->getColumnIdByTitle($project_id, $column['title']) ?: false;
case 'user_id':
case 'owner_id':
return $this->projectPermission->isAssignable($project_id, $value) ? $value : false;
diff --git a/app/Model/Board.php b/app/Model/Board.php
index 0f980f68..f677266f 100644
--- a/app/Model/Board.php
+++ b/app/Model/Board.php
@@ -13,13 +13,6 @@ use PicoDb\Database;
class Board extends Base
{
/**
- * SQL table name
- *
- * @var string
- */
- const TABLE = 'columns';
-
- /**
* Get Kanboard default columns
*
* @access public
@@ -73,7 +66,7 @@ class Board extends Base
'description' => $column['description'],
);
- if (! $this->db->table(self::TABLE)->save($values)) {
+ if (! $this->db->table(Column::TABLE)->save($values)) {
return false;
}
}
@@ -91,7 +84,7 @@ class Board extends Base
*/
public function duplicate($project_from, $project_to)
{
- $columns = $this->db->table(Board::TABLE)
+ $columns = $this->db->table(Column::TABLE)
->columns('title', 'task_limit', 'description')
->eq('project_id', $project_from)
->asc('position')
@@ -101,134 +94,6 @@ class Board extends Base
}
/**
- * Add a new column to the board
- *
- * @access public
- * @param integer $project_id Project id
- * @param string $title Column title
- * @param integer $task_limit Task limit
- * @param string $description Column description
- * @return boolean|integer
- */
- public function addColumn($project_id, $title, $task_limit = 0, $description = '')
- {
- $values = array(
- 'project_id' => $project_id,
- 'title' => $title,
- 'task_limit' => intval($task_limit),
- 'position' => $this->getLastColumnPosition($project_id) + 1,
- 'description' => $description,
- );
-
- return $this->persist(self::TABLE, $values);
- }
-
- /**
- * Update a column
- *
- * @access public
- * @param integer $column_id Column id
- * @param string $title Column title
- * @param integer $task_limit Task limit
- * @param string $description Optional description
- * @return boolean
- */
- public function updateColumn($column_id, $title, $task_limit = 0, $description = '')
- {
- return $this->db->table(self::TABLE)->eq('id', $column_id)->update(array(
- 'title' => $title,
- 'task_limit' => intval($task_limit),
- 'description' => $description,
- ));
- }
-
- /**
- * Get columns with consecutive positions
- *
- * If you remove a column, the positions are not anymore consecutives
- *
- * @access public
- * @param integer $project_id
- * @return array
- */
- public function getNormalizedColumnPositions($project_id)
- {
- $columns = $this->db->hashtable(self::TABLE)->eq('project_id', $project_id)->asc('position')->getAll('id', 'position');
- $position = 1;
-
- foreach ($columns as $column_id => $column_position) {
- $columns[$column_id] = $position++;
- }
-
- return $columns;
- }
-
- /**
- * Save the new positions for a set of columns
- *
- * @access public
- * @param array $columns Hashmap of column_id/column_position
- * @return boolean
- */
- public function saveColumnPositions(array $columns)
- {
- return $this->db->transaction(function (Database $db) use ($columns) {
-
- foreach ($columns as $column_id => $position) {
- if (! $db->table(Board::TABLE)->eq('id', $column_id)->update(array('position' => $position))) {
- return false;
- }
- }
- });
- }
-
- /**
- * Move a column down, increment the column position value
- *
- * @access public
- * @param integer $project_id Project id
- * @param integer $column_id Column id
- * @return boolean
- */
- public function moveDown($project_id, $column_id)
- {
- $columns = $this->getNormalizedColumnPositions($project_id);
- $positions = array_flip($columns);
-
- if (isset($columns[$column_id]) && $columns[$column_id] < count($columns)) {
- $position = ++$columns[$column_id];
- $columns[$positions[$position]]--;
-
- return $this->saveColumnPositions($columns);
- }
-
- return false;
- }
-
- /**
- * Move a column up, decrement the column position value
- *
- * @access public
- * @param integer $project_id Project id
- * @param integer $column_id Column id
- * @return boolean
- */
- public function moveUp($project_id, $column_id)
- {
- $columns = $this->getNormalizedColumnPositions($project_id);
- $positions = array_flip($columns);
-
- if (isset($columns[$column_id]) && $columns[$column_id] > 1) {
- $position = --$columns[$column_id];
- $columns[$positions[$position]]++;
-
- return $this->saveColumnPositions($columns);
- }
-
- return false;
- }
-
- /**
* Get all tasks sorted by columns and swimlanes
*
* @access public
@@ -239,7 +104,7 @@ class Board extends Base
public function getBoard($project_id, $callback = null)
{
$swimlanes = $this->swimlane->getSwimlanes($project_id);
- $columns = $this->getColumns($project_id);
+ $columns = $this->column->getAll($project_id);
$nb_columns = count($columns);
for ($i = 0, $ilen = count($swimlanes); $i < $ilen; $i++) {
@@ -307,131 +172,4 @@ class Board extends Base
return $prepend ? array(-1 => t('All columns')) + $listing : $listing;
}
-
- /**
- * Get the first column id for a given project
- *
- * @access public
- * @param integer $project_id Project id
- * @return integer
- */
- public function getFirstColumn($project_id)
- {
- return $this->db->table(self::TABLE)->eq('project_id', $project_id)->asc('position')->findOneColumn('id');
- }
-
- /**
- * Get the last column id for a given project
- *
- * @access public
- * @param integer $project_id Project id
- * @return integer
- */
- public function getLastColumn($project_id)
- {
- return $this->db->table(self::TABLE)->eq('project_id', $project_id)->desc('position')->findOneColumn('id');
- }
-
- /**
- * Get the list of columns sorted by position [ column_id => title ]
- *
- * @access public
- * @param integer $project_id Project id
- * @param boolean $prepend Prepend a default value
- * @return array
- */
- public function getColumnsList($project_id, $prepend = false)
- {
- $listing = $this->db->hashtable(self::TABLE)->eq('project_id', $project_id)->asc('position')->getAll('id', 'title');
- return $prepend ? array(-1 => t('All columns')) + $listing : $listing;
- }
-
- /**
- * Get all columns sorted by position for a given project
- *
- * @access public
- * @param integer $project_id Project id
- * @return array
- */
- public function getColumns($project_id)
- {
- return $this->db->table(self::TABLE)->eq('project_id', $project_id)->asc('position')->findAll();
- }
-
- /**
- * Get the number of columns for a given project
- *
- * @access public
- * @param integer $project_id Project id
- * @return integer
- */
- public function countColumns($project_id)
- {
- return $this->db->table(self::TABLE)->eq('project_id', $project_id)->count();
- }
-
- /**
- * Get a column by the id
- *
- * @access public
- * @param integer $column_id Column id
- * @return array
- */
- public function getColumn($column_id)
- {
- return $this->db->table(self::TABLE)->eq('id', $column_id)->findOne();
- }
-
- /**
- * Get a column id by the name
- *
- * @access public
- * @param integer $project_id
- * @param string $title
- * @return integer
- */
- public function getColumnIdByTitle($project_id, $title)
- {
- return (int) $this->db->table(self::TABLE)->eq('project_id', $project_id)->eq('title', $title)->findOneColumn('id');
- }
-
- /**
- * Get a column title by the id
- *
- * @access public
- * @param integer $column_id
- * @return integer
- */
- public function getColumnTitleById($column_id)
- {
- return $this->db->table(self::TABLE)->eq('id', $column_id)->findOneColumn('title');
- }
-
- /**
- * Get the position of the last column for a given project
- *
- * @access public
- * @param integer $project_id Project id
- * @return integer
- */
- public function getLastColumnPosition($project_id)
- {
- return (int) $this->db
- ->table(self::TABLE)
- ->eq('project_id', $project_id)
- ->desc('position')
- ->findOneColumn('position');
- }
-
- /**
- * Remove a column and all tasks associated to this column
- *
- * @access public
- * @param integer $column_id Column id
- * @return boolean
- */
- public function removeColumn($column_id)
- {
- return $this->db->table(self::TABLE)->eq('id', $column_id)->remove();
- }
}
diff --git a/app/Model/Column.php b/app/Model/Column.php
index 286b6140..ccdcb049 100644
--- a/app/Model/Column.php
+++ b/app/Model/Column.php
@@ -18,6 +18,83 @@ class Column extends Base
const TABLE = 'columns';
/**
+ * Get a column by the id
+ *
+ * @access public
+ * @param integer $column_id Column id
+ * @return array
+ */
+ public function getById($column_id)
+ {
+ return $this->db->table(self::TABLE)->eq('id', $column_id)->findOne();
+ }
+
+ /**
+ * Get the first column id for a given project
+ *
+ * @access public
+ * @param integer $project_id Project id
+ * @return integer
+ */
+ public function getFirstColumnId($project_id)
+ {
+ return $this->db->table(self::TABLE)->eq('project_id', $project_id)->asc('position')->findOneColumn('id');
+ }
+
+ /**
+ * Get the last column id for a given project
+ *
+ * @access public
+ * @param integer $project_id Project id
+ * @return integer
+ */
+ public function getLastColumnId($project_id)
+ {
+ return $this->db->table(self::TABLE)->eq('project_id', $project_id)->desc('position')->findOneColumn('id');
+ }
+
+ /**
+ * Get the position of the last column for a given project
+ *
+ * @access public
+ * @param integer $project_id Project id
+ * @return integer
+ */
+ public function getLastColumnPosition($project_id)
+ {
+ return (int) $this->db
+ ->table(self::TABLE)
+ ->eq('project_id', $project_id)
+ ->desc('position')
+ ->findOneColumn('position');
+ }
+
+ /**
+ * Get a column id by the name
+ *
+ * @access public
+ * @param integer $project_id
+ * @param string $title
+ * @return integer
+ */
+ public function getColumnIdByTitle($project_id, $title)
+ {
+ return (int) $this->db->table(self::TABLE)->eq('project_id', $project_id)->eq('title', $title)->findOneColumn('id');
+ }
+
+ /**
+ * Get a column title by the id
+ *
+ * @access public
+ * @param integer $column_id
+ * @return integer
+ */
+ public function getColumnTitleById($column_id)
+ {
+ return $this->db->table(self::TABLE)->eq('id', $column_id)->findOneColumn('title');
+ }
+
+ /**
* Get all columns sorted by position for a given project
*
* @access public
@@ -30,6 +107,74 @@ class Column extends Base
}
/**
+ * Get the list of columns sorted by position [ column_id => title ]
+ *
+ * @access public
+ * @param integer $project_id Project id
+ * @param boolean $prepend Prepend a default value
+ * @return array
+ */
+ public function getList($project_id, $prepend = false)
+ {
+ $listing = $this->db->hashtable(self::TABLE)->eq('project_id', $project_id)->asc('position')->getAll('id', 'title');
+ return $prepend ? array(-1 => t('All columns')) + $listing : $listing;
+ }
+
+ /**
+ * Add a new column to the board
+ *
+ * @access public
+ * @param integer $project_id Project id
+ * @param string $title Column title
+ * @param integer $task_limit Task limit
+ * @param string $description Column description
+ * @return boolean|integer
+ */
+ public function create($project_id, $title, $task_limit = 0, $description = '')
+ {
+ $values = array(
+ 'project_id' => $project_id,
+ 'title' => $title,
+ 'task_limit' => intval($task_limit),
+ 'position' => $this->getLastColumnPosition($project_id) + 1,
+ 'description' => $description,
+ );
+
+ return $this->persist(self::TABLE, $values);
+ }
+
+ /**
+ * Update a column
+ *
+ * @access public
+ * @param integer $column_id Column id
+ * @param string $title Column title
+ * @param integer $task_limit Task limit
+ * @param string $description Optional description
+ * @return boolean
+ */
+ public function update($column_id, $title, $task_limit = 0, $description = '')
+ {
+ return $this->db->table(self::TABLE)->eq('id', $column_id)->update(array(
+ 'title' => $title,
+ 'task_limit' => intval($task_limit),
+ 'description' => $description,
+ ));
+ }
+
+ /**
+ * Remove a column and all tasks associated to this column
+ *
+ * @access public
+ * @param integer $column_id Column id
+ * @return boolean
+ */
+ public function remove($column_id)
+ {
+ return $this->db->table(self::TABLE)->eq('id', $column_id)->remove();
+ }
+
+ /**
* Change column position
*
* @access public
diff --git a/app/Model/Project.php b/app/Model/Project.php
index d0a8bfc8..a79e46a1 100644
--- a/app/Model/Project.php
+++ b/app/Model/Project.php
@@ -241,7 +241,7 @@ class Project extends Base
{
$stats = array();
$stats['nb_active_tasks'] = 0;
- $columns = $this->board->getColumns($project_id);
+ $columns = $this->column->getAll($project_id);
$column_stats = $this->board->getColumnStats($project_id);
foreach ($columns as &$column) {
@@ -265,7 +265,7 @@ class Project extends Base
*/
public function getColumnStats(array &$project)
{
- $project['columns'] = $this->board->getColumns($project['id']);
+ $project['columns'] = $this->column->getAll($project['id']);
$stats = $this->board->getColumnStats($project['id']);
foreach ($project['columns'] as &$column) {
diff --git a/app/Model/ProjectDailyColumnStats.php b/app/Model/ProjectDailyColumnStats.php
index cf79be84..2bcc4d55 100644
--- a/app/Model/ProjectDailyColumnStats.php
+++ b/app/Model/ProjectDailyColumnStats.php
@@ -84,7 +84,7 @@ class ProjectDailyColumnStats extends Base
*/
public function getAggregatedMetrics($project_id, $from, $to, $field = 'total')
{
- $columns = $this->board->getColumnsList($project_id);
+ $columns = $this->column->getList($project_id);
$metrics = $this->getMetrics($project_id, $from, $to);
return $this->buildAggregate($metrics, $columns, $field);
}
diff --git a/app/Model/TaskAnalytic.php b/app/Model/TaskAnalytic.php
index bdfec3cb..cff56744 100644
--- a/app/Model/TaskAnalytic.php
+++ b/app/Model/TaskAnalytic.php
@@ -48,7 +48,7 @@ class TaskAnalytic extends Base
public function getTimeSpentByColumn(array $task)
{
$result = array();
- $columns = $this->board->getColumnsList($task['project_id']);
+ $columns = $this->column->getList($task['project_id']);
$sums = $this->transition->getTimeSpentByTask($task['id']);
foreach ($columns as $column_id => $column_title) {
diff --git a/app/Model/TaskCreation.php b/app/Model/TaskCreation.php
index f7d981fa..576eb18c 100644
--- a/app/Model/TaskCreation.php
+++ b/app/Model/TaskCreation.php
@@ -56,7 +56,7 @@ class TaskCreation extends Base
$this->resetFields($values, array('date_started', 'creator_id', 'owner_id', 'swimlane_id', 'date_due', 'score', 'category_id', 'time_estimated'));
if (empty($values['column_id'])) {
- $values['column_id'] = $this->board->getFirstColumn($values['project_id']);
+ $values['column_id'] = $this->column->getFirstColumnId($values['project_id']);
}
if (empty($values['color_id'])) {
diff --git a/app/Model/TaskDuplication.php b/app/Model/TaskDuplication.php
index e81fb232..b081aac1 100644
--- a/app/Model/TaskDuplication.php
+++ b/app/Model/TaskDuplication.php
@@ -64,7 +64,7 @@ class TaskDuplication extends Base
if ($values['recurrence_status'] == Task::RECURRING_STATUS_PENDING) {
$values['recurrence_parent'] = $task_id;
- $values['column_id'] = $this->board->getFirstColumn($values['project_id']);
+ $values['column_id'] = $this->column->getFirstColumnId($values['project_id']);
$this->calculateRecurringTaskDueDate($values);
$recurring_task_id = $this->save($task_id, $values);
@@ -181,12 +181,12 @@ class TaskDuplication extends Base
// Check if the column exists for the destination project
if ($values['column_id'] > 0) {
- $values['column_id'] = $this->board->getColumnIdByTitle(
+ $values['column_id'] = $this->column->getColumnIdByTitle(
$values['project_id'],
- $this->board->getColumnTitleById($values['column_id'])
+ $this->column->getColumnTitleById($values['column_id'])
);
- $values['column_id'] = $values['column_id'] ?: $this->board->getFirstColumn($values['project_id']);
+ $values['column_id'] = $values['column_id'] ?: $this->column->getFirstColumnId($values['project_id']);
}
return $values;
diff --git a/app/Model/TaskFilter.php b/app/Model/TaskFilter.php
index 7ceb4a97..1883298d 100644
--- a/app/Model/TaskFilter.php
+++ b/app/Model/TaskFilter.php
@@ -469,7 +469,7 @@ class TaskFilter extends Base
$this->query->beginOr();
foreach ($values as $project) {
- $this->query->ilike(Board::TABLE.'.title', $project);
+ $this->query->ilike(Column::TABLE.'.title', $project);
}
$this->query->closeOr();
diff --git a/app/Model/TaskFinder.php b/app/Model/TaskFinder.php
index 95ddc12f..0492a9bf 100644
--- a/app/Model/TaskFinder.php
+++ b/app/Model/TaskFinder.php
@@ -38,14 +38,14 @@ class TaskFinder extends Base
Task::TABLE.'.time_spent',
Task::TABLE.'.time_estimated',
Project::TABLE.'.name AS project_name',
- Board::TABLE.'.title AS column_name',
+ Column::TABLE.'.title AS column_name',
User::TABLE.'.username AS assignee_username',
User::TABLE.'.name AS assignee_name'
)
->eq(Task::TABLE.'.is_active', $is_active)
->in(Project::TABLE.'.id', $project_ids)
->join(Project::TABLE, 'id', 'project_id')
- ->join(Board::TABLE, 'id', 'column_id', Task::TABLE)
+ ->join(Column::TABLE, 'id', 'column_id', Task::TABLE)
->join(User::TABLE, 'id', 'owner_id', Task::TABLE);
}
@@ -129,15 +129,15 @@ class TaskFinder extends Base
User::TABLE.'.name AS assignee_name',
Category::TABLE.'.name AS category_name',
Category::TABLE.'.description AS category_description',
- Board::TABLE.'.title AS column_name',
- Board::TABLE.'.position AS column_position',
+ Column::TABLE.'.title AS column_name',
+ Column::TABLE.'.position AS column_position',
Swimlane::TABLE.'.name AS swimlane_name',
Project::TABLE.'.default_swimlane',
Project::TABLE.'.name AS project_name'
)
->join(User::TABLE, 'id', 'owner_id', Task::TABLE)
->join(Category::TABLE, 'id', 'category_id', Task::TABLE)
- ->join(Board::TABLE, 'id', 'column_id', Task::TABLE)
+ ->join(Column::TABLE, 'id', 'column_id', Task::TABLE)
->join(Swimlane::TABLE, 'id', 'swimlane_id', Task::TABLE)
->join(Project::TABLE, 'id', 'project_id', Task::TABLE);
}
diff --git a/app/Model/TaskImport.php b/app/Model/TaskImport.php
index e8dd1946..ccab0152 100644
--- a/app/Model/TaskImport.php
+++ b/app/Model/TaskImport.php
@@ -111,7 +111,7 @@ class TaskImport extends Base
}
if (! empty($row['column'])) {
- $values['column_id'] = $this->board->getColumnIdByTitle($this->projectId, $row['column']);
+ $values['column_id'] = $this->column->getColumnIdByTitle($this->projectId, $row['column']);
}
if (! empty($row['category'])) {
diff --git a/app/Model/TaskLink.php b/app/Model/TaskLink.php
index 034fcf45..a57bf3b0 100644
--- a/app/Model/TaskLink.php
+++ b/app/Model/TaskLink.php
@@ -81,17 +81,17 @@ class TaskLink extends Base
Task::TABLE.'.owner_id AS task_assignee_id',
User::TABLE.'.username AS task_assignee_username',
User::TABLE.'.name AS task_assignee_name',
- Board::TABLE.'.title AS column_title',
+ Column::TABLE.'.title AS column_title',
Project::TABLE.'.name AS project_name'
)
->eq(self::TABLE.'.task_id', $task_id)
->join(Link::TABLE, 'id', 'link_id')
->join(Task::TABLE, 'id', 'opposite_task_id')
- ->join(Board::TABLE, 'id', 'column_id', Task::TABLE)
+ ->join(Column::TABLE, 'id', 'column_id', Task::TABLE)
->join(User::TABLE, 'id', 'owner_id', Task::TABLE)
->join(Project::TABLE, 'id', 'project_id', Task::TABLE)
->asc(Link::TABLE.'.id')
- ->desc(Board::TABLE.'.position')
+ ->desc(Column::TABLE.'.position')
->desc(Task::TABLE.'.is_active')
->asc(Task::TABLE.'.position')
->asc(Task::TABLE.'.id')
diff --git a/app/Model/Transition.php b/app/Model/Transition.php
index b1f8f678..aa76d58f 100644
--- a/app/Model/Transition.php
+++ b/app/Model/Transition.php
@@ -76,8 +76,8 @@ class Transition extends Base
->eq('task_id', $task_id)
->desc('date')
->join(User::TABLE, 'id', 'user_id')
- ->join(Board::TABLE.' as src', 'id', 'src_column_id', self::TABLE, 'src')
- ->join(Board::TABLE.' as dst', 'id', 'dst_column_id', self::TABLE, 'dst')
+ ->join(Column::TABLE.' as src', 'id', 'src_column_id', self::TABLE, 'src')
+ ->join(Column::TABLE.' as dst', 'id', 'dst_column_id', self::TABLE, 'dst')
->findAll();
}
@@ -118,8 +118,8 @@ class Transition extends Base
->desc('date')
->join(Task::TABLE, 'id', 'task_id')
->join(User::TABLE, 'id', 'user_id')
- ->join(Board::TABLE.' as src', 'id', 'src_column_id', self::TABLE, 'src')
- ->join(Board::TABLE.' as dst', 'id', 'dst_column_id', self::TABLE, 'dst')
+ ->join(Column::TABLE.' as src', 'id', 'src_column_id', self::TABLE, 'src')
+ ->join(Column::TABLE.' as dst', 'id', 'dst_column_id', self::TABLE, 'dst')
->findAll();
}
diff --git a/app/Subscriber/RecurringTaskSubscriber.php b/app/Subscriber/RecurringTaskSubscriber.php
index 6d5aee89..09a5665a 100644
--- a/app/Subscriber/RecurringTaskSubscriber.php
+++ b/app/Subscriber/RecurringTaskSubscriber.php
@@ -21,9 +21,9 @@ class RecurringTaskSubscriber extends BaseSubscriber implements EventSubscriberI
$this->logger->debug('Subscriber executed: '.__METHOD__);
if ($event['recurrence_status'] == Task::RECURRING_STATUS_PENDING) {
- if ($event['recurrence_trigger'] == Task::RECURRING_TRIGGER_FIRST_COLUMN && $this->board->getFirstColumn($event['project_id']) == $event['src_column_id']) {
+ if ($event['recurrence_trigger'] == Task::RECURRING_TRIGGER_FIRST_COLUMN && $this->column->getFirstColumnId($event['project_id']) == $event['src_column_id']) {
$this->taskDuplication->duplicateRecurringTask($event['task_id']);
- } elseif ($event['recurrence_trigger'] == Task::RECURRING_TRIGGER_LAST_COLUMN && $this->board->getLastColumn($event['project_id']) == $event['dst_column_id']) {
+ } elseif ($event['recurrence_trigger'] == Task::RECURRING_TRIGGER_LAST_COLUMN && $this->column->getLastColumnId($event['project_id']) == $event['dst_column_id']) {
$this->taskDuplication->duplicateRecurringTask($event['task_id']);
}
}
diff --git a/jsonrpc.php b/jsonrpc.php
index 1d59d4ea..d2163347 100644
--- a/jsonrpc.php
+++ b/jsonrpc.php
@@ -8,6 +8,7 @@ use Kanboard\Api\Me;
use Kanboard\Api\Action;
use Kanboard\Api\App;
use Kanboard\Api\Board;
+use Kanboard\Api\Column;
use Kanboard\Api\Category;
use Kanboard\Api\Comment;
use Kanboard\Api\File;
@@ -30,6 +31,7 @@ $server->attach(new Me($container));
$server->attach(new Action($container));
$server->attach(new App($container));
$server->attach(new Board($container));
+$server->attach(new Column($container));
$server->attach(new Category($container));
$server->attach(new Comment($container));
$server->attach(new File($container));
diff --git a/tests/integration/ApiTest.php b/tests/integration/ApiTest.php
index 8b970a6c..679238a2 100644
--- a/tests/integration/ApiTest.php
+++ b/tests/integration/ApiTest.php
@@ -170,76 +170,6 @@ class Api extends PHPUnit_Framework_TestCase
$this->assertCount(0, $activities);
}
- public function testGetBoard()
- {
- $board = $this->client->getBoard(1);
- $this->assertTrue(is_array($board));
- $this->assertEquals(1, count($board));
- $this->assertEquals('Default swimlane', $board[0]['name']);
- $this->assertEquals(4, count($board[0]['columns']));
- }
-
- public function testGetColumns()
- {
- $columns = $this->client->getColumns(1);
- $this->assertTrue(is_array($columns));
- $this->assertEquals(4, count($columns));
- $this->assertEquals('Done', $columns[3]['title']);
- }
-
- public function testMoveColumnUp()
- {
- $this->assertTrue($this->client->moveColumnUp(1, 4));
-
- $columns = $this->client->getColumns(1);
- $this->assertTrue(is_array($columns));
- $this->assertEquals('Done', $columns[2]['title']);
- $this->assertEquals('Work in progress', $columns[3]['title']);
- }
-
- public function testMoveColumnDown()
- {
- $this->assertTrue($this->client->moveColumnDown(1, 4));
-
- $columns = $this->client->getColumns(1);
- $this->assertTrue(is_array($columns));
- $this->assertEquals('Work in progress', $columns[2]['title']);
- $this->assertEquals('Done', $columns[3]['title']);
- }
-
- public function testUpdateColumn()
- {
- $this->assertTrue($this->client->updateColumn(4, 'Boo', 2));
-
- $columns = $this->client->getColumns(1);
- $this->assertTrue(is_array($columns));
- $this->assertEquals('Boo', $columns[3]['title']);
- $this->assertEquals(2, $columns[3]['task_limit']);
- }
-
- public function testAddColumn()
- {
- $column_id = $this->client->addColumn(1, 'New column');
-
- $this->assertNotFalse($column_id);
- $this->assertInternalType('int', $column_id);
- $this->assertTrue($column_id > 0);
-
- $columns = $this->client->getColumns(1);
- $this->assertTrue(is_array($columns));
- $this->assertEquals(5, count($columns));
- $this->assertEquals('New column', $columns[4]['title']);
- }
-
- public function testRemoveColumn()
- {
- $this->assertTrue($this->client->removeColumn(5));
-
- $columns = $this->client->getColumns(1);
- $this->assertTrue(is_array($columns));
- $this->assertEquals(4, count($columns));
- }
-
public function testGetDefaultSwimlane()
{
$swimlane = $this->client->getDefaultSwimlane(1);
diff --git a/tests/integration/BoardTest.php b/tests/integration/BoardTest.php
new file mode 100644
index 00000000..bf8d50b9
--- /dev/null
+++ b/tests/integration/BoardTest.php
@@ -0,0 +1,21 @@
+<?php
+
+require_once __DIR__.'/Base.php';
+
+class BoardTest extends Base
+{
+ public function testCreateProject()
+ {
+ $this->assertEquals(1, $this->app->createProject('A project'));
+ }
+
+ public function testGetBoard()
+ {
+ $board = $this->app->getBoard(1);
+ $this->assertCount(1, $board);
+ $this->assertEquals('Default swimlane', $board[0]['name']);
+
+ $this->assertCount(4, $board[0]['columns']);
+ $this->assertEquals('Ready', $board[0]['columns'][1]['title']);
+ }
+}
diff --git a/tests/integration/ColumnTest.php b/tests/integration/ColumnTest.php
new file mode 100644
index 00000000..6d02afc0
--- /dev/null
+++ b/tests/integration/ColumnTest.php
@@ -0,0 +1,65 @@
+<?php
+
+require_once __DIR__.'/Base.php';
+
+class ColumnTest extends Base
+{
+ public function testCreateProject()
+ {
+ $this->assertEquals(1, $this->app->createProject('A project'));
+ }
+
+ public function testGetColumns()
+ {
+ $columns = $this->app->getColumns($this->getProjectId());
+ $this->assertCount(4, $columns);
+ $this->assertEquals('Done', $columns[3]['title']);
+ }
+
+ public function testUpdateColumn()
+ {
+ $this->assertTrue($this->app->updateColumn(4, 'Boo', 2));
+
+ $columns = $this->app->getColumns($this->getProjectId());
+ $this->assertEquals('Boo', $columns[3]['title']);
+ $this->assertEquals(2, $columns[3]['task_limit']);
+ }
+
+ public function testAddColumn()
+ {
+ $column_id = $this->app->addColumn($this->getProjectId(), 'New column');
+
+ $this->assertNotFalse($column_id);
+ $this->assertInternalType('int', $column_id);
+ $this->assertTrue($column_id > 0);
+
+ $columns = $this->app->getColumns($this->getProjectId());
+ $this->assertCount(5, $columns);
+ $this->assertEquals('New column', $columns[4]['title']);
+ }
+
+ public function testRemoveColumn()
+ {
+ $this->assertTrue($this->app->removeColumn(5));
+
+ $columns = $this->app->getColumns($this->getProjectId());
+ $this->assertCount(4, $columns);
+ }
+
+ public function testChangeColumnPosition()
+ {
+ $this->assertTrue($this->app->changeColumnPosition($this->getProjectId(), 1, 3));
+
+ $columns = $this->app->getColumns($this->getProjectId());
+ $this->assertCount(4, $columns);
+
+ $this->assertEquals('Ready', $columns[0]['title']);
+ $this->assertEquals(1, $columns[0]['position']);
+ $this->assertEquals('Work in progress', $columns[1]['title']);
+ $this->assertEquals(2, $columns[1]['position']);
+ $this->assertEquals('Backlog', $columns[2]['title']);
+ $this->assertEquals(3, $columns[2]['position']);
+ $this->assertEquals('Boo', $columns[3]['title']);
+ $this->assertEquals(4, $columns[3]['position']);
+ }
+}
diff --git a/tests/units/Model/ActionTest.php b/tests/units/Model/ActionTest.php
index 8d574115..ed687846 100644
--- a/tests/units/Model/ActionTest.php
+++ b/tests/units/Model/ActionTest.php
@@ -6,7 +6,7 @@ use Kanboard\Model\Action;
use Kanboard\Model\Project;
use Kanboard\Model\Task;
use Kanboard\Model\User;
-use Kanboard\Model\Board;
+use Kanboard\Model\Column;
use Kanboard\Model\Category;
use Kanboard\Model\ProjectUserRole;
use Kanboard\Core\Security\Role;
@@ -260,12 +260,12 @@ class ActionTest extends Base
{
$projectModel = new Project($this->container);
$actionModel = new Action($this->container);
- $boardModel = new Board($this->container);
+ $columnModel = new Column($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
$this->assertEquals(2, $projectModel->create(array('name' => 'test2')));
- $this->assertTrue($boardModel->updateColumn(2, 'My unique column'));
+ $this->assertTrue($columnModel->update(2, 'My unique column'));
$this->assertEquals(1, $actionModel->create(array(
'project_id' => 1,
diff --git a/tests/units/Model/BoardTest.php b/tests/units/Model/BoardTest.php
index bb6c4b76..bb0778ce 100644
--- a/tests/units/Model/BoardTest.php
+++ b/tests/units/Model/BoardTest.php
@@ -4,6 +4,7 @@ require_once __DIR__.'/../Base.php';
use Kanboard\Model\Project;
use Kanboard\Model\Board;
+use Kanboard\Model\Column;
use Kanboard\Model\Config;
use Kanboard\Model\TaskCreation;
use Kanboard\Model\TaskFinder;
@@ -15,12 +16,13 @@ class BoardTest extends Base
{
$p = new Project($this->container);
$b = new Board($this->container);
+ $columnModel = new Column($this->container);
$c = new Config($this->container);
// Default columns
$this->assertEquals(1, $p->create(array('name' => 'UnitTest1')));
- $columns = $b->getColumnsList(1);
+ $columns = $columnModel->getList(1);
$this->assertTrue(is_array($columns));
$this->assertEquals(4, count($columns));
@@ -37,7 +39,7 @@ class BoardTest extends Base
$this->assertEquals($input, $c->get('board_columns'));
$this->assertEquals(2, $p->create(array('name' => 'UnitTest2')));
- $columns = $b->getColumnsList(2);
+ $columns = $columnModel->getList(2);
$this->assertTrue(is_array($columns));
$this->assertEquals(2, count($columns));
@@ -161,225 +163,4 @@ class BoardTest extends Base
$this->assertEquals(1, $board[1]['columns'][3]['tasks'][0]['position']);
$this->assertEquals(1, $board[1]['columns'][3]['tasks'][0]['swimlane_id']);
}
-
- public function testGetColumn()
- {
- $p = new Project($this->container);
- $b = new Board($this->container);
-
- $this->assertEquals(1, $p->create(array('name' => 'UnitTest1')));
-
- $column = $b->getColumn(3);
- $this->assertNotEmpty($column);
- $this->assertEquals('Work in progress', $column['title']);
-
- $column = $b->getColumn(33);
- $this->assertEmpty($column);
- }
-
- public function testRemoveColumn()
- {
- $p = new Project($this->container);
- $b = new Board($this->container);
-
- $this->assertEquals(1, $p->create(array('name' => 'UnitTest1')));
- $this->assertTrue($b->removeColumn(3));
- $this->assertFalse($b->removeColumn(322));
-
- $columns = $b->getColumns(1);
- $this->assertTrue(is_array($columns));
- $this->assertEquals(3, count($columns));
- }
-
- public function testUpdateColumn()
- {
- $p = new Project($this->container);
- $b = new Board($this->container);
-
- $this->assertEquals(1, $p->create(array('name' => 'UnitTest1')));
-
- $this->assertTrue($b->updateColumn(3, 'blah', 5));
- $this->assertTrue($b->updateColumn(2, 'boo'));
-
- $column = $b->getColumn(3);
- $this->assertNotEmpty($column);
- $this->assertEquals('blah', $column['title']);
- $this->assertEquals(5, $column['task_limit']);
-
- $column = $b->getColumn(2);
- $this->assertNotEmpty($column);
- $this->assertEquals('boo', $column['title']);
- $this->assertEquals(0, $column['task_limit']);
- }
-
- public function testAddColumn()
- {
- $p = new Project($this->container);
- $b = new Board($this->container);
-
- $this->assertEquals(1, $p->create(array('name' => 'UnitTest1')));
- $this->assertNotFalse($b->addColumn(1, 'another column'));
- $this->assertNotFalse($b->addColumn(1, 'one more', 3, 'one more description'));
-
- $columns = $b->getColumns(1);
- $this->assertTrue(is_array($columns));
- $this->assertEquals(6, count($columns));
-
- $this->assertEquals('another column', $columns[4]['title']);
- $this->assertEquals(0, $columns[4]['task_limit']);
- $this->assertEquals(5, $columns[4]['position']);
-
- $this->assertEquals('one more', $columns[5]['title']);
- $this->assertEquals(3, $columns[5]['task_limit']);
- $this->assertEquals(6, $columns[5]['position']);
- $this->assertEquals('one more description', $columns[5]['description']);
- }
-
- public function testMoveColumns()
- {
- $p = new Project($this->container);
- $b = new Board($this->container);
-
- // We create 2 projects
- $this->assertEquals(1, $p->create(array('name' => 'UnitTest1')));
- $this->assertEquals(2, $p->create(array('name' => 'UnitTest2')));
-
- // We get the columns of the project 2
- $columns = $b->getColumns(2);
- $columns_id = array_keys($b->getColumnsList(2));
- $this->assertNotEmpty($columns);
-
- // Initial order: 5, 6, 7, 8
-
- // Move the column 1 down
- $this->assertEquals(1, $columns[0]['position']);
- $this->assertEquals($columns_id[0], $columns[0]['id']);
-
- $this->assertEquals(2, $columns[1]['position']);
- $this->assertEquals($columns_id[1], $columns[1]['id']);
-
- $this->assertTrue($b->moveDown(2, $columns[0]['id']));
- $columns = $b->getColumns(2); // Sorted by position
-
- // New order: 6, 5, 7, 8
-
- $this->assertEquals(1, $columns[0]['position']);
- $this->assertEquals($columns_id[1], $columns[0]['id']);
-
- $this->assertEquals(2, $columns[1]['position']);
- $this->assertEquals($columns_id[0], $columns[1]['id']);
-
- // Move the column 3 up
- $this->assertTrue($b->moveUp(2, $columns[2]['id']));
- $columns = $b->getColumns(2);
-
- // New order: 6, 7, 5, 8
-
- $this->assertEquals(1, $columns[0]['position']);
- $this->assertEquals($columns_id[1], $columns[0]['id']);
-
- $this->assertEquals(2, $columns[1]['position']);
- $this->assertEquals($columns_id[2], $columns[1]['id']);
-
- $this->assertEquals(3, $columns[2]['position']);
- $this->assertEquals($columns_id[0], $columns[2]['id']);
-
- // Move column 1 up (must do nothing because it's the first column)
- $this->assertFalse($b->moveUp(2, $columns[0]['id']));
- $columns = $b->getColumns(2);
-
- // Order: 6, 7, 5, 8
-
- $this->assertEquals(1, $columns[0]['position']);
- $this->assertEquals($columns_id[1], $columns[0]['id']);
-
- // Move column 4 down (must do nothing because it's the last column)
- $this->assertFalse($b->moveDown(2, $columns[3]['id']));
- $columns = $b->getColumns(2);
-
- // Order: 6, 7, 5, 8
-
- $this->assertEquals(4, $columns[3]['position']);
- $this->assertEquals($columns_id[3], $columns[3]['id']);
- }
-
- public function testMoveUpAndRemoveColumn()
- {
- $p = new Project($this->container);
- $b = new Board($this->container);
-
- // We create a project
- $this->assertEquals(1, $p->create(array('name' => 'UnitTest1')));
-
- // We remove the second column
- $this->assertTrue($b->removeColumn(2));
-
- $columns = $b->getColumns(1);
- $this->assertNotEmpty($columns);
- $this->assertCount(3, $columns);
-
- $this->assertEquals(1, $columns[0]['position']);
- $this->assertEquals(3, $columns[1]['position']);
- $this->assertEquals(4, $columns[2]['position']);
-
- $this->assertEquals(1, $columns[0]['id']);
- $this->assertEquals(3, $columns[1]['id']);
- $this->assertEquals(4, $columns[2]['id']);
-
- // We move up the second column
- $this->assertTrue($b->moveUp(1, $columns[1]['id']));
-
- // Check the new positions
- $columns = $b->getColumns(1);
- $this->assertNotEmpty($columns);
- $this->assertCount(3, $columns);
-
- $this->assertEquals(1, $columns[0]['position']);
- $this->assertEquals(2, $columns[1]['position']);
- $this->assertEquals(3, $columns[2]['position']);
-
- $this->assertEquals(3, $columns[0]['id']);
- $this->assertEquals(1, $columns[1]['id']);
- $this->assertEquals(4, $columns[2]['id']);
- }
-
- public function testMoveDownAndRemoveColumn()
- {
- $p = new Project($this->container);
- $b = new Board($this->container);
-
- // We create a project
- $this->assertEquals(1, $p->create(array('name' => 'UnitTest1')));
-
- // We remove the second column
- $this->assertTrue($b->removeColumn(2));
-
- $columns = $b->getColumns(1);
- $this->assertNotEmpty($columns);
- $this->assertCount(3, $columns);
-
- $this->assertEquals(1, $columns[0]['position']);
- $this->assertEquals(3, $columns[1]['position']);
- $this->assertEquals(4, $columns[2]['position']);
-
- $this->assertEquals(1, $columns[0]['id']);
- $this->assertEquals(3, $columns[1]['id']);
- $this->assertEquals(4, $columns[2]['id']);
-
- // We move up the second column
- $this->assertTrue($b->moveDown(1, $columns[0]['id']));
-
- // Check the new positions
- $columns = $b->getColumns(1);
- $this->assertNotEmpty($columns);
- $this->assertCount(3, $columns);
-
- $this->assertEquals(1, $columns[0]['position']);
- $this->assertEquals(2, $columns[1]['position']);
- $this->assertEquals(3, $columns[2]['position']);
-
- $this->assertEquals(3, $columns[0]['id']);
- $this->assertEquals(1, $columns[1]['id']);
- $this->assertEquals(4, $columns[2]['id']);
- }
}
diff --git a/tests/units/Model/ColumnTest.php b/tests/units/Model/ColumnTest.php
index a03c3717..e40f89c6 100644
--- a/tests/units/Model/ColumnTest.php
+++ b/tests/units/Model/ColumnTest.php
@@ -7,6 +7,174 @@ use Kanboard\Model\Column;
class ColumnTest extends Base
{
+ public function testGetColumn()
+ {
+ $projectModel = new Project($this->container);
+ $columnModel = new Column($this->container);
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
+
+ $column = $columnModel->getById(3);
+ $this->assertNotEmpty($column);
+ $this->assertEquals('Work in progress', $column['title']);
+
+ $column = $columnModel->getById(33);
+ $this->assertEmpty($column);
+ }
+
+ public function testGetFirstColumnId()
+ {
+ $projectModel = new Project($this->container);
+ $columnModel = new Column($this->container);
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
+ $this->assertEquals(1, $columnModel->getFirstColumnId(1));
+ }
+
+ public function testGetLastColumnId()
+ {
+ $projectModel = new Project($this->container);
+ $columnModel = new Column($this->container);
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
+ $this->assertEquals(4, $columnModel->getLastColumnId(1));
+ }
+
+ public function testGetLastColumnPosition()
+ {
+ $projectModel = new Project($this->container);
+ $columnModel = new Column($this->container);
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
+ $this->assertEquals(4, $columnModel->getLastColumnPosition(1));
+ }
+
+ public function testGetColumnIdByTitle()
+ {
+ $projectModel = new Project($this->container);
+ $columnModel = new Column($this->container);
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
+ $this->assertEquals(2, $columnModel->getColumnIdByTitle(1, 'Ready'));
+ }
+
+ public function testGetTitleByColumnId()
+ {
+ $projectModel = new Project($this->container);
+ $columnModel = new Column($this->container);
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
+ $this->assertEquals('Work in progress', $columnModel->getColumnTitleById(3));
+ }
+
+ public function testGetAll()
+ {
+ $projectModel = new Project($this->container);
+ $columnModel = new Column($this->container);
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
+
+ $columns = $columnModel->getAll(1);
+ $this->assertCount(4, $columns);
+
+ $this->assertEquals(1, $columns[0]['id']);
+ $this->assertEquals(1, $columns[0]['position']);
+ $this->assertEquals('Backlog', $columns[0]['title']);
+
+ $this->assertEquals(2, $columns[1]['id']);
+ $this->assertEquals(2, $columns[1]['position']);
+ $this->assertEquals('Ready', $columns[1]['title']);
+
+ $this->assertEquals(3, $columns[2]['id']);
+ $this->assertEquals(3, $columns[2]['position']);
+ $this->assertEquals('Work in progress', $columns[2]['title']);
+
+ $this->assertEquals(4, $columns[3]['id']);
+ $this->assertEquals(4, $columns[3]['position']);
+ $this->assertEquals('Done', $columns[3]['title']);
+ }
+
+ public function testGetList()
+ {
+ $projectModel = new Project($this->container);
+ $columnModel = new Column($this->container);
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
+
+ $columns = $columnModel->getList(1);
+ $this->assertCount(4, $columns);
+ $this->assertEquals('Backlog', $columns[1]);
+ $this->assertEquals('Ready', $columns[2]);
+ $this->assertEquals('Work in progress', $columns[3]);
+ $this->assertEquals('Done', $columns[4]);
+
+ $columns = $columnModel->getList(1, true);
+ $this->assertCount(5, $columns);
+ $this->assertEquals('All columns', $columns[-1]);
+ $this->assertEquals('Backlog', $columns[1]);
+ $this->assertEquals('Ready', $columns[2]);
+ $this->assertEquals('Work in progress', $columns[3]);
+ $this->assertEquals('Done', $columns[4]);
+ }
+
+ public function testAddColumn()
+ {
+ $projectModel = new Project($this->container);
+ $columnModel = new Column($this->container);
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
+ $this->assertNotFalse($columnModel->create(1, 'another column'));
+ $this->assertNotFalse($columnModel->create(1, 'one more', 3, 'one more description'));
+
+ $columns = $columnModel->getAll(1);
+ $this->assertTrue(is_array($columns));
+ $this->assertEquals(6, count($columns));
+
+ $this->assertEquals('another column', $columns[4]['title']);
+ $this->assertEquals(0, $columns[4]['task_limit']);
+ $this->assertEquals(5, $columns[4]['position']);
+
+ $this->assertEquals('one more', $columns[5]['title']);
+ $this->assertEquals(3, $columns[5]['task_limit']);
+ $this->assertEquals(6, $columns[5]['position']);
+ $this->assertEquals('one more description', $columns[5]['description']);
+ }
+
+ public function testUpdateColumn()
+ {
+ $projectModel = new Project($this->container);
+ $columnModel = new Column($this->container);
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
+
+ $this->assertTrue($columnModel->update(3, 'blah', 5));
+ $this->assertTrue($columnModel->update(2, 'boo'));
+
+ $column = $columnModel->getById(3);
+ $this->assertNotEmpty($column);
+ $this->assertEquals('blah', $column['title']);
+ $this->assertEquals(5, $column['task_limit']);
+
+ $column = $columnModel->getById(2);
+ $this->assertNotEmpty($column);
+ $this->assertEquals('boo', $column['title']);
+ $this->assertEquals(0, $column['task_limit']);
+ }
+
+ public function testRemoveColumn()
+ {
+ $projectModel = new Project($this->container);
+ $columnModel = new Column($this->container);
+
+ $this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
+ $this->assertTrue($columnModel->remove(3));
+ $this->assertFalse($columnModel->remove(322));
+
+ $columns = $columnModel->getAll(1);
+ $this->assertTrue(is_array($columns));
+ $this->assertEquals(3, count($columns));
+ }
+
public function testChangePosition()
{
$projectModel = new Project($this->container);
diff --git a/tests/units/Model/ProjectTest.php b/tests/units/Model/ProjectTest.php
index cadb42a6..5478fa40 100644
--- a/tests/units/Model/ProjectTest.php
+++ b/tests/units/Model/ProjectTest.php
@@ -8,8 +8,6 @@ use Kanboard\Model\Project;
use Kanboard\Model\User;
use Kanboard\Model\Task;
use Kanboard\Model\TaskCreation;
-use Kanboard\Model\Acl;
-use Kanboard\Model\Board;
use Kanboard\Model\Config;
use Kanboard\Model\Category;
diff --git a/tests/units/Model/TaskPositionTest.php b/tests/units/Model/TaskPositionTest.php
index 5f045768..28145a66 100644
--- a/tests/units/Model/TaskPositionTest.php
+++ b/tests/units/Model/TaskPositionTest.php
@@ -3,7 +3,7 @@
require_once __DIR__.'/../Base.php';
use Kanboard\Model\Task;
-use Kanboard\Model\Board;
+use Kanboard\Model\Column;
use Kanboard\Model\TaskStatus;
use Kanboard\Model\TaskPosition;
use Kanboard\Model\TaskCreation;
@@ -21,23 +21,23 @@ class TaskPositionTest extends Base
$tc = new TaskCreation($this->container);
$tf = new TaskFinder($this->container);
$p = new Project($this->container);
- $b = new Board($this->container);
+ $columnModel = new Column($this->container);
$this->assertEquals(1, $p->create(array('name' => 'Project #1')));
$this->assertEquals(1, $tc->create(array('title' => 'Task #1', 'project_id' => 1, 'column_id' => 1)));
- $this->assertEquals(0, $t->getProgress($tf->getById(1), $b->getColumnsList(1)));
+ $this->assertEquals(0, $t->getProgress($tf->getById(1), $columnModel->getList(1)));
$this->assertTrue($tp->movePosition(1, 1, 2, 1));
- $this->assertEquals(25, $t->getProgress($tf->getById(1), $b->getColumnsList(1)));
+ $this->assertEquals(25, $t->getProgress($tf->getById(1), $columnModel->getList(1)));
$this->assertTrue($tp->movePosition(1, 1, 3, 1));
- $this->assertEquals(50, $t->getProgress($tf->getById(1), $b->getColumnsList(1)));
+ $this->assertEquals(50, $t->getProgress($tf->getById(1), $columnModel->getList(1)));
$this->assertTrue($tp->movePosition(1, 1, 4, 1));
- $this->assertEquals(75, $t->getProgress($tf->getById(1), $b->getColumnsList(1)));
+ $this->assertEquals(75, $t->getProgress($tf->getById(1), $columnModel->getList(1)));
$this->assertTrue($ts->close(1));
- $this->assertEquals(100, $t->getProgress($tf->getById(1), $b->getColumnsList(1)));
+ $this->assertEquals(100, $t->getProgress($tf->getById(1), $columnModel->getList(1)));
}
public function testMoveTaskToWrongPosition()