Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/drydock/controller/DrydockResourceViewController.php
12256 views
1
<?php
2
3
final class DrydockResourceViewController extends DrydockResourceController {
4
5
public function handleRequest(AphrontRequest $request) {
6
$viewer = $request->getViewer();
7
$id = $request->getURIData('id');
8
9
$resource = id(new DrydockResourceQuery())
10
->setViewer($viewer)
11
->withIDs(array($id))
12
->needUnconsumedCommands(true)
13
->executeOne();
14
if (!$resource) {
15
return new Aphront404Response();
16
}
17
18
$title = pht(
19
'Resource %s %s',
20
$resource->getID(),
21
$resource->getResourceName());
22
23
$header = id(new PHUIHeaderView())
24
->setUser($viewer)
25
->setPolicyObject($resource)
26
->setHeader($title)
27
->setHeaderIcon('fa-map')
28
->setStatus(
29
$resource->getStatusIcon(),
30
$resource->getStatusColor(),
31
$resource->getStatusDisplayName());
32
33
if ($resource->isReleasing()) {
34
$header->addTag(
35
id(new PHUITagView())
36
->setType(PHUITagView::TYPE_SHADE)
37
->setIcon('fa-exclamation-triangle')
38
->setColor('red')
39
->setName('Releasing'));
40
}
41
42
$curtain = $this->buildCurtain($resource);
43
$properties = $this->buildPropertyListView($resource);
44
45
$id = $resource->getID();
46
$resource_uri = $this->getApplicationURI("resource/{$id}/");
47
48
$log_query = id(new DrydockLogQuery())
49
->withResourcePHIDs(array($resource->getPHID()));
50
51
$log_table = $this->buildLogTable($log_query)
52
->setHideResources(true);
53
54
$logs = $this->buildLogBox(
55
$log_table,
56
$this->getApplicationURI("resource/{$id}/logs/query/all/"));
57
58
$crumbs = $this->buildApplicationCrumbs();
59
$crumbs->addTextCrumb(pht('Resource %d', $resource->getID()));
60
$crumbs->setBorder(true);
61
62
$locks = $this->buildLocksTab($resource->getPHID());
63
$commands = $this->buildCommandsTab($resource->getPHID());
64
65
$tab_group = id(new PHUITabGroupView())
66
->addTab(
67
id(new PHUITabView())
68
->setName(pht('Properties'))
69
->setKey('properties')
70
->appendChild($properties))
71
->addTab(
72
id(new PHUITabView())
73
->setName(pht('Slot Locks'))
74
->setKey('locks')
75
->appendChild($locks))
76
->addTab(
77
id(new PHUITabView())
78
->setName(pht('Commands'))
79
->setKey('commands')
80
->appendChild($commands));
81
82
$object_box = id(new PHUIObjectBoxView())
83
->setHeaderText(pht('Properties'))
84
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
85
->addTabGroup($tab_group);
86
87
$lease_box = $this->buildLeaseBox($resource);
88
89
$view = id(new PHUITwoColumnView())
90
->setHeader($header)
91
->setCurtain($curtain)
92
->setMainColumn(
93
array(
94
$object_box,
95
$lease_box,
96
$logs,
97
));
98
99
return $this->newPage()
100
->setTitle($title)
101
->setCrumbs($crumbs)
102
->appendChild(
103
array(
104
$view,
105
));
106
107
}
108
109
private function buildCurtain(DrydockResource $resource) {
110
$viewer = $this->getViewer();
111
112
$curtain = $this->newCurtainView($resource);
113
114
$can_release = $resource->canRelease();
115
if ($resource->isReleasing()) {
116
$can_release = false;
117
}
118
119
$can_edit = PhabricatorPolicyFilter::hasCapability(
120
$viewer,
121
$resource,
122
PhabricatorPolicyCapability::CAN_EDIT);
123
124
$uri = '/resource/'.$resource->getID().'/release/';
125
$uri = $this->getApplicationURI($uri);
126
127
$curtain->addAction(
128
id(new PhabricatorActionView())
129
->setHref($uri)
130
->setName(pht('Release Resource'))
131
->setIcon('fa-times')
132
->setWorkflow(true)
133
->setDisabled(!$can_release || !$can_edit));
134
135
return $curtain;
136
}
137
138
private function buildPropertyListView(
139
DrydockResource $resource) {
140
$viewer = $this->getViewer();
141
142
$view = new PHUIPropertyListView();
143
144
$until = $resource->getUntil();
145
if ($until) {
146
$until_display = phabricator_datetime($until, $viewer);
147
} else {
148
$until_display = phutil_tag('em', array(), pht('Never'));
149
}
150
$view->addProperty(pht('Expires'), $until_display);
151
152
$view->addProperty(
153
pht('Resource Type'),
154
$resource->getType());
155
156
$view->addProperty(
157
pht('Blueprint'),
158
$viewer->renderHandle($resource->getBlueprintPHID()));
159
160
$attributes = $resource->getAttributes();
161
if ($attributes) {
162
$view->addSectionHeader(
163
pht('Attributes'), 'fa-list-ul');
164
foreach ($attributes as $key => $value) {
165
$view->addProperty($key, $value);
166
}
167
}
168
169
return $view;
170
}
171
172
private function buildLeaseBox(DrydockResource $resource) {
173
$viewer = $this->getViewer();
174
175
$leases = id(new DrydockLeaseQuery())
176
->setViewer($viewer)
177
->withResourcePHIDs(array($resource->getPHID()))
178
->withStatuses(
179
array(
180
DrydockLeaseStatus::STATUS_PENDING,
181
DrydockLeaseStatus::STATUS_ACQUIRED,
182
DrydockLeaseStatus::STATUS_ACTIVE,
183
))
184
->setLimit(100)
185
->execute();
186
187
$id = $resource->getID();
188
$leases_uri = "resource/{$id}/leases/query/all/";
189
$leases_uri = $this->getApplicationURI($leases_uri);
190
191
$lease_header = id(new PHUIHeaderView())
192
->setHeader(pht('Active Leases'))
193
->addActionLink(
194
id(new PHUIButtonView())
195
->setTag('a')
196
->setHref($leases_uri)
197
->setIcon('fa-search')
198
->setText(pht('View All')));
199
200
$lease_list = id(new DrydockLeaseListView())
201
->setUser($viewer)
202
->setLeases($leases)
203
->render()
204
->setNoDataString(pht('This resource has no active leases.'));
205
206
return id(new PHUIObjectBoxView())
207
->setHeader($lease_header)
208
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
209
->setObjectList($lease_list);
210
}
211
212
}
213
214