@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Split users apart from projects/packages in reviewer and audit UIs

Summary: Ref T1279. Show separate sections for "Reviewers" and "Project Reviewers" (Differential) and for "Auditors" and "Package/Project Auditors" (Diffusion/Audit).

Test Plan:
- Looked at a commit. Saw separation.
- Looked at a revision. Saw separation.

Reviewers: chad, btrahan

Reviewed By: btrahan

CC: aran

Maniphest Tasks: T1279

Differential Revision: https://secure.phabricator.com/D7233

+191 -64
+4
src/__phutil_library_map__.php
··· 392 392 'DifferentialPathFieldSpecification' => 'applications/differential/field/specification/DifferentialPathFieldSpecification.php', 393 393 'DifferentialPeopleMenuEventListener' => 'applications/differential/events/DifferentialPeopleMenuEventListener.php', 394 394 'DifferentialPrimaryPaneView' => 'applications/differential/view/DifferentialPrimaryPaneView.php', 395 + 'DifferentialProjectReviewersFieldSpecification' => 'applications/differential/field/specification/DifferentialProjectReviewersFieldSpecification.php', 395 396 'DifferentialRawDiffRenderer' => 'applications/differential/render/DifferentialRawDiffRenderer.php', 396 397 'DifferentialReleephRequestFieldSpecification' => 'applications/releeph/differential/DifferentialReleephRequestFieldSpecification.php', 397 398 'DifferentialRemarkupRule' => 'applications/differential/remarkup/DifferentialRemarkupRule.php', ··· 405 406 'DifferentialReviewer' => 'applications/differential/storage/DifferentialReviewer.php', 406 407 'DifferentialReviewerStatus' => 'applications/differential/constants/DifferentialReviewerStatus.php', 407 408 'DifferentialReviewersFieldSpecification' => 'applications/differential/field/specification/DifferentialReviewersFieldSpecification.php', 409 + 'DifferentialReviewersView' => 'applications/differential/view/DifferentialReviewersView.php', 408 410 'DifferentialRevision' => 'applications/differential/storage/DifferentialRevision.php', 409 411 'DifferentialRevisionCommentListView' => 'applications/differential/view/DifferentialRevisionCommentListView.php', 410 412 'DifferentialRevisionCommentView' => 'applications/differential/view/DifferentialRevisionCommentView.php', ··· 2487 2489 'DifferentialPathFieldSpecification' => 'DifferentialFieldSpecification', 2488 2490 'DifferentialPeopleMenuEventListener' => 'PhutilEventListener', 2489 2491 'DifferentialPrimaryPaneView' => 'AphrontView', 2492 + 'DifferentialProjectReviewersFieldSpecification' => 'DifferentialFieldSpecification', 2490 2493 'DifferentialReleephRequestFieldSpecification' => 'DifferentialFieldSpecification', 2491 2494 'DifferentialRemarkupRule' => 'PhabricatorRemarkupRuleObject', 2492 2495 'DifferentialReplyHandler' => 'PhabricatorMailReplyHandler', ··· 2497 2500 'DifferentialReviewRequestMail' => 'DifferentialMail', 2498 2501 'DifferentialReviewedByFieldSpecification' => 'DifferentialFieldSpecification', 2499 2502 'DifferentialReviewersFieldSpecification' => 'DifferentialFieldSpecification', 2503 + 'DifferentialReviewersView' => 'AphrontView', 2500 2504 'DifferentialRevision' => 2501 2505 array( 2502 2506 0 => 'DifferentialDAO',
+1
src/applications/differential/field/selector/DifferentialDefaultFieldSelector.php
··· 11 11 new DifferentialRevisionStatusFieldSpecification(), 12 12 new DifferentialAuthorFieldSpecification(), 13 13 new DifferentialReviewersFieldSpecification(), 14 + new DifferentialProjectReviewersFieldSpecification(), 14 15 new DifferentialReviewedByFieldSpecification(), 15 16 new DifferentialCCsFieldSpecification(), 16 17 new DifferentialRepositoryFieldSpecification(),
+42
src/applications/differential/field/specification/DifferentialProjectReviewersFieldSpecification.php
··· 1 + <?php 2 + 3 + final class DifferentialProjectReviewersFieldSpecification 4 + extends DifferentialFieldSpecification { 5 + 6 + public function shouldAppearOnRevisionView() { 7 + return true; 8 + } 9 + 10 + public function getRequiredHandlePHIDsForRevisionView() { 11 + return $this->getRevision()->getReviewers(); 12 + } 13 + 14 + public function renderLabelForRevisionView() { 15 + return pht('Project Reviewers'); 16 + } 17 + 18 + public function renderValueForRevisionView() { 19 + $reviewers = array(); 20 + foreach ($this->getRevision()->getReviewerStatus() as $reviewer) { 21 + if (!$reviewer->isUser()) { 22 + $reviewers[] = $reviewer; 23 + } 24 + } 25 + 26 + if (!$reviewers) { 27 + return null; 28 + } 29 + 30 + $view = id(new DifferentialReviewersView()) 31 + ->setReviewers($reviewers) 32 + ->setHandles($this->getLoadedHandles()); 33 + 34 + $diff = $this->getRevision()->loadActiveDiff(); 35 + if ($diff) { 36 + $view->setActiveDiff($diff); 37 + } 38 + 39 + return $view; 40 + } 41 + 42 + }
+13 -63
src/applications/differential/field/specification/DifferentialReviewersFieldSpecification.php
··· 19 19 } 20 20 21 21 public function renderValueForRevisionView() { 22 - if (!$this->getReviewerPHIDs()) { 22 + $reviewers = array(); 23 + foreach ($this->getRevision()->getReviewerStatus() as $reviewer) { 24 + if ($reviewer->isUser()) { 25 + $reviewers[] = $reviewer; 26 + } 27 + } 28 + 29 + if (!$reviewers) { 23 30 // Renders "None". 24 31 return $this->renderUserList(array()); 25 32 } 26 33 27 - $revision = $this->getRevision(); 28 - $reviewers = $revision->getReviewerStatus(); 34 + $view = id(new DifferentialReviewersView()) 35 + ->setReviewers($reviewers) 36 + ->setHandles($this->getLoadedHandles()); 29 37 30 - 31 - $diff = $revision->loadActiveDiff(); 38 + $diff = $this->getRevision()->loadActiveDiff(); 32 39 if ($diff) { 33 - $diff = $diff->getID(); 40 + $view->setActiveDiff($diff); 34 41 } 35 42 36 - $view = new PHUIStatusListView(); 37 - $handles = $this->getLoadedHandles(); 38 - foreach ($reviewers as $reviewer) { 39 - $phid = $reviewer->getReviewerPHID(); 40 - 41 - $is_current = (!$diff) || 42 - (!$reviewer->getDiffID()) || 43 - ($diff == $reviewer->getDiffID()); 44 - 45 - $item = new PHUIStatusItemView(); 46 - 47 - switch ($reviewer->getStatus()) { 48 - case DifferentialReviewerStatus::STATUS_ADDED: 49 - $item->setIcon('open-dark', pht('Review Requested')); 50 - break; 51 - 52 - case DifferentialReviewerStatus::STATUS_ACCEPTED: 53 - if ($is_current) { 54 - $item->setIcon( 55 - 'accept-green', 56 - pht('Accept')); 57 - } else { 58 - $item->setIcon( 59 - 'accept-dark', 60 - pht('Accepted Prior Diff')); 61 - } 62 - break; 63 - 64 - case DifferentialReviewerStatus::STATUS_REJECTED: 65 - if ($is_current) { 66 - $item->setIcon( 67 - 'reject-red', 68 - pht('Requested Changes')); 69 - } else { 70 - $item->setIcon( 71 - 'reject-dark', 72 - pht('Requested Changes to Prior Diff')); 73 - } 74 - break; 75 - 76 - case DifferentialReviewerStatus::STATUS_COMMENTED: 77 - if ($is_current) { 78 - $item->setIcon( 79 - 'info-blue', 80 - pht('Commented')); 81 - } else { 82 - $item->setIcon( 83 - 'info-dark', 84 - pht('Commented Previously')); 85 - } 86 - break; 87 - 88 - } 89 - 90 - $item->setTarget($handles[$phid]->renderLink()); 91 - $view->addItem($item); 92 - } 93 43 return $view; 94 44 } 95 45
+5
src/applications/differential/storage/DifferentialReviewer.php
··· 24 24 return $this->diffID; 25 25 } 26 26 27 + public function isUser() { 28 + $user_type = PhabricatorPeoplePHIDTypeUser::TYPECONST; 29 + return (phid_get_type($this->getReviewerPHID()) == $user_type); 30 + } 31 + 27 32 }
+96
src/applications/differential/view/DifferentialReviewersView.php
··· 1 + <?php 2 + 3 + final class DifferentialReviewersView extends AphrontView { 4 + 5 + private $reviewers; 6 + private $handles; 7 + private $diff; 8 + 9 + public function setReviewers(array $reviewers) { 10 + assert_instances_of($reviewers, 'DifferentialReviewer'); 11 + $this->reviewers = $reviewers; 12 + return $this; 13 + } 14 + 15 + public function setHandles(array $handles) { 16 + assert_instances_of($handles, 'PhabricatorObjectHandle'); 17 + $this->handles = $handles; 18 + return $this; 19 + } 20 + 21 + public function setActiveDiff(DifferentialDiff $diff) { 22 + $this->diff = $diff; 23 + return $this; 24 + } 25 + 26 + public function render() { 27 + $view = new PHUIStatusListView(); 28 + 29 + foreach ($this->reviewers as $reviewer) { 30 + $phid = $reviewer->getReviewerPHID(); 31 + $handle = $this->handles[$phid]; 32 + 33 + // If we're missing either the diff or action information for the 34 + // reviewer, render information as current. 35 + $is_current = (!$this->diff) || 36 + (!$reviewer->getDiffID()) || 37 + ($this->diff->getID() == $reviewer->getDiffID()); 38 + 39 + $item = new PHUIStatusItemView(); 40 + 41 + 42 + switch ($reviewer->getStatus()) { 43 + case DifferentialReviewerStatus::STATUS_ADDED: 44 + $item->setIcon('open-dark', pht('Review Requested')); 45 + break; 46 + 47 + case DifferentialReviewerStatus::STATUS_ACCEPTED: 48 + if ($is_current) { 49 + $item->setIcon( 50 + 'accept-green', 51 + pht('Accepted')); 52 + } else { 53 + $item->setIcon( 54 + 'accept-dark', 55 + pht('Accepted Prior Diff')); 56 + } 57 + break; 58 + 59 + case DifferentialReviewerStatus::STATUS_REJECTED: 60 + if ($is_current) { 61 + $item->setIcon( 62 + 'reject-red', 63 + pht('Requested Changes')); 64 + } else { 65 + $item->setIcon( 66 + 'reject-dark', 67 + pht('Requested Changes to Prior Diff')); 68 + } 69 + break; 70 + 71 + case DifferentialReviewerStatus::STATUS_COMMENTED: 72 + if ($is_current) { 73 + $item->setIcon( 74 + 'info-blue', 75 + pht('Commented')); 76 + } else { 77 + $item->setIcon( 78 + 'info-dark', 79 + pht('Commented Previously')); 80 + } 81 + break; 82 + 83 + default: 84 + $item->setIcon('question-dark', pht('%s?', $reviewer->getStatus())); 85 + break; 86 + 87 + } 88 + 89 + $item->setTarget($handle->renderLink()); 90 + $view->addItem($item); 91 + } 92 + 93 + return $view; 94 + } 95 + 96 + }
+24 -1
src/applications/diffusion/controller/DiffusionCommitController.php
··· 473 473 } 474 474 475 475 if ($audit_requests) { 476 - $props['Auditors'] = $this->renderAuditStatusView($audit_requests); 476 + $user_requests = array(); 477 + $other_requests = array(); 478 + foreach ($audit_requests as $audit_request) { 479 + if ($audit_request->isUser()) { 480 + $user_requests[] = $audit_request; 481 + } else { 482 + $other_requests[] = $audit_request; 483 + } 484 + } 485 + 486 + if ($user_requests) { 487 + $props['Auditors'] = $this->renderAuditStatusView( 488 + $user_requests); 489 + } 490 + 491 + if ($other_requests) { 492 + $props['Project/Package Auditors'] = $this->renderAuditStatusView( 493 + $other_requests); 494 + } 477 495 } 478 496 479 497 $props['Committed'] = phabricator_datetime($commit->getEpoch(), $user); ··· 1011 1029 break; 1012 1030 case PhabricatorAuditStatusConstants::CC: 1013 1031 $item->setIcon('info-dark', pht('Subscribed')); 1032 + break; 1033 + default: 1034 + $item->setIcon( 1035 + 'question-dark', 1036 + pht('%s?', $request->getAuditStatus())); 1014 1037 break; 1015 1038 } 1016 1039
+5
src/applications/repository/storage/PhabricatorRepositoryAuditRequest.php
··· 16 16 ) + parent::getConfiguration(); 17 17 } 18 18 19 + public function isUser() { 20 + $user_type = PhabricatorPeoplePHIDTypeUser::TYPECONST; 21 + return (phid_get_type($this->getAuditorPHID()) == $user_type); 22 + } 23 + 19 24 }
+1
src/view/phui/PHUIStatusItemView.php
··· 62 62 $icon->setMetadata( 63 63 array( 64 64 'tip' => $this->iconLabel, 65 + 'size' => 240, 65 66 )); 66 67 } 67 68 }