[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/differential/query/ -> DifferentialRevisionSearchEngine.php (source)

   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  }


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