@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
at recaptime-dev/main 113 lines 3.1 kB view raw
1<?php 2 3final class PhabricatorProjectColumnPriorityOrder 4 extends PhabricatorProjectColumnOrder { 5 6 const ORDERKEY = 'priority'; 7 8 public function getDisplayName() { 9 return pht('Group by Priority'); 10 } 11 12 protected function newMenuIconIcon() { 13 return 'fa-sort-numeric-asc'; 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 1000; 26 } 27 28 protected function newHeaderKeyForObject($object) { 29 return $this->newHeaderKeyForPriority($object->getPriority()); 30 } 31 32 private function newHeaderKeyForPriority($priority) { 33 return sprintf('priority(%d)', $priority); 34 } 35 36 protected function newSortVectorForObject($object) { 37 return $this->newSortVectorForPriority($object->getPriority()); 38 } 39 40 private function newSortVectorForPriority($priority) { 41 return array( 42 -1 * (int)$priority, 43 ); 44 } 45 46 protected function newHeadersForObjects(array $objects) { 47 $priorities = ManiphestTaskPriority::getTaskPriorityMap(); 48 49 // It's possible for tasks to have an invalid/unknown priority in the 50 // database. We still want to generate a header for these tasks so we 51 // don't break the workboard. 52 $priorities = $priorities + mpull($objects, null, 'getPriority'); 53 54 $priorities = array_keys($priorities); 55 56 $headers = array(); 57 foreach ($priorities as $priority) { 58 $header_key = $this->newHeaderKeyForPriority($priority); 59 $sort_vector = $this->newSortVectorForPriority($priority); 60 61 $priority_name = ManiphestTaskPriority::getTaskPriorityName($priority); 62 $priority_color = ManiphestTaskPriority::getTaskPriorityColor($priority); 63 $priority_icon = ManiphestTaskPriority::getTaskPriorityIcon($priority); 64 65 $icon_view = id(new PHUIIconView()) 66 ->setIcon($priority_icon, $priority_color); 67 68 $drop_effect = $this->newEffect() 69 ->setIcon($priority_icon) 70 ->setColor($priority_color) 71 ->addCondition('priority', '!=', $priority) 72 ->setContent( 73 pht( 74 'Change priority to %s.', 75 phutil_tag('strong', array(), $priority_name))); 76 77 $header = $this->newHeader() 78 ->setHeaderKey($header_key) 79 ->setSortVector($sort_vector) 80 ->setName($priority_name) 81 ->setIcon($icon_view) 82 ->setEditProperties( 83 array( 84 'value' => (int)$priority, 85 )) 86 ->addDropEffect($drop_effect); 87 88 $headers[] = $header; 89 } 90 91 return $headers; 92 } 93 94 protected function newColumnTransactions($object, array $header) { 95 $new_priority = idx($header, 'value'); 96 97 if ($object->getPriority() === $new_priority) { 98 return null; 99 } 100 101 $keyword_map = ManiphestTaskPriority::getTaskPriorityKeywordsMap(); 102 $keyword = head(idx($keyword_map, $new_priority)); 103 104 $xactions = array(); 105 $xactions[] = $this->newTransaction($object) 106 ->setTransactionType(ManiphestTaskPriorityTransaction::TRANSACTIONTYPE) 107 ->setNewValue($keyword); 108 109 return $xactions; 110 } 111 112 113}