diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index c14913bc7a..8293955dbe 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -392,6 +392,7 @@ phutil_register_library_map(array( 'DifferentialPathFieldSpecification' => 'applications/differential/field/specification/DifferentialPathFieldSpecification.php', 'DifferentialPeopleMenuEventListener' => 'applications/differential/events/DifferentialPeopleMenuEventListener.php', 'DifferentialPrimaryPaneView' => 'applications/differential/view/DifferentialPrimaryPaneView.php', + 'DifferentialProjectReviewersFieldSpecification' => 'applications/differential/field/specification/DifferentialProjectReviewersFieldSpecification.php', 'DifferentialRawDiffRenderer' => 'applications/differential/render/DifferentialRawDiffRenderer.php', 'DifferentialReleephRequestFieldSpecification' => 'applications/releeph/differential/DifferentialReleephRequestFieldSpecification.php', 'DifferentialRemarkupRule' => 'applications/differential/remarkup/DifferentialRemarkupRule.php', @@ -405,6 +406,7 @@ phutil_register_library_map(array( 'DifferentialReviewer' => 'applications/differential/storage/DifferentialReviewer.php', 'DifferentialReviewerStatus' => 'applications/differential/constants/DifferentialReviewerStatus.php', 'DifferentialReviewersFieldSpecification' => 'applications/differential/field/specification/DifferentialReviewersFieldSpecification.php', + 'DifferentialReviewersView' => 'applications/differential/view/DifferentialReviewersView.php', 'DifferentialRevision' => 'applications/differential/storage/DifferentialRevision.php', 'DifferentialRevisionCommentListView' => 'applications/differential/view/DifferentialRevisionCommentListView.php', 'DifferentialRevisionCommentView' => 'applications/differential/view/DifferentialRevisionCommentView.php', @@ -2487,6 +2489,7 @@ phutil_register_library_map(array( 'DifferentialPathFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialPeopleMenuEventListener' => 'PhutilEventListener', 'DifferentialPrimaryPaneView' => 'AphrontView', + 'DifferentialProjectReviewersFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialReleephRequestFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialRemarkupRule' => 'PhabricatorRemarkupRuleObject', 'DifferentialReplyHandler' => 'PhabricatorMailReplyHandler', @@ -2497,6 +2500,7 @@ phutil_register_library_map(array( 'DifferentialReviewRequestMail' => 'DifferentialMail', 'DifferentialReviewedByFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialReviewersFieldSpecification' => 'DifferentialFieldSpecification', + 'DifferentialReviewersView' => 'AphrontView', 'DifferentialRevision' => array( 0 => 'DifferentialDAO', diff --git a/src/applications/differential/field/selector/DifferentialDefaultFieldSelector.php b/src/applications/differential/field/selector/DifferentialDefaultFieldSelector.php index a1ce876256..e95dc3acbd 100644 --- a/src/applications/differential/field/selector/DifferentialDefaultFieldSelector.php +++ b/src/applications/differential/field/selector/DifferentialDefaultFieldSelector.php @@ -11,6 +11,7 @@ final class DifferentialDefaultFieldSelector new DifferentialRevisionStatusFieldSpecification(), new DifferentialAuthorFieldSpecification(), new DifferentialReviewersFieldSpecification(), + new DifferentialProjectReviewersFieldSpecification(), new DifferentialReviewedByFieldSpecification(), new DifferentialCCsFieldSpecification(), new DifferentialRepositoryFieldSpecification(), diff --git a/src/applications/differential/field/specification/DifferentialProjectReviewersFieldSpecification.php b/src/applications/differential/field/specification/DifferentialProjectReviewersFieldSpecification.php new file mode 100644 index 0000000000..672aeb822f --- /dev/null +++ b/src/applications/differential/field/specification/DifferentialProjectReviewersFieldSpecification.php @@ -0,0 +1,42 @@ +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; + } + + $view = id(new DifferentialReviewersView()) + ->setReviewers($reviewers) + ->setHandles($this->getLoadedHandles()); + + $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 81ba72d150..5ec9fb2614 100644 --- a/src/applications/differential/field/specification/DifferentialReviewersFieldSpecification.php +++ b/src/applications/differential/field/specification/DifferentialReviewersFieldSpecification.php @@ -19,77 +19,27 @@ final class DifferentialReviewersFieldSpecification } public function renderValueForRevisionView() { - if (!$this->getReviewerPHIDs()) { + $reviewers = array(); + foreach ($this->getRevision()->getReviewerStatus() as $reviewer) { + if ($reviewer->isUser()) { + $reviewers[] = $reviewer; + } + } + + if (!$reviewers) { // Renders "None". return $this->renderUserList(array()); } - $revision = $this->getRevision(); - $reviewers = $revision->getReviewerStatus(); + $view = id(new DifferentialReviewersView()) + ->setReviewers($reviewers) + ->setHandles($this->getLoadedHandles()); - - $diff = $revision->loadActiveDiff(); + $diff = $this->getRevision()->loadActiveDiff(); if ($diff) { - $diff = $diff->getID(); + $view->setActiveDiff($diff); } - $view = new PHUIStatusListView(); - $handles = $this->getLoadedHandles(); - foreach ($reviewers as $reviewer) { - $phid = $reviewer->getReviewerPHID(); - - $is_current = (!$diff) || - (!$reviewer->getDiffID()) || - ($diff == $reviewer->getDiffID()); - - $item = new PHUIStatusItemView(); - - 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('Accept')); - } 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; - - } - - $item->setTarget($handles[$phid]->renderLink()); - $view->addItem($item); - } return $view; } diff --git a/src/applications/differential/storage/DifferentialReviewer.php b/src/applications/differential/storage/DifferentialReviewer.php index 6dd13b1cbc..e6597ccaf7 100644 --- a/src/applications/differential/storage/DifferentialReviewer.php +++ b/src/applications/differential/storage/DifferentialReviewer.php @@ -24,4 +24,9 @@ final class DifferentialReviewer { return $this->diffID; } + public function isUser() { + $user_type = PhabricatorPeoplePHIDTypeUser::TYPECONST; + return (phid_get_type($this->getReviewerPHID()) == $user_type); + } + } diff --git a/src/applications/differential/view/DifferentialReviewersView.php b/src/applications/differential/view/DifferentialReviewersView.php new file mode 100644 index 0000000000..b731054285 --- /dev/null +++ b/src/applications/differential/view/DifferentialReviewersView.php @@ -0,0 +1,96 @@ +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 render() { + $view = new PHUIStatusListView(); + + 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(); + + + 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; + } + +} diff --git a/src/applications/diffusion/controller/DiffusionCommitController.php b/src/applications/diffusion/controller/DiffusionCommitController.php index 5a3cdf2d9d..a49e071fe8 100644 --- a/src/applications/diffusion/controller/DiffusionCommitController.php +++ b/src/applications/diffusion/controller/DiffusionCommitController.php @@ -473,7 +473,25 @@ final class DiffusionCommitController extends DiffusionController { } if ($audit_requests) { - $props['Auditors'] = $this->renderAuditStatusView($audit_requests); + $user_requests = array(); + $other_requests = array(); + foreach ($audit_requests as $audit_request) { + if ($audit_request->isUser()) { + $user_requests[] = $audit_request; + } else { + $other_requests[] = $audit_request; + } + } + + if ($user_requests) { + $props['Auditors'] = $this->renderAuditStatusView( + $user_requests); + } + + if ($other_requests) { + $props['Project/Package Auditors'] = $this->renderAuditStatusView( + $other_requests); + } } $props['Committed'] = phabricator_datetime($commit->getEpoch(), $user); @@ -1012,6 +1030,11 @@ final class DiffusionCommitController extends DiffusionController { case PhabricatorAuditStatusConstants::CC: $item->setIcon('info-dark', pht('Subscribed')); break; + default: + $item->setIcon( + 'question-dark', + pht('%s?', $request->getAuditStatus())); + break; } $note = array(); diff --git a/src/applications/repository/storage/PhabricatorRepositoryAuditRequest.php b/src/applications/repository/storage/PhabricatorRepositoryAuditRequest.php index 5be8c12971..3243beda01 100644 --- a/src/applications/repository/storage/PhabricatorRepositoryAuditRequest.php +++ b/src/applications/repository/storage/PhabricatorRepositoryAuditRequest.php @@ -16,4 +16,9 @@ final class PhabricatorRepositoryAuditRequest extends PhabricatorRepositoryDAO { ) + parent::getConfiguration(); } + public function isUser() { + $user_type = PhabricatorPeoplePHIDTypeUser::TYPECONST; + return (phid_get_type($this->getAuditorPHID()) == $user_type); + } + } diff --git a/src/view/phui/PHUIStatusItemView.php b/src/view/phui/PHUIStatusItemView.php index 0bc45f6ede..a93579d4f4 100644 --- a/src/view/phui/PHUIStatusItemView.php +++ b/src/view/phui/PHUIStatusItemView.php @@ -62,6 +62,7 @@ final class PHUIStatusItemView extends AphrontTagView { $icon->setMetadata( array( 'tip' => $this->iconLabel, + 'size' => 240, )); } }