Add new actions to reorder tasks by column

This commit is contained in:
Frédéric Guillot 2019-02-08 13:53:13 -08:00
parent ba5878e786
commit 0295388461
36 changed files with 320 additions and 1 deletions

View File

@ -0,0 +1,36 @@
<?php
namespace Kanboard\Controller;
use Kanboard\Core\Controller\AccessForbiddenException;
class TaskReorderController extends BaseController
{
public function reorderColumn()
{
$project = $this->getProject();
if (! $this->helper->user->hasProjectAccess('TaskModificationController', 'update', $project['id'])) {
throw new AccessForbiddenException();
}
$swimlaneID = $this->request->getIntegerParam('swimlane_id');
$columnID = $this->request->getIntegerParam('column_id');
$direction = $this->request->getStringParam('direction');
$sort = $this->request->getStringParam('sort');
switch ($sort) {
case 'priority':
$this->taskReorderModel->reorderByPriority($project['id'], $swimlaneID, $columnID, $direction);
break;
case 'assignee-priority':
$this->taskReorderModel->reorderByAssigneeAndPriority($project['id'], $swimlaneID, $columnID, $direction);
break;
case 'assignee':
$this->taskReorderModel->reorderByAssignee($project['id'], $swimlaneID, $columnID, $direction);
break;
}
$this->response->redirect($this->helper->url->to('BoardViewController', 'show', ['project_id' => $project['id']]));
}
}

View File

@ -142,6 +142,7 @@ use Pimple\Container;
* @property \Kanboard\Model\TaskLinkModel $taskLinkModel
* @property \Kanboard\Model\TaskModificationModel $taskModificationModel
* @property \Kanboard\Model\TaskPositionModel $taskPositionModel
* @property \Kanboard\Model\TaskReorderModel $taskReorderModel
* @property \Kanboard\Model\TaskStatusModel $taskStatusModel
* @property \Kanboard\Model\TaskTagModel $taskTagModel
* @property \Kanboard\Model\TaskMetadataModel $taskMetadataModel

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
'Destination swimlane' => 'Mål spor',
'Assign a category when the task is moved to a specific swimlane' => 'Tildele kategori når opgave flyttes til anført spor',
'Move the task to another swimlane when the category is changed' => 'Flytte opgave til andet spor når kategori ændres',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
'Destination swimlane' => 'Swimlane de destination',
'Assign a category when the task is moved to a specific swimlane' => 'Assigner une catégorie lorsque la tâche est déplaçée dans une swimlane spécifique',
'Move the task to another swimlane when the category is changed' => 'Déplaçer la tâche dans une autre swimlane lorsque la catégorie est modifiée',
'Reorder this column by priority (ASC)' => 'Réorganiser cette colonne par priorité (ASC)',
'Reorder this column by priority (DESC)' => 'Réorganiser cette colonne par priorité (DESC)',
'Reorder this column by assignee and priority (ASC)' => 'Réorganiser cette colonne par assigné et par priorité (ASC)',
'Reorder this column by assignee and priority (DESC)' => 'Réorganiser cette colonne par assigné et par priorité (DESC)',
'Reorder this column by assignee (A-Z)' => 'Réorganiser cette colonne par assigné (A-Z)',
'Reorder this column by assignee (Z-A)' => 'Réorganiser cette colonne par assigné (Z-A)',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
'Destination swimlane' => 'Raia de destino',
'Assign a category when the task is moved to a specific swimlane' => 'Atribuir uma categoria quando a tarefa for movida para uma raia específica',
'Move the task to another swimlane when the category is changed' => 'Mover a tarefa para outra raia quando a categoria é alterada',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
'Destination swimlane' => '目标泳道',
'Assign a category when the task is moved to a specific swimlane' => '将移动到指定泳道的任务设定分类',
'Move the task to another swimlane when the category is changed' => '当分类改变时将任务移动到另一个泳道',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -1392,4 +1392,10 @@ return array(
// 'Destination swimlane' => '',
// 'Assign a category when the task is moved to a specific swimlane' => '',
// 'Move the task to another swimlane when the category is changed' => '',
// 'Reorder this column by priority (ASC)' => '',
// 'Reorder this column by priority (DESC)' => '',
// 'Reorder this column by assignee and priority (ASC)' => '',
// 'Reorder this column by assignee and priority (DESC)' => '',
// 'Reorder this column by assignee (A-Z)' => '',
// 'Reorder this column by assignee (Z-A)' => '',
);

View File

