Move a task to another project
This commit is contained in:
parent
9e36f84fbc
commit
7e44dee903
|
|
@ -352,7 +352,6 @@ class Task extends Base
|
|||
$this->response->html($this->template->layout('task_new', array(
|
||||
'errors' => array(),
|
||||
'values' => $task,
|
||||
'projects_list' => $this->project->getListByStatus(ProjectModel::ACTIVE),
|
||||
'columns_list' => $this->board->getColumnsList($task['project_id']),
|
||||
'users_list' => $this->project->getUsersList($task['project_id']),
|
||||
'colors_list' => $this->task->getColors(),
|
||||
|
|
@ -373,13 +372,14 @@ class Task extends Base
|
|||
$task = $this->getTask();
|
||||
|
||||
$params = array(
|
||||
'values' => $task,
|
||||
'errors' => array(),
|
||||
'task' => $task,
|
||||
'ajax' => $this->request->isAjax(),
|
||||
'menu' => 'tasks',
|
||||
'title' => t('Edit the description')
|
||||
);
|
||||
'values' => $task,
|
||||
'errors' => array(),
|
||||
'task' => $task,
|
||||
'ajax' => $this->request->isAjax(),
|
||||
'menu' => 'tasks',
|
||||
'title' => t('Edit the description'),
|
||||
);
|
||||
|
||||
if ($this->request->isAjax()) {
|
||||
$this->response->html($this->template->load('task_edit_description', $params));
|
||||
}
|
||||
|
|
@ -425,4 +425,41 @@ class Task extends Base
|
|||
'title' => t('Edit the description')
|
||||
)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Move a task to another project
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
public function move()
|
||||
{
|
||||
$task = $this->getTask();
|
||||
$values = $task;
|
||||
$errors = array();
|
||||
|
||||
if ($this->request->isPost()) {
|
||||
|
||||
$values = $this->request->getValues();
|
||||
list($valid, $errors) = $this->task->validateProjectModification($values);
|
||||
|
||||
if ($valid) {
|
||||
if ($this->task->moveToAnotherProject($values['project_id'], $task)) {
|
||||
$this->session->flash(t('Task updated successfully.'));
|
||||
$this->response->redirect('?controller=task&action=show&task_id='.$values['id']);
|
||||
}
|
||||
else {
|
||||
$this->session->flashError(t('Unable to update your task.'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->response->html($this->taskLayout('task_move_project', array(
|
||||
'values' => $values,
|
||||
'errors' => $errors,
|
||||
'task' => $task,
|
||||
'projects_list' => $this->project->getAvailableList($this->acl->getUserId()),
|
||||
'menu' => 'tasks',
|
||||
'title' => t('Move the task to another project')
|
||||
)));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -434,4 +434,6 @@ return array(
|
|||
// 'Do you really want to duplicate this project: "%s"?' => '',
|
||||
// 'Do you really want to enable this project: "%s"?' => '',
|
||||
// 'Project activation' => '',
|
||||
// 'Move the task to another project' => '',
|
||||
// 'Move to another project' => '',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -434,4 +434,6 @@ return array(
|
|||
// 'Do you really want to duplicate this project: "%s"?' => '',
|
||||
// 'Do you really want to enable this project: "%s"?' => '',
|
||||
// 'Project activation' => '',
|
||||
// 'Move the task to another project' => '',
|
||||
// 'Move to another project' => '',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -434,4 +434,6 @@ return array(
|
|||
// 'Do you really want to duplicate this project: "%s"?' => '',
|
||||
// 'Do you really want to enable this project: "%s"?' => '',
|
||||
// 'Project activation' => '',
|
||||
// 'Move the task to another project' => '',
|
||||
// 'Move to another project' => '',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -434,4 +434,6 @@ return array(
|
|||
'Do you really want to duplicate this project: "%s"?' => 'Voulez-vous vraiment dupliquer ce projet : « %s » ?',
|
||||
'Do you really want to enable this project: "%s"?' => 'Voulez-vous vraiment activer ce projet : « %s » ?',
|
||||
'Project activation' => 'Activation du projet',
|
||||
'Move the task to another project' => 'Déplacer la tâche vers un autre projet',
|
||||
'Move to another project' => 'Déplacer vers un autre projet',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -434,4 +434,6 @@ return array(
|
|||
// 'Do you really want to duplicate this project: "%s"?' => '',
|
||||
// 'Do you really want to enable this project: "%s"?' => '',
|
||||
// 'Project activation' => '',
|
||||
// 'Move the task to another project' => '',
|
||||
// 'Move to another project' => '',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -434,4 +434,6 @@ return array(
|
|||
// 'Do you really want to duplicate this project: "%s"?' => '',
|
||||
// 'Do you really want to enable this project: "%s"?' => '',
|
||||
// 'Project activation' => '',
|
||||
// 'Move the task to another project' => '',
|
||||
// 'Move to another project' => '',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -434,4 +434,6 @@ return array(
|
|||
// 'Do you really want to duplicate this project: "%s"?' => '',
|
||||
// 'Do you really want to enable this project: "%s"?' => '',
|
||||
// 'Project activation' => '',
|
||||
// 'Move the task to another project' => '',
|
||||
// 'Move to another project' => '',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -434,4 +434,6 @@ return array(
|
|||
// 'Do you really want to duplicate this project: "%s"?' => '',
|
||||
// 'Do you really want to enable this project: "%s"?' => '',
|
||||
// 'Project activation' => '',
|
||||
// 'Move the task to another project' => '',
|
||||
// 'Move to another project' => '',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -434,4 +434,6 @@ return array(
|
|||
// 'Do you really want to duplicate this project: "%s"?' => '',
|
||||
// 'Do you really want to enable this project: "%s"?' => '',
|
||||
// 'Project activation' => '',
|
||||
// 'Move the task to another project' => '',
|
||||
// 'Move to another project' => '',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ class Acl extends Base
|
|||
'confirmremove',
|
||||
'editdescription',
|
||||
'savedescription',
|
||||
'move',
|
||||
),
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ class Board extends Base
|
|||
foreach ($positions as $value) {
|
||||
|
||||
// We trigger events only for the selected task
|
||||
if (! $this->task->move($value['task_id'], $value['column_id'], $value['position'], $value['task_id'] == $selected_task_id)) {
|
||||
if (! $this->task->movePosition($value['task_id'], $value['column_id'], $value['position'], $value['task_id'] == $selected_task_id)) {
|
||||
$this->db->cancelTransaction();
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -545,7 +545,7 @@ class Task extends Base
|
|||
* @param boolean $trigger_events Flag to trigger events
|
||||
* @return boolean
|
||||
*/
|
||||
public function move($task_id, $column_id, $position, $trigger_events = true)
|
||||
public function movePosition($task_id, $column_id, $position, $trigger_events = true)
|
||||
{
|
||||
$this->event->clearTriggeredEvents();
|
||||
|
||||
|
|
@ -558,6 +558,35 @@ class Task extends Base
|
|||
return $this->update($values, $trigger_events);
|
||||
}
|
||||
|
||||
/**
|
||||
* Move a task to another project
|
||||
*
|
||||
* @access public
|
||||
* @param integer $project_id Project id
|
||||
* @param array $task Task data
|
||||
* @return boolean
|
||||
*/
|
||||
public function moveToAnotherProject($project_id, array $task)
|
||||
{
|
||||
$values = array();
|
||||
|
||||
// Clear values (categories are different for each project)
|
||||
$values['category_id'] = 0;
|
||||
$values['owner_id'] = 0;
|
||||
|
||||
// Check if the assigned user is allowed for the new project
|
||||
if ($task['owner_id'] && $this->project->isUserAllowed($project_id, $task['owner_id'])) {
|
||||
$values['owner_id'] = $task['owner_id'];
|
||||
}
|
||||
|
||||
// We use the first column of the new project
|
||||
$values['column_id'] = $this->board->getFirstColumn($project_id);
|
||||
$values['position'] = $this->countByColumnId($project_id, $values['column_id']);
|
||||
$values['project_id'] = $project_id;
|
||||
|
||||
return $this->db->table(self::TABLE)->eq('id', $task['id'])->update($values);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate task creation
|
||||
*
|
||||
|
|
@ -662,6 +691,28 @@ class Task extends Base
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate project modification
|
||||
*
|
||||
* @access public
|
||||
* @param array $values Form values
|
||||
* @return array $valid, $errors [0] = Success or not, [1] = List of errors
|
||||
*/
|
||||
public function validateProjectModification(array $values)
|
||||
{
|
||||
$v = new Validator($values, array(
|
||||
new Validators\Required('id', t('The id is required')),
|
||||
new Validators\Integer('id', t('This value must be an integer')),
|
||||
new Validators\Required('project_id', t('The project is required')),
|
||||
new Validators\Integer('project_id', t('This value must be an integer')),
|
||||
));
|
||||
|
||||
return array(
|
||||
$v->execute(),
|
||||
$v->getErrors()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a timestamp if the given date format is correct otherwise return 0
|
||||
*
|
||||
|
|
|
|||
|
|
@ -13,11 +13,10 @@
|
|||
<div class="form-actions">
|
||||
<input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
|
||||
<?= t('or') ?>
|
||||
<?php if ($ajax): ?>
|
||||
<a href="?controller=board&action=show&project_id=<?= $task['project_id'] ?>"><?= t('cancel') ?></a>
|
||||
<?php else: ?>
|
||||
<a href="?controller=task&action=show&task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
|
||||
<?php endif ?>
|
||||
<?php if ($ajax): ?>
|
||||
<a href="?controller=board&action=show&project_id=<?= $task['project_id'] ?>"><?= t('cancel') ?></a>
|
||||
<?php else: ?>
|
||||
<a href="?controller=task&action=show&task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
|
||||
<?php endif ?>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,18 @@
|
|||
<div class="page-header">
|
||||
<h2><?= t('Move the task to another project') ?></h2>
|
||||
</div>
|
||||
|
||||
<form method="post" action="?controller=task&action=move&task_id=<?= $task['id'] ?>&project_id=<?= $task['project_id'] ?>" autocomplete="off">
|
||||
|
||||
<?= Helper\form_csrf() ?>
|
||||
|
||||
<?= Helper\form_hidden('id', $values) ?>
|
||||
<?= Helper\form_label(t('Project'), 'project_id') ?>
|
||||
<?= Helper\form_select('project_id', $projects_list, $values, $errors) ?><br/>
|
||||
|
||||
<div class="form-actions">
|
||||
<input type="submit" value="<?= t('Save') ?>" class="btn btn-blue"/>
|
||||
<?= t('or') ?>
|
||||
<a href="?controller=board&action=show&project_id=<?= $task['project_id'] ?>"><?= t('cancel') ?></a>
|
||||
</div>
|
||||
</form>
|
||||
|
|
@ -9,6 +9,7 @@
|
|||
<li><a href="?controller=comment&action=create&task_id=<?= $task['id'] ?>"><?= t('Add a comment') ?></a></li>
|
||||
<li><a href="?controller=file&action=create&task_id=<?= $task['id'] ?>"><?= t('Attach a document') ?></a></li>
|
||||
<li><a href="?controller=task&action=duplicate&project_id=<?= $task['project_id'] ?>&task_id=<?= $task['id'] ?>"><?= t('Duplicate') ?></a></li>
|
||||
<li><a href="?controller=task&action=move&project_id=<?= $task['project_id'] ?>&task_id=<?= $task['id'] ?>"><?= t('Move to another project') ?></a></li>
|
||||
<li>
|
||||
<?php if ($task['is_active'] == 1): ?>
|
||||
<a href="?controller=task&action=confirmClose&task_id=<?= $task['id'] ?>"><?= t('Close this task') ?></a>
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ class ActionTest extends Base
|
|||
$this->assertEquals(1, $t1['column_id']);
|
||||
|
||||
// We move our task
|
||||
$task->move(1, 4, 1);
|
||||
$task->movePosition(1, 4, 1);
|
||||
|
||||
$this->assertTrue($this->registry->event->isEventTriggered(Task::EVENT_MOVE_COLUMN));
|
||||
$this->assertTrue($this->registry->event->isEventTriggered(Task::EVENT_UPDATE));
|
||||
|
|
@ -152,8 +152,8 @@ class ActionTest extends Base
|
|||
$this->assertEquals('yellow', $t1['color_id']);
|
||||
|
||||
// We move our tasks
|
||||
$task->move(1, 1, 1); // task #1 to position 1
|
||||
$task->move(2, 1, 0); // task #2 to position 0
|
||||
$task->movePosition(1, 1, 1); // task #1 to position 1
|
||||
$task->movePosition(2, 1, 0); // task #2 to position 0
|
||||
|
||||
$this->assertTrue($this->registry->event->isEventTriggered(Task::EVENT_MOVE_POSITION));
|
||||
|
||||
|
|
@ -223,7 +223,7 @@ class ActionTest extends Base
|
|||
$this->assertEquals(1, $t1['project_id']);
|
||||
|
||||
// We move our task
|
||||
$task->move(1, 4, 1);
|
||||
$task->movePosition(1, 4, 1);
|
||||
|
||||
$this->assertTrue($this->registry->event->isEventTriggered(Task::EVENT_CLOSE));
|
||||
$this->assertTrue($this->registry->event->isEventTriggered(Task::EVENT_MOVE_COLUMN));
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ require_once __DIR__.'/Base.php';
|
|||
use Model\Task;
|
||||
use Model\Project;
|
||||
use Model\Category;
|
||||
use Model\User;
|
||||
|
||||
class TaskTest extends Base
|
||||
{
|
||||
|
|
@ -183,6 +184,51 @@ class TaskTest extends Base
|
|||
$this->assertEquals('test', $task['title']);
|
||||
}
|
||||
|
||||
public function testMoveToAnotherProject()
|
||||
{
|
||||
$t = new Task($this->registry);
|
||||
$p = new Project($this->registry);
|
||||
$user = new User($this->registry);
|
||||
|
||||
// We create a regular user
|
||||
$user->create(array('username' => 'unittest1', 'password' => 'unittest'));
|
||||
$user->create(array('username' => 'unittest2', 'password' => 'unittest'));
|
||||
|
||||
// We create 2 projects
|
||||
$this->assertEquals(1, $p->create(array('name' => 'test1')));
|
||||
$this->assertEquals(2, $p->create(array('name' => 'test2')));
|
||||
|
||||
// We create a task
|
||||
$this->assertEquals(1, $t->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 1, 'owner_id' => 1, 'category_id' => 10, 'position' => 333)));
|
||||
$this->assertEquals(2, $t->create(array('title' => 'test2', 'project_id' => 1, 'column_id' => 1, 'owner_id' => 3, 'category_id' => 10, 'position' => 333)));
|
||||
|
||||
// We duplicate our task to the 2nd project
|
||||
$task = $t->getById(1);
|
||||
$this->assertTrue($t->moveToAnotherProject(2, $task));
|
||||
//$this->assertTrue($this->registry->event->isEventTriggered(Task::EVENT_CREATE));
|
||||
|
||||
// Check the values of the duplicated task
|
||||
$task = $t->getById(1);
|
||||
$this->assertNotEmpty($task);
|
||||
$this->assertEquals(1, $task['owner_id']);
|
||||
$this->assertEquals(0, $task['category_id']);
|
||||
$this->assertEquals(2, $task['project_id']);
|
||||
$this->assertEquals(5, $task['column_id']);
|
||||
$this->assertEquals(0, $task['position']);
|
||||
$this->assertEquals('test', $task['title']);
|
||||
|
||||
// We allow only one user on the second project
|
||||
$this->assertTrue($p->allowUser(2, 2));
|
||||
|
||||
// The owner should be reseted
|
||||
$task = $t->getById(2);
|
||||
$this->assertTrue($t->moveToAnotherProject(2, $task));
|
||||
|
||||
$task = $t->getById(2);
|
||||
$this->assertNotEmpty($task);
|
||||
$this->assertEquals(0, $task['owner_id']);
|
||||
}
|
||||
|
||||
public function testEvents()
|
||||
{
|
||||
$t = new Task($this->registry);
|
||||
|
|
@ -209,15 +255,15 @@ class TaskTest extends Base
|
|||
$this->assertTrue($this->registry->event->isEventTriggered(Task::EVENT_OPEN));
|
||||
|
||||
// We change the column of our task
|
||||
$this->assertTrue($t->move(1, 2, 1));
|
||||
$this->assertTrue($t->movePosition(1, 2, 1));
|
||||
$this->assertTrue($this->registry->event->isEventTriggered(Task::EVENT_MOVE_COLUMN));
|
||||
|
||||
// We change the position of our task
|
||||
$this->assertTrue($t->move(1, 2, 2));
|
||||
$this->assertTrue($t->movePosition(1, 2, 2));
|
||||
$this->assertTrue($this->registry->event->isEventTriggered(Task::EVENT_MOVE_POSITION));
|
||||
|
||||
// We change the column and the position of our task
|
||||
$this->assertTrue($t->move(1, 1, 3));
|
||||
$this->assertTrue($t->movePosition(1, 1, 3));
|
||||
$this->assertTrue($this->registry->event->isEventTriggered(Task::EVENT_MOVE_COLUMN));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue