summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorFrederic Guillot <fred@kanboard.net>2016-02-20 11:24:43 -0500
committerFrederic Guillot <fred@kanboard.net>2016-02-20 11:24:43 -0500
commitc8c1242c26a11dc2abc7126829d76430612e7107 (patch)
tree012c7cf8df996b3af570120cfbfc3dd75eb5a13d /app
parent2d27c36a71f08bea60a992b051bfb8a2d8bd06b6 (diff)
Add drag and drop to change column positions
Diffstat (limited to 'app')
-rw-r--r--app/Controller/Column.php13
-rw-r--r--app/Controller/Subtask.php2
-rw-r--r--app/Model/Column.php64
-rw-r--r--app/Model/Subtask.php21
-rw-r--r--app/ServiceProvider/ClassProvider.php1
-rw-r--r--app/Template/column/index.php48
-rw-r--r--app/Template/subtask/table.php6
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 ?>