Create new class SubtaskPositionModel
This commit is contained in:
@@ -168,7 +168,7 @@ class SubtaskController extends BaseController
|
|||||||
$values = $this->request->getJson();
|
$values = $this->request->getJson();
|
||||||
|
|
||||||
if (! empty($values) && $this->helper->user->hasProjectAccess('SubtaskController', 'movePosition', $project_id)) {
|
if (! empty($values) && $this->helper->user->hasProjectAccess('SubtaskController', 'movePosition', $project_id)) {
|
||||||
$result = $this->subtaskModel->changePosition($task_id, $values['subtask_id'], $values['position']);
|
$result = $this->subtaskPositionModel->changePosition($task_id, $values['subtask_id'], $values['position']);
|
||||||
$this->response->json(array('result' => $result));
|
$this->response->json(array('result' => $result));
|
||||||
} else {
|
} else {
|
||||||
throw new AccessForbiddenException();
|
throw new AccessForbiddenException();
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ use Pimple\Container;
|
|||||||
* @property \Kanboard\Model\ProjectTaskPriorityModel $projectTaskPriorityModel
|
* @property \Kanboard\Model\ProjectTaskPriorityModel $projectTaskPriorityModel
|
||||||
* @property \Kanboard\Model\RememberMeSessionModel $rememberMeSessionModel
|
* @property \Kanboard\Model\RememberMeSessionModel $rememberMeSessionModel
|
||||||
* @property \Kanboard\Model\SubtaskModel $subtaskModel
|
* @property \Kanboard\Model\SubtaskModel $subtaskModel
|
||||||
|
* @property \Kanboard\Model\SubtaskPositionModel $subtaskPositionModel
|
||||||
* @property \Kanboard\Model\SubtaskTimeTrackingModel $subtaskTimeTrackingModel
|
* @property \Kanboard\Model\SubtaskTimeTrackingModel $subtaskTimeTrackingModel
|
||||||
* @property \Kanboard\Model\SwimlaneModel $swimlaneModel
|
* @property \Kanboard\Model\SwimlaneModel $swimlaneModel
|
||||||
* @property \Kanboard\Model\TagDuplicationModel $tagDuplicationModel
|
* @property \Kanboard\Model\TagDuplicationModel $tagDuplicationModel
|
||||||
|
|||||||
@@ -272,39 +272,6 @@ class SubtaskModel extends Base
|
|||||||
return $this->db->table(self::TABLE)->eq('task_id', $task_id)->update(array('status' => self::STATUS_DONE));
|
return $this->db->table(self::TABLE)->eq('task_id', $task_id)->update(array('status' => self::STATUS_DONE));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Save subtask position
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param integer $task_id
|
|
||||||
* @param integer $subtask_id
|
|
||||||
* @param integer $position
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public function changePosition($task_id, $subtask_id, $position)
|
|
||||||
{
|
|
||||||
if ($position < 1 || $position > $this->db->table(self::TABLE)->eq('task_id', $task_id)->count()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$subtask_ids = $this->db->table(self::TABLE)->eq('task_id', $task_id)->neq('id', $subtask_id)->asc('position')->findAllByColumn('id');
|
|
||||||
$offset = 1;
|
|
||||||
$results = array();
|
|
||||||
|
|
||||||
foreach ($subtask_ids as $current_subtask_id) {
|
|
||||||
if ($offset == $position) {
|
|
||||||
$offset++;
|
|
||||||
}
|
|
||||||
|
|
||||||
$results[] = $this->db->table(self::TABLE)->eq('id', $current_subtask_id)->update(array('position' => $offset));
|
|
||||||
$offset++;
|
|
||||||
}
|
|
||||||
|
|
||||||
$results[] = $this->db->table(self::TABLE)->eq('id', $subtask_id)->update(array('position' => $position));
|
|
||||||
|
|
||||||
return !in_array(false, $results, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change the status of subtask
|
* Change the status of subtask
|
||||||
*
|
*
|
||||||
|
|||||||
47
app/Model/SubtaskPositionModel.php
Normal file
47
app/Model/SubtaskPositionModel.php
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Kanboard\Model;
|
||||||
|
|
||||||
|
use Kanboard\Core\Base;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class SubtaskPositionModel
|
||||||
|
*
|
||||||
|
* @package Kanboard\Model
|
||||||
|
* @author Frederic Guillot
|
||||||
|
*/
|
||||||
|
class SubtaskPositionModel extends Base
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Change subtask position
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param integer $task_id
|
||||||
|
* @param integer $subtask_id
|
||||||
|
* @param integer $position
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function changePosition($task_id, $subtask_id, $position)
|
||||||
|
{
|
||||||
|
if ($position < 1 || $position > $this->db->table(SubtaskModel::TABLE)->eq('task_id', $task_id)->count()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$subtask_ids = $this->db->table(SubtaskModel::TABLE)->eq('task_id', $task_id)->neq('id', $subtask_id)->asc('position')->findAllByColumn('id');
|
||||||
|
$offset = 1;
|
||||||
|
$results = array();
|
||||||
|
|
||||||
|
foreach ($subtask_ids as $current_subtask_id) {
|
||||||
|
if ($offset == $position) {
|
||||||
|
$offset++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$results[] = $this->db->table(SubtaskModel::TABLE)->eq('id', $current_subtask_id)->update(array('position' => $offset));
|
||||||
|
$offset++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$results[] = $this->db->table(SubtaskModel::TABLE)->eq('id', $subtask_id)->update(array('position' => $position));
|
||||||
|
|
||||||
|
return !in_array(false, $results, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -60,6 +60,7 @@ class ClassProvider implements ServiceProviderInterface
|
|||||||
'ProjectUserRoleModel',
|
'ProjectUserRoleModel',
|
||||||
'RememberMeSessionModel',
|
'RememberMeSessionModel',
|
||||||
'SubtaskModel',
|
'SubtaskModel',
|
||||||
|
'SubtaskPositionModel',
|
||||||
'SubtaskTimeTrackingModel',
|
'SubtaskTimeTrackingModel',
|
||||||
'SwimlaneModel',
|
'SwimlaneModel',
|
||||||
'TagDuplicationModel',
|
'TagDuplicationModel',
|
||||||
|
|||||||
@@ -229,71 +229,6 @@ class SubtaskModelTest extends Base
|
|||||||
$this->assertEquals(2, $subtasks[1]['position']);
|
$this->assertEquals(2, $subtasks[1]['position']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testChangePosition()
|
|
||||||
{
|
|
||||||
$taskCreationModel = new TaskCreationModel($this->container);
|
|
||||||
$subtaskModel = new SubtaskModel($this->container);
|
|
||||||
$projectModel = new ProjectModel($this->container);
|
|
||||||
|
|
||||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
|
||||||
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'test 1', 'project_id' => 1)));
|
|
||||||
|
|
||||||
$this->assertEquals(1, $subtaskModel->create(array('title' => 'subtask #1', 'task_id' => 1)));
|
|
||||||
$this->assertEquals(2, $subtaskModel->create(array('title' => 'subtask #2', 'task_id' => 1)));
|
|
||||||
$this->assertEquals(3, $subtaskModel->create(array('title' => 'subtask #3', 'task_id' => 1)));
|
|
||||||
|
|
||||||
$subtasks = $subtaskModel->getAll(1);
|
|
||||||
$this->assertEquals(1, $subtasks[0]['position']);
|
|
||||||
$this->assertEquals(1, $subtasks[0]['id']);
|
|
||||||
$this->assertEquals(2, $subtasks[1]['position']);
|
|
||||||
$this->assertEquals(2, $subtasks[1]['id']);
|
|
||||||
$this->assertEquals(3, $subtasks[2]['position']);
|
|
||||||
$this->assertEquals(3, $subtasks[2]['id']);
|
|
||||||
|
|
||||||
$this->assertTrue($subtaskModel->changePosition(1, 3, 2));
|
|
||||||
|
|
||||||
$subtasks = $subtaskModel->getAll(1);
|
|
||||||
$this->assertEquals(1, $subtasks[0]['position']);
|
|
||||||
$this->assertEquals(1, $subtasks[0]['id']);
|
|
||||||
$this->assertEquals(2, $subtasks[1]['position']);
|
|
||||||
$this->assertEquals(3, $subtasks[1]['id']);
|
|
||||||
$this->assertEquals(3, $subtasks[2]['position']);
|
|
||||||
$this->assertEquals(2, $subtasks[2]['id']);
|
|
||||||
|
|
||||||
$this->assertTrue($subtaskModel->changePosition(1, 2, 1));
|
|
||||||
|
|
||||||
$subtasks = $subtaskModel->getAll(1);
|
|
||||||
$this->assertEquals(1, $subtasks[0]['position']);
|
|
||||||
$this->assertEquals(2, $subtasks[0]['id']);
|
|
||||||
$this->assertEquals(2, $subtasks[1]['position']);
|
|
||||||
$this->assertEquals(1, $subtasks[1]['id']);
|
|
||||||
$this->assertEquals(3, $subtasks[2]['position']);
|
|
||||||
$this->assertEquals(3, $subtasks[2]['id']);
|
|
||||||
|
|
||||||
$this->assertTrue($subtaskModel->changePosition(1, 2, 2));
|
|
||||||
|
|
||||||
$subtasks = $subtaskModel->getAll(1);
|
|
||||||
$this->assertEquals(1, $subtasks[0]['position']);
|
|
||||||
$this->assertEquals(1, $subtasks[0]['id']);
|
|
||||||
$this->assertEquals(2, $subtasks[1]['position']);
|
|
||||||
$this->assertEquals(2, $subtasks[1]['id']);
|
|
||||||
$this->assertEquals(3, $subtasks[2]['position']);
|
|
||||||
$this->assertEquals(3, $subtasks[2]['id']);
|
|
||||||
|
|
||||||
$this->assertTrue($subtaskModel->changePosition(1, 1, 3));
|
|
||||||
|
|
||||||
$subtasks = $subtaskModel->getAll(1);
|
|
||||||
$this->assertEquals(1, $subtasks[0]['position']);
|
|
||||||
$this->assertEquals(2, $subtasks[0]['id']);
|
|
||||||
$this->assertEquals(2, $subtasks[1]['position']);
|
|
||||||
$this->assertEquals(3, $subtasks[1]['id']);
|
|
||||||
$this->assertEquals(3, $subtasks[2]['position']);
|
|
||||||
$this->assertEquals(1, $subtasks[2]['id']);
|
|
||||||
|
|
||||||
$this->assertFalse($subtaskModel->changePosition(1, 2, 0));
|
|
||||||
$this->assertFalse($subtaskModel->changePosition(1, 2, 4));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testConvertToTask()
|
public function testConvertToTask()
|
||||||
{
|
{
|
||||||
$taskCreationModel = new TaskCreationModel($this->container);
|
$taskCreationModel = new TaskCreationModel($this->container);
|
||||||
|
|||||||
77
tests/units/Model/SubtaskPositionModelTest.php
Normal file
77
tests/units/Model/SubtaskPositionModelTest.php
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Kanboard\Model\SubtaskPositionModel;
|
||||||
|
use Kanboard\Model\TaskCreationModel;
|
||||||
|
use Kanboard\Model\SubtaskModel;
|
||||||
|
use Kanboard\Model\ProjectModel;
|
||||||
|
|
||||||
|
require_once __DIR__.'/../Base.php';
|
||||||
|
|
||||||
|
class SubtaskPositionModelTest extends Base
|
||||||
|
{
|
||||||
|
public function testChangePosition()
|
||||||
|
{
|
||||||
|
$taskCreationModel = new TaskCreationModel($this->container);
|
||||||
|
$subtaskModel = new SubtaskModel($this->container);
|
||||||
|
$subtaskPositionModel = new SubtaskPositionModel($this->container);
|
||||||
|
$projectModel = new ProjectModel($this->container);
|
||||||
|
|
||||||
|
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||||
|
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'test 1', 'project_id' => 1)));
|
||||||
|
|
||||||
|
$this->assertEquals(1, $subtaskModel->create(array('title' => 'subtask #1', 'task_id' => 1)));
|
||||||
|
$this->assertEquals(2, $subtaskModel->create(array('title' => 'subtask #2', 'task_id' => 1)));
|
||||||
|
$this->assertEquals(3, $subtaskModel->create(array('title' => 'subtask #3', 'task_id' => 1)));
|
||||||
|
|
||||||
|
$subtasks = $subtaskModel->getAll(1);
|
||||||
|
$this->assertEquals(1, $subtasks[0]['position']);
|
||||||
|
$this->assertEquals(1, $subtasks[0]['id']);
|
||||||
|
$this->assertEquals(2, $subtasks[1]['position']);
|
||||||
|
$this->assertEquals(2, $subtasks[1]['id']);
|
||||||
|
$this->assertEquals(3, $subtasks[2]['position']);
|
||||||
|
$this->assertEquals(3, $subtasks[2]['id']);
|
||||||
|
|
||||||
|
$this->assertTrue($subtaskPositionModel->changePosition(1, 3, 2));
|
||||||
|
|
||||||
|
$subtasks = $subtaskModel->getAll(1);
|
||||||
|
$this->assertEquals(1, $subtasks[0]['position']);
|
||||||
|
$this->assertEquals(1, $subtasks[0]['id']);
|
||||||
|
$this->assertEquals(2, $subtasks[1]['position']);
|
||||||
|
$this->assertEquals(3, $subtasks[1]['id']);
|
||||||
|
$this->assertEquals(3, $subtasks[2]['position']);
|
||||||
|
$this->assertEquals(2, $subtasks[2]['id']);
|
||||||
|
|
||||||
|
$this->assertTrue($subtaskPositionModel->changePosition(1, 2, 1));
|
||||||
|
|
||||||
|
$subtasks = $subtaskModel->getAll(1);
|
||||||
|
$this->assertEquals(1, $subtasks[0]['position']);
|
||||||
|
$this->assertEquals(2, $subtasks[0]['id']);
|
||||||
|
$this->assertEquals(2, $subtasks[1]['position']);
|
||||||
|
$this->assertEquals(1, $subtasks[1]['id']);
|
||||||
|
$this->assertEquals(3, $subtasks[2]['position']);
|
||||||
|
$this->assertEquals(3, $subtasks[2]['id']);
|
||||||
|
|
||||||
|
$this->assertTrue($subtaskPositionModel->changePosition(1, 2, 2));
|
||||||
|
|
||||||
|
$subtasks = $subtaskModel->getAll(1);
|
||||||
|
$this->assertEquals(1, $subtasks[0]['position']);
|
||||||
|
$this->assertEquals(1, $subtasks[0]['id']);
|
||||||
|
$this->assertEquals(2, $subtasks[1]['position']);
|
||||||
|
$this->assertEquals(2, $subtasks[1]['id']);
|
||||||
|
$this->assertEquals(3, $subtasks[2]['position']);
|
||||||
|
$this->assertEquals(3, $subtasks[2]['id']);
|
||||||
|
|
||||||
|
$this->assertTrue($subtaskPositionModel->changePosition(1, 1, 3));
|
||||||
|
|
||||||
|
$subtasks = $subtaskModel->getAll(1);
|
||||||
|
$this->assertEquals(1, $subtasks[0]['position']);
|
||||||
|
$this->assertEquals(2, $subtasks[0]['id']);
|
||||||
|
$this->assertEquals(2, $subtasks[1]['position']);
|
||||||
|
$this->assertEquals(3, $subtasks[1]['id']);
|
||||||
|
$this->assertEquals(3, $subtasks[2]['position']);
|
||||||
|
$this->assertEquals(1, $subtasks[2]['id']);
|
||||||
|
|
||||||
|
$this->assertFalse($subtaskPositionModel->changePosition(1, 2, 0));
|
||||||
|
$this->assertFalse($subtaskPositionModel->changePosition(1, 2, 4));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user