summaryrefslogtreecommitdiff
path: root/app/Filter
diff options
context:
space:
mode:
authorFrederic Guillot <fred@kanboard.net>2016-04-10 15:18:20 -0400
committerFrederic Guillot <fred@kanboard.net>2016-04-10 15:18:20 -0400
commit9f0166502b8b8886156bcb4ad0497cd9ee5a60b2 (patch)
tree425f829d3ace03eec5cbcaddf667d752046d75c6 /app/Filter
parent2eadfb22912d94e76a479b694070735fbb0298f1 (diff)
Added search in activity stream
Diffstat (limited to 'app/Filter')
-rw-r--r--app/Filter/BaseDateFilter.php103
-rw-r--r--app/Filter/BaseFilter.php44
-rw-r--r--app/Filter/ProjectActivityCreationDateFilter.php38
-rw-r--r--app/Filter/ProjectActivityCreatorFilter.php65
-rw-r--r--app/Filter/ProjectActivityProjectIdsFilter.php2
-rw-r--r--app/Filter/ProjectActivityProjectNameFilter.php38
-rw-r--r--app/Filter/ProjectActivityTaskStatusFilter.php43
-rw-r--r--app/Filter/ProjectActivityTaskTitleFilter.php15
-rw-r--r--app/Filter/TaskCompletionDateFilter.php2
-rw-r--r--app/Filter/TaskCreationDateFilter.php2
-rw-r--r--app/Filter/TaskDueDateFilter.php2
-rw-r--r--app/Filter/TaskModificationDateFilter.php2
-rw-r--r--app/Filter/TaskProjectsFilter.php7
-rw-r--r--app/Filter/TaskStartDateFilter.php2
14 files changed, 300 insertions, 65 deletions
diff --git a/app/Filter/BaseDateFilter.php b/app/Filter/BaseDateFilter.php
new file mode 100644
index 00000000..56fb2d78
--- /dev/null
+++ b/app/Filter/BaseDateFilter.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace Kanboard\Filter;
+
+use Kanboard\Core\DateParser;
+
+/**
+ * Base date filter class
+ *
+ * @package filter
+ * @author Frederic Guillot
+ */
+abstract class BaseDateFilter extends BaseFilter
+{
+ /**
+ * DateParser object
+ *
+ * @access protected
+ * @var DateParser
+ */
+ protected $dateParser;
+
+ /**
+ * Set DateParser object
+ *
+ * @access public
+ * @param DateParser $dateParser
+ * @return $this
+ */
+ public function setDateParser(DateParser $dateParser)
+ {
+ $this->dateParser = $dateParser;
+ return $this;
+ }
+
+ /**
+ * Parse operator in the input string
+ *
+ * @access protected
+ * @return string
+ */
+ protected function parseOperator()
+ {
+ $operators = array(
+ '<=' => 'lte',
+ '>=' => 'gte',
+ '<' => 'lt',
+ '>' => 'gt',
+ );
+
+ foreach ($operators as $operator => $method) {
+ if (strpos($this->value, $operator) === 0) {
+ $this->value = substr($this->value, strlen($operator));
+ return $method;
+ }
+ }
+
+ return '';
+ }
+
+ /**
+ * Apply a date filter
+ *
+ * @access protected
+ * @param string $field
+ */
+ protected function applyDateFilter($field)
+ {
+ $method = $this->parseOperator();
+ $timestamp = $this->dateParser->getTimestampFromIsoFormat($this->value);
+
+ if ($method !== '') {
+ $this->query->$method($field, $this->getTimestampFromOperator($method, $timestamp));
+ } else {
+ $this->query->gte($field, $timestamp);
+ $this->query->lte($field, $timestamp + 86399);
+ }
+ }
+
+ /**
+ * Get timestamp from the operator
+ *
+ * @access public
+ * @param string $method
+ * @param integer $timestamp
+ * @return integer
+ */
+ protected function getTimestampFromOperator($method, $timestamp)
+ {
+ switch ($method) {
+ case 'lte':
+ return $timestamp + 86399;
+ case 'lt':
+ return $timestamp;
+ case 'gte':
+ return $timestamp;
+ case 'gt':
+ return $timestamp + 86400;
+ }
+
+ return $timestamp;
+ }
+}
diff --git a/app/Filter/BaseFilter.php b/app/Filter/BaseFilter.php
index a7e6a61a..79a664be 100644
--- a/app/Filter/BaseFilter.php
+++ b/app/Filter/BaseFilter.php
@@ -72,48 +72,4 @@ abstract class BaseFilter
$this->value = $value;
return $this;
}
-
- /**
- * Parse operator in the input string
- *
- * @access protected
- * @return string
- */
- protected function parseOperator()
- {
- $operators = array(
- '<=' => 'lte',
- '>=' => 'gte',
- '<' => 'lt',
- '>' => 'gt',
- );
-
- foreach ($operators as $operator => $method) {
- if (strpos($this->value, $operator) === 0) {
- $this->value = substr($this->value, strlen($operator));
- return $method;
- }
- }
-
- return '';
- }
-
- /**
- * Apply a date filter
- *
- * @access protected
- * @param string $field
- */
- protected function applyDateFilter($field)
- {
- $timestamp = strtotime($this->value);
- $method = $this->parseOperator();
-
- if ($method !== '') {
- $this->query->$method($field, $timestamp);
- } else {
- $this->query->gte($field, $timestamp);
- $this->query->lte($field, $timestamp + 86399);
- }
- }
}
diff --git a/app/Filter/ProjectActivityCreationDateFilter.php b/app/Filter/ProjectActivityCreationDateFilter.php
new file mode 100644
index 00000000..d0b7f754
--- /dev/null
+++ b/app/Filter/ProjectActivityCreationDateFilter.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace Kanboard\Filter;
+
+use Kanboard\Core\Filter\FilterInterface;
+use Kanboard\Model\ProjectActivity;
+
+/**
+ * Filter activity events by creation date
+ *
+ * @package filter
+ * @author Frederic Guillot
+ */
+class ProjectActivityCreationDateFilter extends BaseDateFilter implements FilterInterface
+{
+ /**
+ * Get search attribute
+ *
+ * @access public
+ * @return string[]
+ */
+ public function getAttributes()
+ {
+ return array('created');
+ }
+
+ /**
+ * Apply filter
+ *
+ * @access public
+ * @return FilterInterface
+ */
+ public function apply()
+ {
+ $this->applyDateFilter(ProjectActivity::TABLE.'.date_creation');
+ return $this;
+ }
+}
diff --git a/app/Filter/ProjectActivityCreatorFilter.php b/app/Filter/ProjectActivityCreatorFilter.php
new file mode 100644
index 00000000..c95569d6
--- /dev/null
+++ b/app/Filter/ProjectActivityCreatorFilter.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Kanboard\Filter;
+
+use Kanboard\Core\Filter\FilterInterface;
+use Kanboard\Model\ProjectActivity;
+
+/**
+ * Filter activity events by creator
+ *
+ * @package filter
+ * @author Frederic Guillot
+ */
+class ProjectActivityCreatorFilter 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 ($this->value === 'me') {
+ $this->query->eq(ProjectActivity::TABLE . '.creator_id', $this->currentUserId);
+ } else {
+ $this->query->beginOr();
+ $this->query->ilike('uc.username', '%'.$this->value.'%');
+ $this->query->ilike('uc.name', '%'.$this->value.'%');
+ $this->query->closeOr();
+ }
+ }
+}
diff --git a/app/Filter/ProjectActivityProjectIdsFilter.php b/app/Filter/ProjectActivityProjectIdsFilter.php
index 4d7c9028..47cf0c25 100644
--- a/app/Filter/ProjectActivityProjectIdsFilter.php
+++ b/app/Filter/ProjectActivityProjectIdsFilter.php
@@ -21,7 +21,7 @@ class ProjectActivityProjectIdsFilter extends BaseFilter implements FilterInterf
*/
public function getAttributes()
{
- return array('project_ids');
+ return array('projects');
}
/**
diff --git a/app/Filter/ProjectActivityProjectNameFilter.php b/app/Filter/ProjectActivityProjectNameFilter.php
new file mode 100644
index 00000000..0cf73657
--- /dev/null
+++ b/app/Filter/ProjectActivityProjectNameFilter.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace Kanboard\Filter;
+
+use Kanboard\Core\Filter\FilterInterface;
+use Kanboard\Model\Project;
+
+/**
+ * Filter activity events by project name
+ *
+ * @package filter
+ * @author Frederic Guillot
+ */
+class ProjectActivityProjectNameFilter extends BaseFilter implements FilterInterface
+{
+ /**
+ * Get search attribute
+ *
+ * @access public
+ * @return string[]
+ */
+ public function getAttributes()
+ {
+ return array('project');
+ }
+
+ /**
+ * Apply filter
+ *
+ * @access public
+ * @return FilterInterface
+ */
+ public function apply()
+ {
+ $this->query->ilike(Project::TABLE.'.name', '%'.$this->value.'%');
+ return $this;
+ }
+}
diff --git a/app/Filter/ProjectActivityTaskStatusFilter.php b/app/Filter/ProjectActivityTaskStatusFilter.php
new file mode 100644
index 00000000..69e2c52d
--- /dev/null
+++ b/app/Filter/ProjectActivityTaskStatusFilter.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Kanboard\Filter;
+
+use Kanboard\Core\Filter\FilterInterface;
+use Kanboard\Model\Task;
+
+/**
+ * Filter activity events by task status
+ *
+ * @package filter
+ * @author Frederic Guillot
+ */
+class ProjectActivityTaskStatusFilter extends BaseFilter implements FilterInterface
+{
+ /**
+ * Get search attribute
+ *
+ * @access public
+ * @return string[]
+ */
+ public function getAttributes()
+ {
+ return array('status');
+ }
+
+ /**
+ * Apply filter
+ *
+ * @access public
+ * @return FilterInterface
+ */
+ public function apply()
+ {
+ if ($this->value === 'open') {
+ $this->query->eq(Task::TABLE.'.is_active', Task::STATUS_OPEN);
+ } elseif ($this->value === 'closed') {
+ $this->query->eq(Task::TABLE.'.is_active', Task::STATUS_CLOSED);
+ }
+
+ return $this;
+ }
+}
diff --git a/app/Filter/ProjectActivityTaskTitleFilter.php b/app/Filter/ProjectActivityTaskTitleFilter.php
index ed3f36d6..bf2afa30 100644
--- a/app/Filter/ProjectActivityTaskTitleFilter.php
+++ b/app/Filter/ProjectActivityTaskTitleFilter.php
@@ -3,7 +3,6 @@
namespace Kanboard\Filter;
use Kanboard\Core\Filter\FilterInterface;
-use Kanboard\Model\Task;
/**
* Filter activity events by task title
@@ -11,7 +10,7 @@ use Kanboard\Model\Task;
* @package filter
* @author Frederic Guillot
*/
-class ProjectActivityTaskTitleFilter extends BaseFilter implements FilterInterface
+class ProjectActivityTaskTitleFilter extends TaskTitleFilter implements FilterInterface
{
/**
* Get search attribute
@@ -23,16 +22,4 @@ class ProjectActivityTaskTitleFilter extends BaseFilter implements FilterInterfa
{
return array('title');
}
-
- /**
- * Apply filter
- *
- * @access public
- * @return FilterInterface
- */
- public function apply()
- {
- $this->query->ilike(Task::TABLE.'.title', '%'.$this->value.'%');
- return $this;
- }
}
diff --git a/app/Filter/TaskCompletionDateFilter.php b/app/Filter/TaskCompletionDateFilter.php
index 5166bebf..f206a3e2 100644
--- a/app/Filter/TaskCompletionDateFilter.php
+++ b/app/Filter/TaskCompletionDateFilter.php
@@ -11,7 +11,7 @@ use Kanboard\Model\Task;
* @package filter
* @author Frederic Guillot
*/
-class TaskCompletionDateFilter extends BaseFilter implements FilterInterface
+class TaskCompletionDateFilter extends BaseDateFilter implements FilterInterface
{
/**
* Get search attribute
diff --git a/app/Filter/TaskCreationDateFilter.php b/app/Filter/TaskCreationDateFilter.php
index 26318b3e..bb6efad6 100644
--- a/app/Filter/TaskCreationDateFilter.php
+++ b/app/Filter/TaskCreationDateFilter.php
@@ -11,7 +11,7 @@ use Kanboard\Model\Task;
* @package filter
* @author Frederic Guillot
*/
-class TaskCreationDateFilter extends BaseFilter implements FilterInterface
+class TaskCreationDateFilter extends BaseDateFilter implements FilterInterface
{
/**
* Get search attribute
diff --git a/app/Filter/TaskDueDateFilter.php b/app/Filter/TaskDueDateFilter.php
index 6ba55eb9..e36efdd0 100644
--- a/app/Filter/TaskDueDateFilter.php
+++ b/app/Filter/TaskDueDateFilter.php
@@ -11,7 +11,7 @@ use Kanboard\Model\Task;
* @package filter
* @author Frederic Guillot
*/
-class TaskDueDateFilter extends BaseFilter implements FilterInterface
+class TaskDueDateFilter extends BaseDateFilter implements FilterInterface
{
/**
* Get search attribute
diff --git a/app/Filter/TaskModificationDateFilter.php b/app/Filter/TaskModificationDateFilter.php
index d8838bce..5036e9c1 100644
--- a/app/Filter/TaskModificationDateFilter.php
+++ b/app/Filter/TaskModificationDateFilter.php
@@ -11,7 +11,7 @@ use Kanboard\Model\Task;
* @package filter
* @author Frederic Guillot
*/
-class TaskModificationDateFilter extends BaseFilter implements FilterInterface
+class TaskModificationDateFilter extends BaseDateFilter implements FilterInterface
{
/**
* Get search attribute
diff --git a/app/Filter/TaskProjectsFilter.php b/app/Filter/TaskProjectsFilter.php
index e0fc09cf..47636b1d 100644
--- a/app/Filter/TaskProjectsFilter.php
+++ b/app/Filter/TaskProjectsFilter.php
@@ -32,7 +32,12 @@ class TaskProjectsFilter extends BaseFilter implements FilterInterface
*/
public function apply()
{
- $this->query->in(Task::TABLE.'.project_id', $this->value);
+ if (empty($this->value)) {
+ $this->query->eq(Task::TABLE.'.project_id', 0);
+ } else {
+ $this->query->in(Task::TABLE.'.project_id', $this->value);
+ }
+
return $this;
}
}
diff --git a/app/Filter/TaskStartDateFilter.php b/app/Filter/TaskStartDateFilter.php
index d45bc0d4..dd30762b 100644
--- a/app/Filter/TaskStartDateFilter.php
+++ b/app/Filter/TaskStartDateFilter.php
@@ -11,7 +11,7 @@ use Kanboard\Model\Task;
* @package filter
* @author Frederic Guillot
*/
-class TaskStartDateFilter extends BaseFilter implements FilterInterface
+class TaskStartDateFilter extends BaseDateFilter implements FilterInterface
{
/**
* Get search attribute