From fe9f3ba707d1caf9348ae17e0566eabd505fbce2 Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Sat, 8 Apr 2017 11:18:58 -0400 Subject: Add assignee restriction for custom project roles (dnd) --- app/Controller/ColumnMoveRestrictionController.php | 3 ++- app/Helper/ProjectRoleHelper.php | 13 +++++++++---- app/Model/ColumnMoveRestrictionModel.php | 8 ++++++-- app/Schema/Sqlite.php | 7 ++++++- app/Template/column_move_restriction/create.php | 2 ++ app/Template/project_role/show.php | 6 +++++- 6 files changed, 30 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/Controller/ColumnMoveRestrictionController.php b/app/Controller/ColumnMoveRestrictionController.php index b12f6b77..9a75bf75 100644 --- a/app/Controller/ColumnMoveRestrictionController.php +++ b/app/Controller/ColumnMoveRestrictionController.php @@ -49,7 +49,8 @@ class ColumnMoveRestrictionController extends BaseController $project['id'], $values['role_id'], $values['src_column_id'], - $values['dst_column_id'] + $values['dst_column_id'], + isset($values['only_assigned']) && $values['only_assigned'] == 1 ); if ($restriction_id !== false) { diff --git a/app/Helper/ProjectRoleHelper.php b/app/Helper/ProjectRoleHelper.php index 295b8b3e..a9f0596a 100644 --- a/app/Helper/ProjectRoleHelper.php +++ b/app/Helper/ProjectRoleHelper.php @@ -36,7 +36,7 @@ class ProjectRoleHelper extends Base public function isDraggable(array &$task) { if ($task['is_active'] == 1 && $this->helper->user->hasProjectAccess('BoardAjaxController', 'save', $task['project_id'])) { - return $this->isSortableColumn($task['project_id'], $task['column_id']); + return $this->isSortableColumn($task['project_id'], $task['column_id'], $task['owner_id']); } return false; @@ -47,9 +47,10 @@ class ProjectRoleHelper extends Base * * @param int $projectId * @param int $columnId + * @param int $assigneeId * @return bool */ - public function isSortableColumn($projectId, $columnId) + public function isSortableColumn($projectId, $columnId, $assigneeId = null) { $role = $this->getProjectUserRole($projectId); @@ -58,6 +59,10 @@ class ProjectRoleHelper extends Base foreach ($sortableColumns as $column) { if ($column['src_column_id'] == $columnId || $column['dst_column_id'] == $columnId) { + if ($column['only_assigned'] == 1 && $assigneeId !== null && $assigneeId != $this->userSession->getId()) { + return false; + } + return true; } } @@ -182,7 +187,7 @@ class ProjectRoleHelper extends Base { $role = $this->getProjectUserRole($task['project_id']); - if ($this->hasRestriction($task['project_id'], $role, ProjectRoleRestrictionModel::RULE_TASK_CHANGE_ASSIGNEE)) { + if ($this->role->isCustomProjectRole($role) && $this->hasRestriction($task['project_id'], $role, ProjectRoleRestrictionModel::RULE_TASK_CHANGE_ASSIGNEE)) { return false; } @@ -200,7 +205,7 @@ class ProjectRoleHelper extends Base { $role = $this->getProjectUserRole($task['project_id']); - if ($task['owner_id'] != $this->userSession->getId() && $this->hasRestriction($task['project_id'], $role, ProjectRoleRestrictionModel::RULE_TASK_UPDATE_ASSIGNED)) { + if ($this->role->isCustomProjectRole($role) && $task['owner_id'] != $this->userSession->getId() && $this->hasRestriction($task['project_id'], $role, ProjectRoleRestrictionModel::RULE_TASK_UPDATE_ASSIGNED)) { return false; } diff --git a/app/Model/ColumnMoveRestrictionModel.php b/app/Model/ColumnMoveRestrictionModel.php index c2603efd..9d2b2842 100644 --- a/app/Model/ColumnMoveRestrictionModel.php +++ b/app/Model/ColumnMoveRestrictionModel.php @@ -31,6 +31,7 @@ class ColumnMoveRestrictionModel extends Base self::TABLE.'.role_id', self::TABLE.'.src_column_id', self::TABLE.'.dst_column_id', + self::TABLE.'.only_assigned', 'pr.role', 'sc.title as src_column_title', 'dc.title as dst_column_title' @@ -59,6 +60,7 @@ class ColumnMoveRestrictionModel extends Base self::TABLE.'.role_id', self::TABLE.'.src_column_id', self::TABLE.'.dst_column_id', + self::TABLE.'.only_assigned', 'pr.role', 'sc.title as src_column_title', 'dc.title as dst_column_title' @@ -81,7 +83,7 @@ class ColumnMoveRestrictionModel extends Base { return $this->db ->table(self::TABLE) - ->columns(self::TABLE.'.src_column_id', self::TABLE.'.dst_column_id') + ->columns(self::TABLE.'.src_column_id', self::TABLE.'.dst_column_id', self::TABLE.'.only_assigned') ->left(ProjectRoleModel::TABLE, 'pr', 'role_id', self::TABLE, 'role_id') ->eq(self::TABLE.'.project_id', $project_id) ->eq('pr.role', $role) @@ -95,9 +97,10 @@ class ColumnMoveRestrictionModel extends Base * @param int $role_id * @param int $src_column_id * @param int $dst_column_id + * @param bool $only_assigned * @return bool|int */ - public function create($project_id, $role_id, $src_column_id, $dst_column_id) + public function create($project_id, $role_id, $src_column_id, $dst_column_id, $only_assigned = false) { return $this->db ->table(self::TABLE) @@ -106,6 +109,7 @@ class ColumnMoveRestrictionModel extends Base 'role_id' => $role_id, 'src_column_id' => $src_column_id, 'dst_column_id' => $dst_column_id, + 'only_assigned' => (int) $only_assigned, )); } diff --git a/app/Schema/Sqlite.php b/app/Schema/Sqlite.php index 04a5d050..ddcff861 100644 --- a/app/Schema/Sqlite.php +++ b/app/Schema/Sqlite.php @@ -8,7 +8,12 @@ use Kanboard\Core\Security\Token; use Kanboard\Core\Security\Role; use PDO; -const VERSION = 113; +const VERSION = 114; + +function version_114(PDO $pdo) +{ + $pdo->exec('ALTER TABLE column_has_move_restrictions ADD COLUMN only_assigned INTEGER DEFAULT 0'); +} function version_113(PDO $pdo) { diff --git a/app/Template/column_move_restriction/create.php b/app/Template/column_move_restriction/create.php index 852df971..cd9e1bf5 100644 --- a/app/Template/column_move_restriction/create.php +++ b/app/Template/column_move_restriction/create.php @@ -12,6 +12,8 @@ form->label(t('Destination column'), 'dst_column_id') ?> form->select('dst_column_id', $columns, $values, $errors) ?> + form->checkbox('only_assigned', t('Only for tasks assigned to the current user'), 1, isset($values['only_assigned']) && $values['only_assigned'] == 1) ?> + modal->submitButtons() ?>

diff --git a/app/Template/project_role/show.php b/app/Template/project_role/show.php index 5377f7bb..65c9ef11 100644 --- a/app/Template/project_role/show.php +++ b/app/Template/project_role/show.php @@ -80,7 +80,11 @@ text->e($restriction['src_column_title']) ?> / text->e($restriction['dst_column_title']) ?> - + + + + + modal->confirm('trash-o', t('Remove'), 'ColumnMoveRestrictionController', 'confirm', array('project_id' => $project['id'], 'restriction_id' => $restriction['restriction_id'])) ?> -- cgit v1.2.3