[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/differential/view/ -> DifferentialRevisionListView.php (source)

   1  <?php
   2  
   3  /**
   4   * Render a table of Differential revisions.
   5   */
   6  final class DifferentialRevisionListView extends AphrontView {
   7  
   8    private $revisions;
   9    private $handles;
  10    private $highlightAge;
  11    private $header;
  12    private $noDataString;
  13  
  14    public function setNoDataString($no_data_string) {
  15      $this->noDataString = $no_data_string;
  16      return $this;
  17    }
  18  
  19    public function setHeader($header) {
  20      $this->header = $header;
  21      return $this;
  22    }
  23  
  24    public function setRevisions(array $revisions) {
  25      assert_instances_of($revisions, 'DifferentialRevision');
  26      $this->revisions = $revisions;
  27      return $this;
  28    }
  29  
  30    public function setHighlightAge($bool) {
  31      $this->highlightAge = $bool;
  32      return $this;
  33    }
  34  
  35    public function getRequiredHandlePHIDs() {
  36      $phids = array();
  37      foreach ($this->revisions as $revision) {
  38        $phids[] = array($revision->getAuthorPHID());
  39  
  40        // TODO: Switch to getReviewerStatus(), but not all callers pass us
  41        // revisions with this data loaded.
  42        $phids[] = $revision->getReviewers();
  43      }
  44      return array_mergev($phids);
  45    }
  46  
  47    public function setHandles(array $handles) {
  48      assert_instances_of($handles, 'PhabricatorObjectHandle');
  49      $this->handles = $handles;
  50      return $this;
  51    }
  52  
  53    public function render() {
  54  
  55      $user = $this->user;
  56      if (!$user) {
  57        throw new Exception('Call setUser() before render()!');
  58      }
  59  
  60      $fresh = PhabricatorEnv::getEnvConfig('differential.days-fresh');
  61      if ($fresh) {
  62        $fresh = PhabricatorCalendarHoliday::getNthBusinessDay(
  63          time(),
  64          -$fresh);
  65      }
  66  
  67      $stale = PhabricatorEnv::getEnvConfig('differential.days-stale');
  68      if ($stale) {
  69        $stale = PhabricatorCalendarHoliday::getNthBusinessDay(
  70          time(),
  71          -$stale);
  72      }
  73  
  74      $this->initBehavior('phabricator-tooltips', array());
  75      $this->requireResource('aphront-tooltip-css');
  76  
  77      $list = new PHUIObjectItemListView();
  78  
  79      foreach ($this->revisions as $revision) {
  80        $item = id(new PHUIObjectItemView())
  81          ->setUser($user);
  82  
  83        $icons = array();
  84  
  85        $phid = $revision->getPHID();
  86        $flag = $revision->getFlag($user);
  87        if ($flag) {
  88          $flag_class = PhabricatorFlagColor::getCSSClass($flag->getColor());
  89          $icons['flag'] = phutil_tag(
  90            'div',
  91            array(
  92              'class' => 'phabricator-flag-icon '.$flag_class,
  93            ),
  94            '');
  95        }
  96  
  97        if ($revision->getDrafts($user)) {
  98          $icons['draft'] = true;
  99        }
 100  
 101        $modified = $revision->getDateModified();
 102  
 103        $status = $revision->getStatus();
 104        $show_age = ($fresh || $stale) &&
 105                    $this->highlightAge &&
 106                    !$revision->isClosed();
 107  
 108        if ($stale && $modified < $stale) {
 109          $object_age = PHUIObjectItemView::AGE_OLD;
 110        } else if ($fresh && $modified < $fresh) {
 111          $object_age = PHUIObjectItemView::AGE_STALE;
 112        } else {
 113          $object_age = PHUIObjectItemView::AGE_FRESH;
 114        }
 115  
 116        $status_name =
 117          ArcanistDifferentialRevisionStatus::getNameForRevisionStatus($status);
 118  
 119        if (isset($icons['flag'])) {
 120          $item->addHeadIcon($icons['flag']);
 121        }
 122  
 123        $item->setObjectName('D'.$revision->getID());
 124        $item->setHeader(phutil_tag('a',
 125          array('href' => '/D'.$revision->getID()),
 126          $revision->getTitle()));
 127  
 128        if (isset($icons['draft'])) {
 129          $draft = id(new PHUIIconView())
 130            ->setIconFont('fa-comment-o lightgreytext')
 131            ->addSigil('has-tooltip')
 132            ->setMetadata(
 133              array(
 134                'tip' => pht('Unsubmitted Comments'),
 135              ));
 136          $item->addAttribute($draft);
 137        }
 138  
 139        /* Most things 'Need Review', so accept it's the default */
 140        if ($status != ArcanistDifferentialRevisionStatus::NEEDS_REVIEW) {
 141          $item->addAttribute($status_name);
 142        }
 143  
 144        // Author
 145        $author_handle = $this->handles[$revision->getAuthorPHID()];
 146        $item->addByline(pht('Author: %s', $author_handle->renderLink()));
 147  
 148        $reviewers = array();
 149        // TODO: As above, this should be based on `getReviewerStatus()`.
 150        foreach ($revision->getReviewers() as $reviewer) {
 151          $reviewers[] = $this->handles[$reviewer]->renderLink();
 152        }
 153        if (!$reviewers) {
 154          $reviewers = phutil_tag('em', array(), pht('None'));
 155        } else {
 156          $reviewers = phutil_implode_html(', ', $reviewers);
 157        }
 158  
 159        $item->addAttribute(pht('Reviewers: %s', $reviewers));
 160        $item->setEpoch($revision->getDateModified(), $object_age);
 161  
 162        switch ($status) {
 163          case ArcanistDifferentialRevisionStatus::NEEDS_REVIEW:
 164            break;
 165          case ArcanistDifferentialRevisionStatus::NEEDS_REVISION:
 166          case ArcanistDifferentialRevisionStatus::CHANGES_PLANNED:
 167            $item->setBarColor('red');
 168            break;
 169          case ArcanistDifferentialRevisionStatus::ACCEPTED:
 170            $item->setBarColor('green');
 171            break;
 172          case ArcanistDifferentialRevisionStatus::CLOSED:
 173            $item->setDisabled(true);
 174            break;
 175          case ArcanistDifferentialRevisionStatus::ABANDONED:
 176            $item->setBarColor('black');
 177            break;
 178        }
 179  
 180        $list->addItem($item);
 181      }
 182  
 183      $list->setHeader($this->header);
 184      $list->setNoDataString($this->noDataString);
 185  
 186      return $list;
 187    }
 188  
 189  }


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