1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-27 09:12:41 +01:00

Implement "Sort by Points" on workboards

Summary: Depends on D20275. Fixes T10578. This is a static sorting (like "By Date Created") where you can't change point values by dragging. You can still drag cards between columns, or use the "Edit" icon to change point values.

Test Plan: {F6265191}

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T10578

Differential Revision: https://secure.phabricator.com/D20276
This commit is contained in:
epriestley 2019-03-11 09:38:55 -07:00
parent c020f027bb
commit 03b7aca019
8 changed files with 106 additions and 5 deletions

View file

@ -4059,6 +4059,7 @@ phutil_register_library_map(array(
'PhabricatorProjectColumnOrder' => 'applications/project/order/PhabricatorProjectColumnOrder.php', 'PhabricatorProjectColumnOrder' => 'applications/project/order/PhabricatorProjectColumnOrder.php',
'PhabricatorProjectColumnOwnerOrder' => 'applications/project/order/PhabricatorProjectColumnOwnerOrder.php', 'PhabricatorProjectColumnOwnerOrder' => 'applications/project/order/PhabricatorProjectColumnOwnerOrder.php',
'PhabricatorProjectColumnPHIDType' => 'applications/project/phid/PhabricatorProjectColumnPHIDType.php', 'PhabricatorProjectColumnPHIDType' => 'applications/project/phid/PhabricatorProjectColumnPHIDType.php',
'PhabricatorProjectColumnPointsOrder' => 'applications/project/order/PhabricatorProjectColumnPointsOrder.php',
'PhabricatorProjectColumnPosition' => 'applications/project/storage/PhabricatorProjectColumnPosition.php', 'PhabricatorProjectColumnPosition' => 'applications/project/storage/PhabricatorProjectColumnPosition.php',
'PhabricatorProjectColumnPositionQuery' => 'applications/project/query/PhabricatorProjectColumnPositionQuery.php', 'PhabricatorProjectColumnPositionQuery' => 'applications/project/query/PhabricatorProjectColumnPositionQuery.php',
'PhabricatorProjectColumnPriorityOrder' => 'applications/project/order/PhabricatorProjectColumnPriorityOrder.php', 'PhabricatorProjectColumnPriorityOrder' => 'applications/project/order/PhabricatorProjectColumnPriorityOrder.php',
@ -10145,6 +10146,7 @@ phutil_register_library_map(array(
'PhabricatorProjectColumnOrder' => 'Phobject', 'PhabricatorProjectColumnOrder' => 'Phobject',
'PhabricatorProjectColumnOwnerOrder' => 'PhabricatorProjectColumnOrder', 'PhabricatorProjectColumnOwnerOrder' => 'PhabricatorProjectColumnOrder',
'PhabricatorProjectColumnPHIDType' => 'PhabricatorPHIDType', 'PhabricatorProjectColumnPHIDType' => 'PhabricatorPHIDType',
'PhabricatorProjectColumnPointsOrder' => 'PhabricatorProjectColumnOrder',
'PhabricatorProjectColumnPosition' => array( 'PhabricatorProjectColumnPosition' => array(
'PhabricatorProjectDAO', 'PhabricatorProjectDAO',
'PhabricatorPolicyInterface', 'PhabricatorPolicyInterface',

View file

@ -616,7 +616,7 @@ final class PhabricatorProjectBoardViewController
$order_key = $this->sortKey; $order_key = $this->sortKey;
$ordering_map = PhabricatorProjectColumnOrder::getAllOrders(); $ordering_map = PhabricatorProjectColumnOrder::getEnabledOrders();
$ordering = id(clone $ordering_map[$order_key]) $ordering = id(clone $ordering_map[$order_key])
->setViewer($viewer); ->setViewer($viewer);
@ -635,6 +635,12 @@ final class PhabricatorProjectBoardViewController
$order_maps[] = $ordering->toDictionary(); $order_maps[] = $ordering->toDictionary();
$properties = array(); $properties = array();
foreach ($all_tasks as $task) {
$properties[$task->getPHID()] = array(
'points' => (double)$task->getPoints(),
'status' => $task->getStatus(),
);
}
$behavior_config = array( $behavior_config = array(
'moveURI' => $this->getApplicationURI('move/'.$project->getID().'/'), 'moveURI' => $this->getApplicationURI('move/'.$project->getID().'/'),
@ -771,7 +777,7 @@ final class PhabricatorProjectBoardViewController
} }
private function isValidSort($sort) { private function isValidSort($sort) {
$map = PhabricatorProjectColumnOrder::getAllOrders(); $map = PhabricatorProjectColumnOrder::getEnabledOrders();
return isset($map[$sort]); return isset($map[$sort]);
} }
@ -820,6 +826,9 @@ final class PhabricatorProjectBoardViewController
$project, $project,
PhabricatorPolicyCapability::CAN_EDIT); PhabricatorPolicyCapability::CAN_EDIT);
$items[] = id(new PhabricatorActionView())
->setType(PhabricatorActionView::TYPE_DIVIDER);
$items[] = id(new PhabricatorActionView()) $items[] = id(new PhabricatorActionView())
->setIcon('fa-floppy-o') ->setIcon('fa-floppy-o')
->setName(pht('Save as Default')) ->setName(pht('Save as Default'))
@ -918,6 +927,9 @@ final class PhabricatorProjectBoardViewController
$project, $project,
PhabricatorPolicyCapability::CAN_EDIT); PhabricatorPolicyCapability::CAN_EDIT);
$items[] = id(new PhabricatorActionView())
->setType(PhabricatorActionView::TYPE_DIVIDER);
$items[] = id(new PhabricatorActionView()) $items[] = id(new PhabricatorActionView())
->setIcon('fa-floppy-o') ->setIcon('fa-floppy-o')
->setName(pht('Save as Default')) ->setName(pht('Save as Default'))

View file

@ -21,10 +21,14 @@ final class PhabricatorProjectColumnCreatedOrder
return false; return false;
} }
public function getMenuOrder() {
return 3000;
}
protected function newSortVectorForObject($object) { protected function newSortVectorForObject($object) {
return array( return array(
(int)-$object->getDateCreated(), -(int)$object->getDateCreated(),
(int)-$object->getID(), -(int)$object->getID(),
); );
} }

