|
<?php |
|
|
|
namespace Kanboard\Filter; |
|
|
|
use Kanboard\Core\Filter\FilterInterface; |
|
use Kanboard\Model\SubtaskModel; |
|
use Kanboard\Model\TaskModel; |
|
use Kanboard\Model\UserModel; |
|
use PicoDb\Database; |
|
use PicoDb\Table; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TaskSubtaskAssigneeFilter extends BaseFilter implements FilterInterface |
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
private $db; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $currentUserId = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function setCurrentUserId($userId) |
|
{ |
|
$this->currentUserId = $userId; |
|
return $this; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function setDatabase(Database $db) |
|
{ |
|
$this->db = $db; |
|
return $this; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getAttributes() |
|
{ |
|
return array('subtask:assignee'); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function apply() |
|
{ |
|
$this->query->inSubquery(TaskModel::TABLE.'.id', $this->getSubQuery()); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected function getSubQuery() |
|
{ |
|
$subquery = $this->db->table(SubtaskModel::TABLE) |
|
->columns(SubtaskModel::TABLE.'.task_id') |
|
->join(UserModel::TABLE, 'id', 'user_id', SubtaskModel::TABLE) |
|
->neq(SubtaskModel::TABLE.'.status', SubtaskModel::STATUS_DONE); |
|
|
|
return $this->applySubQueryFilter($subquery); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected function applySubQueryFilter(Table $subquery) |
|
{ |
|
if (is_int($this->value) || ctype_digit((string) $this->value)) { |
|
$subquery->eq(SubtaskModel::TABLE.'.user_id', $this->value); |
|
} else { |
|
switch ($this->value) { |
|
case 'me': |
|
$subquery->eq(SubtaskModel::TABLE.'.user_id', $this->currentUserId); |
|
break; |
|
case 'nobody': |
|
$subquery->eq(SubtaskModel::TABLE.'.user_id', 0); |
|
break; |
|
case 'anybody': |
|
$subquery->gt(SubtaskModel::TABLE.'.user_id', 0); |
|
break; |
|
default: |
|
$subquery->beginOr(); |
|
$subquery->ilike(UserModel::TABLE.'.username', $this->value.'%'); |
|
$subquery->ilike(UserModel::TABLE.'.name', '%'.$this->value.'%'); |
|
$subquery->closeOr(); |
|
} |
|
} |
|
|
|
return $subquery; |
|
} |
|
} |
|
|