diff --git a/src/applications/project/query/PhabricatorProjectSearchEngine.php b/src/applications/project/query/PhabricatorProjectSearchEngine.php index cfb1868a61..5df3bbeb1a 100644 --- a/src/applications/project/query/PhabricatorProjectSearchEngine.php +++ b/src/applications/project/query/PhabricatorProjectSearchEngine.php @@ -13,8 +13,7 @@ final class PhabricatorProjectSearchEngine public function newQuery() { return id(new PhabricatorProjectQuery()) - ->needImages(true) - ->withIsMilestone(false); + ->needImages(true); } protected function buildCustomSearchFields() { @@ -34,6 +33,17 @@ final class PhabricatorProjectSearchEngine ->setLabel(pht('Status')) ->setKey('status') ->setOptions($this->getStatusOptions()), + id(new PhabricatorSearchThreeStateField()) + ->setLabel(pht('Milestones')) + ->setKey('isMilestone') + ->setOptions( + pht('(Show All)'), + pht('Show Only Milestones'), + pht('Hide Milestones')) + ->setDescription( + pht( + 'Pass true to find only milestones, or false to omit '. + 'milestones.')), id(new PhabricatorSearchCheckboxesField()) ->setLabel(pht('Icons')) ->setKey('icons') @@ -77,6 +87,10 @@ final class PhabricatorProjectSearchEngine $query->withColors($map['colors']); } + if ($map['isMilestone'] !== null) { + $query->withIsMilestone($map['isMilestone']); + } + return $query; } @@ -103,6 +117,9 @@ final class PhabricatorProjectSearchEngine $viewer_phid = $this->requireViewer()->getPHID(); + // By default, do not show milestones in the list view. + $query->setParameter('isMilestone', false); + switch ($query_key) { case 'all': return $query; diff --git a/src/applications/project/storage/PhabricatorProject.php b/src/applications/project/storage/PhabricatorProject.php index 47e251f3af..c8b5e2e45a 100644 --- a/src/applications/project/storage/PhabricatorProject.php +++ b/src/applications/project/storage/PhabricatorProject.php @@ -741,6 +741,10 @@ final class PhabricatorProject extends PhabricatorProjectDAO ->setKey('slug') ->setType('string') ->setDescription(pht('Primary slug/hashtag.')), + id(new PhabricatorConduitSearchFieldSpecification()) + ->setKey('milestone') + ->setType('int?') + ->setDescription(pht('For milestones, milestone sequence number.')), id(new PhabricatorConduitSearchFieldSpecification()) ->setKey('icon') ->setType('map') @@ -756,9 +760,16 @@ final class PhabricatorProject extends PhabricatorProjectDAO $color_key = $this->getColor(); $color_name = PhabricatorProjectIconSet::getColorName($color_key); + if ($this->isMilestone()) { + $milestone = (int)$this->getMilestoneNumber(); + } else { + $milestone = null; + } + return array( 'name' => $this->getName(), 'slug' => $this->getPrimarySlug(), + 'milestone' => $milestone, 'icon' => array( 'key' => $this->getDisplayIconKey(), 'name' => $this->getDisplayIconName(),