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

Drive Maniphest statuses with internal pseudo-configuration

Summary: Ref T1812. Without actually exposing configuration, this moves all status information into a config-like chunk of data which can later be exposed to human editors.

Test Plan:
- Made a bunch of status changes.
- Merged duplicates.
- Created task.
- Viewed feed, transaction record, etc.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T1812

Differential Revision: https://secure.phabricator.com/D8582

+155 -83
+149 -82
src/applications/maniphest/constants/ManiphestTaskStatus.php
··· 9 9 const STATUS_CLOSED_DUPLICATE = 4; 10 10 const STATUS_CLOSED_SPITE = 5; 11 11 12 - public static function getTaskStatusMap() { 13 - $open = pht('Open'); 14 - $resolved = pht('Resolved'); 15 - $wontfix = pht('Wontfix'); 16 - $invalid = pht('Invalid'); 17 - $duplicate = pht('Duplicate'); 18 - $spite = pht('Spite'); 12 + const SPECIAL_DEFAULT = 'default'; 13 + const SPECIAL_CLOSED = 'closed'; 14 + const SPECIAL_DUPLICATE = 'duplicate'; 19 15 20 - $statuses = array( 21 - self::STATUS_OPEN => $open, 22 - self::STATUS_CLOSED_RESOLVED => $resolved, 23 - self::STATUS_CLOSED_WONTFIX => $wontfix, 24 - self::STATUS_CLOSED_INVALID => $invalid, 25 - self::STATUS_CLOSED_DUPLICATE => $duplicate, 26 - self::STATUS_CLOSED_SPITE => $spite, 16 + private static function getStatusConfig() { 17 + return array( 18 + self::STATUS_OPEN => array( 19 + 'name' => pht('Open'), 20 + 'special' => self::SPECIAL_DEFAULT, 21 + ), 22 + self::STATUS_CLOSED_RESOLVED => array( 23 + 'name' => pht('Resolved'), 24 + 'name.full' => pht('Closed, Resolved'), 25 + 'closed' => true, 26 + 'special' => self::SPECIAL_CLOSED, 27 + 'prefixes' => array( 28 + 'closed', 29 + 'closes', 30 + 'close', 31 + 'fix', 32 + 'fixes', 33 + 'fixed', 34 + 'resolve', 35 + 'resolves', 36 + 'resolved', 37 + ), 38 + 'suffixes' => array( 39 + 'as resolved', 40 + 'as fixed', 41 + ), 42 + ), 43 + self::STATUS_CLOSED_WONTFIX => array( 44 + 'name' => pht('Wontfix'), 45 + 'name.full' => pht('Closed, Wontfix'), 46 + 'closed' => true, 47 + 'prefixes' => array( 48 + 'wontfix', 49 + 'wontfixes', 50 + 'wontfixed', 51 + ), 52 + 'suffixes' => array( 53 + 'as wontfix', 54 + ), 55 + ), 56 + self::STATUS_CLOSED_INVALID => array( 57 + 'name' => pht('Invalid'), 58 + 'name.full' => pht('Closed, Invalid'), 59 + 'closed' => true, 60 + 'prefixes' => array( 61 + 'invalidate', 62 + 'invalidates', 63 + 'invalidated', 64 + ), 65 + 'suffixes' => array( 66 + 'as invalid', 67 + ), 68 + ), 69 + self::STATUS_CLOSED_DUPLICATE => array( 70 + 'name' => pht('Duplicate'), 71 + 'name.full' => pht('Closed, Duplicate'), 72 + 'transaction.icon' => 'delete', 73 + 'special' => self::SPECIAL_DUPLICATE, 74 + 'closed' => true, 75 + ), 76 + self::STATUS_CLOSED_SPITE => array( 77 + 'name' => pht('Spite'), 78 + 'name.full' => pht('Closed, Spite'), 79 + 'name.action' => pht('Spited'), 80 + 'transaction.icon' => 'dislike', 81 + 'silly' => true, 82 + 'closed' => true, 83 + 'prefixes' => array( 84 + 'spite', 85 + 'spites', 86 + 'spited', 87 + ), 88 + 'suffixes' => array( 89 + 'out of spite', 90 + 'as spite', 91 + ), 92 + ), 27 93 ); 94 + } 95 + 96 + private static function getEnabledStatusMap() { 97 + $spec = self::getStatusConfig(); 28 98 29 99 $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business'); 30 - if (!$is_serious) { 31 - $statuses[self::STATUS_CLOSED_SPITE] = pht('Spite'); 100 + foreach ($spec as $const => $status) { 101 + if ($is_serious && !empty($status['silly'])) { 102 + unset($spec[$const]); 103 + continue; 104 + } 32 105 } 33 106 34 - return $statuses; 107 + return $spec; 108 + } 109 + 110 + public static function getTaskStatusMap() { 111 + return ipull(self::getEnabledStatusMap(), 'name'); 35 112 } 36 113 37 114 public static function getTaskStatusName($status) { 38 - return idx(self::getTaskStatusMap(), $status, pht('Unknown Status')); 115 + return self::getStatusAttribute($status, 'name', pht('Unknown Status')); 39 116 } 40 117 41 118 public static function getTaskStatusFullName($status) { 42 - $open = pht('Open'); 43 - $resolved = pht('Closed, Resolved'); 44 - $wontfix = pht('Closed, Wontfix'); 45 - $invalid = pht('Closed, Invalid'); 46 - $duplicate = pht('Closed, Duplicate'); 47 - $spite = pht('Closed, Spite'); 119 + $name = self::getStatusAttribute($status, 'name.full'); 120 + if ($name !== null) { 121 + return $name; 122 + } 48 123 49 - $map = array( 50 - self::STATUS_OPEN => $open, 51 - self::STATUS_CLOSED_RESOLVED => $resolved, 52 - self::STATUS_CLOSED_WONTFIX => $wontfix, 53 - self::STATUS_CLOSED_INVALID => $invalid, 54 - self::STATUS_CLOSED_DUPLICATE => $duplicate, 55 - self::STATUS_CLOSED_SPITE => $spite, 56 - ); 57 - return idx($map, $status, '???'); 124 + return self::getStatusAttribute($status, 'name', pht('Unknown Status')); 58 125 } 59 126 60 127 public static function renderFullDescription($status) { ··· 83 150 return $tag; 84 151 } 85 152 153 + private static function getSpecialStatus($special) { 154 + foreach (self::getEnabledStatusMap() as $const => $status) { 155 + if (idx($status, 'special') == $special) { 156 + return $const; 157 + } 158 + } 159 + return null; 160 + } 161 + 86 162 public static function getDefaultStatus() { 87 - return self::STATUS_OPEN; 163 + return self::getSpecialStatus(self::SPECIAL_DEFAULT); 88 164 } 89 165 90 166 public static function getDefaultClosedStatus() { 91 - return self::STATUS_CLOSED_RESOLVED; 167 + return self::getSpecialStatus(self::SPECIAL_CLOSED); 92 168 } 93 169 94 170 public static function getDuplicateStatus() { 95 - return self::STATUS_CLOSED_DUPLICATE; 171 + return self::getSpecialStatus(self::SPECIAL_DUPLICATE); 96 172 } 97 173 98 174 public static function getOpenStatusConstants() { 99 - return array( 100 - self::STATUS_OPEN, 101 - ); 175 + $result = array(); 176 + foreach (self::getEnabledStatusMap() as $const => $status) { 177 + if (empty($status['closed'])) { 178 + $result[] = $const; 179 + } 180 + } 181 + return $result; 102 182 } 103 183 104 184 public static function getClosedStatusConstants() { ··· 121 201 } 122 202 123 203 public static function getStatusActionName($status) { 124 - switch ($status) { 125 - case self::STATUS_CLOSED_SPITE: 126 - return pht('Spited'); 127 - } 128 - return null; 204 + return self::getStatusAttribute($status, 'name.action'); 129 205 } 130 206 131 207 public static function getStatusColor($status) { 132 - if (self::isOpenStatus($status)) { 133 - return 'green'; 134 - } 135 - return 'black'; 208 + return self::getStatusAttribute($status, 'transaction.color'); 136 209 } 137 210 138 211 public static function getStatusIcon($status) { 139 - switch ($status) { 140 - case ManiphestTaskStatus::STATUS_CLOSED_SPITE: 141 - return 'dislike'; 142 - case ManiphestTaskStatus::STATUS_CLOSED_DUPLICATE: 143 - return 'delete'; 144 - } 212 + return self::getStatusAttribute($status, 'transaction.icon'); 145 213 } 146 214 215 + public static function getStatusPrefixMap() { 216 + $map = array(); 217 + foreach (self::getEnabledStatusMap() as $const => $status) { 218 + foreach (idx($status, 'prefixes', array()) as $prefix) { 219 + $map[$prefix] = $const; 220 + } 221 + } 147 222 148 - public static function getStatusPrefixMap() { 149 - return array( 150 - 'resolve' => self::STATUS_CLOSED_RESOLVED, 151 - 'resolves' => self::STATUS_CLOSED_RESOLVED, 152 - 'resolved' => self::STATUS_CLOSED_RESOLVED, 153 - 'fix' => self::STATUS_CLOSED_RESOLVED, 154 - 'fixes' => self::STATUS_CLOSED_RESOLVED, 155 - 'fixed' => self::STATUS_CLOSED_RESOLVED, 156 - 'wontfix' => self::STATUS_CLOSED_WONTFIX, 157 - 'wontfixes' => self::STATUS_CLOSED_WONTFIX, 158 - 'wontfixed' => self::STATUS_CLOSED_WONTFIX, 159 - 'spite' => self::STATUS_CLOSED_SPITE, 160 - 'spites' => self::STATUS_CLOSED_SPITE, 161 - 'spited' => self::STATUS_CLOSED_SPITE, 162 - 'invalidate' => self::STATUS_CLOSED_INVALID, 163 - 'invaldiates' => self::STATUS_CLOSED_INVALID, 164 - 'invalidated' => self::STATUS_CLOSED_INVALID, 165 - 'close' => self::STATUS_CLOSED_RESOLVED, 166 - 'closes' => self::STATUS_CLOSED_RESOLVED, 167 - 'closed' => self::STATUS_CLOSED_RESOLVED, 223 + $map += array( 168 224 'ref' => null, 169 225 'refs' => null, 170 226 'references' => null, 171 227 'cf.' => null, 172 228 ); 229 + 230 + return $map; 173 231 } 174 232 175 233 public static function getStatusSuffixMap() { 176 - return array( 177 - 'as resolved' => self::STATUS_CLOSED_RESOLVED, 178 - 'as fixed' => self::STATUS_CLOSED_RESOLVED, 179 - 'as wontfix' => self::STATUS_CLOSED_WONTFIX, 180 - 'as spite' => self::STATUS_CLOSED_SPITE, 181 - 'out of spite' => self::STATUS_CLOSED_SPITE, 182 - 'as invalid' => self::STATUS_CLOSED_INVALID, 183 - ); 234 + $map = array(); 235 + foreach (self::getEnabledStatusMap() as $const => $status) { 236 + foreach (idx($status, 'suffixes', array()) as $prefix) { 237 + $map[$prefix] = $const; 238 + } 239 + } 240 + return $map; 184 241 } 185 242 243 + private static function getStatusAttribute($status, $key, $default = null) { 244 + $config = self::getStatusConfig(); 245 + 246 + $spec = idx($config, $status); 247 + if ($spec) { 248 + return idx($spec, $key, $default); 249 + } 250 + 251 + return $default; 252 + } 186 253 187 254 }
+6 -1
src/applications/maniphest/storage/ManiphestTransaction.php
··· 143 143 if ($color !== null) { 144 144 return $color; 145 145 } 146 - break; 146 + 147 + if (ManiphestTaskStatus::isOpenStatus($new)) { 148 + return 'green'; 149 + } else { 150 + return 'black'; 151 + } 147 152 148 153 case self::TYPE_PRIORITY: 149 154 if ($old == ManiphestTaskPriority::getDefaultPriority()) {