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

Add "Group by Status" to Workboards

Summary:
Depends on D20276. Ref T10333. This one is a little bit rough/experimental, and I'm sort of curious what feedback we get about it. Weird stuff:

  - All statuses are always shown, even if the filter prevents tasks in that status from appearing (which is the default, since views are "Open Tasks" by default).
    - Pro: you can close tasks by dragging them to a closed status.
    - Con: lots of empty groups.
  - The "Duplicate" status is shown.
    - Pro: Shows closed duplicate tasks.
    - Con: Dragging tasks to "Duplicate" works, but is silly.
  - Since boards show "open tasks" by default, dragging stuff to a closed status and then reloading the board causes it to vanish. This is kind of how everything works, but more obvious/defaulted on "Status".

These issues might overwhelm its usefulness, but there isn't much cost to nuking it in the future if feedback is mostly negative/confused.

Test Plan: Grouped a workboard by status, dragged stuff around.

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T10333

Differential Revision: https://secure.phabricator.com/D20277
This commit is contained in:
epriestley 2019-03-11 10:43:29 -07:00
parent 03b7aca019
commit a400d82932
2 changed files with 108 additions and 0 deletions

View file

@ -4065,6 +4065,7 @@ phutil_register_library_map(array(
'PhabricatorProjectColumnPriorityOrder' => 'applications/project/order/PhabricatorProjectColumnPriorityOrder.php',
'PhabricatorProjectColumnQuery' => 'applications/project/query/PhabricatorProjectColumnQuery.php',
'PhabricatorProjectColumnSearchEngine' => 'applications/project/query/PhabricatorProjectColumnSearchEngine.php',
'PhabricatorProjectColumnStatusOrder' => 'applications/project/order/PhabricatorProjectColumnStatusOrder.php',
'PhabricatorProjectColumnTransaction' => 'applications/project/storage/PhabricatorProjectColumnTransaction.php',
'PhabricatorProjectColumnTransactionEditor' => 'applications/project/editor/PhabricatorProjectColumnTransactionEditor.php',
'PhabricatorProjectColumnTransactionQuery' => 'applications/project/query/PhabricatorProjectColumnTransactionQuery.php',
@ -10155,6 +10156,7 @@ phutil_register_library_map(array(
'PhabricatorProjectColumnPriorityOrder' => 'PhabricatorProjectColumnOrder',
'PhabricatorProjectColumnQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorProjectColumnSearchEngine' => 'PhabricatorApplicationSearchEngine',
'PhabricatorProjectColumnStatusOrder' => 'PhabricatorProjectColumnOrder',
'PhabricatorProjectColumnTransaction' => 'PhabricatorApplicationTransaction',
'PhabricatorProjectColumnTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
'PhabricatorProjectColumnTransactionQuery' => 'PhabricatorApplicationTransactionQuery',

View file

@ -0,0 +1,106 @@
<?php
final class PhabricatorProjectColumnStatusOrder
extends PhabricatorProjectColumnOrder {
const ORDERKEY = 'status';
public function getDisplayName() {
return pht('Group by Status');
}
protected function newMenuIconIcon() {
return 'fa-check';
}
public function getHasHeaders() {
return true;
}
public function getCanReorder() {
return true;
}
public function getMenuOrder() {
return 3000;
}
protected function newHeaderKeyForObject($object) {
return $this->newHeaderKeyForStatus($object->getStatus());
}
private function newHeaderKeyForStatus($status) {
return sprintf('status(%s)', $status);
}
protected function newSortVectorsForObjects(array $objects) {
$status_sequence = $this->newStatusSequence();
$vectors = array();
foreach ($objects as $object_key => $object) {
$vectors[$object_key] = array(
(int)idx($status_sequence, $object->getStatus(), 0),
);
}
return $vectors;
}
private function newStatusSequence() {
$statuses = ManiphestTaskStatus::getTaskStatusMap();
return array_combine(
array_keys($statuses),
range(1, count($statuses)));
}
protected function newHeadersForObjects(array $objects) {
$headers = array();
$statuses = ManiphestTaskStatus::getTaskStatusMap();
$sequence = $this->newStatusSequence();
foreach ($statuses as $status_key => $status_name) {
$header_key = $this->newHeaderKeyForStatus($status_key);
$sort_vector = array(
(int)idx($sequence, $status_key, 0),
);
$status_icon = ManiphestTaskStatus::getStatusIcon($status_key);
$status_color = ManiphestTaskStatus::getStatusColor($status_key);
$icon_view = id(new PHUIIconView())
->setIcon($status_icon, $status_color);
$header = $this->newHeader()
->setHeaderKey($header_key)
->setSortVector($sort_vector)
->setName($status_name)
->setIcon($icon_view)
->setEditProperties(
array(
'value' => $status_key,
));
$headers[] = $header;
}
return $headers;
}
protected function newColumnTransactions($object, array $header) {
$new_status = idx($header, 'value');
if ($object->getStatus() === $new_status) {
return null;
}
$xactions = array();
$xactions[] = $this->newTransaction($object)
->setTransactionType(ManiphestTaskStatusTransaction::TRANSACTIONTYPE)
->setNewValue($new_status);
return $xactions;
}
}