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

When a revision has more than 7 reviewers, render only the first 7 in the list view

Summary:
See PHI489. Ref T13110. At least for now, this just shows "..." at the end since you can click the revision to see the whole list anyway.

Also remove the older-style external Handle passing in favor of lazy construction via HandlePool.

Test Plan: Viewed revisions, fiddled with the 7 limit, got sensible-seeming "..." behavior.

Maniphest Tasks: T13110

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

+57 -69
+3 -9
src/applications/differential/controller/DifferentialRevisionViewController.php
··· 869 869 $header = id(new PHUIHeaderView()) 870 870 ->setHeader(pht('Recent Similar Revisions')); 871 871 872 - $view = id(new DifferentialRevisionListView()) 872 + return id(new DifferentialRevisionListView()) 873 + ->setViewer($viewer) 873 874 ->setRevisions($revisions) 874 875 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 875 - ->setNoBox(true) 876 - ->setUser($viewer); 877 - 878 - $phids = $view->getRequiredHandlePHIDs(); 879 - $handles = $this->loadViewerHandles($phids); 880 - $view->setHandles($handles); 881 - 882 - return $view; 876 + ->setNoBox(true); 883 877 } 884 878 885 879
+3 -15
src/applications/differential/query/DifferentialRevisionSearchEngine.php
··· 148 148 149 149 $viewer = $this->requireViewer(); 150 150 $template = id(new DifferentialRevisionListView()) 151 - ->setUser($viewer) 151 + ->setViewer($viewer) 152 152 ->setNoBox($this->isPanelContext()); 153 153 154 154 $bucket = $this->getResultBucket($query); ··· 176 176 } 177 177 } else { 178 178 $views[] = id(clone $template) 179 - ->setRevisions($revisions) 180 - ->setHandles(array()); 179 + ->setRevisions($revisions); 181 180 } 182 181 183 182 if (!$views) { 184 183 $views[] = id(new DifferentialRevisionListView()) 185 - ->setUser($viewer) 186 - ->setNoDataString(pht('No revisions found.')); 187 - } 188 - 189 - $phids = array_mergev(mpull($views, 'getRequiredHandlePHIDs')); 190 - if ($phids) { 191 - $handles = id(new PhabricatorHandleQuery()) 192 184 ->setViewer($viewer) 193 - ->withPHIDs($phids) 194 - ->execute(); 195 - } else { 196 - $handles = array(); 185 + ->setNoDataString(pht('No revisions found.')); 197 186 } 198 187 199 188 foreach ($views as $view) { 200 - $view->setHandles($handles); 201 189 $view->setUnlandedDependencies($unlanded); 202 190 } 203 191
+49 -35
src/applications/differential/view/DifferentialRevisionListView.php
··· 6 6 final class DifferentialRevisionListView extends AphrontView { 7 7 8 8 private $revisions = array(); 9 - private $handles; 10 9 private $header; 11 10 private $noDataString; 12 11 private $noBox; ··· 48 47 return $this; 49 48 } 50 49 51 - public function getRequiredHandlePHIDs() { 52 - $phids = array(); 53 - foreach ($this->revisions as $revision) { 54 - $phids[] = array($revision->getAuthorPHID()); 55 - $phids[] = $revision->getReviewerPHIDs(); 56 - } 57 - return array_mergev($phids); 58 - } 59 - 60 - public function setHandles(array $handles) { 61 - assert_instances_of($handles, 'PhabricatorObjectHandle'); 62 - $this->handles = $handles; 63 - return $this; 64 - } 65 - 66 50 public function render() { 67 51 $viewer = $this->getViewer(); 68 52 69 53 $this->initBehavior('phabricator-tooltips', array()); 70 54 $this->requireResource('aphront-tooltip-css'); 71 55 72 - $list = new PHUIObjectItemListView(); 56 + $reviewer_limit = 7; 57 + 58 + $reviewer_phids = array(); 59 + $reviewer_more = array(); 60 + $handle_phids = array(); 61 + foreach ($this->revisions as $key => $revision) { 62 + $reviewers = $revision->getReviewers(); 63 + if (count($reviewers) > $reviewer_limit) { 64 + $reviewers = array_slice($reviewers, 0, $reviewer_limit); 65 + $reviewer_more[$key] = true; 66 + } else { 67 + $reviewer_more[$key] = false; 68 + } 73 69 74 - foreach ($this->revisions as $revision) { 70 + $phids = mpull($reviewers, 'getReviewerPHID'); 71 + 72 + $reviewer_phids[$key] = $phids; 73 + foreach ($phids as $phid) { 74 + $handle_phids[$phid] = $phid; 75 + } 76 + 77 + $author_phid = $revision->getAuthorPHID(); 78 + $handle_phids[$author_phid] = $author_phid; 79 + } 80 + 81 + $handles = $viewer->loadHandles($handle_phids); 82 + 83 + $list = new PHUIObjectItemListView(); 84 + foreach ($this->revisions as $key => $revision) { 75 85 $item = id(new PHUIObjectItemView()) 76 - ->setUser($viewer); 86 + ->setViewer($viewer); 77 87 78 88 $icons = array(); 79 89 ··· 89 99 ''); 90 100 } 91 101 92 - if ($revision->getHasDraft($viewer)) { 93 - $icons['draft'] = true; 94 - } 95 - 96 102 $modified = $revision->getDateModified(); 97 103 98 104 if (isset($icons['flag'])) { 99 105 $item->addHeadIcon($icons['flag']); 100 106 } 101 107 102 - $item->setObjectName('D'.$revision->getID()); 108 + $item->setObjectName($revision->getMonogram()); 103 109 $item->setHeader($revision->getTitle()); 104 - $item->setHref('/D'.$revision->getID()); 110 + $item->setHref($revision->getURI()); 105 111 106 - if (isset($icons['draft'])) { 112 + if ($revision->getHasDraft($viewer)) { 107 113 $draft = id(new PHUIIconView()) 108 114 ->setIcon('fa-comment yellow') 109 115 ->addSigil('has-tooltip') ··· 114 120 $item->addAttribute($draft); 115 121 } 116 122 117 - // Author 118 - $author_handle = $this->handles[$revision->getAuthorPHID()]; 123 + $author_handle = $handles[$revision->getAuthorPHID()]; 119 124 $item->addByline(pht('Author: %s', $author_handle->renderLink())); 120 125 121 126 $unlanded = idx($this->unlandedDependencies, $phid); ··· 128 133 )); 129 134 } 130 135 131 - $reviewers = array(); 132 - foreach ($revision->getReviewerPHIDs() as $reviewer) { 133 - $reviewers[] = $this->handles[$reviewer]->renderLink(); 136 + $more = null; 137 + if ($reviewer_more[$key]) { 138 + $more = pht(', ...'); 139 + } else { 140 + $more = null; 134 141 } 135 - if (!$reviewers) { 136 - $reviewers = phutil_tag('em', array(), pht('None')); 142 + 143 + if ($reviewer_phids[$key]) { 144 + $item->addAttribute( 145 + array( 146 + pht('Reviewers:'), 147 + ' ', 148 + $viewer->renderHandleList($reviewer_phids[$key]) 149 + ->setAsInline(true), 150 + $more, 151 + )); 137 152 } else { 138 - $reviewers = phutil_implode_html(', ', $reviewers); 153 + $item->addAttribute(phutil_tag('em', array(), pht('No Reviewers'))); 139 154 } 140 155 141 - $item->addAttribute(pht('Reviewers: %s', $reviewers)); 142 156 $item->setEpoch($revision->getDateModified()); 143 157 144 158 if ($revision->isClosed()) {
+1 -5
src/applications/diffusion/controller/DiffusionBrowseController.php
··· 1754 1754 ->setHeader(pht('Recently Open Revisions')); 1755 1755 1756 1756 $list = id(new DifferentialRevisionListView()) 1757 + ->setViewer($viewer) 1757 1758 ->setRevisions($revisions) 1758 - ->setUser($viewer) 1759 1759 ->setNoBox(true); 1760 - 1761 - $phids = $list->getRequiredHandlePHIDs(); 1762 - $handles = $this->loadViewerHandles($phids); 1763 - $list->setHandles($handles); 1764 1760 1765 1761 $view = id(new PHUIObjectBoxView()) 1766 1762 ->setHeader($header)
+1 -5
src/applications/people/controller/PhabricatorPeopleProfileRevisionsController.php
··· 63 63 ->execute(); 64 64 65 65 $list = id(new DifferentialRevisionListView()) 66 - ->setUser($viewer) 66 + ->setViewer($viewer) 67 67 ->setNoBox(true) 68 68 ->setRevisions($revisions) 69 69 ->setNoDataString(pht('No recent revisions.')); 70 - 71 - $object_phids = $list->getRequiredHandlePHIDs(); 72 - $handles = $this->loadViewerHandles($object_phids); 73 - $list->setHandles($handles); 74 70 75 71 $view = id(new PHUIObjectBoxView()) 76 72 ->setHeaderText(pht('Recent Revisions'))