@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<?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}