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

Replace Differential "unit stars" with icons

Summary:
Ref T9764. These "star" icons are unclear, inconsistent, and not friendly to colorblind users.

They date from a time long ago when the product didn't have icons.

Modernize them and make them more consistent with the similar statuses in Harbormaster.

Test Plan:
{F8545690}

{F8545691}

{F8545692}

Maniphest Tasks: T9764

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

+267 -58
+4
src/__phutil_library_map__.php
··· 496 496 'DifferentialCommitsSearchEngineAttachment' => 'applications/differential/engineextension/DifferentialCommitsSearchEngineAttachment.php', 497 497 'DifferentialConduitAPIMethod' => 'applications/differential/conduit/DifferentialConduitAPIMethod.php', 498 498 'DifferentialConflictsCommitMessageField' => 'applications/differential/field/DifferentialConflictsCommitMessageField.php', 499 + 'DifferentialConstantsModule' => 'applications/differential/constants/DifferentialConstantsModule.php', 499 500 'DifferentialController' => 'applications/differential/controller/DifferentialController.php', 500 501 'DifferentialCoreCustomField' => 'applications/differential/customfield/DifferentialCoreCustomField.php', 501 502 'DifferentialCreateCommentConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateCommentConduitAPIMethod.php', ··· 2025 2026 'PHUICalendarMonthView' => 'view/phui/calendar/PHUICalendarMonthView.php', 2026 2027 'PHUICalendarWeekView' => 'view/phui/calendar/PHUICalendarWeekView.php', 2027 2028 'PHUICalendarWidgetView' => 'view/phui/calendar/PHUICalendarWidgetView.php', 2029 + 'PHUIColor' => 'view/phui/PHUIColor.php', 2028 2030 'PHUIColorPalletteExample' => 'applications/uiexample/examples/PHUIColorPalletteExample.php', 2029 2031 'PHUICrumbView' => 'view/phui/PHUICrumbView.php', 2030 2032 'PHUICrumbsView' => 'view/phui/PHUICrumbsView.php', ··· 6587 6589 'DifferentialCommitsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', 6588 6590 'DifferentialConduitAPIMethod' => 'ConduitAPIMethod', 6589 6591 'DifferentialConflictsCommitMessageField' => 'DifferentialCommitMessageField', 6592 + 'DifferentialConstantsModule' => 'PhabricatorConfigModule', 6590 6593 'DifferentialController' => 'PhabricatorController', 6591 6594 'DifferentialCoreCustomField' => 'DifferentialCustomField', 6592 6595 'DifferentialCreateCommentConduitAPIMethod' => 'DifferentialConduitAPIMethod', ··· 8356 8359 'PHUICalendarMonthView' => 'AphrontView', 8357 8360 'PHUICalendarWeekView' => 'AphrontView', 8358 8361 'PHUICalendarWidgetView' => 'AphrontTagView', 8362 + 'PHUIColor' => 'Phobject', 8359 8363 'PHUIColorPalletteExample' => 'PhabricatorUIExample', 8360 8364 'PHUICrumbView' => 'AphrontView', 8361 8365 'PHUICrumbsView' => 'AphrontView',
+5 -1
src/applications/config/controller/module/PhabricatorConfigModuleController.php
··· 38 38 $nav->selectFilter($key); 39 39 $header = $this->buildHeaderView($title); 40 40 41 - $view = $this->buildConfigBoxView($title, $content); 41 + if ($content instanceof AphrontTableView) { 42 + $view = $this->buildConfigBoxView($title, $content); 43 + } else { 44 + $view = $content; 45 + } 42 46 43 47 $crumbs = $this->buildApplicationCrumbs() 44 48 ->addTextCrumb(pht('Extensions/Modules'), $modules_uri)
+144
src/applications/differential/constants/DifferentialConstantsModule.php
··· 1 + <?php 2 + 3 + final class DifferentialConstantsModule 4 + extends PhabricatorConfigModule { 5 + 6 + public function getModuleKey() { 7 + return 'constants.differential'; 8 + } 9 + 10 + public function getModuleName() { 11 + return pht('Constants: Differential'); 12 + } 13 + 14 + public function renderModuleStatus(AphrontRequest $request) { 15 + $viewer = $request->getViewer(); 16 + 17 + return array( 18 + $this->renderRevisionStatuses($viewer), 19 + $this->renderUnitStatuses($viewer), 20 + ); 21 + } 22 + 23 + private function renderRevisionStatuses(PhabricatorUser $viewer) { 24 + $statuses = DifferentialRevisionStatus::getAll(); 25 + 26 + $rows = array(); 27 + foreach ($statuses as $status) { 28 + $icon = id(new PHUIIconView()) 29 + ->setIcon( 30 + $status->getIcon(), 31 + $status->getIconColor()); 32 + 33 + $timeline_icon = $status->getTimelineIcon(); 34 + if ($timeline_icon !== null) { 35 + $timeline_view = id(new PHUIIconView()) 36 + ->setIcon( 37 + $status->getTimelineIcon(), 38 + $status->getTimelineColor()); 39 + } else { 40 + $timeline_view = null; 41 + } 42 + 43 + if ($status->isClosedStatus()) { 44 + $is_open = pht('Closed'); 45 + } else { 46 + $is_open = pht('Open'); 47 + } 48 + 49 + $tag_color = $status->getTagColor(); 50 + if ($tag_color !== null) { 51 + $tag_view = id(new PHUIIconView()) 52 + ->seticon('fa-tag', $tag_color); 53 + } else { 54 + $tag_view = null; 55 + } 56 + 57 + $ansi_color = $status->getAnsiColor(); 58 + if ($ansi_color !== null) { 59 + $web_color = PHUIColor::getWebColorFromANSIColor($ansi_color); 60 + $ansi_view = id(new PHUIIconView()) 61 + ->setIcon('fa-stop', $web_color); 62 + } else { 63 + $ansi_view = null; 64 + } 65 + 66 + 67 + $rows[] = array( 68 + $status->getKey(), 69 + $status->getLegacyKey(), 70 + $icon, 71 + $timeline_view, 72 + $tag_view, 73 + $ansi_view, 74 + $is_open, 75 + $status->getDisplayName(), 76 + ); 77 + } 78 + 79 + $table = id(new AphrontTableView($rows)) 80 + ->setHeaders( 81 + array( 82 + pht('Value'), 83 + pht('Legacy Value'), 84 + pht('Icon'), 85 + pht('Timeline Icon'), 86 + pht('Tag Color'), 87 + pht('ANSI Color'), 88 + pht('Open/Closed'), 89 + pht('Name'), 90 + )) 91 + ->setColumnClasses( 92 + array( 93 + null, 94 + null, 95 + null, 96 + null, 97 + null, 98 + null, 99 + null, 100 + 'wide pri', 101 + )); 102 + 103 + $view = id(new PHUIObjectBoxView()) 104 + ->setHeaderText(pht('Differential Revision Statuses')) 105 + ->setTable($table); 106 + 107 + return $view; 108 + } 109 + 110 + private function renderUnitStatuses(PhabricatorUser $viewer) { 111 + $statuses = DifferentialUnitStatus::getStatusMap(); 112 + 113 + $rows = array(); 114 + foreach ($statuses as $status) { 115 + $rows[] = array( 116 + $status->getValue(), 117 + id(new PHUIIconView()) 118 + ->setIcon($status->getIconIcon(), $status->getIconColor()), 119 + $status->getName(), 120 + ); 121 + } 122 + 123 + $table = id(new AphrontTableView($rows)) 124 + ->setHeaders( 125 + array( 126 + pht('Value'), 127 + pht('Icon'), 128 + pht('Name'), 129 + )) 130 + ->setColumnClasses( 131 + array( 132 + null, 133 + null, 134 + 'wide pri', 135 + )); 136 + 137 + $view = id(new PHUIObjectBoxView()) 138 + ->setHeaderText(pht('Differential Unit Statuses')) 139 + ->setTable($table); 140 + 141 + return $view; 142 + } 143 + 144 + }
+81
src/applications/differential/constants/DifferentialUnitStatus.php
··· 9 9 const UNIT_SKIP = 4; 10 10 const UNIT_AUTO_SKIP = 6; 11 11 12 + private $value; 13 + 14 + public static function newStatusFromValue($value) { 15 + $status = new self(); 16 + $status->value = $value; 17 + return $status; 18 + } 19 + 20 + public function getValue() { 21 + return $this->value; 22 + } 23 + 24 + public function getName() { 25 + $name = $this->getUnitStatusProperty('name'); 26 + 27 + if ($name === null) { 28 + $name = pht('Unknown Unit Status ("%s")', $this->getValue()); 29 + } 30 + 31 + return $name; 32 + } 33 + 34 + public function getIconIcon() { 35 + return $this->getUnitStatusProperty('icon.icon'); 36 + } 37 + 38 + public function getIconColor() { 39 + return $this->getUnitStatusProperty('icon.color'); 40 + } 41 + 42 + public static function getStatusMap() { 43 + $results = array(); 44 + 45 + foreach (self::newUnitStatusMap() as $value => $ignored) { 46 + $results[$value] = self::newStatusFromValue($value); 47 + } 48 + 49 + return $results; 50 + } 51 + 52 + private function getUnitStatusProperty($key, $default = null) { 53 + $map = self::newUnitStatusMap(); 54 + $properties = idx($map, $this->getValue(), array()); 55 + return idx($properties, $key, $default); 56 + } 57 + 58 + private static function newUnitStatusMap() { 59 + return array( 60 + self::UNIT_NONE => array( 61 + 'name' => pht('No Test Coverage'), 62 + 'icon.icon' => 'fa-ban', 63 + 'icon.color' => 'grey', 64 + ), 65 + self::UNIT_OKAY => array( 66 + 'name' => pht('Tests Passed'), 67 + 'icon.icon' => 'fa-check', 68 + 'icon.color' => 'green', 69 + ), 70 + self::UNIT_WARN => array( 71 + 'name' => pht('Test Warnings'), 72 + 'icon.icon' => 'fa-exclamation-triangle', 73 + 'icon.color' => 'yellow', 74 + ), 75 + self::UNIT_FAIL => array( 76 + 'name' => pht('Test Failures'), 77 + 'icon.icon' => 'fa-times', 78 + 'icon.color' => 'red', 79 + ), 80 + self::UNIT_SKIP => array( 81 + 'name' => pht('Tests Skipped'), 82 + 'icon.icon' => 'fa-fast-forward', 83 + 'icon.color' => 'blue', 84 + ), 85 + self::UNIT_AUTO_SKIP => array( 86 + 'name' => pht('Tests Not Applicable'), 87 + 'icon.icon' => 'fa-upload', 88 + 'icon.color' => 'grey', 89 + ), 90 + ); 91 + } 92 + 12 93 }
+7 -16
src/applications/differential/customfield/DifferentialUnitField.php
··· 72 72 } 73 73 74 74 public function renderDiffPropertyViewValue(DifferentialDiff $diff) { 75 + $status_value = $diff->getUnitStatus(); 76 + $status = DifferentialUnitStatus::newStatusFromValue($status_value); 75 77 76 - $colors = array( 77 - DifferentialUnitStatus::UNIT_NONE => 'grey', 78 - DifferentialUnitStatus::UNIT_OKAY => 'green', 79 - DifferentialUnitStatus::UNIT_WARN => 'yellow', 80 - DifferentialUnitStatus::UNIT_FAIL => 'red', 81 - DifferentialUnitStatus::UNIT_SKIP => 'blue', 82 - DifferentialUnitStatus::UNIT_AUTO_SKIP => 'blue', 83 - ); 84 - $icon_color = idx($colors, $diff->getUnitStatus(), 'grey'); 85 - 86 - $message = DifferentialRevisionUpdateHistoryView::getDiffUnitMessage( 87 - $diff->getUnitStatus()); 78 + $status_icon = $status->getIconIcon(); 79 + $status_color = $status->getIconColor(); 80 + $status_name = $status->getName(); 88 81 89 82 $status = id(new PHUIStatusListView()) 90 83 ->addItem( 91 84 id(new PHUIStatusItemView()) 92 - ->setIcon(PHUIStatusItemView::ICON_STAR, $icon_color) 93 - ->setTarget($message)); 85 + ->setIcon($status_icon, $status_color) 86 + ->setTarget($status_name)); 94 87 95 88 return $status; 96 89 } 97 - 98 - 99 90 100 91 }
+13 -41
src/applications/differential/view/DifferentialRevisionUpdateHistoryView.php
··· 153 153 ), 154 154 $lint); 155 155 156 - $unit = self::renderDiffUnitStar($unit_status); 157 - $unit = phutil_tag( 158 - 'div', 159 - array( 160 - 'class' => 'lintunit-star', 161 - 'title' => self::getDiffUnitMessage($unit_status), 162 - ), 163 - $unit); 156 + $status = DifferentialUnitStatus::newStatusFromValue($unit_status); 157 + 158 + $unit_icon = $status->getIconIcon(); 159 + $unit_color = $status->getIconColor(); 160 + $unit_name = $status->getName(); 161 + 162 + $unit = id(new PHUIIconView()) 163 + ->setIcon($unit_icon, $unit_color) 164 + ->addSigil('has-tooltip') 165 + ->setMetadata( 166 + array( 167 + 'tip' => $unit_name, 168 + )); 164 169 165 170 $base = $this->renderBaseRevision($diff); 166 171 } else { ··· 303 308 return self::renderDiffStar($star); 304 309 } 305 310 306 - private static function renderDiffUnitStar($unit_status) { 307 - static $map = array( 308 - DifferentialUnitStatus::UNIT_NONE => self::STAR_NONE, 309 - DifferentialUnitStatus::UNIT_OKAY => self::STAR_OKAY, 310 - DifferentialUnitStatus::UNIT_WARN => self::STAR_WARN, 311 - DifferentialUnitStatus::UNIT_FAIL => self::STAR_FAIL, 312 - DifferentialUnitStatus::UNIT_SKIP => self::STAR_SKIP, 313 - DifferentialUnitStatus::UNIT_AUTO_SKIP => self::STAR_SKIP, 314 - ); 315 - $star = idx($map, $unit_status, self::STAR_FAIL); 316 - 317 - return self::renderDiffStar($star); 318 - } 319 - 320 311 public static function getDiffLintMessage(DifferentialDiff $diff) { 321 312 switch ($diff->getLintStatus()) { 322 313 case DifferentialLintStatus::LINT_NONE: ··· 331 322 return pht('Lint Skipped'); 332 323 case DifferentialLintStatus::LINT_AUTO_SKIP: 333 324 return pht('Automatic diff as part of commit; lint not applicable.'); 334 - } 335 - return pht('Unknown'); 336 - } 337 - 338 - public static function getDiffUnitMessage($unit_status) { 339 - switch ($unit_status) { 340 - case DifferentialUnitStatus::UNIT_NONE: 341 - return pht('No Unit Test Coverage'); 342 - case DifferentialUnitStatus::UNIT_OKAY: 343 - return pht('Unit Tests OK'); 344 - case DifferentialUnitStatus::UNIT_WARN: 345 - return pht('Unit Test Warnings'); 346 - case DifferentialUnitStatus::UNIT_FAIL: 347 - return pht('Unit Test Errors'); 348 - case DifferentialUnitStatus::UNIT_SKIP: 349 - return pht('Unit Tests Skipped'); 350 - case DifferentialUnitStatus::UNIT_AUTO_SKIP: 351 - return pht( 352 - 'Automatic diff as part of commit; unit tests not applicable.'); 353 325 } 354 326 return pht('Unknown'); 355 327 }
+13
src/view/phui/PHUIColor.php
··· 1 + <?php 2 + 3 + final class PHUIColor extends Phobject { 4 + 5 + public static function getWebColorFromANSIColor($ansi_color) { 6 + $map = array( 7 + 'cyan' => 'sky', 8 + 'magenta' => 'pink', 9 + ); 10 + 11 + return idx($map, $ansi_color, $ansi_color); 12 + } 13 + }