Move a task to another project

This commit is contained in:
Frédéric Guillot
2014-08-30 22:35:50 -08:00
parent 9e36f84fbc
commit 7e44dee903
18 changed files with 194 additions and 23 deletions

View File

@@ -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')
)));
}
}

View File

@@ -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' => '',
);

View File

@@ -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' => '',
);

View File

@@ -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' => '',
);

View File

@@ -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',
);

View File

@@ -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' => '',
);

View File

@@ -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' => '',
);

View File

@@ -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' => '',
);

View File

@@ -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' => '',
);

View File

@@ -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' => '',
);

View File

@@ -52,6 +52,7 @@ class Acl extends Base
'confirmremove',
'editdescription',
'savedescription',
'move',
),
);

View File

@@ -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;
}

View File

@@ -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
*

View File

@@ -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&amp;action=show&amp;project_id=<?= $task['project_id'] ?>"><?= t('cancel') ?></a>
<?php else: ?>
<a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
<?php endif ?>
<?php if ($ajax): ?>
<a href="?controller=board&amp;action=show&amp;project_id=<?= $task['project_id'] ?>"><?= t('cancel') ?></a>
<?php else: ?>
<a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>"><?= t('cancel') ?></a>
<?php endif ?>
</div>
</form>

View File

@@ -0,0 +1,18 @@
<div class="page-header">
<h2><?= t('Move the task to another project') ?></h2>
</div>
<form method="post" action="?controller=task&amp;action=move&amp;task_id=<?= $task['id'] ?>&amp;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&amp;action=show&amp;project_id=<?= $task['project_id'] ?>"><?= t('cancel') ?></a>
</div>
</form>

View File

@@ -9,6 +9,7 @@
<li><a href="?controller=comment&amp;action=create&amp;task_id=<?= $task['id'] ?>"><?= t('Add a comment') ?></a></li>
<li><a href="?controller=file&amp;action=create&amp;task_id=<?= $task['id'] ?>"><?= t('Attach a document') ?></a></li>
<li><a href="?controller=task&amp;action=duplicate&amp;project_id=<?= $task['project_id'] ?>&amp;task_id=<?= $task['id'] ?>"><?= t('Duplicate') ?></a></li>
<li><a href="?controller=task&amp;action=move&amp;project_id=<?= $task['project_id'] ?>&amp;task_id=<?= $task['id'] ?>"><?= t('Move to another project') ?></a></li>
<li>
<?php if ($task['is_active'] == 1): ?>
<a href="?controller=task&amp;action=confirmClose&amp;task_id=<?= $task['id'] ?>"><?= t('Close this task') ?></a>