diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index f52d57350c..6dcb395cbb 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -629,6 +629,7 @@ phutil_register_library_map(array( 'HeraldInvalidActionException' => 'applications/herald/engine/exception/HeraldInvalidActionException.php', 'HeraldInvalidConditionException' => 'applications/herald/engine/exception/HeraldInvalidConditionException.php', 'HeraldInvalidFieldException' => 'applications/herald/engine/exception/HeraldInvalidFieldException.php', + 'HeraldManiphestTaskAdapter' => 'applications/herald/adapter/HeraldManiphestTaskAdapter.php', 'HeraldNewController' => 'applications/herald/controller/HeraldNewController.php', 'HeraldObjectTranscript' => 'applications/herald/storage/transcript/HeraldObjectTranscript.php', 'HeraldPHIDTypeRule' => 'applications/herald/phid/HeraldPHIDTypeRule.php', @@ -2692,6 +2693,7 @@ phutil_register_library_map(array( 'HeraldInvalidActionException' => 'Exception', 'HeraldInvalidConditionException' => 'Exception', 'HeraldInvalidFieldException' => 'Exception', + 'HeraldManiphestTaskAdapter' => 'HeraldAdapter', 'HeraldNewController' => 'HeraldController', 'HeraldPHIDTypeRule' => 'PhabricatorPHIDType', 'HeraldPholioMockAdapter' => 'HeraldAdapter', diff --git a/src/applications/herald/adapter/HeraldManiphestTaskAdapter.php b/src/applications/herald/adapter/HeraldManiphestTaskAdapter.php new file mode 100644 index 0000000000..5f0c83440e --- /dev/null +++ b/src/applications/herald/adapter/HeraldManiphestTaskAdapter.php @@ -0,0 +1,114 @@ +task = $task; + return $this; + } + public function getTask() { + return $this->task; + } + + private function setCcPHIDs(array $cc_phids) { + $this->ccPHIDs = $cc_phids; + return $this; + } + public function getCcPHIDs() { + return $this->ccPHIDs; + } + + public function getAdapterContentName() { + return pht('Maniphest Tasks'); + } + + public function getFields() { + return array( + self::FIELD_TITLE, + self::FIELD_BODY, + self::FIELD_AUTHOR, + self::FIELD_CC, + ); + } + + public function getActions($rule_type) { + switch ($rule_type) { + case HeraldRuleTypeConfig::RULE_TYPE_GLOBAL: + return array( + self::ACTION_ADD_CC, + self::ACTION_NOTHING, + ); + case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: + return array( + self::ACTION_ADD_CC, + self::ACTION_FLAG, + self::ACTION_NOTHING, + ); + } + } + + public function getPHID() { + return $this->getTask()->getPHID(); + } + + public function getHeraldName() { + return 'T'.$this->getTask()->getID(); + } + + public function getHeraldField($field) { + switch ($field) { + case self::FIELD_TITLE: + return $this->getTask()->getTitle(); + case self::FIELD_BODY: + return $this->getTask()->getDescription(); + case self::FIELD_AUTHOR: + return $this->getTask()->getAuthorPHID(); + case self::FIELD_CC: + return $this->getTask()->getCCPHIDs(); + } + + return parent::getHeraldField($field); + } + + public function applyHeraldEffects(array $effects) { + assert_instances_of($effects, 'HeraldEffect'); + + $result = array(); + foreach ($effects as $effect) { + $action = $effect->getAction(); + switch ($action) { + case self::ACTION_NOTHING: + $result[] = new HeraldApplyTranscript( + $effect, + true, + pht('Great success at doing nothing.')); + break; + case self::ACTION_ADD_CC: + $add_cc = array(); + foreach ($effect->getTarget() as $phid) { + $add_cc[$phid] = true; + } + $this->setCcPHIDs(array_keys($add_cc)); + $result[] = new HeraldApplyTranscript( + $effect, + true, + pht('Added address to cc list.')); + break; + case self::ACTION_FLAG: + $result[] = parent::applyFlagEffect( + $effect, + $this->getTask()->getPHID()); + break; + default: + throw new Exception("No rules to handle action '{$action}'."); + } + } + return $result; + } +} diff --git a/src/applications/maniphest/editor/ManiphestTransactionEditorPro.php b/src/applications/maniphest/editor/ManiphestTransactionEditorPro.php index 377d693f08..65f9888991 100644 --- a/src/applications/maniphest/editor/ManiphestTransactionEditorPro.php +++ b/src/applications/maniphest/editor/ManiphestTransactionEditorPro.php @@ -189,4 +189,30 @@ final class ManiphestTransactionEditorPro return true; } + protected function supportsHerald() { + return true; + } + + protected function buildHeraldAdapter( + PhabricatorLiskDAO $object, + array $xactions) { + + return id(new HeraldManiphestTaskAdapter()) + ->setTask($object); + } + + protected function didApplyHeraldRules( + PhabricatorLiskDAO $object, + HeraldAdapter $adapter, + HeraldTranscript $transcript) { + + $cc_phids = $adapter->getCcPHIDs(); + if ($cc_phids) { + $existing_cc = $object->getCCPHIDs(); + $new_cc = array_unique(array_merge($cc_phids, $existing_cc)); + $object->setCCPHIDs($new_cc); + $object->save(); + } + } + }