summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/Controller/SubtaskController.php2
-rw-r--r--app/Core/Base.php1
-rw-r--r--app/Model/SubtaskModel.php33
-rw-r--r--app/Model/SubtaskPositionModel.php47
-rw-r--r--app/ServiceProvider/ClassProvider.php1
-rw-r--r--tests/units/Model/SubtaskModelTest.php65
-rw-r--r--tests/units/Model/SubtaskPositionModelTest.php77
7 files changed, 127 insertions, 99 deletions
diff --git a/app/Controller/SubtaskController.php b/app/Controller/SubtaskController.php
index 93dab5cd..7502d84f 100644
--- a/app/Controller/SubtaskController.php
+++ b/app/Controller/SubtaskController.php
@@ -168,7 +168,7 @@ class SubtaskController extends BaseController
$values = $this->request->getJson();
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));
} else {
throw new AccessForbiddenException();
diff --git a/app/Core/Base.php b/app/Core/Base.php
index 41f5d2e0..0230b671 100644
--- a/app/Core/Base.php
+++ b/app/Core/Base.php
@@ -90,6 +90,7 @@ use Pimple\Container;
* @property \Kanboard\Model\ProjectTaskPriorityModel $projectTaskPriorityModel
* @property \Kanboard\Model\RememberMeSessionModel $rememberMeSessionModel
* @property \Kanboard\Model\SubtaskModel $subtaskModel
+ * @property \Kanboard\Model\SubtaskPositionModel $subtaskPositionModel
* @property \Kanboard\Model\SubtaskTimeTrackingModel $subtaskTimeTrackingModel
* @property \Kanboard\Model\SwimlaneModel $swimlaneModel
* @property \Kanboard\Model\TagDuplicationModel $tagDuplicationModel
diff --git a/app/Model/SubtaskModel.php b/app/Model/SubtaskModel.php
index f3fc72ba..5a4e87a2 100644
--- a/app/Model/SubtaskModel.php
+++ b/app/Model/SubtaskModel.php
@@ -273,39 +273,6 @@ class SubtaskModel extends Base
}
/**
- * 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
*
* @access public
diff --git a/app/Model/SubtaskPositionModel.php b/app/Model/SubtaskPositionModel.php
new file mode 100644
index 00000000..3c26465d
--- /dev/null
+++ b/app/Model/SubtaskPositionModel.php
@@ -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);
+ }
+}
diff --git a/app/ServiceProvider/ClassProvider.php b/app/ServiceProvider/ClassProvider.php
index e32c0d43..d1415d8c 100644
--- a/app/ServiceProvider/ClassProvider.php
+++ b/app/ServiceProvider/ClassProvider.php
@@ -60,6 +60,7 @@ class ClassProvider implements ServiceProviderInterface
'ProjectUserRoleModel',
'RememberMeSessionModel',
'SubtaskModel',
+ 'SubtaskPositionModel',
'SubtaskTimeTrackingModel',
'SwimlaneModel',
'TagDuplicationModel',
diff --git a/tests/units/Model/SubtaskModelTest.php b/tests/units/Model/SubtaskModelTest.php
index 7e438651..3b25bb3b 100644
--- a/tests/units/Model/SubtaskModelTest.php
+++ b/tests/units/Model/SubtaskModelTest.php
@@ -229,71 +229,6 @@ class SubtaskModelTest extends Base
$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()
{
$taskCreationModel = new TaskCreationModel($this->container);
diff --git a/tests/units/Model/SubtaskPositionModelTest.php b/tests/units/Model/SubtaskPositionModelTest.php
new file mode 100644
index 00000000..92412392
--- /dev/null
+++ b/tests/units/Model/SubtaskPositionModelTest.php
@@ -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));
+ }
+}