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

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

+108
+2
src/__phutil_library_map__.php
··· 4065 4065 'PhabricatorProjectColumnPriorityOrder' => 'applications/project/order/PhabricatorProjectColumnPriorityOrder.php', 4066 4066 'PhabricatorProjectColumnQuery' => 'applications/project/query/PhabricatorProjectColumnQuery.php', 4067 4067 'PhabricatorProjectColumnSearchEngine' => 'applications/project/query/PhabricatorProjectColumnSearchEngine.php', 4068 + 'PhabricatorProjectColumnStatusOrder' => 'applications/project/order/PhabricatorProjectColumnStatusOrder.php', 4068 4069 'PhabricatorProjectColumnTransaction' => 'applications/project/storage/PhabricatorProjectColumnTransaction.php', 4069 4070 'PhabricatorProjectColumnTransactionEditor' => 'applications/project/editor/PhabricatorProjectColumnTransactionEditor.php', 4070 4071 'PhabricatorProjectColumnTransactionQuery' => 'applications/project/query/PhabricatorProjectColumnTransactionQuery.php', ··· 10155 10156 'PhabricatorProjectColumnPriorityOrder' => 'PhabricatorProjectColumnOrder', 10156 10157 'PhabricatorProjectColumnQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 10157 10158 'PhabricatorProjectColumnSearchEngine' => 'PhabricatorApplicationSearchEngine', 10159 + 'PhabricatorProjectColumnStatusOrder' => 'PhabricatorProjectColumnOrder', 10158 10160 'PhabricatorProjectColumnTransaction' => 'PhabricatorApplicationTransaction', 10159 10161 'PhabricatorProjectColumnTransactionEditor' => 'PhabricatorApplicationTransactionEditor', 10160 10162 'PhabricatorProjectColumnTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
+106
src/applications/project/order/PhabricatorProjectColumnStatusOrder.php
··· 1 + <?php 2 + 3 + final class PhabricatorProjectColumnStatusOrder 4 + extends PhabricatorProjectColumnOrder { 5 + 6 + const ORDERKEY = 'status'; 7 + 8 + public function getDisplayName() { 9 + return pht('Group by Status'); 10 + } 11 + 12 + protected function newMenuIconIcon() { 13 + return 'fa-check'; 14 + } 15 + 16 + public function getHasHeaders() { 17 + return true; 18 + } 19 + 20 + public function getCanReorder() { 21 + return true; 22 + } 23 + 24 + public function getMenuOrder() { 25 + return 3000; 26 + } 27 + 28 + protected function newHeaderKeyForObject($object) { 29 + return $this->newHeaderKeyForStatus($object->getStatus()); 30 + } 31 + 32 + private function newHeaderKeyForStatus($status) { 33 + return sprintf('status(%s)', $status); 34 + } 35 + 36 + protected function newSortVectorsForObjects(array $objects) { 37 + $status_sequence = $this->newStatusSequence(); 38 + 39 + $vectors = array(); 40 + foreach ($objects as $object_key => $object) { 41 + $vectors[$object_key] = array( 42 + (int)idx($status_sequence, $object->getStatus(), 0), 43 + ); 44 + } 45 + 46 + return $vectors; 47 + } 48 + 49 + private function newStatusSequence() { 50 + $statuses = ManiphestTaskStatus::getTaskStatusMap(); 51 + return array_combine( 52 + array_keys($statuses), 53 + range(1, count($statuses))); 54 + } 55 + 56 + protected function newHeadersForObjects(array $objects) { 57 + $headers = array(); 58 + 59 + $statuses = ManiphestTaskStatus::getTaskStatusMap(); 60 + $sequence = $this->newStatusSequence(); 61 + 62 + foreach ($statuses as $status_key => $status_name) { 63 + $header_key = $this->newHeaderKeyForStatus($status_key); 64 + 65 + $sort_vector = array( 66 + (int)idx($sequence, $status_key, 0), 67 + ); 68 + 69 + $status_icon = ManiphestTaskStatus::getStatusIcon($status_key); 70 + $status_color = ManiphestTaskStatus::getStatusColor($status_key); 71 + 72 + $icon_view = id(new PHUIIconView()) 73 + ->setIcon($status_icon, $status_color); 74 + 75 + $header = $this->newHeader() 76 + ->setHeaderKey($header_key) 77 + ->setSortVector($sort_vector) 78 + ->setName($status_name) 79 + ->setIcon($icon_view) 80 + ->setEditProperties( 81 + array( 82 + 'value' => $status_key, 83 + )); 84 + 85 + $headers[] = $header; 86 + } 87 + 88 + return $headers; 89 + } 90 + 91 + protected function newColumnTransactions($object, array $header) { 92 + $new_status = idx($header, 'value'); 93 + 94 + if ($object->getStatus() === $new_status) { 95 + return null; 96 + } 97 + 98 + $xactions = array(); 99 + $xactions[] = $this->newTransaction($object) 100 + ->setTransactionType(ManiphestTaskStatusTransaction::TRANSACTIONTYPE) 101 + ->setNewValue($new_status); 102 + 103 + return $xactions; 104 + } 105 + 106 + }