@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
at upstream/main 127 lines 3.3 kB view raw
1<?php 2 3/** 4 * Trigger Rule that Removes Subscribers 5 * 6 * This may be useful to have a column that simplify 7 * Task handovers. You can remove both Users or Project Tags 8 * from the list of Task Subscribers. 9 * 10 * This class was adapted from these classes: 11 * - PhabricatorProjectTriggerRemoveProjectsRule 12 * - PhabricatorProjectTriggerManiphestOwnerRule 13 * 14 * https://we.phorge.it/T15162 15 */ 16final class PhabricatorProjectTriggerRemoveSubscribersRule 17 extends PhabricatorProjectTriggerRule { 18 19 const TRIGGERTYPE = 'task.subscriber.remove'; 20 21 public function getSelectControlName() { 22 return pht('Remove subscribers'); 23 } 24 25 protected function getValueForEditorField() { 26 return $this->getDatasource()->getWireTokens($this->getValue()); 27 } 28 29 protected function assertValidRuleRecordFormat($value) { 30 if (!is_array($value)) { 31 throw new Exception( 32 pht( 33 'Remove subscribers rule value should be a list, but is not '. 34 '(value is "%s").', 35 phutil_describe_type($value))); 36 } 37 } 38 39 protected function assertValidRuleRecordValue($value) { 40 if (!$value) { 41 throw new Exception( 42 pht( 43 'You must select at least one user or project tag to remove.')); 44 } 45 } 46 47 protected function newDropTransactions($object, $value) { 48 $subscriber_edge_type = PhabricatorObjectHasSubscriberEdgeType::EDGECONST; 49 50 $xaction = $object->getApplicationTransactionTemplate() 51 ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) 52 ->setMetadataValue('edge:type', $subscriber_edge_type) 53 ->setNewValue( 54 array( 55 '-' => array_fuse($value), 56 )); 57 58 return array($xaction); 59 } 60 61 protected function newDropEffects($value) { 62 return array( 63 $this->newEffect() 64 ->setIcon('fa-briefcase') 65 ->setContent($this->getRuleViewDescription($value)), 66 ); 67 } 68 69 protected function getDefaultValue() { 70 return null; 71 } 72 73 protected function getPHUIXControlType() { 74 return 'tokenizer'; 75 } 76 77 private function getDatasource() { 78 $datasource = new PhabricatorProjectOrUserDatasource(); 79 80 if ($this->getViewer()) { 81 $datasource->setViewer($this->getViewer()); 82 } 83 84 return $datasource; 85 } 86 87 protected function getPHUIXControlSpecification() { 88 $template = id(new AphrontTokenizerTemplateView()) 89 ->setViewer($this->getViewer()); 90 91 $template_markup = $template->render(); 92 $datasource = $this->getDatasource(); 93 94 return array( 95 'markup' => (string)hsprintf('%s', $template_markup), 96 'config' => array( 97 'src' => $datasource->getDatasourceURI(), 98 'browseURI' => $datasource->getBrowseURI(), 99 'placeholder' => $datasource->getPlaceholderText(), 100 'limit' => $datasource->getLimit(), 101 ), 102 'value' => null, 103 ); 104 } 105 106 public function getRuleViewLabel() { 107 return pht('Remove subscribers'); 108 } 109 110 public function getRuleViewDescription($value) { 111 return pht( 112 'Remove subscribers: %s.', 113 phutil_tag( 114 'strong', 115 array(), 116 $this->getViewer() 117 ->renderHandleList($value) 118 ->setAsInline(true) 119 ->render())); 120 } 121 122 public function getRuleViewIcon($value) { 123 return id(new PHUIIconView()) 124 ->setIcon('fa-users', 'red'); 125 } 126 127}