@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 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 4000;
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 $drop_effect = $this->newEffect()
76 ->setIcon($status_icon)
77 ->setColor($status_color)
78 ->addCondition('status', '!=', $status_key)
79 ->setContent(
80 pht(
81 'Change status to %s.',
82 phutil_tag('strong', array(), $status_name)));
83
84 $header = $this->newHeader()
85 ->setHeaderKey($header_key)
86 ->setSortVector($sort_vector)
87 ->setName($status_name)
88 ->setIcon($icon_view)
89 ->setEditProperties(
90 array(
91 'value' => $status_key,
92 ))
93 ->addDropEffect($drop_effect);
94
95 $headers[] = $header;
96 }
97
98 return $headers;
99 }
100
101 protected function newColumnTransactions($object, array $header) {
102 $new_status = idx($header, 'value');
103
104 if ($object->getStatus() === $new_status) {
105 return null;
106 }
107
108 $xactions = array();
109 $xactions[] = $this->newTransaction($object)
110 ->setTransactionType(ManiphestTaskStatusTransaction::TRANSACTIONTYPE)
111 ->setNewValue($new_status);
112
113 return $xactions;
114 }
115
116}