Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php
12256 views
1
<?php
2
3
final class HarbormasterBuildableSearchEngine
4
extends PhabricatorApplicationSearchEngine {
5
6
public function getResultTypeDescription() {
7
return pht('Harbormaster Buildables');
8
}
9
10
public function getApplicationClassName() {
11
return 'PhabricatorHarbormasterApplication';
12
}
13
14
public function newQuery() {
15
return new HarbormasterBuildableQuery();
16
}
17
18
protected function buildCustomSearchFields() {
19
return array(
20
id(new PhabricatorSearchStringListField())
21
->setKey('objectPHIDs')
22
->setAliases(array('objects'))
23
->setLabel(pht('Objects'))
24
->setPlaceholder(pht('rXabcdef, PHID-DIFF-1234, ...'))
25
->setDescription(pht('Search for builds of particular objects.')),
26
id(new PhabricatorSearchStringListField())
27
->setKey('containerPHIDs')
28
->setAliases(array('containers'))
29
->setLabel(pht('Containers'))
30
->setPlaceholder(pht('rXYZ, R123, D456, ...'))
31
->setDescription(
32
pht('Search for builds by containing revision or repository.')),
33
id(new PhabricatorSearchCheckboxesField())
34
->setKey('statuses')
35
->setLabel(pht('Statuses'))
36
->setOptions(HarbormasterBuildableStatus::getOptionMap())
37
->setDescription(pht('Search for builds by buildable status.')),
38
id(new PhabricatorSearchThreeStateField())
39
->setLabel(pht('Manual'))
40
->setKey('manual')
41
->setDescription(
42
pht('Search for only manual or automatic buildables.'))
43
->setOptions(
44
pht('(Show All)'),
45
pht('Show Only Manual Builds'),
46
pht('Show Only Automated Builds')),
47
);
48
}
49
50
private function resolvePHIDs(array $names) {
51
$viewer = $this->requireViewer();
52
53
$objects = id(new PhabricatorObjectQuery())
54
->setViewer($viewer)
55
->withNames($names)
56
->execute();
57
58
// TODO: Instead of using string lists, we should ideally be using some
59
// kind of smart field with resolver logic that can help users type the
60
// right stuff. For now, just return a bogus value here so nothing matches
61
// but the form doesn't explode.
62
if (!$objects) {
63
return array('-');
64
}
65
66
return mpull($objects, 'getPHID');
67
}
68
69
protected function buildQueryFromParameters(array $map) {
70
$query = $this->newQuery();
71
72
if ($map['objectPHIDs']) {
73
$phids = $this->resolvePHIDs($map['objectPHIDs']);
74
if ($phids) {
75
$query->withBuildablePHIDs($phids);
76
}
77
}
78
79
if ($map['containerPHIDs']) {
80
$phids = $this->resolvePHIDs($map['containerPHIDs']);
81
if ($phids) {
82
$query->withContainerPHIDs($phids);
83
}
84
}
85
86
if ($map['statuses']) {
87
$query->withStatuses($map['statuses']);
88
}
89
90
if ($map['manual'] !== null) {
91
$query->withManualBuildables($map['manual']);
92
}
93
94
return $query;
95
}
96
97
protected function getURI($path) {
98
return '/harbormaster/'.$path;
99
}
100
101
protected function getBuiltinQueryNames() {
102
return array(
103
'all' => pht('All Buildables'),
104
);
105
}
106
107
public function buildSavedQueryFromBuiltin($query_key) {
108
$query = $this->newSavedQuery();
109
$query->setQueryKey($query_key);
110
111
switch ($query_key) {
112
case 'all':
113
return $query;
114
}
115
116
return parent::buildSavedQueryFromBuiltin($query_key);
117
}
118
119
protected function renderResultList(
120
array $buildables,
121
PhabricatorSavedQuery $query,
122
array $handles) {
123
assert_instances_of($buildables, 'HarbormasterBuildable');
124
125
$viewer = $this->requireViewer();
126
127
$phids = array();
128
foreach ($buildables as $buildable) {
129
$phids[] = $buildable->getBuildableObject()
130
->getHarbormasterBuildableDisplayPHID();
131
132
$phids[] = $buildable->getContainerPHID();
133
$phids[] = $buildable->getBuildablePHID();
134
}
135
$handles = $viewer->loadHandles($phids);
136
137
138
$list = new PHUIObjectItemListView();
139
foreach ($buildables as $buildable) {
140
$id = $buildable->getID();
141
142
$display_phid = $buildable->getBuildableObject()
143
->getHarbormasterBuildableDisplayPHID();
144
145
$container_phid = $buildable->getContainerPHID();
146
$buildable_phid = $buildable->getBuildablePHID();
147
148
$item = id(new PHUIObjectItemView())
149
->setObjectName(pht('Buildable %d', $buildable->getID()));
150
151
if ($display_phid) {
152
$handle = $handles[$display_phid];
153
$item->setHeader($handle->getFullName());
154
}
155
156
if ($container_phid && ($container_phid != $display_phid)) {
157
$handle = $handles[$container_phid];
158
$item->addAttribute($handle->getName());
159
}
160
161
if ($buildable_phid && ($buildable_phid != $display_phid)) {
162
$handle = $handles[$buildable_phid];
163
$item->addAttribute($handle->getFullName());
164
}
165
166
$item->setHref($buildable->getURI());
167
168
if ($buildable->getIsManualBuildable()) {
169
$item->addIcon('fa-wrench grey', pht('Manual'));
170
}
171
172
$status_icon = $buildable->getStatusIcon();
173
$status_color = $buildable->getStatusColor();
174
$status_label = $buildable->getStatusDisplayName();
175
176
$item->setStatusIcon("{$status_icon} {$status_color}", $status_label);
177
178
$list->addItem($item);
179
}
180
181
$result = new PhabricatorApplicationSearchResultView();
182
$result->setObjectList($list);
183
$result->setNoDataString(pht('No buildables found.'));
184
185
return $result;
186
}
187
188
}
189
190