@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 recaptime-dev/main 179 lines 5.0 kB view raw
1<?php 2 3final class FundInitiativeViewController 4 extends FundController { 5 6 public function shouldAllowPublic() { 7 return true; 8 } 9 10 public function handleRequest(AphrontRequest $request) { 11 $viewer = $request->getViewer(); 12 $id = $request->getURIData('id'); 13 14 $initiative = id(new FundInitiativeQuery()) 15 ->setViewer($viewer) 16 ->withIDs(array($id)) 17 ->executeOne(); 18 if (!$initiative) { 19 return new Aphront404Response(); 20 } 21 22 $crumbs = $this->buildApplicationCrumbs(); 23 $crumbs->addTextCrumb($initiative->getMonogram()); 24 $crumbs->setBorder(true); 25 26 $title = pht( 27 '%s %s', 28 $initiative->getMonogram(), 29 $initiative->getName()); 30 31 if ($initiative->isClosed()) { 32 $status_icon = 'fa-ban'; 33 $status_color = 'indigo'; 34 } else { 35 $status_icon = 'fa-check'; 36 $status_color = 'bluegrey'; 37 } 38 $status_name = idx( 39 FundInitiative::getStatusNameMap(), 40 $initiative->getStatus()); 41 42 $header = id(new PHUIHeaderView()) 43 ->setHeader($initiative->getName()) 44 ->setUser($viewer) 45 ->setPolicyObject($initiative) 46 ->setStatus($status_icon, $status_color, $status_name) 47 ->setHeaderIcon('fa-heart'); 48 49 $curtain = $this->buildCurtain($initiative); 50 $details = $this->buildPropertySectionView($initiative); 51 52 $timeline = $this->buildTransactionTimeline( 53 $initiative, 54 new FundInitiativeTransactionQuery()); 55 $timeline->setQuoteRef($initiative->getMonogram()); 56 57 $comment_view = $this->buildCommentForm($initiative, $timeline); 58 59 $view = id(new PHUITwoColumnView()) 60 ->setHeader($header) 61 ->setCurtain($curtain) 62 ->setMainColumn(array( 63 $timeline, 64 $comment_view, 65 )) 66 ->addPropertySection(pht('Details'), $details); 67 68 return $this->newPage() 69 ->setTitle($title) 70 ->setCrumbs($crumbs) 71 ->setPageObjectPHIDs(array($initiative->getPHID())) 72 ->appendChild($view); 73 } 74 75 private function buildPropertySectionView(FundInitiative $initiative) { 76 $viewer = $this->getRequest()->getUser(); 77 78 $view = id(new PHUIPropertyListView()) 79 ->setUser($viewer); 80 81 $owner_phid = $initiative->getOwnerPHID(); 82 $merchant_phid = $initiative->getMerchantPHID(); 83 84 $view->addProperty( 85 pht('Owner'), 86 $viewer->renderHandle($owner_phid)); 87 88 $view->addProperty( 89 pht('Payable to Merchant'), 90 $viewer->renderHandle($merchant_phid)); 91 92 $view->addProperty( 93 pht('Total Funding'), 94 $initiative->getTotalAsCurrency()->formatForDisplay()); 95 96 $description = $initiative->getDescription(); 97 if (strlen($description)) { 98 $description = new PHUIRemarkupView($viewer, $description); 99 $view->addSectionHeader( 100 pht('Description'), PHUIPropertyListView::ICON_SUMMARY); 101 $view->addTextContent($description); 102 } 103 104 $risks = $initiative->getRisks(); 105 if (strlen($risks)) { 106 $risks = new PHUIRemarkupView($viewer, $risks); 107 $view->addSectionHeader( 108 pht('Risks/Challenges'), 'fa-ambulance'); 109 $view->addTextContent($risks); 110 } 111 112 return $view; 113 } 114 115 private function buildCurtain(FundInitiative $initiative) { 116 $viewer = $this->getViewer(); 117 118 $id = $initiative->getID(); 119 120 $can_edit = PhabricatorPolicyFilter::hasCapability( 121 $viewer, 122 $initiative, 123 PhabricatorPolicyCapability::CAN_EDIT); 124 125 $curtain = $this->newCurtainView($initiative); 126 127 $curtain->addAction( 128 id(new PhabricatorActionView()) 129 ->setName(pht('Edit Initiative')) 130 ->setIcon('fa-pencil') 131 ->setDisabled(!$can_edit) 132 ->setWorkflow(!$can_edit) 133 ->setHref($this->getApplicationURI("/edit/{$id}/"))); 134 135 if ($initiative->isClosed()) { 136 $close_name = pht('Reopen Initiative'); 137 $close_icon = 'fa-check'; 138 } else { 139 $close_name = pht('Close Initiative'); 140 $close_icon = 'fa-times'; 141 } 142 143 $curtain->addAction( 144 id(new PhabricatorActionView()) 145 ->setName($close_name) 146 ->setIcon($close_icon) 147 ->setDisabled(!$can_edit) 148 ->setWorkflow(true) 149 ->setHref($this->getApplicationURI("/close/{$id}/"))); 150 151 $curtain->addAction( 152 id(new PhabricatorActionView()) 153 ->setName(pht('Back Initiative')) 154 ->setIcon('fa-money') 155 ->setDisabled($initiative->isClosed()) 156 ->setWorkflow(true) 157 ->setHref($this->getApplicationURI("/back/{$id}/"))); 158 159 $curtain->addAction( 160 id(new PhabricatorActionView()) 161 ->setName(pht('View Backers')) 162 ->setIcon('fa-university') 163 ->setHref($this->getApplicationURI("/backers/{$id}/"))); 164 165 return $curtain; 166 } 167 168 private function buildCommentForm(FundInitiative $initiative, $timeline) { 169 $viewer = $this->getViewer(); 170 $box = id(new FundInitiativeEditEngine()) 171 ->setViewer($viewer) 172 ->buildEditEngineCommentView($initiative) 173 ->setTransactionTimeline($timeline); 174 175 return $box; 176 } 177 178 179}