Add status attribute for advanced search
This commit is contained in:
@@ -28,6 +28,7 @@ class Lexer
|
|||||||
"/^(assignee:)/" => 'T_ASSIGNEE',
|
"/^(assignee:)/" => 'T_ASSIGNEE',
|
||||||
"/^(color:)/" => 'T_COLOR',
|
"/^(color:)/" => 'T_COLOR',
|
||||||
"/^(due:)/" => 'T_DUE',
|
"/^(due:)/" => 'T_DUE',
|
||||||
|
"/^(status:)/" => 'T_STATUS',
|
||||||
"/^(title:)/" => 'T_TITLE',
|
"/^(title:)/" => 'T_TITLE',
|
||||||
"/^(\s+)/" => 'T_WHITESPACE',
|
"/^(\s+)/" => 'T_WHITESPACE',
|
||||||
'/^([<=>]{0,2}[0-9]{4}-[0-9]{2}-[0-9]{2})/' => 'T_DATE',
|
'/^([<=>]{0,2}[0-9]{4}-[0-9]{2}-[0-9]{2})/' => 'T_DATE',
|
||||||
@@ -114,10 +115,11 @@ class Lexer
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'T_STATUS':
|
||||||
case 'T_DUE':
|
case 'T_DUE':
|
||||||
$next = next($tokens);
|
$next = next($tokens);
|
||||||
|
|
||||||
if ($next !== false && $next['token'] === 'T_DATE') {
|
if ($next !== false && ($next['token'] === 'T_DATE' || $next['token'] === 'T_STRING')) {
|
||||||
$map[$token['token']] = $next['match'];
|
$map[$token['token']] = $next['match'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,9 @@ class TaskFilter extends Base
|
|||||||
case 'T_TITLE':
|
case 'T_TITLE':
|
||||||
$this->filterByTitle($value);
|
$this->filterByTitle($value);
|
||||||
break;
|
break;
|
||||||
|
case 'T_STATUS':
|
||||||
|
$this->filterByStatusName($value);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -296,6 +299,22 @@ class TaskFilter extends Base
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter by status name
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string $status
|
||||||
|
* @return TaskFilter
|
||||||
|
*/
|
||||||
|
public function filterByStatusName($status)
|
||||||
|
{
|
||||||
|
if ($status === 'open' || $status === 'closed') {
|
||||||
|
$this->filterByStatus($status === 'open' ? Task::STATUS_OPEN : Task::STATUS_CLOSED);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Filter by status
|
* Filter by status
|
||||||
*
|
*
|
||||||
@@ -321,6 +340,7 @@ class TaskFilter extends Base
|
|||||||
*/
|
*/
|
||||||
public function filterByDueDate($date)
|
public function filterByDueDate($date)
|
||||||
{
|
{
|
||||||
|
$this->query->neq('date_due', '');
|
||||||
$this->query->neq('date_due', 0);
|
$this->query->neq('date_due', 0);
|
||||||
$this->query->notNull('date_due');
|
$this->query->notNull('date_due');
|
||||||
return $this->filterWithOperator('date_due', $date, true);
|
return $this->filterWithOperator('date_due', $date, true);
|
||||||
|
|||||||
@@ -12,6 +12,14 @@ This example will returns all tasks assigned to me with a due date for tomorrow
|
|||||||
assigne:me due:tomorrow my title
|
assigne:me due:tomorrow my title
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Search by status
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Attribute: **status**
|
||||||
|
|
||||||
|
- Query to find open tasks: `status:open`
|
||||||
|
- Query to find closed tasks: `status:closed`
|
||||||
|
|
||||||
Search by assignee
|
Search by assignee
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
|||||||
@@ -66,6 +66,36 @@ class LexerTest extends Base
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testStatusQuery()
|
||||||
|
{
|
||||||
|
$lexer = new Lexer;
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
array(array('match' => 'status:', 'token' => 'T_STATUS'), array('match' => 'open', 'token' => 'T_STRING')),
|
||||||
|
$lexer->tokenize('status:open')
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
array(array('match' => 'status:', 'token' => 'T_STATUS'), array('match' => 'closed', 'token' => 'T_STRING')),
|
||||||
|
$lexer->tokenize('status:closed')
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
array('T_STATUS' => 'open'),
|
||||||
|
$lexer->map($lexer->tokenize('status:open'))
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
array('T_STATUS' => 'closed'),
|
||||||
|
$lexer->map($lexer->tokenize('status:closed'))
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
array(),
|
||||||
|
$lexer->map($lexer->tokenize('status: '))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public function testDueDateQuery()
|
public function testDueDateQuery()
|
||||||
{
|
{
|
||||||
$lexer = new Lexer;
|
$lexer = new Lexer;
|
||||||
|
|||||||
@@ -26,6 +26,33 @@ class TaskFilterTest extends Base
|
|||||||
$this->assertEmpty($tf->search('search something')->findAll());
|
$this->assertEmpty($tf->search('search something')->findAll());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testSearchWithStatus()
|
||||||
|
{
|
||||||
|
$p = new Project($this->container);
|
||||||
|
$tc = new TaskCreation($this->container);
|
||||||
|
$tf = new TaskFilter($this->container);
|
||||||
|
|
||||||
|
$this->assertEquals(1, $p->create(array('name' => 'test')));
|
||||||
|
$this->assertNotFalse($tc->create(array('project_id' => 1, 'title' => 'my task title is awesome')));
|
||||||
|
$this->assertNotFalse($tc->create(array('project_id' => 1, 'title' => 'my task title is amazing')));
|
||||||
|
$this->assertNotFalse($tc->create(array('project_id' => 1, 'title' => 'my task title is amazing', 'is_active' => 0)));
|
||||||
|
|
||||||
|
$tf->search('status:open');
|
||||||
|
$tasks = $tf->findAll();
|
||||||
|
$this->assertNotEmpty($tasks);
|
||||||
|
$this->assertCount(2, $tasks);
|
||||||
|
|
||||||
|
$tf->search('status:plop');
|
||||||
|
$tasks = $tf->findAll();
|
||||||
|
$this->assertNotEmpty($tasks);
|
||||||
|
$this->assertCount(3, $tasks);
|
||||||
|
|
||||||
|
$tf->search('status:closed');
|
||||||
|
$tasks = $tf->findAll();
|
||||||
|
$this->assertNotEmpty($tasks);
|
||||||
|
$this->assertCount(1, $tasks);
|
||||||
|
}
|
||||||
|
|
||||||
public function testSearchWithDueDate()
|
public function testSearchWithDueDate()
|
||||||
{
|
{
|
||||||
$dp = new DateParser($this->container);
|
$dp = new DateParser($this->container);
|
||||||
|
|||||||
Reference in New Issue
Block a user