diff --git a/src/applications/maniphest/ManiphestTaskQuery.php b/src/applications/maniphest/ManiphestTaskQuery.php index 967dbcb921..dbd4d12155 100644 --- a/src/applications/maniphest/ManiphestTaskQuery.php +++ b/src/applications/maniphest/ManiphestTaskQuery.php @@ -36,6 +36,7 @@ final class ManiphestTaskQuery private $statuses; private $priority = null; + private $priorities; private $minPriority = null; private $maxPriority = null; @@ -123,6 +124,11 @@ final class ManiphestTaskQuery return $this; } + public function withPriorities(array $priorities) { + $this->priorities = $priorities; + return $this; + } + public function withPrioritiesBetween($min, $max) { $this->minPriority = $min; $this->maxPriority = $max; @@ -197,6 +203,7 @@ final class ManiphestTaskQuery $where[] = $this->buildStatusWhereClause($conn); $where[] = $this->buildStatusesWhereClause($conn); $where[] = $this->buildPriorityWhereClause($conn); + $where[] = $this->buildPrioritiesWhereClause($conn); $where[] = $this->buildAuthorWhereClause($conn); $where[] = $this->buildOwnerWhereClause($conn); $where[] = $this->buildSubscriberWhereClause($conn); @@ -366,6 +373,18 @@ final class ManiphestTaskQuery return null; } + private function buildPrioritiesWhereClause(AphrontDatabaseConnection $conn) { + if ($this->priorities) { + return qsprintf( + $conn, + 'priority IN (%Ld)', + $this->priorities); + } + + return null; + } + + private function buildAuthorWhereClause(AphrontDatabaseConnection $conn) { if (!$this->authorPHIDs) { return null; diff --git a/src/applications/maniphest/query/ManiphestTaskSearchEngine.php b/src/applications/maniphest/query/ManiphestTaskSearchEngine.php index f3ee7c4b2c..3c04612480 100644 --- a/src/applications/maniphest/query/ManiphestTaskSearchEngine.php +++ b/src/applications/maniphest/query/ManiphestTaskSearchEngine.php @@ -17,8 +17,20 @@ final class ManiphestTaskSearchEngine $this->readUsersFromRequest($request, 'authors')); $saved->setParameter('statuses', $request->getArr('statuses')); + $saved->setParameter('priorities', $request->getArr('priorities')); $saved->setParameter('order', $request->getStr('order')); + $ids = $request->getStrList('ids'); + foreach ($ids as $key => $id) { + $id = trim($id, ' Tt'); + if (!$id || !is_numeric($id)) { + unset($ids[$key]); + } else { + $ids[$key] = $id; + } + } + $saved->setParameter('ids', $ids); + return $saved; } @@ -45,6 +57,11 @@ final class ManiphestTaskSearchEngine $query->withStatuses($statuses); } + $priorities = $saved->getParameter('priorities'); + if ($priorities) { + $query->withPriorities($priorities); + } + $order = $saved->getParameter('order'); $order = idx($this->getOrderValues(), $order); if ($order) { @@ -53,6 +70,11 @@ final class ManiphestTaskSearchEngine $query->setOrderBy(head($this->getOrderValues())); } + $ids = $saved->getParameter('ids'); + if ($ids) { + $query->withIDs($ids); + } + return $query; } @@ -94,6 +116,20 @@ final class ManiphestTaskSearchEngine isset($statuses[$status])); } + $priorities = $saved->getParameter('priorities', array()); + $priorities = array_fuse($priorities); + $priority_control = id(new AphrontFormCheckboxControl()) + ->setLabel(pht('Priority')); + foreach (ManiphestTaskPriority::getTaskPriorityMap() as $pri => $name) { + $priority_control->addCheckbox( + 'priorities[]', + $pri, + $name, + isset($priorities[$pri])); + } + + $ids = $saved->getParameter('ids', array()); + $form ->appendChild( id(new AphrontFormTokenizerControl()) @@ -115,12 +151,18 @@ final class ManiphestTaskSearchEngine ->setLabel(pht('Authors')) ->setValue($author_tokens)) ->appendChild($status_control) + ->appendChild($priority_control) ->appendChild( id(new AphrontFormSelectControl()) ->setName('order') ->setLabel(pht('Order')) ->setValue($saved->getParameter('order')) - ->setOptions($this->getOrderOptions())); + ->setOptions($this->getOrderOptions())) + ->appendChild( + id(new AphrontFormTextControl()) + ->setName('ids') + ->setLabel(pht('Task IDs')) + ->setValue(implode(', ', $ids))); } protected function getURI($path) {