diff options
author | Frederic Guillot <fred@kanboard.net> | 2016-02-20 11:24:43 -0500 |
---|---|---|
committer | Frederic Guillot <fred@kanboard.net> | 2016-02-20 11:24:43 -0500 |
commit | c8c1242c26a11dc2abc7126829d76430612e7107 (patch) | |
tree | 012c7cf8df996b3af570120cfbfc3dd75eb5a13d /app | |
parent | 2d27c36a71f08bea60a992b051bfb8a2d8bd06b6 (diff) |
Add drag and drop to change column positions
Diffstat (limited to 'app')
-rw-r--r-- | app/Controller/Column.php | 13 | ||||
-rw-r--r-- | app/Controller/Subtask.php | 2 | ||||
-rw-r--r-- | app/Model/Column.php | 64 | ||||
-rw-r--r-- | app/Model/Subtask.php | 21 | ||||
-rw-r--r-- | app/ServiceProvider/ClassProvider.php | 1 | ||||
-rw-r--r-- | app/Template/column/index.php | 48 | ||||
-rw-r--r-- | app/Template/subtask/table.php | 6 |
7 files changed, 94 insertions, 61 deletions
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 @@ +<?php + +namespace Kanboard\Model; + +/** + * Column Model + * + * @package model + * @author Frederic Guillot + */ +class Column extends Base +{ + /** + * SQL table name + * + * @var string + */ + const TABLE = 'columns'; + + /** + * Get all columns sorted by position for a given project + * + * @access public + * @param integer $project_id Project id + * @return array + */ + public function getAll($project_id) + { + return $this->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 @@ -263,27 +263,6 @@ class Subtask extends Base } /** - * 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 * * @access public 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 @@ </ul> </div> -<?php if (! empty($columns)): ?> - - <?php $first_position = $columns[0]['position']; ?> - <?php $last_position = $columns[count($columns) - 1]['position']; ?> - - <h3><?= t('Change columns') ?></h3> - <table> +<?php if (empty($columns)): ?> + <p class="alert alert-error"><?= t('Your board doesn\'t have any columns!') ?></p> +<?php else: ?> + <table + class="columns-table table-stripped" + data-save-position-url="<?= $this->url->href('Column', 'move', array('project_id' => $project['id'])) ?>"> + <thead> <tr> <th class="column-70"><?= t('Column title') ?></th> <th class="column-25"><?= t('Task limit') ?></th> <th class="column-5"><?= t('Actions') ?></th> </tr> + </thead> + <tbody> <?php foreach ($columns as $column): ?> - <tr> - <td><?= $this->e($column['title']) ?> - <?php if (! empty($column['description'])): ?> - <span class="tooltip" title='<?= $this->e($this->text->markdown($column['description'])) ?>'> - <i class="fa fa-info-circle"></i> - </span> - <?php endif ?> + <tr data-column-id="<?= $column['id'] ?>"> + <td> + <i class="fa fa-arrows-alt draggable-row-handle" title="<?= t('Move column position') ?>"></i> + <?= $this->e($column['title']) ?> + <?php if (! empty($column['description'])): ?> + <span class="tooltip" title='<?= $this->e($this->text->markdown($column['description'])) ?>'> + <i class="fa fa-info-circle"></i> + </span> + <?php endif ?> + </td> + <td> + <?= $this->e($column['task_limit']) ?> </td> - <td><?= $this->e($column['task_limit']) ?></td> <td> <div class="dropdown"> <a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog fa-fw"></i><i class="fa fa-caret-down"></i></a> @@ -37,16 +43,6 @@ <li> <?= $this->url->link(t('Edit'), 'column', 'edit', array('project_id' => $project['id'], 'column_id' => $column['id']), false, 'popover') ?> </li> - <?php if ($column['position'] != $first_position): ?> - <li> - <?= $this->url->link(t('Move Up'), 'column', 'move', array('project_id' => $project['id'], 'column_id' => $column['id'], 'direction' => 'up'), true) ?> - </li> - <?php endif ?> - <?php if ($column['position'] != $last_position): ?> - <li> - <?= $this->url->link(t('Move Down'), 'column', 'move', array('project_id' => $project['id'], 'column_id' => $column['id'], 'direction' => 'down'), true) ?> - </li> - <?php endif ?> <li> <?= $this->url->link(t('Remove'), 'column', 'confirm', array('project_id' => $project['id'], 'column_id' => $column['id']), false, 'popover') ?> </li> @@ -55,6 +51,6 @@ </td> </tr> <?php endforeach ?> + </tbody> </table> - <?php endif ?> 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 @@ <?php if (! empty($subtasks)): ?> - - <?php $first_position = $subtasks[0]['position']; ?> - <?php $last_position = $subtasks[count($subtasks) - 1]['position']; ?> - <table class="subtasks-table table-stripped" data-save-position-url="<?= $this->url->href('Subtask', 'movePosition', array('project_id' => $task['project_id'], 'task_id' => $task['id'])) ?>" @@ -63,8 +59,6 @@ <?= $this->render('subtask/menu', array( 'task' => $task, 'subtask' => $subtask, - 'first_position' => $first_position, - 'last_position' => $last_position, )) ?> </td> <?php endif ?> |