@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 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}