[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class PhabricatorOwnersListController 4 extends PhabricatorOwnersController { 5 6 protected $view; 7 8 public function willProcessRequest(array $data) { 9 $this->view = idx($data, 'view', 'owned'); 10 $this->setSideNavFilter('view/'.$this->view); 11 } 12 13 public function processRequest() { 14 15 $request = $this->getRequest(); 16 $user = $request->getUser(); 17 18 $package = new PhabricatorOwnersPackage(); 19 $owner = new PhabricatorOwnersOwner(); 20 $path = new PhabricatorOwnersPath(); 21 22 $repository_phid = ''; 23 if ($request->getStr('repository') != '') { 24 $repository_phid = id(new PhabricatorRepositoryQuery()) 25 ->setViewer($user) 26 ->withCallsigns(array($request->getStr('repository'))) 27 ->executeOne() 28 ->getPHID(); 29 } 30 31 switch ($this->view) { 32 case 'search': 33 $packages = array(); 34 35 $conn_r = $package->establishConnection('r'); 36 37 $where = array('1 = 1'); 38 $join = array(); 39 $having = ''; 40 41 if ($request->getStr('name')) { 42 $where[] = qsprintf( 43 $conn_r, 44 'p.name LIKE %~', 45 $request->getStr('name')); 46 } 47 48 if ($repository_phid || $request->getStr('path')) { 49 50 $join[] = qsprintf( 51 $conn_r, 52 'JOIN %T path ON path.packageID = p.id', 53 $path->getTableName()); 54 55 if ($repository_phid) { 56 $where[] = qsprintf( 57 $conn_r, 58 'path.repositoryPHID = %s', 59 $repository_phid); 60 } 61 62 if ($request->getStr('path')) { 63 $where[] = qsprintf( 64 $conn_r, 65 '(path.path LIKE %~ AND NOT path.excluded) OR 66 %s LIKE CONCAT(REPLACE(path.path, %s, %s), %s)', 67 $request->getStr('path'), 68 $request->getStr('path'), 69 '_', 70 '\_', 71 '%'); 72 $having = 'HAVING MAX(path.excluded) = 0'; 73 } 74 75 } 76 77 if ($request->getArr('owner')) { 78 $join[] = qsprintf( 79 $conn_r, 80 'JOIN %T o ON o.packageID = p.id', 81 $owner->getTableName()); 82 $where[] = qsprintf( 83 $conn_r, 84 'o.userPHID IN (%Ls)', 85 $request->getArr('owner')); 86 } 87 88 $data = queryfx_all( 89 $conn_r, 90 'SELECT p.* FROM %T p %Q WHERE %Q GROUP BY p.id %Q', 91 $package->getTableName(), 92 implode(' ', $join), 93 '('.implode(') AND (', $where).')', 94 $having); 95 $packages = $package->loadAllFromArray($data); 96 97 $header = pht('Search Results'); 98 $nodata = pht('No packages match your query.'); 99 break; 100 case 'owned': 101 $data = queryfx_all( 102 $package->establishConnection('r'), 103 'SELECT p.* FROM %T p JOIN %T o ON p.id = o.packageID 104 WHERE o.userPHID = %s GROUP BY p.id', 105 $package->getTableName(), 106 $owner->getTableName(), 107 $user->getPHID()); 108 $packages = $package->loadAllFromArray($data); 109 110 $header = pht('Owned Packages'); 111 $nodata = pht('No owned packages'); 112 break; 113 case 'projects': 114 $projects = id(new PhabricatorProjectQuery()) 115 ->setViewer($user) 116 ->withMemberPHIDs(array($user->getPHID())) 117 ->withStatus(PhabricatorProjectQuery::STATUS_ANY) 118 ->execute(); 119 $owner_phids = mpull($projects, 'getPHID'); 120 if ($owner_phids) { 121 $data = queryfx_all( 122 $package->establishConnection('r'), 123 'SELECT p.* FROM %T p JOIN %T o ON p.id = o.packageID 124 WHERE o.userPHID IN (%Ls) GROUP BY p.id', 125 $package->getTableName(), 126 $owner->getTableName(), 127 $owner_phids); 128 } else { 129 $data = array(); 130 } 131 $packages = $package->loadAllFromArray($data); 132 133 $header = pht('Owned Packages'); 134 $nodata = pht('No owned packages'); 135 break; 136 case 'all': 137 $packages = $package->loadAll(); 138 139 $header = pht('All Packages'); 140 $nodata = pht('There are no defined packages.'); 141 break; 142 } 143 144 $content = $this->renderPackageTable( 145 $packages, 146 $header, 147 $nodata); 148 149 $filter = new AphrontListFilterView(); 150 151 $owners_search_value = array(); 152 if ($request->getArr('owner')) { 153 $phids = $request->getArr('owner'); 154 $phid = reset($phids); 155 $handles = $this->loadViewerHandles(array($phid)); 156 $owners_search_value = array($handles[$phid]); 157 } 158 159 $callsigns = array('' => pht('(Any Repository)')); 160 $repositories = id(new PhabricatorRepositoryQuery()) 161 ->setViewer($user) 162 ->setOrder(PhabricatorRepositoryQuery::ORDER_CALLSIGN) 163 ->execute(); 164 foreach ($repositories as $repository) { 165 $callsigns[$repository->getCallsign()] = 166 $repository->getCallsign().': '.$repository->getName(); 167 } 168 169 $form = id(new AphrontFormView()) 170 ->setUser($user) 171 ->setAction('/owners/view/search/') 172 ->setMethod('GET') 173 ->appendChild( 174 id(new AphrontFormTextControl()) 175 ->setName('name') 176 ->setLabel(pht('Name')) 177 ->setValue($request->getStr('name'))) 178 ->appendChild( 179 id(new AphrontFormTokenizerControl()) 180 ->setDatasource(new PhabricatorProjectOrUserDatasource()) 181 ->setLimit(1) 182 ->setName('owner') 183 ->setLabel(pht('Owner')) 184 ->setValue($owners_search_value)) 185 ->appendChild( 186 id(new AphrontFormSelectControl()) 187 ->setName('repository') 188 ->setLabel(pht('Repository')) 189 ->setOptions($callsigns) 190 ->setValue($request->getStr('repository'))) 191 ->appendChild( 192 id(new AphrontFormTextControl()) 193 ->setName('path') 194 ->setLabel(pht('Path')) 195 ->setValue($request->getStr('path'))) 196 ->appendChild( 197 id(new AphrontFormSubmitControl()) 198 ->setValue(pht('Search for Packages'))); 199 200 $filter->appendChild($form); 201 202 $nav = $this->buildSideNavView(); 203 $nav->appendChild($filter); 204 $nav->appendChild($content); 205 206 return $this->buildApplicationPage( 207 array( 208 $nav, 209 ), 210 array( 211 'title' => pht('Package Index'), 212 )); 213 } 214 215 private function renderPackageTable(array $packages, $header, $nodata) { 216 assert_instances_of($packages, 'PhabricatorOwnersPackage'); 217 218 if ($packages) { 219 $package_ids = mpull($packages, 'getID'); 220 221 $owners = id(new PhabricatorOwnersOwner())->loadAllWhere( 222 'packageID IN (%Ld)', 223 $package_ids); 224 225 $paths = id(new PhabricatorOwnersPath())->loadAllWhere( 226 'packageID in (%Ld)', 227 $package_ids); 228 229 $phids = array(); 230 foreach ($owners as $owner) { 231 $phids[$owner->getUserPHID()] = true; 232 } 233 $phids = array_keys($phids); 234 $handles = $this->loadViewerHandles($phids); 235 236 $repository_phids = array(); 237 foreach ($paths as $path) { 238 $repository_phids[$path->getRepositoryPHID()] = true; 239 } 240 241 if ($repository_phids) { 242 $repositories = id(new PhabricatorRepositoryQuery()) 243 ->setViewer($this->getRequest()->getUser()) 244 ->withPHIDs(array_keys($repository_phids)) 245 ->execute(); 246 } else { 247 $repositories = array(); 248 } 249 250 $repositories = mpull($repositories, null, 'getPHID'); 251 $owners = mgroup($owners, 'getPackageID'); 252 $paths = mgroup($paths, 'getPackageID'); 253 } else { 254 $handles = array(); 255 $repositories = array(); 256 $owners = array(); 257 $paths = array(); 258 } 259 260 $rows = array(); 261 foreach ($packages as $package) { 262 263 $pkg_owners = idx($owners, $package->getID(), array()); 264 foreach ($pkg_owners as $key => $owner) { 265 $pkg_owners[$key] = $handles[$owner->getUserPHID()]->renderLink(); 266 if ($owner->getUserPHID() == $package->getPrimaryOwnerPHID()) { 267 $pkg_owners[$key] = phutil_tag('strong', array(), $pkg_owners[$key]); 268 } 269 } 270 $pkg_owners = phutil_implode_html(phutil_tag('br'), $pkg_owners); 271 272 $pkg_paths = idx($paths, $package->getID(), array()); 273 foreach ($pkg_paths as $key => $path) { 274 $repo = idx($repositories, $path->getRepositoryPHID()); 275 if ($repo) { 276 $href = DiffusionRequest::generateDiffusionURI( 277 array( 278 'callsign' => $repo->getCallsign(), 279 'branch' => $repo->getDefaultBranch(), 280 'path' => $path->getPath(), 281 'action' => 'browse', 282 )); 283 $pkg_paths[$key] = hsprintf( 284 '%s %s%s', 285 ($path->getExcluded() ? "\xE2\x80\x93" : '+'), 286 phutil_tag('strong', array(), $repo->getName()), 287 phutil_tag( 288 'a', 289 array( 290 'href' => (string) $href, 291 ), 292 $path->getPath())); 293 } else { 294 $pkg_paths[$key] = $path->getPath(); 295 } 296 } 297 $pkg_paths = phutil_implode_html(phutil_tag('br'), $pkg_paths); 298 299 $rows[] = array( 300 phutil_tag( 301 'a', 302 array( 303 'href' => '/owners/package/'.$package->getID().'/', 304 ), 305 $package->getName()), 306 $pkg_owners, 307 $pkg_paths, 308 phutil_tag( 309 'a', 310 array( 311 'href' => '/audit/?auditorPHIDs='.$package->getPHID(), 312 ), 313 pht('Related Commits')), 314 ); 315 } 316 317 $table = new AphrontTableView($rows); 318 $table->setHeaders( 319 array( 320 pht('Name'), 321 pht('Owners'), 322 pht('Paths'), 323 pht('Related Commits'), 324 )); 325 $table->setColumnClasses( 326 array( 327 'pri', 328 '', 329 'wide wrap', 330 'narrow', 331 )); 332 333 $panel = new AphrontPanelView(); 334 $panel->setHeader($header); 335 $panel->appendChild($table); 336 $panel->setNoBackground(); 337 338 return $panel; 339 } 340 341 protected function getExtraPackageViews(AphrontSideNavFilterView $view) { 342 if ($this->view == 'search') { 343 $view->addFilter('view/search', pht('Search Results')); 344 } 345 } 346 }
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 |