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

Add a "Remove flag" action to Herald

Summary: Fixes T13409. This is a companion to the existing "Mark with flag" rule.

Test Plan: Used a "remove flag" rule on an object with no flag (not removed), the right type of flag (removed), and a different type of flag (not removed).

Maniphest Tasks: T13409

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

+104 -14
+5 -1
src/__phutil_library_map__.php
··· 3438 3438 'PhabricatorFlagDeleteController' => 'applications/flag/controller/PhabricatorFlagDeleteController.php', 3439 3439 'PhabricatorFlagDestructionEngineExtension' => 'applications/flag/engineextension/PhabricatorFlagDestructionEngineExtension.php', 3440 3440 'PhabricatorFlagEditController' => 'applications/flag/controller/PhabricatorFlagEditController.php', 3441 + 'PhabricatorFlagHeraldAction' => 'applications/flag/herald/PhabricatorFlagHeraldAction.php', 3441 3442 'PhabricatorFlagListController' => 'applications/flag/controller/PhabricatorFlagListController.php', 3442 3443 'PhabricatorFlagQuery' => 'applications/flag/query/PhabricatorFlagQuery.php', 3444 + 'PhabricatorFlagRemoveFlagHeraldAction' => 'applications/flag/herald/PhabricatorFlagRemoveFlagHeraldAction.php', 3443 3445 'PhabricatorFlagSearchEngine' => 'applications/flag/query/PhabricatorFlagSearchEngine.php', 3444 3446 'PhabricatorFlagSelectControl' => 'applications/flag/view/PhabricatorFlagSelectControl.php', 3445 3447 'PhabricatorFlaggableInterface' => 'applications/flag/interface/PhabricatorFlaggableInterface.php', ··· 9799 9801 'PhabricatorFlagDAO', 9800 9802 'PhabricatorPolicyInterface', 9801 9803 ), 9802 - 'PhabricatorFlagAddFlagHeraldAction' => 'HeraldAction', 9804 + 'PhabricatorFlagAddFlagHeraldAction' => 'PhabricatorFlagHeraldAction', 9803 9805 'PhabricatorFlagColor' => 'PhabricatorFlagConstants', 9804 9806 'PhabricatorFlagConstants' => 'Phobject', 9805 9807 'PhabricatorFlagController' => 'PhabricatorController', ··· 9807 9809 'PhabricatorFlagDeleteController' => 'PhabricatorFlagController', 9808 9810 'PhabricatorFlagDestructionEngineExtension' => 'PhabricatorDestructionEngineExtension', 9809 9811 'PhabricatorFlagEditController' => 'PhabricatorFlagController', 9812 + 'PhabricatorFlagHeraldAction' => 'HeraldAction', 9810 9813 'PhabricatorFlagListController' => 'PhabricatorFlagController', 9811 9814 'PhabricatorFlagQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 9815 + 'PhabricatorFlagRemoveFlagHeraldAction' => 'PhabricatorFlagHeraldAction', 9812 9816 'PhabricatorFlagSearchEngine' => 'PhabricatorApplicationSearchEngine', 9813 9817 'PhabricatorFlagSelectControl' => 'AphrontFormControl', 9814 9818 'PhabricatorFlaggableInterface' => 'PhabricatorPHIDInterface',
+2 -13
src/applications/flag/herald/PhabricatorFlagAddFlagHeraldAction.php
··· 1 1 <?php 2 2 3 - final class PhabricatorFlagAddFlagHeraldAction extends HeraldAction { 3 + final class PhabricatorFlagAddFlagHeraldAction 4 + extends PhabricatorFlagHeraldAction { 4 5 5 6 const ACTIONCONST = 'flag'; 6 7 ··· 9 10 10 11 public function getHeraldActionName() { 11 12 return pht('Mark with flag'); 12 - } 13 - 14 - public function getActionGroupKey() { 15 - return HeraldSupportActionGroup::ACTIONGROUPKEY; 16 - } 17 - 18 - public function supportsObject($object) { 19 - return ($object instanceof PhabricatorFlaggableInterface); 20 - } 21 - 22 - public function supportsRuleType($rule_type) { 23 - return ($rule_type == HeraldRuleTypeConfig::RULE_TYPE_PERSONAL); 24 13 } 25 14 26 15 public function applyEffect($object, HeraldEffect $effect) {
+18
src/applications/flag/herald/PhabricatorFlagHeraldAction.php
··· 1 + <?php 2 + 3 + abstract class PhabricatorFlagHeraldAction 4 + extends HeraldAction { 5 + 6 + public function getActionGroupKey() { 7 + return HeraldSupportActionGroup::ACTIONGROUPKEY; 8 + } 9 + 10 + public function supportsObject($object) { 11 + return ($object instanceof PhabricatorFlaggableInterface); 12 + } 13 + 14 + public function supportsRuleType($rule_type) { 15 + return ($rule_type === HeraldRuleTypeConfig::RULE_TYPE_PERSONAL); 16 + } 17 + 18 + }
+79
src/applications/flag/herald/PhabricatorFlagRemoveFlagHeraldAction.php
··· 1 + <?php 2 + 3 + final class PhabricatorFlagRemoveFlagHeraldAction 4 + extends PhabricatorFlagHeraldAction { 5 + 6 + const ACTIONCONST = 'unflag'; 7 + 8 + const DO_UNFLAG = 'do.unflag'; 9 + const DO_IGNORE_UNFLAG = 'do.ignore-unflag'; 10 + 11 + public function getHeraldActionName() { 12 + return pht('Remove flag'); 13 + } 14 + 15 + public function applyEffect($object, HeraldEffect $effect) { 16 + $phid = $this->getAdapter()->getPHID(); 17 + $rule = $effect->getRule(); 18 + $author = $rule->getAuthor(); 19 + 20 + $flag = PhabricatorFlagQuery::loadUserFlag($author, $phid); 21 + if (!$flag) { 22 + $this->logEffect(self::DO_IGNORE_UNFLAG, null); 23 + return; 24 + } 25 + 26 + if ($flag->getColor() !== $effect->getTarget()) { 27 + $this->logEffect(self::DO_IGNORE_UNFLAG, $flag->getColor()); 28 + return; 29 + } 30 + 31 + $flag->delete(); 32 + 33 + $this->logEffect(self::DO_UNFLAG, $flag->getColor()); 34 + } 35 + 36 + public function getHeraldActionValueType() { 37 + return id(new HeraldSelectFieldValue()) 38 + ->setKey('flag.color') 39 + ->setOptions(PhabricatorFlagColor::getColorNameMap()) 40 + ->setDefault(PhabricatorFlagColor::COLOR_BLUE); 41 + } 42 + 43 + protected function getActionEffectMap() { 44 + return array( 45 + self::DO_IGNORE_UNFLAG => array( 46 + 'icon' => 'fa-times', 47 + 'color' => 'grey', 48 + 'name' => pht('Did Not Remove Flag'), 49 + ), 50 + self::DO_UNFLAG => array( 51 + 'icon' => 'fa-flag', 52 + 'name' => pht('Removed Flag'), 53 + ), 54 + ); 55 + } 56 + 57 + public function renderActionDescription($value) { 58 + $color = PhabricatorFlagColor::getColorName($value); 59 + return pht('Remove %s flag.', $color); 60 + } 61 + 62 + protected function renderActionEffectDescription($type, $data) { 63 + switch ($type) { 64 + case self::DO_IGNORE_UNFLAG: 65 + if (!$data) { 66 + return pht('Not marked with any flag.'); 67 + } else { 68 + return pht( 69 + 'Marked with flag of the wrong color ("%s").', 70 + PhabricatorFlagColor::getColorName($data)); 71 + } 72 + case self::DO_UNFLAG: 73 + return pht( 74 + 'Removed "%s" flag.', 75 + PhabricatorFlagColor::getColorName($data)); 76 + } 77 + } 78 + 79 + }