Added search by task creator
This commit is contained in:
@@ -4,6 +4,7 @@ Version 1.0.28 (unreleased)
|
|||||||
New features:
|
New features:
|
||||||
|
|
||||||
* Search in comments
|
* Search in comments
|
||||||
|
* Search by task creator
|
||||||
|
|
||||||
Improvements:
|
Improvements:
|
||||||
|
|
||||||
|
|||||||
74
app/Filter/TaskCreatorFilter.php
Normal file
74
app/Filter/TaskCreatorFilter.php
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Kanboard\Filter;
|
||||||
|
|
||||||
|
use Kanboard\Core\Filter\FilterInterface;
|
||||||
|
use Kanboard\Model\Task;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter tasks by creator
|
||||||
|
*
|
||||||
|
* @package filter
|
||||||
|
* @author Frederic Guillot
|
||||||
|
*/
|
||||||
|
class TaskCreatorFilter extends BaseFilter implements FilterInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Current user id
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
private $currentUserId = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set current user id
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param integer $userId
|
||||||
|
* @return TaskAssigneeFilter
|
||||||
|
*/
|
||||||
|
public function setCurrentUserId($userId)
|
||||||
|
{
|
||||||
|
$this->currentUserId = $userId;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get search attribute
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string[]
|
||||||
|
*/
|
||||||
|
public function getAttributes()
|
||||||
|
{
|
||||||
|
return array('creator');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply filter
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function apply()
|
||||||
|
{
|
||||||
|
if (is_int($this->value) || ctype_digit($this->value)) {
|
||||||
|
$this->query->eq(Task::TABLE.'.creator_id', $this->value);
|
||||||
|
} else {
|
||||||
|
switch ($this->value) {
|
||||||
|
case 'me':
|
||||||
|
$this->query->eq(Task::TABLE.'.creator_id', $this->currentUserId);
|
||||||
|
break;
|
||||||
|
case 'nobody':
|
||||||
|
$this->query->eq(Task::TABLE.'.creator_id', 0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->query->beginOr();
|
||||||
|
$this->query->ilike('uc.username', '%'.$this->value.'%');
|
||||||
|
$this->query->ilike('uc.name', '%'.$this->value.'%');
|
||||||
|
$this->query->closeOr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -138,6 +138,7 @@ class TaskFinder extends Base
|
|||||||
Project::TABLE.'.name AS project_name'
|
Project::TABLE.'.name AS project_name'
|
||||||
)
|
)
|
||||||
->join(User::TABLE, 'id', 'owner_id', Task::TABLE)
|
->join(User::TABLE, 'id', 'owner_id', Task::TABLE)
|
||||||
|
->left(User::TABLE, 'uc', 'id', Task::TABLE, 'creator_id')
|
||||||
->join(Category::TABLE, 'id', 'category_id', Task::TABLE)
|
->join(Category::TABLE, 'id', 'category_id', Task::TABLE)
|
||||||
->join(Column::TABLE, 'id', 'column_id', Task::TABLE)
|
->join(Column::TABLE, 'id', 'column_id', Task::TABLE)
|
||||||
->join(Swimlane::TABLE, 'id', 'swimlane_id', Task::TABLE)
|
->join(Swimlane::TABLE, 'id', 'swimlane_id', Task::TABLE)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use Kanboard\Filter\TaskColorFilter;
|
|||||||
use Kanboard\Filter\TaskColumnFilter;
|
use Kanboard\Filter\TaskColumnFilter;
|
||||||
use Kanboard\Filter\TaskCommentFilter;
|
use Kanboard\Filter\TaskCommentFilter;
|
||||||
use Kanboard\Filter\TaskCreationDateFilter;
|
use Kanboard\Filter\TaskCreationDateFilter;
|
||||||
|
use Kanboard\Filter\TaskCreatorFilter;
|
||||||
use Kanboard\Filter\TaskDescriptionFilter;
|
use Kanboard\Filter\TaskDescriptionFilter;
|
||||||
use Kanboard\Filter\TaskDueDateFilter;
|
use Kanboard\Filter\TaskDueDateFilter;
|
||||||
use Kanboard\Filter\TaskIdFilter;
|
use Kanboard\Filter\TaskIdFilter;
|
||||||
@@ -84,10 +85,15 @@ class FilterProvider implements ServiceProviderInterface
|
|||||||
->setCurrentUserId($c['userSession']->getId())
|
->setCurrentUserId($c['userSession']->getId())
|
||||||
)
|
)
|
||||||
->withFilter(new TaskCategoryFilter())
|
->withFilter(new TaskCategoryFilter())
|
||||||
->withFilter(TaskColorFilter::getInstance()->setColorModel($c['color']))
|
->withFilter(TaskColorFilter::getInstance()
|
||||||
|
->setColorModel($c['color'])
|
||||||
|
)
|
||||||
->withFilter(new TaskColumnFilter())
|
->withFilter(new TaskColumnFilter())
|
||||||
->withFilter(new TaskCommentFilter())
|
->withFilter(new TaskCommentFilter())
|
||||||
->withFilter(new TaskCreationDateFilter())
|
->withFilter(new TaskCreationDateFilter())
|
||||||
|
->withFilter(TaskCreatorFilter::getInstance()
|
||||||
|
->setCurrentUserId($c['userSession']->getId())
|
||||||
|
)
|
||||||
->withFilter(new TaskDescriptionFilter())
|
->withFilter(new TaskDescriptionFilter())
|
||||||
->withFilter(new TaskDueDateFilter())
|
->withFilter(new TaskDueDateFilter())
|
||||||
->withFilter(new TaskIdFilter())
|
->withFilter(new TaskIdFilter())
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ Attribute: **status**
|
|||||||
- Query to find open tasks: `status:open`
|
- Query to find open tasks: `status:open`
|
||||||
- Query to find closed tasks: `status:closed`
|
- Query to find closed tasks: `status:closed`
|
||||||
|
|
||||||
Search by assignees
|
Search by assignee
|
||||||
-------------------
|
------------------
|
||||||
|
|
||||||
Attribute: **assignee**
|
Attribute: **assignee**
|
||||||
|
|
||||||
@@ -38,6 +38,15 @@ Attribute: **assignee**
|
|||||||
- Query for unassigned tasks: `assignee:nobody`
|
- Query for unassigned tasks: `assignee:nobody`
|
||||||
- Query for my assigned tasks: `assignee:me`
|
- Query for my assigned tasks: `assignee:me`
|
||||||
|
|
||||||
|
Search by task creator
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Attribute: **creator**
|
||||||
|
|
||||||
|
- Tasks created by myself: `creator:me`
|
||||||
|
- Tasks created by John Doe: `creator:"John Doe"`
|
||||||
|
- Tasks created by the user id #1: `creator:1`
|
||||||
|
|
||||||
Search by subtask assignee
|
Search by subtask assignee
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
|
|||||||
159
tests/units/Filter/TaskCreatorFilterTest.php
Normal file
159
tests/units/Filter/TaskCreatorFilterTest.php
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Kanboard\Filter\TaskCreatorFilter;
|
||||||
|
use Kanboard\Model\Project;
|
||||||
|
use Kanboard\Model\TaskCreation;
|
||||||
|
use Kanboard\Model\TaskFinder;
|
||||||
|
use Kanboard\Model\User;
|
||||||
|
|
||||||
|
require_once __DIR__.'/../Base.php';
|
||||||
|
|
||||||
|
class TaskCreatorFilterTest extends Base
|
||||||
|
{
|
||||||
|
public function testWithIntegerAssigneeId()
|
||||||
|
{
|
||||||
|
$taskFinder = new TaskFinder($this->container);
|
||||||
|
$taskCreation = new TaskCreation($this->container);
|
||||||
|
$projectModel = new Project($this->container);
|
||||||
|
$query = $taskFinder->getExtendedQuery();
|
||||||
|
|
||||||
|
$this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
|
||||||
|
$this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1, 'creator_id' => 1)));
|
||||||
|
|
||||||
|
$filter = new TaskCreatorFilter();
|
||||||
|
$filter->withQuery($query);
|
||||||
|
$filter->withValue(1);
|
||||||
|
$filter->apply();
|
||||||
|
|
||||||
|
$this->assertCount(1, $query->findAll());
|
||||||
|
|
||||||
|
$filter = new TaskCreatorFilter();
|
||||||
|
$filter->withQuery($query);
|
||||||
|
$filter->withValue(123);
|
||||||
|
$filter->apply();
|
||||||
|
|
||||||
|
$this->assertCount(0, $query->findAll());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testWithStringAssigneeId()
|
||||||
|
{
|
||||||
|
$taskFinder = new TaskFinder($this->container);
|
||||||
|
$taskCreation = new TaskCreation($this->container);
|
||||||
|
$projectModel = new Project($this->container);
|
||||||
|
$query = $taskFinder->getExtendedQuery();
|
||||||
|
|
||||||
|
$this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
|
||||||
|
$this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1, 'creator_id' => 1)));
|
||||||
|
|
||||||
|
$filter = new TaskCreatorFilter();
|
||||||
|
$filter->withQuery($query);
|
||||||
|
$filter->withValue('1');
|
||||||
|
$filter->apply();
|
||||||
|
|
||||||
|
$this->assertCount(1, $query->findAll());
|
||||||
|
|
||||||
|
$filter = new TaskCreatorFilter();
|
||||||
|
$filter->withQuery($query);
|
||||||
|
$filter->withValue("123");
|
||||||
|
$filter->apply();
|
||||||
|
|
||||||
|
$this->assertCount(0, $query->findAll());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testWithUsername()
|
||||||
|
{
|
||||||
|
$taskFinder = new TaskFinder($this->container);
|
||||||
|
$taskCreation = new TaskCreation($this->container);
|
||||||
|
$projectModel = new Project($this->container);
|
||||||
|
$query = $taskFinder->getExtendedQuery();
|
||||||
|
|
||||||
|
$this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
|
||||||
|
$this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1, 'creator_id' => 1)));
|
||||||
|
|
||||||
|
$filter = new TaskCreatorFilter();
|
||||||
|
$filter->withQuery($query);
|
||||||
|
$filter->withValue('admin');
|
||||||
|
$filter->apply();
|
||||||
|
|
||||||
|
$this->assertCount(1, $query->findAll());
|
||||||
|
|
||||||
|
$filter = new TaskCreatorFilter();
|
||||||
|
$filter->withQuery($query);
|
||||||
|
$filter->withValue('foobar');
|
||||||
|
$filter->apply();
|
||||||
|
|
||||||
|
$this->assertCount(0, $query->findAll());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testWithName()
|
||||||
|
{
|
||||||
|
$taskFinder = new TaskFinder($this->container);
|
||||||
|
$taskCreation = new TaskCreation($this->container);
|
||||||
|
$projectModel = new Project($this->container);
|
||||||
|
$userModel = new User($this->container);
|
||||||
|
$query = $taskFinder->getExtendedQuery();
|
||||||
|
|
||||||
|
$this->assertEquals(2, $userModel->create(array('username' => 'foobar', 'name' => 'Foo Bar')));
|
||||||
|
$this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
|
||||||
|
$this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1, 'creator_id' => 2)));
|
||||||
|
|
||||||
|
$filter = new TaskCreatorFilter();
|
||||||
|
$filter->withQuery($query);
|
||||||
|
$filter->withValue('foo bar');
|
||||||
|
$filter->apply();
|
||||||
|
|
||||||
|
$this->assertCount(1, $query->findAll());
|
||||||
|
|
||||||
|
$filter = new TaskCreatorFilter();
|
||||||
|
$filter->withQuery($query);
|
||||||
|
$filter->withValue('bob');
|
||||||
|
$filter->apply();
|
||||||
|
|
||||||
|
$this->assertCount(0, $query->findAll());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testWithNobody()
|
||||||
|
{
|
||||||
|
$taskFinder = new TaskFinder($this->container);
|
||||||
|
$taskCreation = new TaskCreation($this->container);
|
||||||
|
$projectModel = new Project($this->container);
|
||||||
|
$query = $taskFinder->getExtendedQuery();
|
||||||
|
|
||||||
|
$this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
|
||||||
|
$this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1)));
|
||||||
|
|
||||||
|
$filter = new TaskCreatorFilter();
|
||||||
|
$filter->withQuery($query);
|
||||||
|
$filter->withValue('nobody');
|
||||||
|
$filter->apply();
|
||||||
|
|
||||||
|
$this->assertCount(1, $query->findAll());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testWithCurrentUser()
|
||||||
|
{
|
||||||
|
$taskFinder = new TaskFinder($this->container);
|
||||||
|
$taskCreation = new TaskCreation($this->container);
|
||||||
|
$projectModel = new Project($this->container);
|
||||||
|
$query = $taskFinder->getExtendedQuery();
|
||||||
|
|
||||||
|
$this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
|
||||||
|
$this->assertEquals(1, $taskCreation->create(array('title' => 'Test', 'project_id' => 1, 'creator_id' => 1)));
|
||||||
|
|
||||||
|
$filter = new TaskCreatorFilter();
|
||||||
|
$filter->setCurrentUserId(1);
|
||||||
|
$filter->withQuery($query);
|
||||||
|
$filter->withValue('me');
|
||||||
|
$filter->apply();
|
||||||
|
|
||||||
|
$this->assertCount(1, $query->findAll());
|
||||||
|
|
||||||
|
$filter = new TaskCreatorFilter();
|
||||||
|
$filter->setCurrentUserId(2);
|
||||||
|
$filter->withQuery($query);
|
||||||
|
$filter->withValue('me');
|
||||||
|
$filter->apply();
|
||||||
|
|
||||||
|
$this->assertCount(0, $query->findAll());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user