@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add Application Routes to Phame AppSearch queries

Summary: Fixes T9388, lays in basic ApplicationSearch.

Test Plan: Build a dashboard with Posts and Blogs, click on search icon, get sent to correct page.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Maniphest Tasks: T9388

Differential Revision: https://secure.phabricator.com/D14146

+45 -136
+2
src/applications/phame/application/PhabricatorPhameApplication.php
··· 42 42 'live/(?P<id>[^/]+)/(?P<more>.*)' => 'PhameBlogLiveController', 43 43 'post/' => array( 44 44 '(?:(?P<filter>draft|all)/)?' => 'PhamePostListController', 45 + '(?:query/(?P<queryKey>[^/]+)/)?' => 'PhamePostListController', 45 46 'blogger/(?P<bloggername>[\w\.-_]+)/' => 'PhamePostListController', 46 47 'delete/(?P<id>[^/]+)/' => 'PhamePostDeleteController', 47 48 'edit/(?:(?P<id>[^/]+)/)?' => 'PhamePostEditController', ··· 56 57 ), 57 58 'blog/' => array( 58 59 '(?:(?P<filter>user|all)/)?' => 'PhameBlogListController', 60 + '(?:query/(?P<queryKey>[^/]+)/)?' => 'PhameBlogListController', 59 61 'delete/(?P<id>[^/]+)/' => 'PhameBlogDeleteController', 60 62 'edit/(?P<id>[^/]+)/' => 'PhameBlogEditController', 61 63 'view/(?P<id>[^/]+)/' => 'PhameBlogViewController',
+19 -72
src/applications/phame/controller/blog/PhameBlogListController.php
··· 2 2 3 3 final class PhameBlogListController extends PhameController { 4 4 5 - public function handleRequest(AphrontRequest $request) { 6 - $user = $request->getUser(); 7 - 8 - $nav = $this->renderSideNavFilterView(null); 9 - $filter = $request->getURIData('filter'); 10 - $filter = $nav->selectFilter('blog/'.$filter, 'blog/user'); 11 - 12 - $query = id(new PhameBlogQuery()) 13 - ->setViewer($user); 14 - 15 - switch ($filter) { 16 - case 'blog/all': 17 - $title = pht('All Blogs'); 18 - $nodata = pht('No blogs have been created.'); 19 - break; 20 - case 'blog/user': 21 - $title = pht('Joinable Blogs'); 22 - $nodata = pht('There are no blogs you can contribute to.'); 23 - $query->requireCapabilities( 24 - array( 25 - PhabricatorPolicyCapability::CAN_JOIN, 26 - )); 27 - break; 28 - default: 29 - throw new Exception(pht("Unknown filter '%s'!", $filter)); 30 - } 5 + public function shouldAllowPublic() { 6 + return true; 7 + } 31 8 32 - $pager = id(new PHUIPagerView()) 33 - ->setURI($request->getRequestURI(), 'offset') 34 - ->setOffset($request->getInt('offset')); 9 + public function handleRequest(AphrontRequest $request) { 10 + $query_key = $request->getURIData('queryKey'); 11 + $controller = id(new PhabricatorApplicationSearchController()) 12 + ->setQueryKey($query_key) 13 + ->setSearchEngine(new PhameBlogSearchEngine()) 14 + ->setNavigation($this->buildSideNavView()); 35 15 36 - $blogs = $query->executeWithOffsetPager($pager); 37 - 38 - $blog_list = $this->renderBlogList($blogs, $user, $nodata); 39 - $blog_list->setPager($pager); 40 - 41 - $box = id(new PHUIObjectBoxView()) 42 - ->setHeaderText($title) 43 - ->setObjectList($blog_list); 44 - 45 - $crumbs = $this->buildApplicationCrumbs(); 46 - $crumbs->addTextCrumb($title, $this->getApplicationURI()); 47 - 48 - $nav->appendChild( 49 - array( 50 - $crumbs, 51 - $box, 52 - )); 53 - 54 - return $this->buildApplicationPage( 55 - $nav, 56 - array( 57 - 'title' => $title, 58 - )); 16 + return $this->delegateToController($controller); 59 17 } 60 18 61 - private function renderBlogList( 62 - array $blogs, 63 - PhabricatorUser $viewer, 64 - $nodata) { 19 + public function buildSideNavView() { 20 + $viewer = $this->getRequest()->getUser(); 65 21 66 - $view = new PHUIObjectItemListView(); 67 - $view->setNoDataString($nodata); 68 - $view->setUser($viewer); 69 - foreach ($blogs as $blog) { 22 + $nav = new AphrontSideNavFilterView(); 23 + $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); 70 24 71 - $id = $blog->getID(); 72 - $item = id(new PHUIObjectItemView()) 73 - ->setUser($viewer) 74 - ->setObject($blog) 75 - ->setHeader($blog->getName()) 76 - ->setStatusIcon('fa-star') 77 - ->setHref($this->getApplicationURI("/blog/view/{$id}/")) 78 - ->addAttribute($blog->getSkin()) 79 - ->addAttribute($blog->getDomain()); 25 + id(new PhameBlogSearchEngine()) 26 + ->setViewer($viewer) 27 + ->addNavigationItems($nav->getMenu()); 80 28 81 - $view->addItem($item); 82 - } 29 + $nav->selectFilter(null); 83 30 84 - return $view; 31 + return $nav; 85 32 } 86 33 87 34 }
+23 -64
src/applications/phame/controller/post/PhamePostListController.php
··· 2 2 3 3 final class PhamePostListController extends PhameController { 4 4 5 + public function shouldAllowPublic() { 6 + return true; 7 + } 8 + 5 9 public function handleRequest(AphrontRequest $request) { 6 - $viewer = $request->getViewer(); 7 - $filter = $request->getURIData('filter'); 8 - $bloggername = $request->getURIData('bloggername'); 10 + $query_key = $request->getURIData('queryKey'); 11 + $controller = id(new PhabricatorApplicationSearchController()) 12 + ->setQueryKey($query_key) 13 + ->setSearchEngine(new PhamePostSearchEngine()) 14 + ->setNavigation($this->buildSideNavView()); 9 15 10 - $query = id(new PhamePostQuery()) 11 - ->setViewer($viewer); 16 + return $this->delegateToController($controller); 17 + } 12 18 13 - $nav = $this->renderSideNavFilterView(); 14 - $nodata = null; 19 + public function buildSideNavView() { 20 + $viewer = $this->getRequest()->getUser(); 15 21 16 - switch ($filter) { 17 - case 'draft': 18 - $query->withBloggerPHIDs(array($viewer->getPHID())); 19 - $query->withVisibility(PhamePost::VISIBILITY_DRAFT); 20 - $nodata = pht('You have no unpublished drafts.'); 21 - $title = pht('Unpublished Drafts'); 22 - $nav->selectFilter('post/draft'); 23 - break; 24 - case 'blogger': 25 - if ($bloggername) { 26 - $blogger = id(new PhabricatorUser())->loadOneWhere( 27 - 'username = %s', 28 - $bloggername); 29 - if (!$blogger) { 30 - return new Aphront404Response(); 31 - } 32 - } else { 33 - $blogger = $viewer; 34 - } 22 + $nav = new AphrontSideNavFilterView(); 23 + $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); 35 24 36 - $query->withBloggerPHIDs(array($blogger->getPHID())); 37 - if ($blogger->getPHID() == $viewer->getPHID()) { 38 - $nav->selectFilter('post'); 39 - $nodata = pht('You have not written any posts.'); 40 - } else { 41 - $nodata = pht('%s has not written any posts.', $blogger); 42 - } 43 - $title = pht('Posts by %s', $blogger); 44 - break; 45 - default: 46 - case 'all': 47 - $nodata = pht('There are no visible posts.'); 48 - $title = pht('Posts'); 49 - $nav->selectFilter('post/all'); 50 - break; 51 - } 25 + id(new PhamePostSearchEngine()) 26 + ->setViewer($viewer) 27 + ->addNavigationItems($nav->getMenu()); 52 28 53 - $pager = id(new AphrontCursorPagerView()) 54 - ->readFromRequest($request); 29 + $nav->addLabel(pht('Blogs')); 30 + $nav->addFilter('blog/', pht('Manage Blogs')); 55 31 56 - $posts = $query->executeWithCursorPager($pager); 32 + $nav->selectFilter(null); 57 33 58 - $post_list = $this->renderPostList($posts, $viewer, $nodata); 59 - $post_list = id(new PHUIObjectBoxView()) 60 - ->setHeaderText($title) 61 - ->appendChild($post_list); 34 + return $nav; 35 + } 62 36 63 - $crumbs = $this->buildApplicationCrumbs(); 64 - $crumbs->addTextCrumb($title, $this->getApplicationURI()); 65 - 66 - $nav->appendChild( 67 - array( 68 - $crumbs, 69 - $post_list, 70 - )); 71 - 72 - return $this->buildApplicationPage( 73 - $nav, 74 - array( 75 - 'title' => $title, 76 - )); 77 - } 78 37 79 38 }
+1
src/applications/phame/query/PhamePostSearchEngine.php
··· 29 29 return array( 30 30 id(new PhabricatorSearchSelectField()) 31 31 ->setKey('visibility') 32 + ->setLabel(pht('Visibility')) 32 33 ->setOptions(array( 33 34 '' => pht('All'), 34 35 PhamePost::VISIBILITY_PUBLISHED => pht('Live'),