Files
BulkMoveTasks/Controller/BulkMoveController.php

104 lines
3.9 KiB
PHP
Raw Permalink Normal View History

2026-06-28 17:30:04 -03:00
<?php
namespace Kanboard\Plugin\BulkMoveTasks\Controller;
use Kanboard\Controller\BaseController;
use Kanboard\Core\Controller\AccessForbiddenException;
use Kanboard\Model\TaskModel;
/**
* Move every task of a board column (within one swimlane) to another column.
*/
class BulkMoveController extends BaseController
{
/**
* Render the modal: pick the destination column.
*/
public function show()
{
$project = $this->getProject();
$this->checkAccess($project['id']);
$column_id = $this->request->getIntegerParam('column_id');
$swimlane_id = $this->request->getIntegerParam('swimlane_id');
// Offer every column of the project except the source one as a destination.
$columns = $this->columnModel->getList($project['id']);
unset($columns[$column_id]);
$this->response->html($this->template->render('bulkMoveTasks:board/move_all_tasks', array(
'project' => $project,
'nb_tasks' => $this->taskFinderModel->countByColumnAndSwimlaneId($project['id'], $column_id, $swimlane_id),
'column' => $this->columnModel->getColumnTitleById($column_id),
'swimlane' => $this->swimlaneModel->getNameById($swimlane_id),
'columns_list' => $columns,
'values' => array(
'column_id' => $column_id,
'swimlane_id' => $swimlane_id,
),
)));
}
/**
* Perform the move and return to the board.
*/
public function move()
{
$project = $this->getProject();
$this->checkAccess($project['id']);
$values = $this->request->getValues();
$src_column_id = isset($values['column_id']) ? (int) $values['column_id'] : 0;
$dst_column_id = isset($values['dst_column_id']) ? (int) $values['dst_column_id'] : 0;
$swimlane_id = isset($values['swimlane_id']) ? (int) $values['swimlane_id'] : 0;
$columns = $this->columnModel->getList($project['id']);
if ($src_column_id === 0 || $dst_column_id === 0 || $src_column_id === $dst_column_id || ! isset($columns[$dst_column_id])) {
$this->flash->failure(t('Please choose a different destination column.'));
} else {
$moved = $this->moveAllTasks($project['id'], $src_column_id, $dst_column_id, $swimlane_id);
$this->flash->success(t('%d task(s) moved from "%s" to "%s".', $moved, $this->columnModel->getColumnTitleById($src_column_id), $this->columnModel->getColumnTitleById($dst_column_id)));
}
$this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $project['id'])));
}
/**
* Move every open task of (source column, swimlane) to the end of the
* destination column, keeping their relative order. Returns the count moved.
*/
private function moveAllTasks($project_id, $src_column_id, $dst_column_id, $swimlane_id)
{
$task_ids = $this->db->table(TaskModel::TABLE)
->eq('project_id', $project_id)
->eq('column_id', $src_column_id)
->eq('swimlane_id', $swimlane_id)
->eq('is_active', TaskModel::STATUS_OPEN)
->asc('position')
->findAllByColumn('id');
$position = $this->taskFinderModel->countByColumnAndSwimlaneId($project_id, $dst_column_id, $swimlane_id) + 1;
$moved = 0;
foreach ($task_ids as $task_id) {
if ($this->taskPositionModel->movePosition($project_id, $task_id, $dst_column_id, $position, $swimlane_id)) {
$position++;
$moved++;
}
}
return $moved;
}
/**
* Allow only users who can modify tasks in this project.
*/
private function checkAccess($project_id)
{
if (! $this->helper->user->hasProjectAccess('TaskModificationController', 'update', $project_id)) {
throw new AccessForbiddenException();
}
}
}