summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/Controller/TaskBulkMoveColumnController.php44
-rw-r--r--app/Locale/bs_BA/translations.php4
-rw-r--r--app/Locale/ca_ES/translations.php4
-rw-r--r--app/Locale/cs_CZ/translations.php4
-rw-r--r--app/Locale/da_DK/translations.php4
-rw-r--r--app/Locale/de_DE/translations.php4
-rw-r--r--app/Locale/el_GR/translations.php4
-rw-r--r--app/Locale/es_ES/translations.php4
-rw-r--r--app/Locale/fi_FI/translations.php4
-rw-r--r--app/Locale/fr_FR/translations.php4
-rw-r--r--app/Locale/hr_HR/translations.php4
-rw-r--r--app/Locale/hu_HU/translations.php4
-rw-r--r--app/Locale/id_ID/translations.php4
-rw-r--r--app/Locale/it_IT/translations.php4
-rw-r--r--app/Locale/ja_JP/translations.php4
-rw-r--r--app/Locale/ko_KR/translations.php4
-rw-r--r--app/Locale/my_MY/translations.php4
-rw-r--r--app/Locale/nb_NO/translations.php4
-rw-r--r--app/Locale/nl_NL/translations.php4
-rw-r--r--app/Locale/pl_PL/translations.php4
-rw-r--r--app/Locale/pt_BR/translations.php4
-rw-r--r--app/Locale/pt_PT/translations.php4
-rw-r--r--app/Locale/ro_RO/translations.php4
-rw-r--r--app/Locale/ru_RU/translations.php4
-rw-r--r--app/Locale/sr_Latn_RS/translations.php4
-rw-r--r--app/Locale/sv_SE/translations.php4
-rw-r--r--app/Locale/th_TH/translations.php4
-rw-r--r--app/Locale/tr_TR/translations.php4
-rw-r--r--app/Locale/uk_UA/translations.php4
-rw-r--r--app/Locale/vi_VN/translations.php4
-rw-r--r--app/Locale/zh_CN/translations.php4
-rw-r--r--app/Locale/zh_TW/translations.php4
-rw-r--r--app/Model/TaskPositionModel.php36
-rw-r--r--app/ServiceProvider/AuthenticationProvider.php1
-rw-r--r--app/Template/task_bulk_move_column/show.php16
-rw-r--r--app/Template/task_list/header.php18
-rw-r--r--app/Template/task_list/listing.php2
-rw-r--r--app/Template/task_list/task_title.php3
38 files changed, 244 insertions, 0 deletions
diff --git a/app/Controller/TaskBulkMoveColumnController.php b/app/Controller/TaskBulkMoveColumnController.php
new file mode 100644
index 00000000..f3607df6
--- /dev/null
+++ b/app/Controller/TaskBulkMoveColumnController.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Kanboard\Controller;
+
+use Kanboard\Core\Controller\AccessForbiddenException;
+
+class TaskBulkMoveColumnController extends BaseController
+{
+ public function show(array $values = [], array $errors = [])
+ {
+ $project = $this->getProject();
+
+ if (empty($values)) {
+ $values['task_ids'] = $this->request->getStringParam('task_ids');
+ }
+
+ $this->response->html($this->template->render('task_bulk_move_column/show', [
+ 'project' => $project,
+ 'values' => $values,
+ 'errors' => $errors,
+ 'columns' => $this->columnModel->getList($project['id']),
+ 'swimlanes' => $this->swimlaneModel->getList($project['id'], false, true),
+ ]));
+ }
+
+ public function save()
+ {
+ $project = $this->getProject();
+ $values = $this->request->getValues();
+ $taskIDs = explode(',', $values['task_ids']);
+
+ foreach ($taskIDs as $taskID) {
+ $task = $this->taskFinderModel->getById($taskID);
+
+ if (! $this->helper->projectRole->canMoveTask($task['project_id'], $task['column_id'], $values['column_id'])) {
+ throw new AccessForbiddenException(e('You are not allowed to move this task.'));
+ }
+
+ $this->taskPositionModel->moveBottom($project['id'], $taskID, $values['swimlane_id'], $values['column_id']);
+ }
+
+ $this->response->redirect($this->helper->url->to('TaskListController', 'show', ['project_id' => $project['id']]), true);
+ }
+}
diff --git a/app/Locale/bs_BA/translations.php b/app/Locale/bs_BA/translations.php
index 4efddd68..df615277 100644
--- a/app/Locale/bs_BA/translations.php
+++ b/app/Locale/bs_BA/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/ca_ES/translations.php b/app/Locale/ca_ES/translations.php
index 657de0a3..7b854aaf 100644
--- a/app/Locale/ca_ES/translations.php
+++ b/app/Locale/ca_ES/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/cs_CZ/translations.php b/app/Locale/cs_CZ/translations.php
index 1851df43..7217ff9a 100644
--- a/app/Locale/cs_CZ/translations.php
+++ b/app/Locale/cs_CZ/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/da_DK/translations.php b/app/Locale/da_DK/translations.php
index 9511f53a..9a8caa96 100644
--- a/app/Locale/da_DK/translations.php
+++ b/app/Locale/da_DK/translations.php
@@ -1377,4 +1377,8 @@ return array(
'%s moved the task #%d to the swimlane "%s"' => '%s flyttet opgave #%d til spor "%s"',
'%sh spent' => '%sh brugt',
'%sh estimated' => '%sh anslået',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/de_DE/translations.php b/app/Locale/de_DE/translations.php
index 7e681cc4..fd32baef 100644
--- a/app/Locale/de_DE/translations.php
+++ b/app/Locale/de_DE/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/el_GR/translations.php b/app/Locale/el_GR/translations.php
index 38cad369..a16f6c85 100644
--- a/app/Locale/el_GR/translations.php
+++ b/app/Locale/el_GR/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/es_ES/translations.php b/app/Locale/es_ES/translations.php
index 7b099df1..15448f80 100644
--- a/app/Locale/es_ES/translations.php
+++ b/app/Locale/es_ES/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/fi_FI/translations.php b/app/Locale/fi_FI/translations.php
index 456e04ed..d91bc296 100644
--- a/app/Locale/fi_FI/translations.php
+++ b/app/Locale/fi_FI/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/fr_FR/translations.php b/app/Locale/fr_FR/translations.php
index 9411547d..279fb70d 100644
--- a/app/Locale/fr_FR/translations.php
+++ b/app/Locale/fr_FR/translations.php
@@ -1377,4 +1377,8 @@ return array(
'%s moved the task #%d to the swimlane "%s"' => '%s a déplacé la tâche #%d vers la swimlane « %s »',
'%sh spent' => '%sh passé',
'%sh estimated' => '%sh estimé',
+ 'Select All' => 'Tout sélectionner',
+ 'Unselect All' => 'Tout désélectionner',
+ 'Apply action' => 'Appliquer une action',
+ 'Move selected tasks to another column' => 'Déplaçer les tâches sélectionnées vers une autre colonne',
);
diff --git a/app/Locale/hr_HR/translations.php b/app/Locale/hr_HR/translations.php
index c0915760..a834eaa3 100644
--- a/app/Locale/hr_HR/translations.php
+++ b/app/Locale/hr_HR/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/hu_HU/translations.php b/app/Locale/hu_HU/translations.php
index b4a71041..9235ece2 100644
--- a/app/Locale/hu_HU/translations.php
+++ b/app/Locale/hu_HU/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/id_ID/translations.php b/app/Locale/id_ID/translations.php
index 5a60aac7..71c89c1f 100644
--- a/app/Locale/id_ID/translations.php
+++ b/app/Locale/id_ID/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/it_IT/translations.php b/app/Locale/it_IT/translations.php
index c74d0736..00ef9599 100644
--- a/app/Locale/it_IT/translations.php
+++ b/app/Locale/it_IT/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/ja_JP/translations.php b/app/Locale/ja_JP/translations.php
index 58f25804..7d476b2a 100644
--- a/app/Locale/ja_JP/translations.php
+++ b/app/Locale/ja_JP/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/ko_KR/translations.php b/app/Locale/ko_KR/translations.php
index 35f29815..8f79fc00 100644
--- a/app/Locale/ko_KR/translations.php
+++ b/app/Locale/ko_KR/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/my_MY/translations.php b/app/Locale/my_MY/translations.php
index 668c76eb..ef82d749 100644
--- a/app/Locale/my_MY/translations.php
+++ b/app/Locale/my_MY/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/nb_NO/translations.php b/app/Locale/nb_NO/translations.php
index 85a458a4..e5e3d5aa 100644
--- a/app/Locale/nb_NO/translations.php
+++ b/app/Locale/nb_NO/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/nl_NL/translations.php b/app/Locale/nl_NL/translations.php
index f4083aa5..2f067090 100644
--- a/app/Locale/nl_NL/translations.php
+++ b/app/Locale/nl_NL/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/pl_PL/translations.php b/app/Locale/pl_PL/translations.php
index be91d579..b3ccc0a6 100644
--- a/app/Locale/pl_PL/translations.php
+++ b/app/Locale/pl_PL/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/pt_BR/translations.php b/app/Locale/pt_BR/translations.php
index 7e38f325..edd02c81 100644
--- a/app/Locale/pt_BR/translations.php
+++ b/app/Locale/pt_BR/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/pt_PT/translations.php b/app/Locale/pt_PT/translations.php
index 8493b22d..ea2be376 100644
--- a/app/Locale/pt_PT/translations.php
+++ b/app/Locale/pt_PT/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/ro_RO/translations.php b/app/Locale/ro_RO/translations.php
index 8c41ecfb..50939126 100644
--- a/app/Locale/ro_RO/translations.php
+++ b/app/Locale/ro_RO/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/ru_RU/translations.php b/app/Locale/ru_RU/translations.php
index e3decf38..60a01fc3 100644
--- a/app/Locale/ru_RU/translations.php
+++ b/app/Locale/ru_RU/translations.php
@@ -1377,4 +1377,8 @@ return array(
'%s moved the task #%d to the swimlane "%s"' => '%s перенёс задачу #%d на дорожку "%s"',
'%sh spent' => '%sч затрачено',
'%sh estimated' => '%sч запланировано',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/sr_Latn_RS/translations.php b/app/Locale/sr_Latn_RS/translations.php
index f6ae8ae8..724bebd4 100644
--- a/app/Locale/sr_Latn_RS/translations.php
+++ b/app/Locale/sr_Latn_RS/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/sv_SE/translations.php b/app/Locale/sv_SE/translations.php
index c777dcf9..781372c5 100644
--- a/app/Locale/sv_SE/translations.php
+++ b/app/Locale/sv_SE/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/th_TH/translations.php b/app/Locale/th_TH/translations.php
index b259cf64..b568ef09 100644
--- a/app/Locale/th_TH/translations.php
+++ b/app/Locale/th_TH/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/tr_TR/translations.php b/app/Locale/tr_TR/translations.php
index 92b12014..b7aa82cb 100644
--- a/app/Locale/tr_TR/translations.php
+++ b/app/Locale/tr_TR/translations.php
@@ -1377,4 +1377,8 @@ return array(
'%s moved the task #%d to the swimlane "%s"' => '%s , #%d görevini "%s" kulvarına taşıdı',
'%sh spent' => '%sh harcandı',
'%sh estimated' => '%sh tahmin edildi',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/uk_UA/translations.php b/app/Locale/uk_UA/translations.php
index f7c8da56..40d69dea 100644
--- a/app/Locale/uk_UA/translations.php
+++ b/app/Locale/uk_UA/translations.php
@@ -1377,4 +1377,8 @@ return array(
'%s moved the task #%d to the swimlane "%s"' => '%s перемістив задачу #%d на доріжку "%s"',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/vi_VN/translations.php b/app/Locale/vi_VN/translations.php
index 10f1b55d..1a5dcd70 100644
--- a/app/Locale/vi_VN/translations.php
+++ b/app/Locale/vi_VN/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/zh_CN/translations.php b/app/Locale/zh_CN/translations.php
index d9401dc2..ac6230e2 100644
--- a/app/Locale/zh_CN/translations.php
+++ b/app/Locale/zh_CN/translations.php
@@ -1377,4 +1377,8 @@ return array(
'%s moved the task #%d to the swimlane "%s"' => '%s将任务 #%d 移动到了里程碑 "%s" 下',
'%sh spent' => '花费%s小时',
'%sh estimated' => '预估%s小时',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Locale/zh_TW/translations.php b/app/Locale/zh_TW/translations.php
index ab35c1e6..ebdcd276 100644
--- a/app/Locale/zh_TW/translations.php
+++ b/app/Locale/zh_TW/translations.php
@@ -1377,4 +1377,8 @@ return array(
// '%s moved the task #%d to the swimlane "%s"' => '',
// '%sh spent' => '',
// '%sh estimated' => '',
+ // 'Select All' => '',
+ // 'Unselect All' => '',
+ // 'Apply action' => '',
+ // 'Move selected tasks to another column' => '',
);
diff --git a/app/Model/TaskPositionModel.php b/app/Model/TaskPositionModel.php
index 9f7eb983..6c109f3d 100644
--- a/app/Model/TaskPositionModel.php
+++ b/app/Model/TaskPositionModel.php
@@ -12,6 +12,42 @@ use Kanboard\Core\Base;
*/
class TaskPositionModel extends Base
{
+ public function moveBottom($project_id, $task_id, $swimlane_id, $column_id)
+ {
+ $this->db->startTransaction();
+
+ $task = $this->taskFinderModel->getById($task_id);
+
+ $result = $this->db->table(TaskModel::TABLE)
+ ->eq('project_id', $project_id)
+ ->eq('swimlane_id', $swimlane_id)
+ ->eq('column_id', $column_id)
+ ->columns('MAX(position) AS pos')
+ ->findOne();
+
+ $position = 1;
+ if (! empty($result)) {
+ $position = $result['pos'] + 1;
+ }
+
+ $result = $this->db->table(TaskModel::TABLE)
+ ->eq('id', $task_id)
+ ->eq('project_id', $project_id)
+ ->update([
+ 'swimlane_id' => $swimlane_id,
+ 'column_id' => $column_id,
+ 'position' => $position
+ ]);
+
+ $this->db->closeTransaction();
+
+ if ($result) {
+ $this->fireEvents($task, $column_id, $position, $swimlane_id);
+ }
+
+ return $result;
+ }
+
/**
* Move a task to another column or to another position
*
diff --git a/app/ServiceProvider/AuthenticationProvider.php b/app/ServiceProvider/AuthenticationProvider.php
index 797e70d0..9cb437ac 100644
--- a/app/ServiceProvider/AuthenticationProvider.php
+++ b/app/ServiceProvider/AuthenticationProvider.php
@@ -106,6 +106,7 @@ class AuthenticationProvider implements ServiceProviderInterface
$acl->add('TaskSuppressionController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskCreationController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskBulkController', '*', Role::PROJECT_MEMBER);
+ $acl->add('TaskBulkMoveColumnController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskDuplicationController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskRecurrenceController', '*', Role::PROJECT_MEMBER);
$acl->add('TaskImportController', '*', Role::PROJECT_MANAGER);
diff --git a/app/Template/task_bulk_move_column/show.php b/app/Template/task_bulk_move_column/show.php
new file mode 100644
index 00000000..3333391e
--- /dev/null
+++ b/app/Template/task_bulk_move_column/show.php
@@ -0,0 +1,16 @@
+<div class="page-header">
+ <h2><?= t('Move selected tasks to another column') ?></h2>
+</div>
+
+<form action="<?= $this->url->href('TaskBulkMoveColumnController', 'save', ['project_id' => $project['id']]) ?>" method="post">
+ <?= $this->form->csrf() ?>
+ <?= $this->form->hidden('task_ids', $values) ?>
+
+ <?= $this->form->label(t('Swimlane'), 'swimlane_id') ?>
+ <?= $this->form->select('swimlane_id', $swimlanes, $values) ?>
+
+ <?= $this->form->label(t('Column'), 'column_id') ?>
+ <?= $this->form->select('column_id', $columns, $values) ?>
+
+ <?= $this->modal->submitButtons() ?>
+</form>
diff --git a/app/Template/task_list/header.php b/app/Template/task_list/header.php
index 7704e2df..599286aa 100644
--- a/app/Template/task_list/header.php
+++ b/app/Template/task_list/header.php
@@ -6,6 +6,24 @@
<?= t('%d task', $paginator->getTotal()) ?>
<?php endif ?>
</div>
+ <?php if (isset($show_items_selection)): ?>
+ <?php if ($this->user->hasProjectAccess('TaskModificationController', 'save', $project['id'])): ?>
+ <div class="list-item-links">
+ <a href="#" data-list-item-selection="all"><?= t('Select All') ?></a> / <a href="#" data-list-item-selection="none"><?= t('Unselect All') ?></a>
+ </div>
+ <div class="list-item-actions list-item-action-hidden">
+ -&nbsp;
+ <div class="dropdown">
+ <a href="#" class="dropdown-menu dropdown-menu-link-icon"><strong><?= t('Apply action') ?> <i class="fa fa-caret-down"></i></strong></a>
+ <ul>
+ <li>
+ <a href="<?= $this->url->href('TaskBulkMoveColumnController', 'show', ['project_id' => $project['id']]) ?>" data-list-item-action="modal"><?= t('Move selected tasks to another column') ?></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <?php endif ?>
+ <?php endif ?>
<div class="table-list-header-menu">
<?php if (isset($project)): ?>
<?php if ($this->user->hasSubtaskListActivated()): ?>
diff --git a/app/Template/task_list/listing.php b/app/Template/task_list/listing.php
index 97393972..7891b543 100644
--- a/app/Template/task_list/listing.php
+++ b/app/Template/task_list/listing.php
@@ -7,12 +7,14 @@
<?= $this->render('task_list/header', array(
'paginator' => $paginator,
'project' => $project,
+ 'show_items_selection' => true,
)) ?>
<?php foreach ($paginator->getCollection() as $task): ?>
<div class="table-list-row color-<?= $task['color_id'] ?>">
<?= $this->render('task_list/task_title', array(
'task' => $task,
+ 'show_items_selection' => true,
)) ?>
<?= $this->render('task_list/task_details', array(
diff --git a/app/Template/task_list/task_title.php b/app/Template/task_list/task_title.php
index 028e9b70..92d61b6c 100644
--- a/app/Template/task_list/task_title.php
+++ b/app/Template/task_list/task_title.php
@@ -1,5 +1,8 @@
<div>
<?php if ($this->user->hasProjectAccess('TaskModificationController', 'edit', $task['project_id'])): ?>
+ <?php if (isset($show_items_selection)): ?>
+ <input type="checkbox" data-list-item="selectable" name="tasks[]" value="<?= $task['id'] ?>">
+ <?php endif ?>
<?= $this->render('task/dropdown', array('task' => $task)) ?>
<?php else: ?>
<strong><?= '#'.$task['id'] ?></strong>