From c8c1242c26a11dc2abc7126829d76430612e7107 Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Sat, 20 Feb 2016 11:24:43 -0500 Subject: Add drag and drop to change column positions --- app/Controller/Column.php | 13 ++++--- app/Controller/Subtask.php | 2 +- app/Model/Column.php | 64 +++++++++++++++++++++++++++++++++++ app/Model/Subtask.php | 21 ------------ app/ServiceProvider/ClassProvider.php | 1 + app/Template/column/index.php | 48 ++++++++++++-------------- app/Template/subtask/table.php | 6 ---- 7 files changed, 94 insertions(+), 61 deletions(-) create mode 100644 app/Model/Column.php (limited to 'app') diff --git a/app/Controller/Column.php b/app/Controller/Column.php index 77204164..2e028e0e 100644 --- a/app/Controller/Column.php +++ b/app/Controller/Column.php @@ -117,22 +117,21 @@ class Column extends Base } /** - * Move a column up or down + * Move column position * * @access public */ public function move() { - $this->checkCSRFParam(); $project = $this->getProject(); - $column_id = $this->request->getIntegerParam('column_id'); - $direction = $this->request->getStringParam('direction'); + $values = $this->request->getJson(); - if ($direction === 'up' || $direction === 'down') { - $this->board->{'move'.$direction}($project['id'], $column_id); + if (! empty($values)) { + $result = $this->column->changePosition($project['id'], $values['column_id'], $values['position']); + return $this->response->json(array('result' => $result)); } - $this->response->redirect($this->helper->url->to('column', 'index', array('project_id' => $project['id']))); + $this->forbidden(); } /** diff --git a/app/Controller/Subtask.php b/app/Controller/Subtask.php index a0a3eb66..8ca0ce92 100644 --- a/app/Controller/Subtask.php +++ b/app/Controller/Subtask.php @@ -174,7 +174,7 @@ class Subtask extends Base if (! empty($values) && $this->helper->user->hasProjectAccess('Subtask', 'movePosition', $project_id)) { $result = $this->subtask->changePosition($task_id, $values['subtask_id'], $values['position']); - $this->response->json(array('result' => $result)); + return $this->response->json(array('result' => $result)); } $this->forbidden(); diff --git a/app/Model/Column.php b/app/Model/Column.php new file mode 100644 index 00000000..286b6140 --- /dev/null +++ b/app/Model/Column.php @@ -0,0 +1,64 @@ +db->table(self::TABLE)->eq('project_id', $project_id)->asc('position')->findAll(); + } + + /** + * Change column position + * + * @access public + * @param integer $project_id + * @param integer $column_id + * @param integer $position + * @return boolean + */ + public function changePosition($project_id, $column_id, $position) + { + if ($position < 1 || $position > $this->db->table(self::TABLE)->eq('project_id', $project_id)->count()) { + return false; + } + + $column_ids = $this->db->table(self::TABLE)->eq('project_id', $project_id)->neq('id', $column_id)->asc('position')->findAllByColumn('id'); + $offset = 1; + $results = array(); + + foreach ($column_ids as $current_column_id) { + if ($offset == $position) { + $offset++; + } + + $results[] = $this->db->table(self::TABLE)->eq('id', $current_column_id)->update(array('position' => $offset)); + $offset++; + } + + $results[] = $this->db->table(self::TABLE)->eq('id', $column_id)->update(array('position' => $position)); + + return !in_array(false, $results, true); + } +} diff --git a/app/Model/Subtask.php b/app/Model/Subtask.php index 3707af13..b5898fcf 100644 --- a/app/Model/Subtask.php +++ b/app/Model/Subtask.php @@ -262,27 +262,6 @@ class Subtask extends Base return $this->db->table(self::TABLE)->eq('task_id', $task_id)->update(array('status' => self::STATUS_DONE)); } - /** - * Get subtasks with consecutive positions - * - * If you remove a subtask, the positions are not anymore consecutives - * - * @access public - * @param integer $task_id - * @return array - */ - public function getNormalizedPositions($task_id) - { - $subtasks = $this->db->hashtable(self::TABLE)->eq('task_id', $task_id)->asc('position')->getAll('id', 'position'); - $position = 1; - - foreach ($subtasks as $subtask_id => $subtask_position) { - $subtasks[$subtask_id] = $position++; - } - - return $subtasks; - } - /** * Save subtask position * diff --git a/app/ServiceProvider/ClassProvider.php b/app/ServiceProvider/ClassProvider.php index a4fa1ff2..0f2fbab5 100644 --- a/app/ServiceProvider/ClassProvider.php +++ b/app/ServiceProvider/ClassProvider.php @@ -27,6 +27,7 @@ class ClassProvider implements ServiceProviderInterface 'Board', 'Category', 'Color', + 'Column', 'Comment', 'Config', 'Currency', diff --git a/app/Template/column/index.php b/app/Template/column/index.php index 8d95dd48..c6a6e85b 100644 --- a/app/Template/column/index.php +++ b/app/Template/column/index.php @@ -8,28 +8,34 @@ - - - - - -

- + +

+ +
+ + + - - + + - +
e($column['title']) ?> - - '> - - - +
+ + e($column['title']) ?> + + '> + + + + + e($column['task_limit']) ?> e($column['task_limit']) ?>
- diff --git a/app/Template/subtask/table.php b/app/Template/subtask/table.php index 53902057..5db23245 100644 --- a/app/Template/subtask/table.php +++ b/app/Template/subtask/table.php @@ -1,8 +1,4 @@ - - - - render('subtask/menu', array( 'task' => $task, 'subtask' => $subtask, - 'first_position' => $first_position, - 'last_position' => $last_position, )) ?> -- cgit v1.2.3