@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<?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}