@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 157 lines 4.3 kB view raw
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}