Page MenuHomestyx hydra

No OneTemporary

diff --git a/src/applications/differential/field/specification/DifferentialProjectReviewersFieldSpecification.php b/src/applications/differential/field/specification/DifferentialProjectReviewersFieldSpecification.php
index 672aeb822f..53aa040560 100644
--- a/src/applications/differential/field/specification/DifferentialProjectReviewersFieldSpecification.php
+++ b/src/applications/differential/field/specification/DifferentialProjectReviewersFieldSpecification.php
@@ -1,42 +1,57 @@
<?php
final class DifferentialProjectReviewersFieldSpecification
extends DifferentialFieldSpecification {
public function shouldAppearOnRevisionView() {
return true;
}
public function getRequiredHandlePHIDsForRevisionView() {
return $this->getRevision()->getReviewers();
}
public function renderLabelForRevisionView() {
return pht('Project Reviewers');
}
public function renderValueForRevisionView() {
$reviewers = array();
foreach ($this->getRevision()->getReviewerStatus() as $reviewer) {
if (!$reviewer->isUser()) {
$reviewers[] = $reviewer;
}
}
if (!$reviewers) {
return null;
}
+ $highlight = array();
+ if ($this->getUser()->getPHID() != $this->getRevision()->getAuthorPHID()) {
+ // Determine which of these projects the viewer is a member of, so we can
+ // highlight them. (If the viewer is the author, skip this since they
+ // can't review.)
+ $phids = mpull($reviewers, 'getReviewerPHID');
+ $projects = id(new PhabricatorProjectQuery())
+ ->setViewer($this->getUser())
+ ->withPHIDs($phids)
+ ->withMemberPHIDs(array($this->getUser()->getPHID()))
+ ->execute();
+ $highlight = mpull($projects, 'getPHID');
+ }
+
$view = id(new DifferentialReviewersView())
->setReviewers($reviewers)
- ->setHandles($this->getLoadedHandles());
+ ->setHandles($this->getLoadedHandles())
+ ->setHighlightPHIDs($highlight);
$diff = $this->getRevision()->loadActiveDiff();
if ($diff) {
$view->setActiveDiff($diff);
}
return $view;
}
}
diff --git a/src/applications/differential/field/specification/DifferentialReviewersFieldSpecification.php b/src/applications/differential/field/specification/DifferentialReviewersFieldSpecification.php
index 5ec9fb2614..f7fcf2056c 100644
--- a/src/applications/differential/field/specification/DifferentialReviewersFieldSpecification.php
+++ b/src/applications/differential/field/specification/DifferentialReviewersFieldSpecification.php
@@ -1,202 +1,203 @@
<?php
final class DifferentialReviewersFieldSpecification
extends DifferentialFieldSpecification {
private $reviewers = array();
private $error;
public function shouldAppearOnRevisionView() {
return true;
}
public function getRequiredHandlePHIDsForRevisionView() {
return $this->getReviewerPHIDs();
}
public function renderLabelForRevisionView() {
return pht('Reviewers');
}
public function renderValueForRevisionView() {
$reviewers = array();
foreach ($this->getRevision()->getReviewerStatus() as $reviewer) {
if ($reviewer->isUser()) {
$reviewers[] = $reviewer;
}
}
if (!$reviewers) {
// Renders "None".
return $this->renderUserList(array());
}
$view = id(new DifferentialReviewersView())
->setReviewers($reviewers)
+ ->setHighlightPHIDs(array($this->getUser()->getPHID()))
->setHandles($this->getLoadedHandles());
$diff = $this->getRevision()->loadActiveDiff();
if ($diff) {
$view->setActiveDiff($diff);
}
return $view;
}
private function getReviewerPHIDs() {
$revision = $this->getRevision();
return $revision->getReviewers();
}
public function shouldAppearOnEdit() {
return true;
}
protected function didSetRevision() {
$this->reviewers = $this->getReviewerPHIDs();
}
public function getRequiredHandlePHIDsForRevisionEdit() {
return $this->reviewers;
}
public function setValueFromRequest(AphrontRequest $request) {
$this->reviewers = $request->getArr('reviewers');
return $this;
}
public function validateField() {
if (!$this->hasRevision()) {
return;
}
$self = PhabricatorEnv::getEnvConfig('differential.allow-self-accept');
if ($self) {
return;
}
$author_phid = $this->getRevision()->getAuthorPHID();
if (!in_array($author_phid, $this->reviewers)) {
return;
}
$this->error = 'Invalid';
throw new DifferentialFieldValidationException(
"The owner of a revision may not be a reviewer.");
}
public function renderEditControl() {
$reviewer_map = array();
foreach ($this->reviewers as $phid) {
$reviewer_map[$phid] = $this->getHandle($phid)->getFullName();
}
return id(new AphrontFormTokenizerControl())
->setLabel(pht('Reviewers'))
->setName('reviewers')
->setUser($this->getUser())
->setDatasource('/typeahead/common/usersorprojects/')
->setValue($reviewer_map)
->setError($this->error);
}
public function willWriteRevision(DifferentialRevisionEditor $editor) {
$editor->setReviewers($this->reviewers);
}
public function shouldAppearOnCommitMessage() {
return true;
}
public function getCommitMessageKey() {
return 'reviewerPHIDs';
}
public function setValueFromParsedCommitMessage($value) {
$this->reviewers = array_unique(nonempty($value, array()));
return $this;
}
public function renderLabelForCommitMessage() {
return 'Reviewers';
}
public function getRequiredHandlePHIDsForCommitMessage() {
return $this->reviewers;
}
public function renderValueForCommitMessage($is_edit) {
if (!$this->reviewers) {
return null;
}
$project_type = PhabricatorProjectPHIDTypeProject::TYPECONST;
$names = array();
foreach ($this->reviewers as $phid) {
$names[] = $this->getHandle($phid)->getObjectName();
}
return implode(', ', $names);
}
public function getSupportedCommitMessageLabels() {
return array(
'Reviewer',
'Reviewers',
);
}
public function parseValueFromCommitMessage($value) {
return $this->parseCommitMessageUserOrProjectList($value);
}
public function shouldAppearOnRevisionList() {
return true;
}
public function renderHeaderForRevisionList() {
return 'Reviewers';
}
public function renderValueForRevisionList(DifferentialRevision $revision) {
$primary_reviewer = $revision->getPrimaryReviewer();
if ($primary_reviewer) {
$names = array();
foreach ($revision->getReviewers() as $reviewer) {
$names[] = $this->getHandle($reviewer)->renderLink();
}
return phutil_implode_html(', ', $names);
} else {
return phutil_tag('em', array(), 'None');
}
}
public function getRequiredHandlePHIDsForRevisionList(
DifferentialRevision $revision) {
return $revision->getReviewers();
}
public function renderValueForMail($phase) {
if ($phase == DifferentialMailPhase::COMMENT) {
return null;
}
if (!$this->reviewers) {
return null;
}
$handles = id(new PhabricatorHandleQuery())
->setViewer($this->getUser())
->withPHIDs($this->reviewers)
->execute();
$handles = array_select_keys(
$handles,
array($this->getRevision()->getPrimaryReviewer())) + $handles;
$names = mpull($handles, 'getObjectName');
return 'Reviewers: '.implode(', ', $names);
}
}
diff --git a/src/applications/differential/view/DifferentialReviewersView.php b/src/applications/differential/view/DifferentialReviewersView.php
index b731054285..851af0afaa 100644
--- a/src/applications/differential/view/DifferentialReviewersView.php
+++ b/src/applications/differential/view/DifferentialReviewersView.php
@@ -1,96 +1,107 @@
<?php
final class DifferentialReviewersView extends AphrontView {
private $reviewers;
private $handles;
private $diff;
+ private $highlightPHIDs = array();
public function setReviewers(array $reviewers) {
assert_instances_of($reviewers, 'DifferentialReviewer');
$this->reviewers = $reviewers;
return $this;
}
public function setHandles(array $handles) {
assert_instances_of($handles, 'PhabricatorObjectHandle');
$this->handles = $handles;
return $this;
}
public function setActiveDiff(DifferentialDiff $diff) {
$this->diff = $diff;
return $this;
}
+ public function setHighlightPHIDs(array $phids) {
+ $this->highlightPHIDs = $phids;
+ return $this;
+ }
+
public function render() {
$view = new PHUIStatusListView();
+ $highlighted = array_fuse($this->highlightPHIDs);
+
foreach ($this->reviewers as $reviewer) {
$phid = $reviewer->getReviewerPHID();
$handle = $this->handles[$phid];
// If we're missing either the diff or action information for the
// reviewer, render information as current.
$is_current = (!$this->diff) ||
(!$reviewer->getDiffID()) ||
($this->diff->getID() == $reviewer->getDiffID());
$item = new PHUIStatusItemView();
+ if (isset($highlighted[$phid])) {
+ $item->setHighlighted(true);
+ }
switch ($reviewer->getStatus()) {
case DifferentialReviewerStatus::STATUS_ADDED:
$item->setIcon('open-dark', pht('Review Requested'));
break;
case DifferentialReviewerStatus::STATUS_ACCEPTED:
if ($is_current) {
$item->setIcon(
'accept-green',
pht('Accepted'));
} else {
$item->setIcon(
'accept-dark',
pht('Accepted Prior Diff'));
}
break;
case DifferentialReviewerStatus::STATUS_REJECTED:
if ($is_current) {
$item->setIcon(
'reject-red',
pht('Requested Changes'));
} else {
$item->setIcon(
'reject-dark',
pht('Requested Changes to Prior Diff'));
}
break;
case DifferentialReviewerStatus::STATUS_COMMENTED:
if ($is_current) {
$item->setIcon(
'info-blue',
pht('Commented'));
} else {
$item->setIcon(
'info-dark',
pht('Commented Previously'));
}
break;
default:
$item->setIcon('question-dark', pht('%s?', $reviewer->getStatus()));
break;
}
$item->setTarget($handle->renderLink());
$view->addItem($item);
}
return $view;
}
}

File Metadata

Mime Type
text/x-diff
Expires
Mon, Jul 28, 9:11 PM (1 w, 3 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
187516
Default Alt Text
(10 KB)

Event Timeline