Added search by task creator
This commit is contained in:
parent
7705f4c533
commit
38326c4ddf
|
|
@ -4,6 +4,7 @@ Version 1.0.28 (unreleased)
|
|||
New features:
|
||||
|
||||
* Search in comments
|
||||
* Search by task creator
|
||||
|
||||
Improvements:
|
||||
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
)
|
||||
->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(Column::TABLE, 'id', 'column_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\TaskCommentFilter;
|
||||
use Kanboard\Filter\TaskCreationDateFilter;
|
||||
use Kanboard\Filter\TaskCreatorFilter;
|
||||
use Kanboard\Filter\TaskDescriptionFilter;
|
||||
use Kanboard\Filter\TaskDueDateFilter;
|
||||
use Kanboard\Filter\TaskIdFilter;
|
||||
|
|
@ -84,10 +85,15 @@ class FilterProvider implements ServiceProviderInterface
|
|||
->setCurrentUserId($c['userSession']->getId())
|
||||
)
|
||||
->withFilter(new TaskCategoryFilter())
|
||||
->withFilter(TaskColorFilter::getInstance()->setColorModel($c['color']))
|
||||
->withFilter(TaskColorFilter::getInstance()
|
||||
->setColorModel($c['color'])
|
||||
)
|
||||
->withFilter(new TaskColumnFilter())
|
||||
->withFilter(new TaskCommentFilter())
|
||||
->withFilter(new TaskCreationDateFilter())
|
||||
->withFilter(TaskCreatorFilter::getInstance()
|
||||
->setCurrentUserId($c['userSession']->getId())
|
||||
)
|
||||
->withFilter(new TaskDescriptionFilter())
|
||||
->withFilter(new TaskDueDateFilter())
|
||||
->withFilter(new TaskIdFilter())
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@ Attribute: **status**
|
|||
- Query to find open tasks: `status:open`
|
||||
- Query to find closed tasks: `status:closed`
|
||||
|
||||
Search by assignees
|
||||
-------------------
|
||||
Search by assignee
|
||||
------------------
|
||||
|
||||
Attribute: **assignee**
|
||||
|
||||
|
|
@ -38,6 +38,15 @@ Attribute: **assignee**
|
|||
- Query for unassigned tasks: `assignee:nobody`
|
||||
- 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
|
||||
--------------------------
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue