Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/fund/query/FundInitiativeSearchEngine.php
12256 views
1
<?php
2
3
final class FundInitiativeSearchEngine
4
extends PhabricatorApplicationSearchEngine {
5
6
public function getResultTypeDescription() {
7
return pht('Fund Initiatives');
8
}
9
10
public function getApplicationClassName() {
11
return 'PhabricatorFundApplication';
12
}
13
14
public function newQuery() {
15
return new FundInitiativeQuery();
16
}
17
18
protected function buildCustomSearchFields() {
19
return array(
20
id(new PhabricatorUsersSearchField())
21
->setKey('ownerPHIDs')
22
->setAliases(array('owner', 'ownerPHID', 'owners'))
23
->setLabel(pht('Owners')),
24
id(new PhabricatorSearchCheckboxesField())
25
->setKey('statuses')
26
->setLabel(pht('Statuses'))
27
->setOptions(FundInitiative::getStatusNameMap()),
28
);
29
}
30
31
protected function buildQueryFromParameters(array $map) {
32
$query = $this->newQuery();
33
34
if ($map['ownerPHIDs']) {
35
$query->withOwnerPHIDs($map['ownerPHIDs']);
36
}
37
38
if ($map['statuses']) {
39
$query->withStatuses($map['statuses']);
40
}
41
42
return $query;
43
}
44
45
protected function getURI($path) {
46
return '/fund/'.$path;
47
}
48
49
protected function getBuiltinQueryNames() {
50
$names = array();
51
52
$names['open'] = pht('Open Initiatives');
53
if ($this->requireViewer()->isLoggedIn()) {
54
$names['owned'] = pht('Owned Initiatives');
55
}
56
$names['all'] = pht('All Initiatives');
57
58
return $names;
59
}
60
61
public function buildSavedQueryFromBuiltin($query_key) {
62
$query = $this->newSavedQuery();
63
$query->setQueryKey($query_key);
64
65
switch ($query_key) {
66
case 'all':
67
return $query;
68
case 'owned':
69
return $query->setParameter(
70
'ownerPHIDs',
71
array(
72
$this->requireViewer()->getPHID(),
73
));
74
case 'open':
75
return $query->setParameter(
76
'statuses',
77
array(
78
FundInitiative::STATUS_OPEN,
79
));
80
}
81
82
return parent::buildSavedQueryFromBuiltin($query_key);
83
}
84
85
protected function renderResultList(
86
array $initiatives,
87
PhabricatorSavedQuery $query,
88
array $handles) {
89
assert_instances_of($initiatives, 'FundInitiative');
90
91
$viewer = $this->requireViewer();
92
93
$load_phids = array();
94
foreach ($initiatives as $initiative) {
95
$load_phids[] = $initiative->getOwnerPHID();
96
}
97
98
if ($initiatives) {
99
$edge_query = id(new PhabricatorEdgeQuery())
100
->withSourcePHIDs(mpull($initiatives, 'getPHID'))
101
->withEdgeTypes(
102
array(
103
PhabricatorProjectObjectHasProjectEdgeType::EDGECONST,
104
));
105
106
$edge_query->execute();
107
108
foreach ($edge_query->getDestinationPHIDs() as $phid) {
109
$load_phids[] = $phid;
110
}
111
}
112
113
$handles = $viewer->loadHandles($load_phids);
114
$handles = iterator_to_array($handles);
115
116
$list = new PHUIObjectItemListView();
117
foreach ($initiatives as $initiative) {
118
$owner_handle = $handles[$initiative->getOwnerPHID()];
119
120
$item = id(new PHUIObjectItemView())
121
->setObjectName($initiative->getMonogram())
122
->setHeader($initiative->getName())
123
->setHref('/'.$initiative->getMonogram())
124
->addByline(pht('Owner: %s', $owner_handle->renderLink()));
125
126
if ($initiative->isClosed()) {
127
$item->setDisabled(true);
128
}
129
130
$project_phids = $edge_query->getDestinationPHIDs(
131
array(
132
$initiative->getPHID(),
133
));
134
135
$project_handles = array_select_keys($handles, $project_phids);
136
if ($project_handles) {
137
$item->addAttribute(
138
id(new PHUIHandleTagListView())
139
->setLimit(4)
140
->setSlim(true)
141
->setHandles($project_handles));
142
}
143
144
$list->addItem($item);
145
}
146
147
$result = new PhabricatorApplicationSearchResultView();
148
$result->setObjectList($list);
149
$result->setNoDataString(pht('No initiatives found.'));
150
151
return $result;
152
}
153
154
}
155
156