Path: blob/master/src/applications/differential/view/DifferentialRevisionListView.php
12256 views
<?php12/**3* Render a table of Differential revisions.4*/5final class DifferentialRevisionListView extends AphrontView {67private $revisions = array();8private $header;9private $noDataString;10private $noBox;11private $background = null;12private $unlandedDependencies = array();1314public function setUnlandedDependencies(array $unlanded_dependencies) {15$this->unlandedDependencies = $unlanded_dependencies;16return $this;17}1819public function getUnlandedDependencies() {20return $this->unlandedDependencies;21}2223public function setNoDataString($no_data_string) {24$this->noDataString = $no_data_string;25return $this;26}2728public function setHeader($header) {29$this->header = $header;30return $this;31}3233public function setRevisions(array $revisions) {34assert_instances_of($revisions, 'DifferentialRevision');35$this->revisions = $revisions;36return $this;37}3839public function setNoBox($box) {40$this->noBox = $box;41return $this;42}4344public function setBackground($background) {45$this->background = $background;46return $this;47}4849public function render() {50$viewer = $this->getViewer();5152$this->initBehavior('phabricator-tooltips', array());53$this->requireResource('aphront-tooltip-css');5455$reviewer_limit = 7;5657$reviewer_phids = array();58$reviewer_more = array();59$handle_phids = array();60foreach ($this->revisions as $key => $revision) {61$reviewers = $revision->getReviewers();6263// Don't show reviewers who have resigned. The "Reviewers" constraint64// does not respect these reviewers and they largely don't count as65// reviewers.66foreach ($reviewers as $reviewer_key => $reviewer) {67if ($reviewer->isResigned()) {68unset($reviewers[$reviewer_key]);69}70}7172if (count($reviewers) > $reviewer_limit) {73$reviewers = array_slice($reviewers, 0, $reviewer_limit);74$reviewer_more[$key] = true;75} else {76$reviewer_more[$key] = false;77}7879$phids = mpull($reviewers, 'getReviewerPHID');8081$reviewer_phids[$key] = $phids;82foreach ($phids as $phid) {83$handle_phids[$phid] = $phid;84}8586$author_phid = $revision->getAuthorPHID();87$handle_phids[$author_phid] = $author_phid;88}8990$handles = $viewer->loadHandles($handle_phids);9192$list = new PHUIObjectItemListView();93foreach ($this->revisions as $key => $revision) {94$item = id(new PHUIObjectItemView())95->setViewer($viewer);9697$icons = array();9899$phid = $revision->getPHID();100$flag = $revision->getFlag($viewer);101if ($flag) {102$flag_class = PhabricatorFlagColor::getCSSClass($flag->getColor());103$icons['flag'] = phutil_tag(104'div',105array(106'class' => 'phabricator-flag-icon '.$flag_class,107),108'');109}110111$modified = $revision->getDateModified();112113if (isset($icons['flag'])) {114$item->addHeadIcon($icons['flag']);115}116117$item->setObjectName($revision->getMonogram());118$item->setHeader($revision->getTitle());119$item->setHref($revision->getURI());120121$size = $this->renderRevisionSize($revision);122if ($size !== null) {123$item->addAttribute($size);124}125126if ($revision->getHasDraft($viewer)) {127$draft = id(new PHUIIconView())128->setIcon('fa-comment yellow')129->addSigil('has-tooltip')130->setMetadata(131array(132'tip' => pht('Unsubmitted Comments'),133));134$item->addAttribute($draft);135}136137$author_handle = $handles[$revision->getAuthorPHID()];138$item->addByline(pht('Author: %s', $author_handle->renderLink()));139140$unlanded = idx($this->unlandedDependencies, $phid);141if ($unlanded) {142$item->addAttribute(143array(144id(new PHUIIconView())->setIcon('fa-chain-broken', 'red'),145' ',146pht('Open Dependencies'),147));148}149150$more = null;151if ($reviewer_more[$key]) {152$more = pht(', ...');153} else {154$more = null;155}156157if ($reviewer_phids[$key]) {158$item->addAttribute(159array(160pht('Reviewers:'),161' ',162$viewer->renderHandleList($reviewer_phids[$key])163->setAsInline(true),164$more,165));166} else {167$item->addAttribute(phutil_tag('em', array(), pht('No Reviewers')));168}169170$item->setEpoch($revision->getDateModified());171172if ($revision->isClosed()) {173$item->setDisabled(true);174}175176$icon = $revision->getStatusIcon();177$color = $revision->getStatusIconColor();178179$item->setStatusIcon(180"{$icon} {$color}",181$revision->getStatusDisplayName());182183$list->addItem($item);184}185186$list->setNoDataString($this->noDataString);187188189if ($this->header && !$this->noBox) {190$list->setFlush(true);191$list = id(new PHUIObjectBoxView())192->setBackground($this->background)193->setObjectList($list);194195if ($this->header instanceof PHUIHeaderView) {196$list->setHeader($this->header);197} else {198$list->setHeaderText($this->header);199}200} else {201$list->setHeader($this->header);202}203204return $list;205}206207private function renderRevisionSize(DifferentialRevision $revision) {208if (!$revision->hasLineCounts()) {209return null;210}211212$size = array();213214$glyphs = $revision->getRevisionScaleGlyphs();215$plus_count = 0;216for ($ii = 0; $ii < 7; $ii++) {217$c = $glyphs[$ii];218219switch ($c) {220case '+':221$size[] = id(new PHUIIconView())222->setIcon('fa-plus');223$plus_count++;224break;225case '-':226$size[] = id(new PHUIIconView())227->setIcon('fa-minus');228break;229default:230$size[] = id(new PHUIIconView())231->setIcon('fa-square-o invisible');232break;233}234}235236$n = $revision->getAddedLineCount() + $revision->getRemovedLineCount();237238$classes = array();239$classes[] = 'differential-revision-size';240241$tip = array();242$tip[] = pht('%s Lines', new PhutilNumber($n));243244if ($plus_count <= 1) {245$classes[] = 'differential-revision-small';246$tip[] = pht('Smaller Change');247}248249if ($plus_count >= 4) {250$classes[] = 'differential-revision-large';251$tip[] = pht('Larger Change');252}253254$tip = phutil_implode_html(" \xC2\xB7 ", $tip);255256return javelin_tag(257'span',258array(259'class' => implode(' ', $classes),260'sigil' => 'has-tooltip',261'meta' => array(262'tip' => $tip,263'align' => 'E',264'size' => 400,265),266),267$size);268}269270}271272273