View file

@ -17,4 +17,8 @@ final class PhabricatorProjectColumnNaturalOrder
return true; return true;
} }
public function getMenuOrder() {
return 0;
}
} }

View file

@ -22,9 +22,22 @@ abstract class PhabricatorProjectColumnOrder
return id(new PhutilClassMapQuery()) return id(new PhutilClassMapQuery())
->setAncestorClass(__CLASS__) ->setAncestorClass(__CLASS__)
->setUniqueMethod('getColumnOrderKey') ->setUniqueMethod('getColumnOrderKey')
->setSortMethod('getMenuOrder')
->execute(); ->execute();
} }
final public static function getEnabledOrders() {
$map = self::getAllOrders();
foreach ($map as $key => $order) {
if (!$order->isEnabled()) {
unset($map[$key]);
}
}
return $map;
}
final public static function getOrderByKey($key) { final public static function getOrderByKey($key) {
$map = self::getAllOrders(); $map = self::getAllOrders();
@ -71,6 +84,14 @@ abstract class PhabricatorProjectColumnOrder
abstract public function getHasHeaders(); abstract public function getHasHeaders();
abstract public function getCanReorder(); abstract public function getCanReorder();
public function getMenuOrder() {
return 9000;
}
public function isEnabled() {
return true;
}
protected function newColumnTransactions($object, array $header) { protected function newColumnTransactions($object, array $header) {
return array(); return array();
} }

View file

@ -21,6 +21,10 @@ final class PhabricatorProjectColumnOwnerOrder
return true; return true;
} }
public function getMenuOrder() {
return 2000;
}
protected function newHeaderKeyForObject($object) { protected function newHeaderKeyForObject($object) {
return $this->newHeaderKeyForOwnerPHID($object->getOwnerPHID()); return $this->newHeaderKeyForOwnerPHID($object->getOwnerPHID());
} }

View file

@ -0,0 +1,50 @@
<?php
final class PhabricatorProjectColumnPointsOrder
extends PhabricatorProjectColumnOrder {
const ORDERKEY = 'points';
public function getDisplayName() {
return pht('Sort by Points');
}
protected function newMenuIconIcon() {
return 'fa-map-pin';
}
public function isEnabled() {
return ManiphestTaskPoints::getIsEnabled();
}
public function getHasHeaders() {
return false;
}
public function getCanReorder() {
return false;
}
public function getMenuOrder() {
return 4000;
}
protected function newSortVectorForObject($object) {
$points = $object->getPoints();
// Put cards with no points on top.
$has_points = ($points !== null);
if (!$has_points) {
$overall_order = 0;
} else {
$overall_order = 1;
}
return array(
$overall_order,
-(double)$points,
-(int)$object->getID(),
);
}
}

View file

@ -21,6 +21,10 @@ final class PhabricatorProjectColumnPriorityOrder
return true; return true;
} }
public function getMenuOrder() {
return 1000;
}
protected function newHeaderKeyForObject($object) { protected function newHeaderKeyForObject($object) {
return $this->newHeaderKeyForPriority($object->getPriority()); return $this->newHeaderKeyForPriority($object->getPriority());
} }
@ -35,7 +39,7 @@ final class PhabricatorProjectColumnPriorityOrder
private function newSortVectorForPriority($priority) { private function newSortVectorForPriority($priority) {
return array( return array(
(int)-$priority, -(int)$priority,
); );
} }