Implemented Changes to Project Duplication to include Swimlanes and Tasks.

ProjectDuplication::duplicate accepts additional param of type array now. Array includes which optional parts to duplicate. Optional parts are: 'swimlane', 'category', 'task', 'action'.
This commit is contained in:
Michael Lüpkes
2015-02-03 11:16:10 +01:00
parent 24300f828a
commit e5ea361255
8 changed files with 218 additions and 16 deletions

View File

@@ -297,7 +297,7 @@ class Project extends Base
/**
* Duplicate a project
*
* @author Antonio Rabelo
* @author Antonio Rabelo & Michael Lüpkes
* @access public
*/
public function duplicate()
@@ -305,10 +305,8 @@ class Project extends Base
$project = $this->getProject();
if ($this->request->getStringParam('duplicate') === 'yes') {
$this->checkCSRFParam();
if ($this->projectDuplication->duplicate($project['id'])) {
$values = array_keys($this->request->getValues());
if ($this->projectDuplication->duplicate($project['id'], $values)) {
$this->session->flash(t('Project cloned successfully.'));
} else {
$this->session->flashError(t('Unable to clone this project.'));

View File

@@ -34,6 +34,7 @@ use Pimple\Container;
* @property \Model\Swimlane $swimlane
* @property \Model\Task $task
* @property \Model\TaskCreation $taskCreation
* @property \Model\TaskDuplication $taskDuplication
* @property \Model\TaskExport $taskExport
* @property \Model\TaskFinder $taskFinder
* @property \Model\TaskHistory $taskHistory

View File

@@ -59,10 +59,11 @@ class ProjectDuplication extends Base
/**
* Clone a project with all settings
*
* @param integer $project_id Project Id
* @param integer $project_id Project Id
* @param array $part_selection Selection of optional project parts to duplicate. Possible options: 'swimlane', 'action', 'category', 'task'
* @return integer Cloned Project Id
*/
public function duplicate($project_id)
public function duplicate($project_id, $part_selection = array('category', 'action'))
{
$this->db->startTransaction();
@@ -74,7 +75,14 @@ class ProjectDuplication extends Base
return false;
}
foreach (array('board', 'category', 'projectPermission', 'action') as $model) {
// Clone Columns, Categories, Permissions and Actions
$optional_parts = array('swimlane', 'action', 'category');
foreach (array('board', 'category', 'projectPermission', 'action', 'swimlane') as $model) {
// Skip if optional part has not been selected
if (in_array($model, $optional_parts) && ! in_array($model, $part_selection)) {
continue;
}
if (! $this->$model->duplicate($project_id, $clone_project_id)) {
$this->db->cancelTransaction();
@@ -82,8 +90,21 @@ class ProjectDuplication extends Base
}
}
$this->db->closeTransaction();
//* Clone Tasks if in $part_selection
if(in_array('task', $part_selection)) {
$tasks = $this->taskFinder->getAll($project_id);
foreach ($tasks as $task) {
if (!$this->taskDuplication->duplicateToProject($task['id'], $clone_project_id)) {
return false;
}
}
}
return (int) $clone_project_id;
}
}

View File

@@ -183,7 +183,7 @@ class Swimlane extends Base
* @access public
* @param integer $project_id
* @param string $name
* @return bool
* @return integer|boolean
*/
public function create($project_id, $name)
{
@@ -412,6 +412,37 @@ class Swimlane extends Base
return false;
}
/**
* Duplicate Swimlane to project
*
* @access public
* @param integer $project_from Project Template
* @param integer $project_to Project that receives the copy
* @return integer|boolean
*/
public function duplicate($project_from, $project_to)
{
$swimlanes = $this->getAll($project_from);
foreach ($swimlanes as $swimlane) {
unset($swimlane['id']);
$swimlane['project_id'] = $project_to;
if (! $this->db->table(self::TABLE)->save($swimlane)) {
return false;
}
}
$default_swimlane = $this->getDefault($project_from);
$default_swimlane['id'] = $project_to;
$this->updateDefault($default_swimlane);
return true;
}
/**
* Validate creation
*

View File

@@ -4,11 +4,20 @@
<div class="confirm">
<p class="alert alert-info">
<?= t('Do you really want to duplicate this project: "%s"?', $project['name']) ?>
<?= t('Which parts of the project do you want to duplicate?') ?>
</p>
<form method="post" action="<?= $this->u('project', 'duplicate', array('project_id' => $project['id'], 'duplicate' => 'yes')) ?>" autocomplete="off">
<div class="form-actions">
<?= $this->a(t('Yes'), 'project', 'duplicate', array('project_id' => $project['id'], 'duplicate' => 'yes'), true, 'btn btn-red') ?>
<?= t('or') ?> <?= $this->a(t('cancel'), 'project', 'show', array('project_id' => $project['id'])) ?>
</div>
<?= $this->formCsrf() ?>
<?= $this->formCheckbox('category', t('Categories'), 1, true) ?>
<?= $this->formCheckbox('action', t('Actions'), 1, true) ?>
<?= $this->formCheckbox('swimlane', t('Swimlanes'), 1, true) ?>
<?= $this->formCheckbox('task', t('Tasks'), 1, true) ?>
<div class="form-actions">
<input type="submit" value="<?= t('Duplicate') ?>" class="btn btn-red"/>
<?= t('or') ?> <?= $this->a(t('cancel'), 'project', 'show', array('project_id' => $project['id'])) ?>
</div>
</form>
</div>