Changeset View
Changeset View
Standalone View
Standalone View
src/applications/project/view/PhabricatorProjectUserListView.php
<?php | <?php | ||||
abstract class PhabricatorProjectUserListView extends AphrontView { | abstract class PhabricatorProjectUserListView | ||||
extends AphrontView { | |||||
private $project; | private $project; | ||||
private $userPHIDs; | private $userPHIDs; | ||||
private $limit; | private $limit; | ||||
private $background; | private $background; | ||||
private $showNote; | private $showNote; | ||||
public function setProject(PhabricatorProject $project) { | public function setProject(PhabricatorProject $project) { | ||||
Show All 40 Lines | abstract class PhabricatorProjectUserListView | ||||
abstract protected function getMembershipNote(); | abstract protected function getMembershipNote(); | ||||
public function render() { | public function render() { | ||||
$viewer = $this->getViewer(); | $viewer = $this->getViewer(); | ||||
$project = $this->getProject(); | $project = $this->getProject(); | ||||
$user_phids = $this->getUserPHIDs(); | $user_phids = $this->getUserPHIDs(); | ||||
$can_edit = $this->canEditList(); | $can_edit = $this->canEditList(); | ||||
$supports_edit = $project->supportsEditMembers(); | |||||
$no_data = $this->getNoDataString(); | $no_data = $this->getNoDataString(); | ||||
$list = id(new PHUIObjectItemListView()) | $list = id(new PHUIObjectItemListView()) | ||||
->setNoDataString($no_data); | ->setNoDataString($no_data); | ||||
$limit = $this->getLimit(); | $limit = $this->getLimit(); | ||||
$is_panel = (bool)$limit; | |||||
// If we're showing everything, show oldest to newest. If we're showing | |||||
// only a slice, show newest to oldest. | |||||
if (!$limit) { | |||||
$user_phids = array_reverse($user_phids); | |||||
} | |||||
$handles = $viewer->loadHandles($user_phids); | $handles = $viewer->loadHandles($user_phids); | ||||
// Always put the viewer first if they are on the list. | // Reorder users in display order. We're going to put the viewer first | ||||
$user_phids = array_fuse($user_phids); | // if they're a member, then enabled users, then disabled/invalid users. | ||||
$user_phids = | |||||
array_select_keys($user_phids, array($viewer->getPHID())) + | $phid_map = array(); | ||||
$user_phids; | foreach ($user_phids as $user_phid) { | ||||
$handle = $handles[$user_phid]; | |||||
$is_viewer = ($user_phid === $viewer->getPHID()); | |||||
$is_enabled = ($handle->isComplete() && !$handle->isDisabled()); | |||||
// If we're showing the main member list, show oldest to newest. If we're | |||||
// showing only a slice in a panel, show newest to oldest. | |||||
if ($limit) { | if ($limit) { | ||||
$render_phids = array_slice($user_phids, 0, $limit); | $order_scalar = 1; | ||||
} else { | } else { | ||||
$render_phids = $user_phids; | $order_scalar = -1; | ||||
} | } | ||||
foreach ($render_phids as $user_phid) { | $phid_map[$user_phid] = id(new PhutilSortVector()) | ||||
$handle = $handles[$user_phid]; | ->addInt($is_viewer ? 0 : 1) | ||||
->addInt($is_enabled ? 0 : 1) | |||||
->addInt($order_scalar * count($phid_map)); | |||||
} | |||||
$phid_map = msortv($phid_map, 'getSelf'); | |||||
$handles = iterator_to_array($handles); | |||||
$handles = array_select_keys($handles, array_keys($phid_map)); | |||||
if ($limit) { | |||||
$handles = array_slice($handles, 0, $limit); | |||||
} | |||||
foreach ($handles as $user_phid => $handle) { | |||||
$item = id(new PHUIObjectItemView()) | $item = id(new PHUIObjectItemView()) | ||||
->setHeader($handle->getFullName()) | ->setHeader($handle->getFullName()) | ||||
->setHref($handle->getURI()) | ->setHref($handle->getURI()) | ||||
->setImageURI($handle->getImageURI()); | ->setImageURI($handle->getImageURI()); | ||||
if ($handle->isDisabled()) { | |||||
if ($is_panel) { | |||||
// Don't show disabled users in the panel view at all. | |||||
continue; | |||||
} | |||||
$item | |||||
->setDisabled(true) | |||||
->addAttribute(pht('Disabled')); | |||||
} else { | |||||
$icon = id(new PHUIIconView()) | $icon = id(new PHUIIconView()) | ||||
->setIcon($handle->getIcon()); | ->setIcon($handle->getIcon()); | ||||
$subtitle = $handle->getSubtitle(); | $subtitle = $handle->getSubtitle(); | ||||
$item->addAttribute(array($icon, ' ', $subtitle)); | $item->addAttribute(array($icon, ' ', $subtitle)); | ||||
} | |||||
if ($can_edit && !$limit) { | if ($supports_edit && !$is_panel) { | ||||
$remove_uri = $this->getRemoveURI($user_phid); | $remove_uri = $this->getRemoveURI($user_phid); | ||||
$item->addAction( | $item->addAction( | ||||
id(new PHUIListItemView()) | id(new PHUIListItemView()) | ||||
->setIcon('fa-times') | ->setIcon('fa-times') | ||||
->setName(pht('Remove')) | ->setName(pht('Remove')) | ||||
->setHref($remove_uri) | ->setHref($remove_uri) | ||||
->setDisabled(!$can_edit) | |||||
->setWorkflow(true)); | ->setWorkflow(true)); | ||||
} | } | ||||
$list->addItem($item); | $list->addItem($item); | ||||
} | } | ||||
if ($user_phids) { | if ($user_phids) { | ||||
$header_text = pht( | $header_text = pht( | ||||
'%s (%s)', | '%s (%s)', | ||||
$this->getHeaderText(), | $this->getHeaderText(), | ||||
phutil_count($user_phids)); | phutil_count($user_phids)); | ||||
} else { | } else { | ||||
$header_text = $this->getHeaderText(); | $header_text = $this->getHeaderText(); | ||||
} | } | ||||
$id = $project->getID(); | $id = $project->getID(); | ||||
$header = id(new PHUIHeaderView()) | $header = id(new PHUIHeaderView()) | ||||
->setHeader($header_text); | ->setHeader($header_text); | ||||
if ($limit) { | if ($limit) { | ||||
$header->addActionLink( | $list->newTailButton() | ||||
id(new PHUIButtonView()) | |||||
->setTag('a') | |||||
->setIcon( | |||||
id(new PHUIIconView()) | |||||
->setIcon('fa-list-ul')) | |||||
->setText(pht('View All')) | ->setText(pht('View All')) | ||||
->setHref("/project/members/{$id}/")); | ->setHref("/project/members/{$id}/"); | ||||
} | } | ||||
$box = id(new PHUIObjectBoxView()) | $box = id(new PHUIObjectBoxView()) | ||||
->setHeader($header) | ->setHeader($header) | ||||
->setObjectList($list); | ->setObjectList($list); | ||||
if ($this->showNote) { | if ($this->showNote) { | ||||
if ($this->getMembershipNote()) { | if ($this->getMembershipNote()) { | ||||
Show All 15 Lines |