diff --git a/src/applications/phame/application/PhabricatorPhameApplication.php b/src/applications/phame/application/PhabricatorPhameApplication.php --- a/src/applications/phame/application/PhabricatorPhameApplication.php +++ b/src/applications/phame/application/PhabricatorPhameApplication.php @@ -42,6 +42,7 @@ 'live/(?P[^/]+)/(?P.*)' => 'PhameBlogLiveController', 'post/' => array( '(?:(?Pdraft|all)/)?' => 'PhamePostListController', + '(?:query/(?P[^/]+)/)?' => 'PhamePostListController', 'blogger/(?P[\w\.-_]+)/' => 'PhamePostListController', 'delete/(?P[^/]+)/' => 'PhamePostDeleteController', 'edit/(?:(?P[^/]+)/)?' => 'PhamePostEditController', @@ -56,6 +57,7 @@ ), 'blog/' => array( '(?:(?Puser|all)/)?' => 'PhameBlogListController', + '(?:query/(?P[^/]+)/)?' => 'PhameBlogListController', 'delete/(?P[^/]+)/' => 'PhameBlogDeleteController', 'edit/(?P[^/]+)/' => 'PhameBlogEditController', 'view/(?P[^/]+)/' => 'PhameBlogViewController', diff --git a/src/applications/phame/controller/blog/PhameBlogListController.php b/src/applications/phame/controller/blog/PhameBlogListController.php --- a/src/applications/phame/controller/blog/PhameBlogListController.php +++ b/src/applications/phame/controller/blog/PhameBlogListController.php @@ -2,86 +2,33 @@ final class PhameBlogListController extends PhameController { - public function handleRequest(AphrontRequest $request) { - $user = $request->getUser(); - - $nav = $this->renderSideNavFilterView(null); - $filter = $request->getURIData('filter'); - $filter = $nav->selectFilter('blog/'.$filter, 'blog/user'); - - $query = id(new PhameBlogQuery()) - ->setViewer($user); - - switch ($filter) { - case 'blog/all': - $title = pht('All Blogs'); - $nodata = pht('No blogs have been created.'); - break; - case 'blog/user': - $title = pht('Joinable Blogs'); - $nodata = pht('There are no blogs you can contribute to.'); - $query->requireCapabilities( - array( - PhabricatorPolicyCapability::CAN_JOIN, - )); - break; - default: - throw new Exception(pht("Unknown filter '%s'!", $filter)); - } - - $pager = id(new PHUIPagerView()) - ->setURI($request->getRequestURI(), 'offset') - ->setOffset($request->getInt('offset')); - - $blogs = $query->executeWithOffsetPager($pager); - - $blog_list = $this->renderBlogList($blogs, $user, $nodata); - $blog_list->setPager($pager); - - $box = id(new PHUIObjectBoxView()) - ->setHeaderText($title) - ->setObjectList($blog_list); - - $crumbs = $this->buildApplicationCrumbs(); - $crumbs->addTextCrumb($title, $this->getApplicationURI()); + public function shouldAllowPublic() { + return true; + } - $nav->appendChild( - array( - $crumbs, - $box, - )); + public function handleRequest(AphrontRequest $request) { + $query_key = $request->getURIData('queryKey'); + $controller = id(new PhabricatorApplicationSearchController()) + ->setQueryKey($query_key) + ->setSearchEngine(new PhameBlogSearchEngine()) + ->setNavigation($this->buildSideNavView()); - return $this->buildApplicationPage( - $nav, - array( - 'title' => $title, - )); + return $this->delegateToController($controller); } - private function renderBlogList( - array $blogs, - PhabricatorUser $viewer, - $nodata) { + public function buildSideNavView() { + $viewer = $this->getRequest()->getUser(); - $view = new PHUIObjectItemListView(); - $view->setNoDataString($nodata); - $view->setUser($viewer); - foreach ($blogs as $blog) { + $nav = new AphrontSideNavFilterView(); + $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); - $id = $blog->getID(); - $item = id(new PHUIObjectItemView()) - ->setUser($viewer) - ->setObject($blog) - ->setHeader($blog->getName()) - ->setStatusIcon('fa-star') - ->setHref($this->getApplicationURI("/blog/view/{$id}/")) - ->addAttribute($blog->getSkin()) - ->addAttribute($blog->getDomain()); + id(new PhameBlogSearchEngine()) + ->setViewer($viewer) + ->addNavigationItems($nav->getMenu()); - $view->addItem($item); - } + $nav->selectFilter(null); - return $view; + return $nav; } } diff --git a/src/applications/phame/controller/post/PhamePostListController.php b/src/applications/phame/controller/post/PhamePostListController.php --- a/src/applications/phame/controller/post/PhamePostListController.php +++ b/src/applications/phame/controller/post/PhamePostListController.php @@ -2,78 +2,37 @@ final class PhamePostListController extends PhameController { - public function handleRequest(AphrontRequest $request) { - $viewer = $request->getViewer(); - $filter = $request->getURIData('filter'); - $bloggername = $request->getURIData('bloggername'); - - $query = id(new PhamePostQuery()) - ->setViewer($viewer); - - $nav = $this->renderSideNavFilterView(); - $nodata = null; + public function shouldAllowPublic() { + return true; + } - switch ($filter) { - case 'draft': - $query->withBloggerPHIDs(array($viewer->getPHID())); - $query->withVisibility(PhamePost::VISIBILITY_DRAFT); - $nodata = pht('You have no unpublished drafts.'); - $title = pht('Unpublished Drafts'); - $nav->selectFilter('post/draft'); - break; - case 'blogger': - if ($bloggername) { - $blogger = id(new PhabricatorUser())->loadOneWhere( - 'username = %s', - $bloggername); - if (!$blogger) { - return new Aphront404Response(); - } - } else { - $blogger = $viewer; - } + public function handleRequest(AphrontRequest $request) { + $query_key = $request->getURIData('queryKey'); + $controller = id(new PhabricatorApplicationSearchController()) + ->setQueryKey($query_key) + ->setSearchEngine(new PhamePostSearchEngine()) + ->setNavigation($this->buildSideNavView()); - $query->withBloggerPHIDs(array($blogger->getPHID())); - if ($blogger->getPHID() == $viewer->getPHID()) { - $nav->selectFilter('post'); - $nodata = pht('You have not written any posts.'); - } else { - $nodata = pht('%s has not written any posts.', $blogger); - } - $title = pht('Posts by %s', $blogger); - break; - default: - case 'all': - $nodata = pht('There are no visible posts.'); - $title = pht('Posts'); - $nav->selectFilter('post/all'); - break; - } + return $this->delegateToController($controller); + } - $pager = id(new AphrontCursorPagerView()) - ->readFromRequest($request); + public function buildSideNavView() { + $viewer = $this->getRequest()->getUser(); - $posts = $query->executeWithCursorPager($pager); + $nav = new AphrontSideNavFilterView(); + $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); - $post_list = $this->renderPostList($posts, $viewer, $nodata); - $post_list = id(new PHUIObjectBoxView()) - ->setHeaderText($title) - ->appendChild($post_list); + id(new PhamePostSearchEngine()) + ->setViewer($viewer) + ->addNavigationItems($nav->getMenu()); - $crumbs = $this->buildApplicationCrumbs(); - $crumbs->addTextCrumb($title, $this->getApplicationURI()); + $nav->addLabel(pht('Blogs')); + $nav->addFilter('blog/', pht('Manage Blogs')); - $nav->appendChild( - array( - $crumbs, - $post_list, - )); + $nav->selectFilter(null); - return $this->buildApplicationPage( - $nav, - array( - 'title' => $title, - )); + return $nav; } + } 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 @@ -29,6 +29,7 @@ return array( id(new PhabricatorSearchSelectField()) ->setKey('visibility') + ->setLabel(pht('Visibility')) ->setOptions(array( '' => pht('All'), PhamePost::VISIBILITY_PUBLISHED => pht('Live'),