@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 151 lines 4.2 kB view raw
1<?php 2 3final class AlmanacServiceViewController 4 extends AlmanacServiceController { 5 6 public function shouldAllowPublic() { 7 return true; 8 } 9 10 public function handleRequest(AphrontRequest $request) { 11 $viewer = $request->getViewer(); 12 13 $name = $request->getURIData('name'); 14 15 $service = id(new AlmanacServiceQuery()) 16 ->setViewer($viewer) 17 ->withNames(array($name)) 18 ->needProperties(true) 19 ->executeOne(); 20 if (!$service) { 21 return new Aphront404Response(); 22 } 23 24 $title = pht('Service %s', $service->getName()); 25 26 $curtain = $this->buildCurtain($service); 27 $details = $this->buildPropertySection($service); 28 29 $header = id(new PHUIHeaderView()) 30 ->setUser($viewer) 31 ->setHeader($service->getName()) 32 ->setPolicyObject($service) 33 ->setHeaderIcon('fa-plug'); 34 35 $issue = null; 36 if ($service->isClusterService()) { 37 $issue = $this->addClusterMessage( 38 pht('This is a cluster service.'), 39 pht( 40 'This service is a cluster service. You do not have permission to '. 41 'edit cluster services, so you can not edit this service.')); 42 } 43 44 $bindings = $this->buildBindingList($service); 45 46 $crumbs = $this->buildApplicationCrumbs(); 47 $crumbs->addTextCrumb($service->getName()); 48 $crumbs->setBorder(true); 49 50 $timeline = $this->buildTransactionTimeline( 51 $service, 52 new AlmanacServiceTransactionQuery()); 53 $timeline->setShouldTerminate(true); 54 55 $view = id(new PHUITwoColumnView()) 56 ->setHeader($header) 57 ->setCurtain($curtain) 58 ->setMainColumn(array( 59 $issue, 60 $details, 61 $bindings, 62 $this->buildAlmanacPropertiesTable($service), 63 $timeline, 64 )); 65 66 return $this->newPage() 67 ->setTitle($title) 68 ->setCrumbs($crumbs) 69 ->appendChild($view); 70 } 71 72 private function buildPropertySection( 73 AlmanacService $service) { 74 $viewer = $this->getViewer(); 75 76 $properties = id(new PHUIPropertyListView()) 77 ->setUser($viewer); 78 79 $properties->addProperty( 80 pht('Service Type'), 81 $service->getServiceImplementation()->getServiceTypeShortName()); 82 83 return id(new PHUIObjectBoxView()) 84 ->setHeaderText(pht('Details')) 85 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 86 ->appendChild($properties); 87 } 88 89 private function buildCurtain(AlmanacService $service) { 90 $viewer = $this->getViewer(); 91 92 $can_edit = PhabricatorPolicyFilter::hasCapability( 93 $viewer, 94 $service, 95 PhabricatorPolicyCapability::CAN_EDIT); 96 97 $id = $service->getID(); 98 $edit_uri = $this->getApplicationURI("service/edit/{$id}/"); 99 100 $curtain = $this->newCurtainView($service); 101 102 $curtain->addAction( 103 id(new PhabricatorActionView()) 104 ->setIcon('fa-pencil') 105 ->setName(pht('Edit Service')) 106 ->setHref($edit_uri) 107 ->setWorkflow(!$can_edit) 108 ->setDisabled(!$can_edit)); 109 110 return $curtain; 111 } 112 113 private function buildBindingList(AlmanacService $service) { 114 $viewer = $this->getViewer(); 115 $id = $service->getID(); 116 117 $can_edit = PhabricatorPolicyFilter::hasCapability( 118 $viewer, 119 $service, 120 PhabricatorPolicyCapability::CAN_EDIT); 121 122 $bindings = id(new AlmanacBindingQuery()) 123 ->setViewer($viewer) 124 ->withServicePHIDs(array($service->getPHID())) 125 ->execute(); 126 127 $table = id(new AlmanacBindingTableView()) 128 ->setNoDataString( 129 pht('This service has not been bound to any device interfaces yet.')) 130 ->setUser($viewer) 131 ->setBindings($bindings) 132 ->setHideServiceColumn(true); 133 134 $header = id(new PHUIHeaderView()) 135 ->setHeader(pht('Service Bindings')) 136 ->addActionLink( 137 id(new PHUIButtonView()) 138 ->setTag('a') 139 ->setHref($this->getApplicationURI("binding/edit/?serviceID={$id}")) 140 ->setWorkflow(!$can_edit) 141 ->setDisabled(!$can_edit) 142 ->setText(pht('Add Binding')) 143 ->setIcon('fa-plus')); 144 145 return id(new PHUIObjectBoxView()) 146 ->setHeader($header) 147 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 148 ->setTable($table); 149 } 150 151}