[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/owners/controller/ -> PhabricatorOwnersListController.php (source)

   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  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1