[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class DifferentialRevisionSearchEngine 4 extends PhabricatorApplicationSearchEngine { 5 6 public function getResultTypeDescription() { 7 return pht('Differential Revisions'); 8 } 9 10 public function getApplicationClassName() { 11 return 'PhabricatorDifferentialApplication'; 12 } 13 14 public function getPageSize(PhabricatorSavedQuery $saved) { 15 if ($saved->getQueryKey() == 'active') { 16 return 0xFFFF; 17 } 18 return parent::getPageSize($saved); 19 } 20 21 public function buildSavedQueryFromRequest(AphrontRequest $request) { 22 $saved = new PhabricatorSavedQuery(); 23 24 $saved->setParameter( 25 'responsiblePHIDs', 26 $this->readUsersFromRequest($request, 'responsibles')); 27 28 $saved->setParameter( 29 'authorPHIDs', 30 $this->readUsersFromRequest($request, 'authors')); 31 32 $saved->setParameter( 33 'reviewerPHIDs', 34 $this->readUsersFromRequest( 35 $request, 36 'reviewers', 37 array( 38 PhabricatorProjectProjectPHIDType::TYPECONST, 39 ))); 40 41 $saved->setParameter( 42 'subscriberPHIDs', 43 $this->readUsersFromRequest($request, 'subscribers')); 44 45 $saved->setParameter( 46 'repositoryPHIDs', 47 $request->getArr('repositories')); 48 49 $saved->setParameter( 50 'draft', 51 $request->getBool('draft')); 52 53 $saved->setParameter( 54 'order', 55 $request->getStr('order')); 56 57 $saved->setParameter( 58 'status', 59 $request->getStr('status')); 60 61 return $saved; 62 } 63 64 public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { 65 $query = id(new DifferentialRevisionQuery()) 66 ->needFlags(true) 67 ->needDrafts(true) 68 ->needRelationships(true); 69 70 $responsible_phids = $saved->getParameter('responsiblePHIDs', array()); 71 if ($responsible_phids) { 72 $query->withResponsibleUsers($responsible_phids); 73 } 74 75 $author_phids = $saved->getParameter('authorPHIDs', array()); 76 if ($author_phids) { 77 $query->withAuthors($author_phids); 78 } 79 80 $reviewer_phids = $saved->getParameter('reviewerPHIDs', array()); 81 if ($reviewer_phids) { 82 $query->withReviewers($reviewer_phids); 83 } 84 85 $subscriber_phids = $saved->getParameter('subscriberPHIDs', array()); 86 if ($subscriber_phids) { 87 $query->withCCs($subscriber_phids); 88 } 89 90 $repository_phids = $saved->getParameter('repositoryPHIDs', array()); 91 if ($repository_phids) { 92 $query->withRepositoryPHIDs($repository_phids); 93 } 94 95 $draft = $saved->getParameter('draft', false); 96 if ($draft && $this->requireViewer()->isLoggedIn()) { 97 $query->withDraftRepliesByAuthors( 98 array($this->requireViewer()->getPHID())); 99 } 100 101 $status = $saved->getParameter('status'); 102 if (idx($this->getStatusOptions(), $status)) { 103 $query->withStatus($status); 104 } 105 106 $order = $saved->getParameter('order'); 107 if (idx($this->getOrderOptions(), $order)) { 108 $query->setOrder($order); 109 } else { 110 $query->setOrder(DifferentialRevisionQuery::ORDER_CREATED); 111 } 112 113 return $query; 114 } 115 116 public function buildSearchForm( 117 AphrontFormView $form, 118 PhabricatorSavedQuery $saved) { 119 120 $responsible_phids = $saved->getParameter('responsiblePHIDs', array()); 121 $author_phids = $saved->getParameter('authorPHIDs', array()); 122 $reviewer_phids = $saved->getParameter('reviewerPHIDs', array()); 123 $subscriber_phids = $saved->getParameter('subscriberPHIDs', array()); 124 $repository_phids = $saved->getParameter('repositoryPHIDs', array()); 125 $only_draft = $saved->getParameter('draft', false); 126 127 $all_phids = array_mergev( 128 array( 129 $responsible_phids, 130 $author_phids, 131 $reviewer_phids, 132 $subscriber_phids, 133 $repository_phids, 134 )); 135 136 $handles = id(new PhabricatorHandleQuery()) 137 ->setViewer($this->requireViewer()) 138 ->withPHIDs($all_phids) 139 ->execute(); 140 141 $form 142 ->appendChild( 143 id(new AphrontFormTokenizerControl()) 144 ->setLabel(pht('Responsible Users')) 145 ->setName('responsibles') 146 ->setDatasource(new PhabricatorPeopleDatasource()) 147 ->setValue(array_select_keys($handles, $responsible_phids))) 148 ->appendChild( 149 id(new AphrontFormTokenizerControl()) 150 ->setLabel(pht('Authors')) 151 ->setName('authors') 152 ->setDatasource(new PhabricatorPeopleDatasource()) 153 ->setValue(array_select_keys($handles, $author_phids))) 154 ->appendChild( 155 id(new AphrontFormTokenizerControl()) 156 ->setLabel(pht('Reviewers')) 157 ->setName('reviewers') 158 ->setDatasource(new PhabricatorProjectOrUserDatasource()) 159 ->setValue(array_select_keys($handles, $reviewer_phids))) 160 ->appendChild( 161 id(new AphrontFormTokenizerControl()) 162 ->setLabel(pht('Subscribers')) 163 ->setName('subscribers') 164 ->setDatasource(new PhabricatorMetaMTAMailableDatasource()) 165 ->setValue(array_select_keys($handles, $subscriber_phids))) 166 ->appendChild( 167 id(new AphrontFormTokenizerControl()) 168 ->setLabel(pht('Repositories')) 169 ->setName('repositories') 170 ->setDatasource(new DiffusionRepositoryDatasource()) 171 ->setValue(array_select_keys($handles, $repository_phids))) 172 ->appendChild( 173 id(new AphrontFormSelectControl()) 174 ->setLabel(pht('Status')) 175 ->setName('status') 176 ->setOptions($this->getStatusOptions()) 177 ->setValue($saved->getParameter('status'))); 178 179 if ($this->requireViewer()->isLoggedIn()) { 180 $form 181 ->appendChild( 182 id(new AphrontFormCheckboxControl()) 183 ->addCheckbox( 184 'draft', 185 1, 186 pht('Show only revisions with a draft comment.'), 187 $only_draft)); 188 } 189 190 $form 191 ->appendChild( 192 id(new AphrontFormSelectControl()) 193 ->setLabel(pht('Order')) 194 ->setName('order') 195 ->setOptions($this->getOrderOptions()) 196 ->setValue($saved->getParameter('order'))); 197 } 198 199 protected function getURI($path) { 200 return '/differential/'.$path; 201 } 202 203 public function getBuiltinQueryNames() { 204 $names = array(); 205 206 if ($this->requireViewer()->isLoggedIn()) { 207 $names['active'] = pht('Active Revisions'); 208 $names['authored'] = pht('Authored'); 209 } 210 211 $names['all'] = pht('All Revisions'); 212 213 return $names; 214 } 215 216 public function buildSavedQueryFromBuiltin($query_key) { 217 $query = $this->newSavedQuery(); 218 $query->setQueryKey($query_key); 219 220 $viewer = $this->requireViewer(); 221 222 switch ($query_key) { 223 case 'active': 224 return $query 225 ->setParameter('responsiblePHIDs', array($viewer->getPHID())) 226 ->setParameter('status', DifferentialRevisionQuery::STATUS_OPEN); 227 case 'authored': 228 return $query 229 ->setParameter('authorPHIDs', array($viewer->getPHID())); 230 case 'all': 231 return $query; 232 } 233 234 return parent::buildSavedQueryFromBuiltin($query_key); 235 } 236 237 private function getStatusOptions() { 238 return array( 239 DifferentialRevisionQuery::STATUS_ANY => pht('All'), 240 DifferentialRevisionQuery::STATUS_OPEN => pht('Open'), 241 DifferentialRevisionQuery::STATUS_ACCEPTED => pht('Accepted'), 242 DifferentialRevisionQuery::STATUS_NEEDS_REVIEW => pht('Needs Review'), 243 DifferentialRevisionQuery::STATUS_NEEDS_REVISION => pht('Needs Revision'), 244 DifferentialRevisionQuery::STATUS_CLOSED => pht('Closed'), 245 DifferentialRevisionQuery::STATUS_ABANDONED => pht('Abandoned'), 246 ); 247 } 248 249 private function getOrderOptions() { 250 return array( 251 DifferentialRevisionQuery::ORDER_CREATED => pht('Created'), 252 DifferentialRevisionQuery::ORDER_MODIFIED => pht('Updated'), 253 ); 254 } 255 256 protected function renderResultList( 257 array $revisions, 258 PhabricatorSavedQuery $query, 259 array $handles) { 260 assert_instances_of($revisions, 'DifferentialRevision'); 261 262 $viewer = $this->requireViewer(); 263 $template = id(new DifferentialRevisionListView()) 264 ->setUser($viewer); 265 266 $views = array(); 267 if ($query->getQueryKey() == 'active') { 268 $split = DifferentialRevisionQuery::splitResponsible( 269 $revisions, 270 $query->getParameter('responsiblePHIDs')); 271 list($blocking, $active, $waiting) = $split; 272 273 $views[] = id(clone $template) 274 ->setHeader(pht('Blocking Others')) 275 ->setNoDataString( 276 pht('No revisions are blocked on your action.')) 277 ->setHighlightAge(true) 278 ->setRevisions($blocking) 279 ->setHandles(array()); 280 281 $views[] = id(clone $template) 282 ->setHeader(pht('Action Required')) 283 ->setNoDataString( 284 pht('No revisions require your action.')) 285 ->setHighlightAge(true) 286 ->setRevisions($active) 287 ->setHandles(array()); 288 289 $views[] = id(clone $template) 290 ->setHeader(pht('Waiting on Others')) 291 ->setNoDataString( 292 pht('You have no revisions waiting on others.')) 293 ->setRevisions($waiting) 294 ->setHandles(array()); 295 } else { 296 $views[] = id(clone $template) 297 ->setRevisions($revisions) 298 ->setHandles(array()); 299 } 300 301 $phids = array_mergev(mpull($views, 'getRequiredHandlePHIDs')); 302 if ($phids) { 303 $handles = id(new PhabricatorHandleQuery()) 304 ->setViewer($viewer) 305 ->withPHIDs($phids) 306 ->execute(); 307 } else { 308 $handles = array(); 309 } 310 311 foreach ($views as $view) { 312 $view->setHandles($handles); 313 } 314 315 if (count($views) == 1) { 316 // Reduce this to a PHUIObjectItemListView so we can get the free 317 // support from ApplicationSearch. 318 return head($views)->render(); 319 } else { 320 return $views; 321 } 322 } 323 324 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |