diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -3794,6 +3794,7 @@ 'PhameBlogArchiveController' => 'applications/phame/controller/blog/PhameBlogArchiveController.php', 'PhameBlogController' => 'applications/phame/controller/blog/PhameBlogController.php', 'PhameBlogCreateCapability' => 'applications/phame/capability/PhameBlogCreateCapability.php', + 'PhameBlogDatasource' => 'applications/phame/typeahead/PhameBlogDatasource.php', 'PhameBlogEditConduitAPIMethod' => 'applications/phame/conduit/PhameBlogEditConduitAPIMethod.php', 'PhameBlogEditController' => 'applications/phame/controller/blog/PhameBlogEditController.php', 'PhameBlogEditEngine' => 'applications/phame/editor/PhameBlogEditEngine.php', @@ -8698,6 +8699,7 @@ 'PhameBlogArchiveController' => 'PhameBlogController', 'PhameBlogController' => 'PhameController', 'PhameBlogCreateCapability' => 'PhabricatorPolicyCapability', + 'PhameBlogDatasource' => 'PhabricatorTypeaheadDatasource', 'PhameBlogEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', 'PhameBlogEditController' => 'PhameBlogController', 'PhameBlogEditEngine' => 'PhabricatorEditEngine', diff --git a/src/applications/phame/controller/blog/PhameBlogViewController.php b/src/applications/phame/controller/blog/PhameBlogViewController.php --- a/src/applications/phame/controller/blog/PhameBlogViewController.php +++ b/src/applications/phame/controller/blog/PhameBlogViewController.php @@ -142,6 +142,14 @@ $actions->addAction( id(new PhabricatorActionView()) ->setUser($viewer) + ->setIcon('fa-search') + ->setHref( + $this->getApplicationURI('post/?blogs[]='.$blog->getPHID())) + ->setName(pht('Search Posts'))); + + $actions->addAction( + id(new PhabricatorActionView()) + ->setUser($viewer) ->setIcon('fa-globe') ->setHref($blog->getLiveURI()) ->setName(pht('View Live'))); diff --git a/src/applications/phame/query/PhamePostSearchEngine.php b/src/applications/phame/query/PhamePostSearchEngine.php --- a/src/applications/phame/query/PhamePostSearchEngine.php +++ b/src/applications/phame/query/PhamePostSearchEngine.php @@ -18,25 +18,36 @@ protected function buildQueryFromParameters(array $map) { $query = $this->newQuery(); - if (strlen($map['visibility'])) { - $query->withVisibility(array($map['visibility'])); + if ($map['visibility']) { + $query->withVisibility($map['visibility']); } + if ($map['blogs']) { + $query->withBlogPHIDs($map['blogs']); + } + return $query; } protected function buildCustomSearchFields() { return array( - id(new PhabricatorSearchSelectField()) + id(new PhabricatorSearchCheckboxesField()) ->setKey('visibility') ->setLabel(pht('Visibility')) ->setOptions( array( - '' => pht('All'), PhameConstants::VISIBILITY_PUBLISHED => pht('Published'), PhameConstants::VISIBILITY_DRAFT => pht('Draft'), PhameConstants::VISIBILITY_ARCHIVED => pht('Archived'), )), + id(new PhabricatorSearchDatasourceField()) + ->setLabel(pht('Blogs')) + ->setKey('blogs') + ->setAliases(array('blogs')) + ->setDescription( + pht('Search for posts with certain blogs.')) + ->setDatasource(new PhameBlogDatasource()), + ); } @@ -63,13 +74,13 @@ return $query; case 'live': return $query->setParameter( - 'visibility', PhameConstants::VISIBILITY_PUBLISHED); + 'visibility', array(PhameConstants::VISIBILITY_PUBLISHED)); case 'draft': return $query->setParameter( - 'visibility', PhameConstants::VISIBILITY_DRAFT); + 'visibility', array(PhameConstants::VISIBILITY_DRAFT)); case 'archived': return $query->setParameter( - 'visibility', PhameConstants::VISIBILITY_ARCHIVED); + 'visibility', array(PhameConstants::VISIBILITY_ARCHIVED)); } return parent::buildSavedQueryFromBuiltin($query_key); diff --git a/src/applications/phame/typeahead/PhameBlogDatasource.php b/src/applications/phame/typeahead/PhameBlogDatasource.php new file mode 100644 --- /dev/null +++ b/src/applications/phame/typeahead/PhameBlogDatasource.php @@ -0,0 +1,53 @@ +getViewer(); + + $blogs = id(new PhameBlogQuery()) + ->setViewer($viewer) + ->needProfileImage(true) + ->requireCapabilities( + array( + PhabricatorPolicyCapability::CAN_VIEW, + PhabricatorPolicyCapability::CAN_EDIT, + )) + ->execute(); + + $results = array(); + foreach ($blogs as $blog) { + $closed = null; + + $status = $blog->getStatus(); + if ($status === PhabricatorBadgesBadge::STATUS_ARCHIVED) { + $closed = pht('Archived'); + } + + $results[] = id(new PhabricatorTypeaheadResult()) + ->setName($blog->getName()) + ->setClosed($closed) + ->addAttribute(pht('Phame Blog')) + ->setImageURI($blog->getProfileImageURI()) + ->setPHID($blog->getPHID()); + } + + $results = $this->filterResultsAgainstTokens($results); + + return $results; + } + +}