Added the possibility to convert a subtask to a task
This commit is contained in:
@@ -3,6 +3,7 @@ Version 1.0.29 (unreleased)
|
|||||||
|
|
||||||
New features:
|
New features:
|
||||||
|
|
||||||
|
* Added the possibility to convert a subtask to a task
|
||||||
* Added menu entry to add tasks from all project views
|
* Added menu entry to add tasks from all project views
|
||||||
* Add tasks in bulk from the board
|
* Add tasks in bulk from the board
|
||||||
* Add dropdown for projects
|
* Add dropdown for projects
|
||||||
|
|||||||
39
app/Controller/SubtaskConverterController.php
Normal file
39
app/Controller/SubtaskConverterController.php
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Kanboard\Controller;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class SubtaskConverterController
|
||||||
|
*
|
||||||
|
* @package Kanboard\Controller
|
||||||
|
* @author Frederic Guillot
|
||||||
|
*/
|
||||||
|
class SubtaskConverterController extends BaseController
|
||||||
|
{
|
||||||
|
public function show()
|
||||||
|
{
|
||||||
|
$task = $this->getTask();
|
||||||
|
$subtask = $this->getSubtask();
|
||||||
|
|
||||||
|
$this->response->html($this->template->render('subtask_converter/show', array(
|
||||||
|
'subtask' => $subtask,
|
||||||
|
'task' => $task,
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function save()
|
||||||
|
{
|
||||||
|
$project = $this->getProject();
|
||||||
|
$subtask = $this->getSubtask();
|
||||||
|
|
||||||
|
$task_id = $this->subtask->convertToTask($project['id'], $subtask['id']);
|
||||||
|
|
||||||
|
if ($task_id !== false) {
|
||||||
|
$this->flash->success(t('Subtask converted to task successfully.'));
|
||||||
|
} else {
|
||||||
|
$this->flash->failure(t('Unable to convert the subtask.'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $project['id'], 'task_id' => $task_id)), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -397,4 +397,31 @@ class Subtask extends Base
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a subtask to a task
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param integer $project_id
|
||||||
|
* @param integer $subtask_id
|
||||||
|
* @return integer
|
||||||
|
*/
|
||||||
|
public function convertToTask($project_id, $subtask_id)
|
||||||
|
{
|
||||||
|
$subtask = $this->getById($subtask_id);
|
||||||
|
|
||||||
|
$task_id = $this->taskCreation->create(array(
|
||||||
|
'project_id' => $project_id,
|
||||||
|
'title' => $subtask['title'],
|
||||||
|
'time_estimated' => $subtask['time_estimated'],
|
||||||
|
'time_spent' => $subtask['time_spent'],
|
||||||
|
'owner_id' => $subtask['user_id'],
|
||||||
|
));
|
||||||
|
|
||||||
|
if ($task_id !== false) {
|
||||||
|
$this->remove($subtask_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $task_id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,10 +2,16 @@
|
|||||||
<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>
|
<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>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
|
<i class="fa fa-pencil-square-o" aria-hidden="true"></i>
|
||||||
<?= $this->url->link(t('Edit'), 'subtask', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), false, 'popover') ?>
|
<?= $this->url->link(t('Edit'), 'subtask', 'edit', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), false, 'popover') ?>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
<i class="fa fa-trash-o" aria-hidden="true"></i>
|
||||||
<?= $this->url->link(t('Remove'), 'subtask', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), false, 'popover') ?>
|
<?= $this->url->link(t('Remove'), 'subtask', 'confirm', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), false, 'popover') ?>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-clone" aria-hidden="true"></i>
|
||||||
|
<?= $this->url->link(t('Convert to task'), 'SubtaskConverterController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), false, 'popover') ?>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -3,15 +3,18 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="confirm">
|
<div class="confirm">
|
||||||
<p class="alert alert-info">
|
<div class="alert alert-info">
|
||||||
<?= t('Do you really want to remove this sub-task?') ?>
|
<?= t('Do you really want to remove this sub-task?') ?>
|
||||||
</p>
|
<ul>
|
||||||
|
<li>
|
||||||
<p><strong><?= $this->text->e($subtask['title']) ?></strong></p>
|
<strong><?= $this->text->e($subtask['title']) ?></strong>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-actions">
|
<div class="form-actions">
|
||||||
<?= $this->url->link(t('Yes'), 'subtask', 'remove', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), true, 'btn btn-red') ?>
|
<?= $this->url->link(t('Yes'), 'subtask', 'remove', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), true, 'btn btn-red') ?>
|
||||||
<?= t('or') ?>
|
<?= t('or') ?>
|
||||||
<?= $this->url->link(t('cancel'), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?>
|
<?= $this->url->link(t('cancel'), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
20
app/Template/subtask_converter/show.php
Normal file
20
app/Template/subtask_converter/show.php
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<div class="page-header">
|
||||||
|
<h2><?= t('Convert sub-task to task') ?></h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="confirm">
|
||||||
|
<div class="alert alert-info">
|
||||||
|
<?= t('Do you really want to convert this sub-task to a task?') ?>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<strong><?= $this->text->e($subtask['title']) ?></strong>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-actions">
|
||||||
|
<?= $this->url->link(t('Yes'), 'SubtaskConverterController', 'save', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'subtask_id' => $subtask['id']), true, 'btn btn-red') ?>
|
||||||
|
<?= t('or') ?>
|
||||||
|
<?= $this->url->link(t('cancel'), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, 'close-popover') ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -6,6 +6,7 @@ use Kanboard\Model\TaskCreation;
|
|||||||
use Kanboard\Model\Subtask;
|
use Kanboard\Model\Subtask;
|
||||||
use Kanboard\Model\Project;
|
use Kanboard\Model\Project;
|
||||||
use Kanboard\Core\User\UserSession;
|
use Kanboard\Core\User\UserSession;
|
||||||
|
use Kanboard\Model\TaskFinder;
|
||||||
|
|
||||||
class SubtaskTest extends Base
|
class SubtaskTest extends Base
|
||||||
{
|
{
|
||||||
@@ -360,4 +361,28 @@ class SubtaskTest extends Base
|
|||||||
$this->assertFalse($subtaskModel->changePosition(1, 2, 0));
|
$this->assertFalse($subtaskModel->changePosition(1, 2, 0));
|
||||||
$this->assertFalse($subtaskModel->changePosition(1, 2, 4));
|
$this->assertFalse($subtaskModel->changePosition(1, 2, 4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testConvertToTask()
|
||||||
|
{
|
||||||
|
$taskCreationModel = new TaskCreation($this->container);
|
||||||
|
$taskFinderModel = new TaskFinder($this->container);
|
||||||
|
$subtaskModel = new Subtask($this->container);
|
||||||
|
$projectModel = new Project($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, 'user_id' => 1, 'time_spent' => 2, 'time_estimated' => 3)));
|
||||||
|
$task_id = $subtaskModel->convertToTask(1, 1);
|
||||||
|
|
||||||
|
$this->assertNotFalse($task_id);
|
||||||
|
$this->assertEmpty($subtaskModel->getById(1));
|
||||||
|
|
||||||
|
$task = $taskFinderModel->getById($task_id);
|
||||||
|
$this->assertEquals('subtask #1', $task['title']);
|
||||||
|
$this->assertEquals(1, $task['project_id']);
|
||||||
|
$this->assertEquals(1, $task['owner_id']);
|
||||||
|
$this->assertEquals(2, $task['time_spent']);
|
||||||
|
$this->assertEquals(3, $task['time_estimated']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user