Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/almanac/query/AlmanacDeviceSearchEngine.php
12256 views
1
<?php
2
3
final class AlmanacDeviceSearchEngine
4
extends PhabricatorApplicationSearchEngine {
5
6
public function getResultTypeDescription() {
7
return pht('Almanac Devices');
8
}
9
10
public function getApplicationClassName() {
11
return 'PhabricatorAlmanacApplication';
12
}
13
14
public function newQuery() {
15
return new AlmanacDeviceQuery();
16
}
17
18
protected function buildCustomSearchFields() {
19
$status_options = AlmanacDeviceStatus::getStatusMap();
20
$status_options = mpull($status_options, 'getName');
21
22
return array(
23
id(new PhabricatorSearchTextField())
24
->setLabel(pht('Name Contains'))
25
->setKey('match')
26
->setDescription(pht('Search for devices by name substring.')),
27
id(new PhabricatorSearchStringListField())
28
->setLabel(pht('Exact Names'))
29
->setKey('names')
30
->setDescription(pht('Search for devices with specific names.')),
31
id(new PhabricatorSearchCheckboxesField())
32
->setLabel(pht('Statuses'))
33
->setKey('statuses')
34
->setDescription(pht('Search for devices with given statuses.'))
35
->setOptions($status_options),
36
id(new PhabricatorSearchThreeStateField())
37
->setLabel(pht('Cluster Device'))
38
->setKey('isClusterDevice')
39
->setOptions(
40
pht('Both Cluster and Non-cluster Devices'),
41
pht('Cluster Devices Only'),
42
pht('Non-cluster Devices Only')),
43
);
44
}
45
46
protected function buildQueryFromParameters(array $map) {
47
$query = $this->newQuery();
48
49
if ($map['match'] !== null) {
50
$query->withNameNgrams($map['match']);
51
}
52
53
if ($map['names']) {
54
$query->withNames($map['names']);
55
}
56
57
if ($map['isClusterDevice'] !== null) {
58
$query->withIsClusterDevice($map['isClusterDevice']);
59
}
60
61
if ($map['statuses']) {
62
$query->withStatuses($map['statuses']);
63
}
64
65
return $query;
66
}
67
68
protected function getURI($path) {
69
return '/almanac/device/'.$path;
70
}
71
72
protected function getBuiltinQueryNames() {
73
$names = array(
74
'active' => pht('Active Devices'),
75
'all' => pht('All Devices'),
76
);
77
78
return $names;
79
}
80
81
public function buildSavedQueryFromBuiltin($query_key) {
82
$query = $this->newSavedQuery();
83
$query->setQueryKey($query_key);
84
85
switch ($query_key) {
86
case 'active':
87
$active_statuses = AlmanacDeviceStatus::getActiveStatusList();
88
return $query->setParameter('statuses', $active_statuses);
89
case 'all':
90
return $query;
91
}
92
93
return parent::buildSavedQueryFromBuiltin($query_key);
94
}
95
96
protected function renderResultList(
97
array $devices,
98
PhabricatorSavedQuery $query,
99
array $handles) {
100
assert_instances_of($devices, 'AlmanacDevice');
101
102
$viewer = $this->requireViewer();
103
104
$list = new PHUIObjectItemListView();
105
$list->setUser($viewer);
106
foreach ($devices as $device) {
107
$item = id(new PHUIObjectItemView())
108
->setObjectName(pht('Device %d', $device->getID()))
109
->setHeader($device->getName())
110
->setHref($device->getURI())
111
->setObject($device);
112
113
if ($device->isClusterDevice()) {
114
$item->addIcon('fa-sitemap', pht('Cluster Device'));
115
}
116
117
if ($device->isDisabled()) {
118
$item->setDisabled(true);
119
}
120
121
$status = $device->getStatusObject();
122
$icon_icon = $status->getIconIcon();
123
$icon_color = $status->getIconColor();
124
$icon_label = $status->getName();
125
126
$item->setStatusIcon(
127
"{$icon_icon} {$icon_color}",
128
$icon_label);
129
130
$list->addItem($item);
131
}
132
133
$result = new PhabricatorApplicationSearchResultView();
134
$result->setObjectList($list);
135
$result->setNoDataString(pht('No Almanac Devices found.'));
136
137
return $result;
138
}
139
140
}
141
142