@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.

Improve project member list behaviors related to disabled users

Summary:
Fixes T13431.

Increase the "panel" version of project member lists to 10 users, hide disabled users, swap the buttons to "tail buttons".

Sort disabled users to the bottom of "full list" versions of member lists.

For UI consistency, render the remove "X" as disabled but visible if users don't have permission to remove members.

Test Plan:
- Viewed a project with disabled members.
- Saw only enabled members on the main project page.
- Saw disabled members sorted to the bottom on the members page.
- Clicked "View All" to jump from the panel to the members page.
- As a user who could not edit a project, viewed the members page and saw a disabled "X" with a policy error when clicked.
- Removed a member as before, as a normal user with permission to remove members.

Maniphest Tasks: T13431

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

+55 -33
+2 -2
src/applications/project/controller/PhabricatorProjectProfileController.php
··· 63 63 $member_list = id(new PhabricatorProjectMemberListView()) 64 64 ->setUser($viewer) 65 65 ->setProject($project) 66 - ->setLimit(5) 66 + ->setLimit(10) 67 67 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 68 68 ->setUserPHIDs($project->getMemberPHIDs()); 69 69 70 70 $watcher_list = id(new PhabricatorProjectWatcherListView()) 71 71 ->setUser($viewer) 72 72 ->setProject($project) 73 - ->setLimit(5) 73 + ->setLimit(10) 74 74 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 75 75 ->setUserPHIDs($project->getWatcherPHIDs()); 76 76
+53 -31
src/applications/project/view/PhabricatorProjectUserListView.php
··· 1 1 <?php 2 2 3 - abstract class PhabricatorProjectUserListView extends AphrontView { 3 + abstract class PhabricatorProjectUserListView 4 + extends AphrontView { 4 5 5 6 private $project; 6 7 private $userPHIDs; ··· 57 58 $user_phids = $this->getUserPHIDs(); 58 59 59 60 $can_edit = $this->canEditList(); 61 + $supports_edit = $project->supportsEditMembers(); 60 62 $no_data = $this->getNoDataString(); 61 63 62 64 $list = id(new PHUIObjectItemListView()) 63 65 ->setNoDataString($no_data); 64 66 65 67 $limit = $this->getLimit(); 66 - 67 - // If we're showing everything, show oldest to newest. If we're showing 68 - // only a slice, show newest to oldest. 69 - if (!$limit) { 70 - $user_phids = array_reverse($user_phids); 71 - } 68 + $is_panel = (bool)$limit; 72 69 73 70 $handles = $viewer->loadHandles($user_phids); 74 71 75 - // Always put the viewer first if they are on the list. 76 - $user_phids = array_fuse($user_phids); 77 - $user_phids = 78 - array_select_keys($user_phids, array($viewer->getPHID())) + 79 - $user_phids; 72 + // Reorder users in display order. We're going to put the viewer first 73 + // if they're a member, then enabled users, then disabled/invalid users. 74 + 75 + $phid_map = array(); 76 + foreach ($user_phids as $user_phid) { 77 + $handle = $handles[$user_phid]; 78 + 79 + $is_viewer = ($user_phid === $viewer->getPHID()); 80 + $is_enabled = ($handle->isComplete() && !$handle->isDisabled()); 81 + 82 + // If we're showing the main member list, show oldest to newest. If we're 83 + // showing only a slice in a panel, show newest to oldest. 84 + if ($limit) { 85 + $order_scalar = 1; 86 + } else { 87 + $order_scalar = -1; 88 + } 80 89 81 - if ($limit) { 82 - $render_phids = array_slice($user_phids, 0, $limit); 83 - } else { 84 - $render_phids = $user_phids; 90 + $phid_map[$user_phid] = id(new PhutilSortVector()) 91 + ->addInt($is_viewer ? 0 : 1) 92 + ->addInt($is_enabled ? 0 : 1) 93 + ->addInt($order_scalar * count($phid_map)); 85 94 } 95 + $phid_map = msortv($phid_map, 'getSelf'); 86 96 87 - foreach ($render_phids as $user_phid) { 88 - $handle = $handles[$user_phid]; 97 + $handles = iterator_to_array($handles); 98 + $handles = array_select_keys($handles, array_keys($phid_map)); 99 + 100 + if ($limit) { 101 + $handles = array_slice($handles, 0, $limit); 102 + } 89 103 104 + foreach ($handles as $user_phid => $handle) { 90 105 $item = id(new PHUIObjectItemView()) 91 106 ->setHeader($handle->getFullName()) 92 107 ->setHref($handle->getURI()) 93 108 ->setImageURI($handle->getImageURI()); 94 109 95 - $icon = id(new PHUIIconView()) 96 - ->setIcon($handle->getIcon()); 110 + if ($handle->isDisabled()) { 111 + if ($is_panel) { 112 + // Don't show disabled users in the panel view at all. 113 + continue; 114 + } 97 115 98 - $subtitle = $handle->getSubtitle(); 116 + $item 117 + ->setDisabled(true) 118 + ->addAttribute(pht('Disabled')); 119 + } else { 120 + $icon = id(new PHUIIconView()) 121 + ->setIcon($handle->getIcon()); 99 122 100 - $item->addAttribute(array($icon, ' ', $subtitle)); 123 + $subtitle = $handle->getSubtitle(); 101 124 102 - if ($can_edit && !$limit) { 125 + $item->addAttribute(array($icon, ' ', $subtitle)); 126 + } 127 + 128 + if ($supports_edit && !$is_panel) { 103 129 $remove_uri = $this->getRemoveURI($user_phid); 104 130 105 131 $item->addAction( ··· 107 133 ->setIcon('fa-times') 108 134 ->setName(pht('Remove')) 109 135 ->setHref($remove_uri) 136 + ->setDisabled(!$can_edit) 110 137 ->setWorkflow(true)); 111 138 } 112 139 ··· 128 155 ->setHeader($header_text); 129 156 130 157 if ($limit) { 131 - $header->addActionLink( 132 - id(new PHUIButtonView()) 133 - ->setTag('a') 134 - ->setIcon( 135 - id(new PHUIIconView()) 136 - ->setIcon('fa-list-ul')) 137 - ->setText(pht('View All')) 138 - ->setHref("/project/members/{$id}/")); 158 + $list->newTailButton() 159 + ->setText(pht('View All')) 160 + ->setHref("/project/members/{$id}/"); 139 161 } 140 162 141 163 $box = id(new PHUIObjectBoxView())