Add subtask position
This commit is contained in:
@@ -185,7 +185,7 @@ class Subtask extends Base
|
||||
if ($redirect === 'board') {
|
||||
|
||||
$this->session['has_subtask_inprogress'] = $this->subtask->hasSubtaskInProgress($this->userSession->getId());
|
||||
|
||||
|
||||
$this->response->html($this->template->render('board/subtasks', array(
|
||||
'subtasks' => $this->subtask->getAll($task['id']),
|
||||
'task' => $task,
|
||||
@@ -259,4 +259,22 @@ class Subtask extends Base
|
||||
$this->response->redirect($this->helper->url('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Move subtask position
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
public function movePosition()
|
||||
{
|
||||
$this->checkCSRFParam();
|
||||
$project_id = $this->request->getIntegerParam('project_id');
|
||||
$task_id = $this->request->getIntegerParam('task_id');
|
||||
$subtask_id = $this->request->getIntegerParam('subtask_id');
|
||||
$direction = $this->request->getStringParam('direction');
|
||||
$method = $direction === 'up' ? 'moveUp' : 'moveDown';
|
||||
|
||||
$this->subtask->$method($task_id, $subtask_id);
|
||||
$this->response->redirect($this->helper->url('task', 'show', array('project_id' => $project_id, 'task_id' => $task_id)).'#subtasks');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,7 +122,7 @@ class Subtask extends Base
|
||||
->eq('task_id', $task_id)
|
||||
->columns(self::TABLE.'.*', User::TABLE.'.username', User::TABLE.'.name')
|
||||
->join(User::TABLE, 'id', 'user_id')
|
||||
->asc(self::TABLE.'.id')
|
||||
->asc(self::TABLE.'.position')
|
||||
->filter(array($this, 'addStatusName'))
|
||||
->findAll();
|
||||
}
|
||||
@@ -163,6 +163,22 @@ class Subtask extends Base
|
||||
$this->resetFields($values, array('time_estimated', 'time_spent'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the position of the last column for a given project
|
||||
*
|
||||
* @access public
|
||||
* @param integer $task_id Task id
|
||||
* @return integer
|
||||
*/
|
||||
public function getLastPosition($task_id)
|
||||
{
|
||||
return (int) $this->db
|
||||
->table(self::TABLE)
|
||||
->eq('task_id', $task_id)
|
||||
->desc('position')
|
||||
->findOneColumn('position');
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new subtask
|
||||
*
|
||||
@@ -173,6 +189,8 @@ class Subtask extends Base
|
||||
public function create(array $values)
|
||||
{
|
||||
$this->prepare($values);
|
||||
$values['position'] = $this->getLastPosition($values['task_id']) + 1;
|
||||
|
||||
$subtask_id = $this->persist(self::TABLE, $values);
|
||||
|
||||
if ($subtask_id) {
|
||||
@@ -208,6 +226,64 @@ class Subtask extends Base
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Move a subtask down, increment the position value
|
||||
*
|
||||
* @access public
|
||||
* @param integer $task_id
|
||||
* @param integer $subtask_id
|
||||
* @return boolean
|
||||
*/
|
||||
public function moveDown($task_id, $subtask_id)
|
||||
{
|
||||
$subtasks = $this->db->hashtable(self::TABLE)->eq('task_id', $task_id)->asc('position')->getAll('id', 'position');
|
||||
$positions = array_flip($subtasks);
|
||||
|
||||
if (isset($subtasks[$subtask_id]) && $subtasks[$subtask_id] < count($subtasks)) {
|
||||
|
||||
$position = ++$subtasks[$subtask_id];
|
||||
$subtasks[$positions[$position]]--;
|
||||
|
||||
$this->db->startTransaction();
|
||||
$this->db->table(self::TABLE)->eq('id', $subtask_id)->update(array('position' => $position));
|
||||
$this->db->table(self::TABLE)->eq('id', $positions[$position])->update(array('position' => $subtasks[$positions[$position]]));
|
||||
$this->db->closeTransaction();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Move a subtask up, decrement the position value
|
||||
*
|
||||
* @access public
|
||||
* @param integer $task_id
|
||||
* @param integer $subtask_id
|
||||
* @return boolean
|
||||
*/
|
||||
public function moveUp($task_id, $subtask_id)
|
||||
{
|
||||
$subtasks = $this->db->hashtable(self::TABLE)->eq('task_id', $task_id)->asc('position')->getAll('id', 'position');
|
||||
$positions = array_flip($subtasks);
|
||||
|
||||
if (isset($subtasks[$subtask_id]) && $subtasks[$subtask_id] > 1) {
|
||||
|
||||
$position = --$subtasks[$subtask_id];
|
||||
$subtasks[$positions[$position]]++;
|
||||
|
||||
$this->db->startTransaction();
|
||||
$this->db->table(self::TABLE)->eq('id', $subtask_id)->update(array('position' => $position));
|
||||
$this->db->table(self::TABLE)->eq('id', $positions[$position])->update(array('position' => $subtasks[$positions[$position]]));
|
||||
$this->db->closeTransaction();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the status of subtask
|
||||
*
|
||||
@@ -286,9 +362,9 @@ class Subtask extends Base
|
||||
return $this->db->transaction(function ($db) use ($src_task_id, $dst_task_id) {
|
||||
|
||||
$subtasks = $db->table(Subtask::TABLE)
|
||||
->columns('title', 'time_estimated')
|
||||
->columns('title', 'time_estimated', 'position')
|
||||
->eq('task_id', $src_task_id)
|
||||
->asc('id') // Explicit sorting for postgresql
|
||||
->asc('position')
|
||||
->findAll();
|
||||
|
||||
foreach ($subtasks as &$subtask) {
|
||||
|
||||
@@ -6,7 +6,29 @@ use PDO;
|
||||
use Core\Security;
|
||||
use Model\Link;
|
||||
|
||||
const VERSION = 48;
|
||||
const VERSION = 49;
|
||||
|
||||
function version_49($pdo)
|
||||
{
|
||||
$pdo->exec('ALTER TABLE subtasks ADD COLUMN position INTEGER DEFAULT 1');
|
||||
|
||||
$task_id = 0;
|
||||
$urq = $pdo->prepare('UPDATE subtasks SET position=? WHERE id=?');
|
||||
|
||||
$rq = $pdo->prepare('SELECT * FROM subtasks ORDER BY task_id, id ASC');
|
||||
$rq->execute();
|
||||
|
||||
foreach ($rq->fetchAll(PDO::FETCH_ASSOC) as $subtask) {
|
||||
|
||||
if ($task_id != $subtask['task_id']) {
|
||||
$position = 1;
|
||||
$task_id = $subtask['task_id'];
|
||||
}
|
||||
|
||||
$urq->execute(array($position, $subtask['id']));
|
||||
$position++;
|
||||
}
|
||||
}
|
||||
|
||||
function version_48($pdo)
|
||||
{
|
||||
|
||||
@@ -6,7 +6,29 @@ use PDO;
|
||||
use Core\Security;
|
||||
use Model\Link;
|
||||
|
||||
const VERSION = 29;
|
||||
const VERSION = 30;
|
||||
|
||||
function version_30($pdo)
|
||||
{
|
||||
$pdo->exec('ALTER TABLE subtasks ADD COLUMN position INTEGER DEFAULT 1');
|
||||
|
||||
$task_id = 0;
|
||||
$urq = $pdo->prepare('UPDATE subtasks SET position=? WHERE id=?');
|
||||
|
||||
$rq = $pdo->prepare('SELECT * FROM subtasks ORDER BY task_id, id ASC');
|
||||
$rq->execute();
|
||||
|
||||
foreach ($rq->fetchAll(PDO::FETCH_ASSOC) as $subtask) {
|
||||
|
||||
if ($task_id != $subtask['task_id']) {
|
||||
$position = 1;
|
||||
$task_id = $subtask['task_id'];
|
||||
}
|
||||
|
||||
$urq->execute(array($position, $subtask['id']));
|
||||
$position++;
|
||||
}
|
||||
}
|
||||
|
||||
function version_29($pdo)
|
||||
{
|
||||
|
||||
@@ -6,7 +6,31 @@ use Core\Security;
|
||||
use PDO;
|
||||
use Model\Link;
|
||||
|
||||
const VERSION = 47;
|
||||
const VERSION = 48;
|
||||
|
||||
function version_48($pdo)
|
||||
{
|
||||
$pdo->exec('ALTER TABLE subtasks ADD COLUMN position INTEGER DEFAULT 1');
|
||||
|
||||
// Migrate all subtasks position
|
||||
|
||||
$task_id = 0;
|
||||
$urq = $pdo->prepare('UPDATE subtasks SET position=? WHERE id=?');
|
||||
|
||||
$rq = $pdo->prepare('SELECT * FROM subtasks ORDER BY task_id, id ASC');
|
||||
$rq->execute();
|
||||
|
||||
foreach ($rq->fetchAll(PDO::FETCH_ASSOC) as $subtask) {
|
||||
|
||||
if ($task_id != $subtask['task_id']) {
|
||||
$position = 1;
|
||||
$task_id = $subtask['task_id'];
|
||||
}
|
||||
|
||||
$urq->execute(array($position, $subtask['id']));
|
||||
$position++;
|
||||
}
|
||||
}
|
||||
|
||||
function version_47($pdo)
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<?php if (! isset($not_editable)): ?>
|
||||
<?= $this->toggleSubtaskStatus($subtask, 'task') ?>
|
||||
<?php else: ?>
|
||||
<?= $this->render('subtask/icons', array('subtask' => $subtask)) . $this->e($subtask['status_name']) ?>
|
||||
<?= $this->render('subtask/icons', array('subtask' => $subtask)) . $this->e($subtask['title']) ?>
|
||||
<?php endif ?>
|
||||
</td>
|
||||
<td>
|
||||
@@ -40,6 +40,16 @@
|
||||
<?php if (! isset($not_editable)): ?>
|
||||
<td>
|
||||
<ul>
|
||||
<?php if ($subtask['position'] > 1): ?>
|
||||
<li>
|
||||
<?= $this->a(t('Move Up'), 'subtask', 'movePosition', array('project_id' => $project['id'], 'task_id' => $subtask['task_id'], 'subtask_id' => $subtask['id'], 'direction' => 'up'), true) ?>
|
||||
</li>
|
||||
<?php endif ?>
|
||||
<?php if ($subtask['position'] != 0 && $subtask['position'] != count($subtasks)): ?>
|
||||
<li>
|
||||
<?= $this->a(t('Move Down'), 'subtask', 'movePosition', array('project_id' => $project['id'], 'task_id' => $subtask['task_id'], 'subtask_id' => $subtask['id'], 'direction' => 'down'), true) ?>
|
||||
</li>
|
||||
<?php endif ?>
|
||||
<li>
|
||||
<?= $this->a(t('Edit'), 'subtask', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id'])) ?>
|
||||
</li>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<?= $this->render('task/time', array('task' => $task, 'values' => $values, 'date_format' => $date_format, 'date_formats' => $date_formats)) ?>
|
||||
<?= $this->render('task/show_description', array('task' => $task)) ?>
|
||||
<?= $this->render('tasklink/show', array('task' => $task, 'links' => $links)) ?>
|
||||
<?= $this->render('subtask/show', array('task' => $task, 'subtasks' => $subtasks)) ?>
|
||||
<?= $this->render('subtask/show', array('task' => $task, 'subtasks' => $subtasks, 'project' => $project)) ?>
|
||||
<?= $this->render('task/timesheet', array('task' => $task)) ?>
|
||||
<?= $this->render('file/show', array('task' => $task, 'files' => $files)) ?>
|
||||
<?= $this->render('task/comments', array('task' => $task, 'comments' => $comments, 'project' => $project)) ?>
|
||||
|
||||
Reference in New Issue
Block a user