@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 trigger rule for adding projects to a task

Summary: Ref T13269. This is mostly copying code from the similar Herald implementation. Note that the drop effect preview always renders because we don't have the infrastructure to compare lists of edge targets.

Test Plan: Created some triggers, dragged some tasks around, checked that tasks that already had project membership didn't write additional edges.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Maniphest Tasks: T13269

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

+106 -1
+2
src/__phutil_library_map__.php
··· 4208 4208 'PhabricatorProjectTransactionQuery' => 'applications/project/query/PhabricatorProjectTransactionQuery.php', 4209 4209 'PhabricatorProjectTransactionType' => 'applications/project/xaction/PhabricatorProjectTransactionType.php', 4210 4210 'PhabricatorProjectTrigger' => 'applications/project/storage/PhabricatorProjectTrigger.php', 4211 + 'PhabricatorProjectTriggerAddProjectsRule' => 'applications/project/trigger/PhabricatorProjectTriggerAddProjectsRule.php', 4211 4212 'PhabricatorProjectTriggerController' => 'applications/project/controller/trigger/PhabricatorProjectTriggerController.php', 4212 4213 'PhabricatorProjectTriggerCorruptionException' => 'applications/project/exception/PhabricatorProjectTriggerCorruptionException.php', 4213 4214 'PhabricatorProjectTriggerEditController' => 'applications/project/controller/trigger/PhabricatorProjectTriggerEditController.php', ··· 10383 10384 'PhabricatorIndexableInterface', 10384 10385 'PhabricatorDestructibleInterface', 10385 10386 ), 10387 + 'PhabricatorProjectTriggerAddProjectsRule' => 'PhabricatorProjectTriggerRule', 10386 10388 'PhabricatorProjectTriggerController' => 'PhabricatorProjectController', 10387 10389 'PhabricatorProjectTriggerCorruptionException' => 'Exception', 10388 10390 'PhabricatorProjectTriggerEditController' => 'PhabricatorProjectTriggerController',
+103
src/applications/project/trigger/PhabricatorProjectTriggerAddProjectsRule.php
··· 1 + <?php 2 + 3 + final class PhabricatorProjectTriggerAddProjectsRule 4 + extends PhabricatorProjectTriggerRule { 5 + 6 + const TRIGGERTYPE = 'task.projects.add'; 7 + 8 + public function getSelectControLname() { 9 + return pht('Add projects'); 10 + } 11 + 12 + protected function getValueForEditorField() { 13 + return $this->getDatasource()->getWireTokens($this->getValue()); 14 + } 15 + 16 + protected function assertValidRuleValue($value) { 17 + if (!is_array($value)) { 18 + throw new Exception( 19 + pht( 20 + 'Add project rule value should be a list, but is not '. 21 + '(value is "%s").', 22 + phutil_describe_type($value))); 23 + } 24 + } 25 + 26 + protected function newDropTransactions($object, $value) { 27 + $project_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST; 28 + 29 + $xaction = $object->getApplicationTransactionTemplate() 30 + ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) 31 + ->setMetadataValue('edge:type', $project_edge_type) 32 + ->setNewValue( 33 + array( 34 + '+' => array_fuse($value), 35 + )); 36 + 37 + return array($xaction); 38 + } 39 + 40 + protected function newDropEffects($value) { 41 + return array( 42 + $this->newEffect() 43 + ->setIcon('fa-briefcase') 44 + ->setContent($this->getRuleViewDescription($value)), 45 + ); 46 + } 47 + 48 + protected function getDefaultValue() { 49 + return null; 50 + } 51 + 52 + protected function getPHUIXControlType() { 53 + return 'tokenizer'; 54 + } 55 + 56 + private function getDatasource() { 57 + return id(new PhabricatorProjectDatasource()) 58 + ->setViewer($this->getViewer()); 59 + } 60 + 61 + protected function getPHUIXControlSpecification() { 62 + $template = id(new AphrontTokenizerTemplateView()) 63 + ->setViewer($this->getViewer()); 64 + 65 + $template_markup = $template->render(); 66 + $datasource = $this->getDatasource(); 67 + 68 + return array( 69 + 'markup' => (string)hsprintf('%s', $template_markup), 70 + 'config' => array( 71 + 'src' => $datasource->getDatasourceURI(), 72 + 'browseURI' => $datasource->getBrowseURI(), 73 + 'placeholder' => $datasource->getPlaceholderText(), 74 + 'limit' => $datasource->getLimit(), 75 + ), 76 + 'value' => null, 77 + ); 78 + } 79 + 80 + public function getRuleViewLabel() { 81 + return pht('Add Projects'); 82 + } 83 + 84 + public function getRuleViewDescription($value) { 85 + return pht( 86 + 'Add projects: %s.', 87 + phutil_tag( 88 + 'strong', 89 + array(), 90 + $this->getViewer() 91 + ->renderHandleList($value) 92 + ->setAsInline(true) 93 + ->render())); 94 + } 95 + 96 + public function getRuleViewIcon($value) { 97 + return id(new PHUIIconView()) 98 + ->setIcon('fa-briefcase', 'green'); 99 + } 100 + 101 + 102 + 103 + }
+1 -1
src/applications/project/trigger/PhabricatorProjectTriggerManiphestOwnerRule.php
··· 66 66 return 'tokenizer'; 67 67 } 68 68 69 - protected function getDatasource() { 69 + private function getDatasource() { 70 70 $datasource = id(new ManiphestAssigneeDatasource()) 71 71 ->setLimit(1); 72 72