@ -0,0 +1,74 @@
<?php
namespace Kanboard\Model;
use Kanboard\Core\Base;
class TaskReorderModel extends Base
{
public function reorderByPriority($projectID, $swimlaneID, $columnID, $direction)
{
$this->db->startTransaction();
$taskIDs = $this->db->table(TaskModel::TABLE)
->eq('project_id', $projectID)
->eq('swimlane_id', $swimlaneID)
->eq('column_id', $columnID)
->orderBy('priority', $direction)
->asc('id')
->findAllByColumn('id');
$this->reorderTasks($taskIDs);
$this->db->closeTransaction();
}
public function reorderByAssigneeAndPriority($projectID, $swimlaneID, $columnID, $direction)
{
$this->db->startTransaction();
$taskIDs = $this->db->table(TaskModel::TABLE)
->eq('tasks.project_id', $projectID)
->eq('tasks.swimlane_id', $swimlaneID)
->eq('tasks.column_id', $columnID)
->asc('u.name')
->asc('u.username')
->orderBy('tasks.priority', $direction)
->left(UserModel::TABLE, 'u', 'id', TaskModel::TABLE, 'owner_id')
->findAllByColumn('tasks.id');
$this->reorderTasks($taskIDs);
$this->db->closeTransaction();
}
public function reorderByAssignee($projectID, $swimlaneID, $columnID, $direction)
{
$this->db->startTransaction();
$taskIDs = $this->db->table(TaskModel::TABLE)
->eq('tasks.project_id', $projectID)
->eq('tasks.swimlane_id', $swimlaneID)
->eq('tasks.column_id', $columnID)
->orderBy('u.name', $direction)
->orderBy('u.username', $direction)
->orderBy('u.id', $direction)
->left(UserModel::TABLE, 'u', 'id', TaskModel::TABLE, 'owner_id')
->findAllByColumn('tasks.id');
$this->reorderTasks($taskIDs);
$this->db->closeTransaction();
}
protected function reorderTasks(array $taskIDs)
{
$i = 1;
foreach ($taskIDs as $taskID) {
$this->db->table(TaskModel::TABLE)
->eq('id', $taskID)
->update(['position' => $i]);
$i++;
}
}
}

View File

@ -85,6 +85,7 @@ class ClassProvider implements ServiceProviderInterface
'TaskLinkModel',
'TaskModificationModel',
'TaskPositionModel',
'TaskReorderModel',
'TaskStatusModel',
'TaskTagModel',
'TaskMetadataModel',

View File

@ -48,6 +48,27 @@
</li>
<?php endif ?>
<?php if ($column['nb_tasks'] > 0 && $this->user->hasProjectAccess('TaskModificationController', 'update', $column['project_id'])): ?>
<li>
<?= $this->url->icon('sort-numeric-asc', t('Reorder this column by priority (ASC)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'priority', 'direction' => 'asc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']]) ?>
</li>
<li>
<?= $this->url->icon('sort-numeric-desc', t('Reorder this column by priority (DESC)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'priority', 'direction' => 'desc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']]) ?>
</li>
<li>
<?= $this->url->icon('sort-amount-asc', t('Reorder this column by assignee and priority (ASC)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'assignee-priority', 'direction' => 'asc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']]) ?>
</li>
<li>
<?= $this->url->icon('sort-amount-desc', t('Reorder this column by assignee and priority (DESC)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'assignee-priority', 'direction' => 'desc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']]) ?>
</li>
<li>
<?= $this->url->icon('sort-alpha-asc', t('Reorder this column by assignee (A-Z)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'assignee', 'direction' => 'asc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']]) ?>
</li>
<li>
<?= $this->url->icon('sort-alpha-desc', t('Reorder this column by assignee (Z-A)'), 'TaskReorderController', 'reorderColumn', ['sort' => 'assignee', 'direction' => 'desc', 'project_id' => $column['project_id'], 'column_id' => $column['id'], 'swimlane_id' => $swimlane['id']]) ?>
</li>
<?php endif ?>
<?= $this->hook->render('template:board:column:dropdown', array('swimlane' => $swimlane, 'column' => $column)) ?>
</ul>
</span>
@ -81,7 +102,7 @@
<?php endif ?>
</span>
<?php endif ?>
<?= $this->hook->render('template:board:column:header', array('swimlane' => $swimlane, 'column' => $column)) ?>
<?= $this->hook->render('template:board:column:header', array('swimlane' => $swimlane, 'column' => $column)) ?>
</div>
</th>