@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 251 lines 7.3 kB view raw
1<?php 2 3final class DrydockBlueprintViewController extends DrydockBlueprintController { 4 5 public function handleRequest(AphrontRequest $request) { 6 $viewer = $request->getViewer(); 7 $id = $request->getURIData('id'); 8 9 $blueprint = id(new DrydockBlueprintQuery()) 10 ->setViewer($viewer) 11 ->withIDs(array($id)) 12 ->executeOne(); 13 if (!$blueprint) { 14 return new Aphront404Response(); 15 } 16 17 $title = $blueprint->getBlueprintName(); 18 19 $header = id(new PHUIHeaderView()) 20 ->setHeader($title) 21 ->setUser($viewer) 22 ->setPolicyObject($blueprint) 23 ->setHeaderIcon('fa-map-o'); 24 25 if ($blueprint->getIsDisabled()) { 26 $header->setStatus('fa-ban', 'red', pht('Disabled')); 27 } else { 28 $header->setStatus('fa-check', 'bluegrey', pht('Active')); 29 } 30 31 $curtain = $this->buildCurtain($blueprint); 32 $properties = $this->buildPropertyListView($blueprint); 33 34 $crumbs = $this->buildApplicationCrumbs(); 35 $crumbs->addTextCrumb(pht('Blueprint %d', $blueprint->getID())); 36 $crumbs->setBorder(true); 37 38 $field_list = PhabricatorCustomField::getObjectFields( 39 $blueprint, 40 PhabricatorCustomField::ROLE_VIEW); 41 $field_list 42 ->setViewer($viewer) 43 ->readFieldsFromStorage($blueprint); 44 45 $field_list->appendFieldsToPropertyList( 46 $blueprint, 47 $viewer, 48 $properties); 49 50 $resources = $this->buildResourceBox($blueprint); 51 $authorizations = $this->buildAuthorizationsBox($blueprint); 52 53 $timeline = $this->buildTransactionTimeline( 54 $blueprint, 55 new DrydockBlueprintTransactionQuery()); 56 $timeline->setShouldTerminate(true); 57 58 $log_query = id(new DrydockLogQuery()) 59 ->withBlueprintPHIDs(array($blueprint->getPHID())); 60 61 $log_table = $this->buildLogTable($log_query) 62 ->setHideBlueprints(true); 63 64 $logs = $this->buildLogBox( 65 $log_table, 66 $this->getApplicationURI("blueprint/{$id}/logs/query/all/")); 67 68 $view = id(new PHUITwoColumnView()) 69 ->setHeader($header) 70 ->setCurtain($curtain) 71 ->addPropertySection(pht('Properties'), $properties) 72 ->setMainColumn(array( 73 $resources, 74 $authorizations, 75 $logs, 76 $timeline, 77 )); 78 79 return $this->newPage() 80 ->setTitle($title) 81 ->setCrumbs($crumbs) 82 ->appendChild( 83 array( 84 $view, 85 )); 86 87 } 88 89 private function buildCurtain(DrydockBlueprint $blueprint) { 90 $viewer = $this->getViewer(); 91 $id = $blueprint->getID(); 92 93 $curtain = $this->newCurtainView($blueprint); 94 $edit_uri = $this->getApplicationURI("blueprint/edit/{$id}/"); 95 96 $can_edit = PhabricatorPolicyFilter::hasCapability( 97 $viewer, 98 $blueprint, 99 PhabricatorPolicyCapability::CAN_EDIT); 100 101 $curtain->addAction( 102 id(new PhabricatorActionView()) 103 ->setHref($edit_uri) 104 ->setName(pht('Edit Blueprint')) 105 ->setIcon('fa-pencil') 106 ->setWorkflow(!$can_edit) 107 ->setDisabled(!$can_edit)); 108 109 if (!$blueprint->getIsDisabled()) { 110 $disable_name = pht('Disable Blueprint'); 111 $disable_icon = 'fa-ban'; 112 $disable_uri = $this->getApplicationURI("blueprint/{$id}/disable/"); 113 } else { 114 $disable_name = pht('Enable Blueprint'); 115 $disable_icon = 'fa-check'; 116 $disable_uri = $this->getApplicationURI("blueprint/{$id}/enable/"); 117 } 118 119 $curtain->addAction( 120 id(new PhabricatorActionView()) 121 ->setHref($disable_uri) 122 ->setName($disable_name) 123 ->setIcon($disable_icon) 124 ->setWorkflow(true) 125 ->setDisabled(!$can_edit)); 126 127 return $curtain; 128 } 129 130 private function buildPropertyListView( 131 DrydockBlueprint $blueprint) { 132 $viewer = $this->getViewer(); 133 134 $view = id(new PHUIPropertyListView()) 135 ->setUser($viewer); 136 137 $view->addProperty( 138 pht('Type'), 139 $blueprint->getImplementation()->getBlueprintName()); 140 141 return $view; 142 } 143 144 private function buildResourceBox(DrydockBlueprint $blueprint) { 145 $viewer = $this->getViewer(); 146 147 $resources = id(new DrydockResourceQuery()) 148 ->setViewer($viewer) 149 ->withBlueprintPHIDs(array($blueprint->getPHID())) 150 ->withStatuses( 151 array( 152 DrydockResourceStatus::STATUS_PENDING, 153 DrydockResourceStatus::STATUS_ACTIVE, 154 )) 155 ->setLimit(100) 156 ->execute(); 157 158 $resource_list = id(new DrydockResourceListView()) 159 ->setUser($viewer) 160 ->setResources($resources) 161 ->render() 162 ->setNoDataString(pht('This blueprint has no active resources.')); 163 164 $id = $blueprint->getID(); 165 $resources_uri = "blueprint/{$id}/resources/query/all/"; 166 $resources_uri = $this->getApplicationURI($resources_uri); 167 168 $resource_header = id(new PHUIHeaderView()) 169 ->setHeader(pht('Active Resources')) 170 ->addActionLink( 171 id(new PHUIButtonView()) 172 ->setTag('a') 173 ->setHref($resources_uri) 174 ->setIcon('fa-search') 175 ->setText(pht('View All'))); 176 177 return id(new PHUIObjectBoxView()) 178 ->setHeader($resource_header) 179 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 180 ->setObjectList($resource_list); 181 } 182 183 private function buildAuthorizationsBox(DrydockBlueprint $blueprint) { 184 $viewer = $this->getViewer(); 185 186 $limit = 25; 187 188 // If there are pending authorizations against this blueprint, make sure 189 // we show them first. 190 191 $pending_authorizations = id(new DrydockAuthorizationQuery()) 192 ->setViewer($viewer) 193 ->withBlueprintPHIDs(array($blueprint->getPHID())) 194 ->withObjectStates( 195 array( 196 DrydockAuthorization::OBJECTAUTH_ACTIVE, 197 )) 198 ->withBlueprintStates( 199 array( 200 DrydockAuthorization::BLUEPRINTAUTH_REQUESTED, 201 )) 202 ->setLimit($limit) 203 ->execute(); 204 205 $all_authorizations = id(new DrydockAuthorizationQuery()) 206 ->setViewer($viewer) 207 ->withBlueprintPHIDs(array($blueprint->getPHID())) 208 ->withObjectStates( 209 array( 210 DrydockAuthorization::OBJECTAUTH_ACTIVE, 211 )) 212 ->withBlueprintStates( 213 array( 214 DrydockAuthorization::BLUEPRINTAUTH_REQUESTED, 215 DrydockAuthorization::BLUEPRINTAUTH_AUTHORIZED, 216 )) 217 ->setLimit($limit) 218 ->execute(); 219 220 $authorizations = 221 mpull($pending_authorizations, null, 'getPHID') + 222 mpull($all_authorizations, null, 'getPHID'); 223 224 $authorization_list = id(new DrydockAuthorizationListView()) 225 ->setUser($viewer) 226 ->setAuthorizations($authorizations) 227 ->setNoDataString( 228 pht('No objects have active authorizations to use this blueprint.')); 229 230 $id = $blueprint->getID(); 231 $authorizations_uri = "blueprint/{$id}/authorizations/query/all/"; 232 $authorizations_uri = $this->getApplicationURI($authorizations_uri); 233 234 $authorizations_header = id(new PHUIHeaderView()) 235 ->setHeader(pht('Active Authorizations')) 236 ->addActionLink( 237 id(new PHUIButtonView()) 238 ->setTag('a') 239 ->setHref($authorizations_uri) 240 ->setIcon('fa-search') 241 ->setText(pht('View All'))); 242 243 return id(new PHUIObjectBoxView()) 244 ->setHeader($authorizations_header) 245 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 246 ->setObjectList($authorization_list); 247 248 } 249 250 251}