@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.

Let feed panels render something meaningful-ish

Summary:
Ref T4986. We need to introduce alternate views to make this more pleasant, but let rendering move to engines so it can be shared between panels and controllers.

I also moved some of the pagination logic in to avoid duplicating that.

So far, only Feed works. I'm going to do these gradually since we have ~40-50 of them.

Test Plan:
- Used global search to check for collateral damage.
- Used not-global search too.
- Used normal feed.

{F151541}

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: chad, epriestley

Maniphest Tasks: T4986

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

+87 -67
+1 -5
src/__phutil_library_map__.php
··· 4377 4377 'PhabricatorFeedController' => 'PhabricatorController', 4378 4378 'PhabricatorFeedDAO' => 'PhabricatorLiskDAO', 4379 4379 'PhabricatorFeedDetailController' => 'PhabricatorFeedController', 4380 - 'PhabricatorFeedListController' => 4381 - array( 4382 - 0 => 'PhabricatorFeedController', 4383 - 1 => 'PhabricatorApplicationSearchResultsControllerInterface', 4384 - ), 4380 + 'PhabricatorFeedListController' => 'PhabricatorFeedController', 4385 4381 'PhabricatorFeedManagementRepublishWorkflow' => 'PhabricatorFeedManagementWorkflow', 4386 4382 'PhabricatorFeedManagementWorkflow' => 'PhabricatorManagementWorkflow', 4387 4383 'PhabricatorFeedPublicStreamController' => 'PhabricatorFeedController',
+3 -10
src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeQuery.php
··· 66 66 } 67 67 68 68 $query = $engine->buildQueryFromSavedQuery($saved); 69 + $pager = $engine->newPagerForSavedQuery($saved); 70 + $results = $engine->executeQuery($query, $pager); 69 71 70 - $results = $query 71 - ->setViewer($viewer) 72 - ->execute(); 73 - 74 - $out = array(); 75 - foreach ($results as $result) { 76 - $out[] = phutil_tag('div', array(), $result->getPHID()); 77 - } 78 - 79 - return $out; 72 + return $engine->renderResults($results, $saved); 80 73 } 81 74 82 75 }
+1 -14
src/applications/feed/controller/PhabricatorFeedListController.php
··· 1 1 <?php 2 2 3 - final class PhabricatorFeedListController extends PhabricatorFeedController 4 - implements PhabricatorApplicationSearchResultsControllerInterface { 3 + final class PhabricatorFeedListController extends PhabricatorFeedController { 5 4 6 5 private $queryKey; 7 6 ··· 21 20 ->setNavigation($this->buildSideNavView()); 22 21 23 22 return $this->delegateToController($controller); 24 - } 25 - 26 - public function renderResultsList( 27 - array $feed, 28 - PhabricatorSavedQuery $query) { 29 - 30 - $builder = new PhabricatorFeedBuilder($feed); 31 - $builder->setShowHovercards(true); 32 - $builder->setUser($this->getRequest()->getUser()); 33 - $view = $builder->buildView(); 34 - 35 - return phutil_tag_div('phabricator-feed-frame', $view); 36 23 } 37 24 38 25 }
+12
src/applications/feed/query/PhabricatorFeedSearchEngine.php
··· 124 124 return parent::buildSavedQueryFromBuiltin($query_key); 125 125 } 126 126 127 + public function renderResults( 128 + array $objects, 129 + PhabricatorSavedQuery $query) { 130 + 131 + $builder = new PhabricatorFeedBuilder($objects); 132 + $builder->setShowHovercards(true); 133 + $builder->setUser($this->requireViewer()); 134 + $view = $builder->buildView(); 135 + 136 + return phutil_tag_div('phabricator-feed-frame', $view); 137 + } 138 + 127 139 }
+10 -36
src/applications/search/controller/PhabricatorApplicationSearchController.php
··· 7 7 private $navigation; 8 8 private $queryKey; 9 9 private $preface; 10 - private $useOffsetPaging; 11 - 12 - public function setUseOffsetPaging($use_offset_paging) { 13 - $this->useOffsetPaging = $use_offset_paging; 14 - return $this; 15 - } 16 - 17 - public function getUseOffsetPaging() { 18 - return $this->useOffsetPaging; 19 - } 20 10 21 11 public function setPreface($preface) { 22 12 $this->preface = $preface; ··· 78 68 $engine->setViewer($this->getRequest()->getUser()); 79 69 80 70 $parent = $this->getDelegatingController(); 81 - $interface = 'PhabricatorApplicationSearchResultsControllerInterface'; 82 - if (!$parent instanceof $interface) { 83 - throw new Exception( 84 - "Delegating controller must implement '{$interface}'."); 85 - } 86 71 } 87 72 88 73 public function processRequest() { ··· 223 208 224 209 $query = $engine->buildQueryFromSavedQuery($saved_query); 225 210 226 - $use_offset_paging = $this->getUseOffsetPaging(); 227 - if ($use_offset_paging) { 228 - $pager = new AphrontPagerView(); 229 - } else { 230 - $pager = new AphrontCursorPagerView(); 231 - } 211 + $pager = $engine->newPagerForSavedQuery($saved_query); 232 212 $pager->readFromRequest($request); 233 - $page_size = $engine->getPageSize($saved_query); 234 - if (is_finite($page_size)) { 235 - $pager->setPageSize($page_size); 236 - } else { 237 - // Consider an INF pagesize to mean a large finite pagesize. 238 213 239 - // TODO: It would be nice to handle this more gracefully, but math 240 - // with INF seems to vary across PHP versions, systems, and runtimes. 241 - $pager->setPageSize(0xFFFF); 242 - } 214 + $objects = $engine->executeQuery($query, $pager); 243 215 244 - $query->setViewer($request->getUser()); 216 + // TODO: To support Dashboard panels, rendering is moving into 217 + // SearchEngines. Move it all the way in and then get rid of this. 245 218 246 - if ($use_offset_paging) { 247 - $objects = $query->executeWithOffsetPager($pager); 219 + $interface = 'PhabricatorApplicationSearchResultsControllerInterface'; 220 + if ($parent instanceof $interface) { 221 + $list = $parent->renderResultsList($objects, $saved_query); 248 222 } else { 249 - $objects = $query->executeWithCursorPager($pager); 223 + $list = $engine->renderResults( 224 + $objects, 225 + $saved_query); 250 226 } 251 - 252 - $list = $parent->renderResultsList($objects, $saved_query); 253 227 254 228 $nav->appendChild($list); 255 229
-1
src/applications/search/controller/PhabricatorSearchController.php
··· 76 76 $controller = id(new PhabricatorApplicationSearchController($request)) 77 77 ->setQueryKey($this->queryKey) 78 78 ->setSearchEngine($engine) 79 - ->setUseOffsetPaging(true) 80 79 ->setNavigation($this->buildSideNavView()); 81 80 82 81 return $this->delegateToController($controller);
+56 -1
src/applications/search/engine/PhabricatorApplicationSearchEngine.php
··· 9 9 * @task uri Query URIs 10 10 * @task dates Date Filters 11 11 * @task read Reading Utilities 12 + * @task exec Paging and Executing Queries 13 + * @task render Rendering Results 12 14 * 13 15 * @group search 14 16 */ ··· 502 504 } 503 505 504 506 505 - /* -( Pagination )--------------------------------------------------------- */ 507 + /* -( Paging and Executing Queries )--------------------------------------- */ 506 508 507 509 508 510 public function getPageSize(PhabricatorSavedQuery $saved) { 509 511 return $saved->getParameter('limit', 100); 512 + } 513 + 514 + 515 + public function shouldUseOffsetPaging() { 516 + return false; 517 + } 518 + 519 + 520 + public function newPagerForSavedQuery(PhabricatorSavedQuery $saved) { 521 + if ($this->shouldUseOffsetPaging()) { 522 + $pager = new AphrontPagerView(); 523 + } else { 524 + $pager = new AphrontCursorPagerView(); 525 + } 526 + 527 + $page_size = $this->getPageSize($saved); 528 + if (is_finite($page_size)) { 529 + $pager->setPageSize($page_size); 530 + } else { 531 + // Consider an INF pagesize to mean a large finite pagesize. 532 + 533 + // TODO: It would be nice to handle this more gracefully, but math 534 + // with INF seems to vary across PHP versions, systems, and runtimes. 535 + $pager->setPageSize(0xFFFF); 536 + } 537 + 538 + return $pager; 539 + } 540 + 541 + 542 + public function executeQuery( 543 + PhabricatorPolicyAwareQuery $query, 544 + AphrontView $pager) { 545 + 546 + $query->setViewer($this->requireViewer()); 547 + 548 + if ($this->shouldUseOffsetPaging()) { 549 + $objects = $query->executeWithOffsetPager($pager); 550 + } else { 551 + $objects = $query->executeWithCursorPager($pager); 552 + } 553 + 554 + return $objects; 555 + } 556 + 557 + 558 + /* -( Rendering )---------------------------------------------------------- */ 559 + 560 + 561 + public function renderResults( 562 + array $objects, 563 + PhabricatorSavedQuery $query) { 564 + throw new Exception(pht('Not supported here yet!')); 510 565 } 511 566 512 567
+4
src/applications/search/query/PhabricatorSearchApplicationSearchEngine.php
··· 229 229 return $results; 230 230 } 231 231 232 + public function shouldUseOffsetPaging() { 233 + return true; 234 + } 235 + 232 236 233 237 }