1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-26 16:52:41 +01:00

Implement "Group by Owner" on Workboards

Summary: Depends on D20269. Ref T10333. Now that orderings are modularized, this is fairly easy to implement. This isn't super fancy for now (e.g., no profile images) but I'll touch it up in a general polish followup.

Test Plan: {F6264596}

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T10333

Differential Revision: https://secure.phabricator.com/D20270
This commit is contained in:
epriestley 2019-03-10 21:49:18 -07:00
parent 9a8019d4a9
commit 2fdab434fa
2 changed files with 165 additions and 0 deletions

View file

@ -4056,6 +4056,7 @@ phutil_register_library_map(array(
'PhabricatorProjectColumnHideController' => 'applications/project/controller/PhabricatorProjectColumnHideController.php',
'PhabricatorProjectColumnNaturalOrder' => 'applications/project/order/PhabricatorProjectColumnNaturalOrder.php',
'PhabricatorProjectColumnOrder' => 'applications/project/order/PhabricatorProjectColumnOrder.php',
'PhabricatorProjectColumnOwnerOrder' => 'applications/project/order/PhabricatorProjectColumnOwnerOrder.php',
'PhabricatorProjectColumnPHIDType' => 'applications/project/phid/PhabricatorProjectColumnPHIDType.php',
'PhabricatorProjectColumnPosition' => 'applications/project/storage/PhabricatorProjectColumnPosition.php',
'PhabricatorProjectColumnPositionQuery' => 'applications/project/query/PhabricatorProjectColumnPositionQuery.php',
@ -10140,6 +10141,7 @@ phutil_register_library_map(array(
'PhabricatorProjectColumnHideController' => 'PhabricatorProjectBoardController',
'PhabricatorProjectColumnNaturalOrder' => 'PhabricatorProjectColumnOrder',
'PhabricatorProjectColumnOrder' => 'Phobject',
'PhabricatorProjectColumnOwnerOrder' => 'PhabricatorProjectColumnOrder',
'PhabricatorProjectColumnPHIDType' => 'PhabricatorPHIDType',
'PhabricatorProjectColumnPosition' => array(
'PhabricatorProjectDAO',

View file

@ -0,0 +1,163 @@
<?php
final class PhabricatorProjectColumnOwnerOrder
extends PhabricatorProjectColumnOrder {
const ORDERKEY = 'owner';
public function getDisplayName() {
return pht('Group by Owner');
}
protected function newMenuIconIcon() {
return 'fa-users';
}
protected function newHeaderKeyForObject($object) {
return $this->newHeaderKeyForOwnerPHID($object->getOwnerPHID());
}
private function newHeaderKeyForOwnerPHID($owner_phid) {
if ($owner_phid === null) {
$owner_phid = '<null>';
}
return sprintf('owner(%s)', $owner_phid);
}
protected function newSortVectorsForObjects(array $objects) {
$owner_phids = mpull($objects, null, 'getOwnerPHID');
$owner_phids = array_keys($owner_phids);
$owner_phids = array_filter($owner_phids);
if ($owner_phids) {
$owner_users = id(new PhabricatorPeopleQuery())
->setViewer($this->getViewer())
->withPHIDs($owner_phids)
->execute();
$owner_users = mpull($owner_users, null, 'getPHID');
} else {
$owner_users = array();
}
$vectors = array();
foreach ($objects as $vector_key => $object) {
$owner_phid = $object->getOwnerPHID();
if (!$owner_phid) {
$vector = $this->newSortVectorForUnowned();
} else {
$owner = idx($owner_users, $owner_phid);
if ($owner) {
$vector = $this->newSortVectorForOwner($owner);
} else {
$vector = $this->newSortVectorForOwnerPHID($owner_phid);
}
}
$vectors[$vector_key] = $vector;
}
return $vectors;
}
private function newSortVectorForUnowned() {
// Always put unasssigned tasks at the top.
return array(
0,
);
}
private function newSortVectorForOwner(PhabricatorUser $user) {
// Put assigned tasks with a valid owner after "Unassigned", but above
// assigned tasks with an invalid owner. Sort these tasks by the owner's
// username.
return array(
1,
$user->getUsername(),
);
}
private function newSortVectorForOwnerPHID($owner_phid) {
// If we have tasks with a nonempty owner but can't load the associated
// "User" object, move them to the bottom. We can only sort these by the
// PHID.
return array(
2,
$owner_phid,
);
}
protected function newHeadersForObjects(array $objects) {
$owner_phids = mpull($objects, null, 'getOwnerPHID');
$owner_phids = array_keys($owner_phids);
$owner_phids = array_filter($owner_phids);
if ($owner_phids) {
$owner_users = id(new PhabricatorPeopleQuery())
->setViewer($this->getViewer())
->withPHIDs($owner_phids)
->execute();
$owner_users = mpull($owner_users, null, 'getPHID');
} else {
$owner_users = array();
}
array_unshift($owner_phids, null);
$headers = array();
foreach ($owner_phids as $owner_phid) {
$header_key = $this->newHeaderKeyForOwnerPHID($owner_phid);
if ($owner_phid === null) {
$owner = null;
$sort_vector = $this->newSortVectorForUnowned();
$owner_name = pht('Not Assigned');
} else {
$owner = idx($owner_users, $owner_phid);
if ($owner) {
$sort_vector = $this->newSortVectorForOwner($owner);
$owner_name = $owner->getUsername();
} else {
$sort_vector = $this->newSortVectorForOwnerPHID($owner_phid);
$owner_name = pht('Unknown User ("%s")', $owner_phid);
}
}
$owner_icon = 'fa-user';
$owner_color = 'bluegrey';
$icon_view = id(new PHUIIconView())
->setIcon($owner_icon, $owner_color);
$header = $this->newHeader()
->setHeaderKey($header_key)
->setSortVector($sort_vector)
->setName($owner_name)
->setIcon($icon_view)
->setEditProperties(
array(
'value' => $owner_phid,
));
$headers[] = $header;
}
return $headers;
}
protected function newColumnTransactions($object, array $header) {
$new_owner = idx($header, 'value');
if ($object->getOwnerPHID() === $new_owner) {
return null;
}
$xactions = array();
$xactions[] = $this->newTransaction($object)
->setTransactionType(ManiphestTaskOwnerTransaction::TRANSACTIONTYPE)
->setNewValue($new_owner);
return $xactions;
}
}