@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
3final class HeraldRuleViewController extends HeraldController {
4
5 public function shouldAllowPublic() {
6 return true;
7 }
8
9 public function handleRequest(AphrontRequest $request) {
10 $viewer = $request->getViewer();
11 $id = $request->getURIData('id');
12
13 $rule = id(new HeraldRuleQuery())
14 ->setViewer($viewer)
15 ->withIDs(array($id))
16 ->needConditionsAndActions(true)
17 ->needValidateAuthors(true)
18 ->executeOne();
19 if (!$rule) {
20 return new Aphront404Response();
21 }
22
23 $header = id(new PHUIHeaderView())
24 ->setUser($viewer)
25 ->setHeader($rule->getName())
26 ->setPolicyObject($rule)
27 ->setHeaderIcon('fa-bullhorn');
28
29 if ($rule->getIsDisabled()) {
30 $header->setStatus('fa-ban', 'red', pht('Disabled'));
31 } else if (!$rule->hasValidAuthor()) {
32 $header->setStatus('fa-user', 'red', pht('Author Not Active'));
33 } else {
34 $header->setStatus('fa-check', 'bluegrey', pht('Active'));
35 }
36
37 $curtain = $this->buildCurtain($rule);
38 $details = $this->buildPropertySectionView($rule);
39 $description = $this->buildDescriptionView($rule);
40
41 $id = $rule->getID();
42
43 $crumbs = $this->buildApplicationCrumbs();
44 $crumbs->addTextCrumb("H{$id}");
45 $crumbs->setBorder(true);
46
47 $timeline = $this->buildTransactionTimeline(
48 $rule,
49 new HeraldTransactionQuery());
50 $timeline->setShouldTerminate(true);
51
52 $title = $rule->getName();
53
54 $view = id(new PHUITwoColumnView())
55 ->setHeader($header)
56 ->setCurtain($curtain)
57 ->setMainColumn($timeline)
58 ->addPropertySection(pht('Details'), $details)
59 ->addPropertySection(pht('Description'), $description);
60
61 return $this->newPage()
62 ->setTitle($title)
63 ->setCrumbs($crumbs)
64 ->appendChild($view);
65 }
66
67 private function buildCurtain(HeraldRule $rule) {
68 $viewer = $this->getViewer();
69
70 $id = $rule->getID();
71
72 $can_edit = PhabricatorPolicyFilter::hasCapability(
73 $viewer,
74 $rule,
75 PhabricatorPolicyCapability::CAN_EDIT);
76
77 $curtain = $this->newCurtainView($rule);
78
79 $curtain->addAction(
80 id(new PhabricatorActionView())
81 ->setName(pht('Edit Rule'))
82 ->setHref($this->getApplicationURI("edit/{$id}/"))
83 ->setIcon('fa-pencil')
84 ->setDisabled(!$can_edit)
85 ->setWorkflow(!$can_edit));
86
87 if ($rule->getIsDisabled()) {
88 $disable_uri = "disable/{$id}/enable/";
89 $disable_icon = 'fa-check';
90 $disable_name = pht('Enable Rule');
91 } else {
92 $disable_uri = "disable/{$id}/disable/";
93 $disable_icon = 'fa-ban';
94 $disable_name = pht('Disable Rule');
95 }
96
97 $curtain->addAction(
98 id(new PhabricatorActionView())
99 ->setHref($this->getApplicationURI($disable_uri))
100 ->setIcon($disable_icon)
101 ->setName($disable_name)
102 ->setDisabled(!$can_edit)
103 ->setWorkflow(true));
104
105 return $curtain;
106 }
107
108 private function buildPropertySectionView(
109 HeraldRule $rule) {
110
111 $viewer = $this->getRequest()->getUser();
112 $view = id(new PHUIPropertyListView())
113 ->setUser($viewer);
114
115 $view->addProperty(
116 pht('Rule Type'),
117 idx(HeraldRuleTypeConfig::getRuleTypeMap(), $rule->getRuleType()));
118
119 if ($rule->isPersonalRule()) {
120 $view->addProperty(
121 pht('Author'),
122 $viewer->renderHandle($rule->getAuthorPHID()));
123 }
124
125 $adapter = HeraldAdapter::getAdapterForContentType($rule->getContentType());
126 if ($adapter) {
127 $view->addProperty(
128 pht('Applies To'),
129 idx(
130 HeraldAdapter::getEnabledAdapterMap($viewer),
131 $rule->getContentType()));
132
133 if ($rule->isObjectRule()) {
134 $view->addProperty(
135 pht('Trigger Object'),
136 $viewer->renderHandle($rule->getTriggerObjectPHID()));
137 }
138 }
139
140 return $view;
141 }
142
143 private function buildDescriptionView(HeraldRule $rule) {
144 $viewer = $this->getRequest()->getUser();
145 $view = id(new PHUIPropertyListView())
146 ->setViewer($viewer);
147
148 $adapter = HeraldAdapter::getAdapterForContentType($rule->getContentType());
149 if ($adapter) {
150 $rule_text = $adapter->renderRuleAsText($rule, $viewer);
151 $view->addTextContent($rule_text);
152 return $view;
153 }
154 return null;
155 }
156
157}