Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/view/page/menu/PhabricatorMainMenuSearchView.php
12242 views
1
<?php
2
3
final class PhabricatorMainMenuSearchView extends AphrontView {
4
5
const DEFAULT_APPLICATION_ICON = 'fa-dot-circle-o';
6
7
private $id;
8
private $application;
9
10
public function setApplication(PhabricatorApplication $application) {
11
$this->application = $application;
12
return $this;
13
}
14
15
public function getApplication() {
16
return $this->application;
17
}
18
19
public function getID() {
20
if (!$this->id) {
21
$this->id = celerity_generate_unique_node_id();
22
}
23
return $this->id;
24
}
25
26
public function render() {
27
$viewer = $this->getViewer();
28
29
$target_id = celerity_generate_unique_node_id();
30
$search_id = $this->getID();
31
$button_id = celerity_generate_unique_node_id();
32
$selector_id = celerity_generate_unique_node_id();
33
$application_id = celerity_generate_unique_node_id();
34
35
$input = phutil_tag(
36
'input',
37
array(
38
'type' => 'text',
39
'name' => 'query',
40
'id' => $search_id,
41
'autocomplete' => 'off',
42
'autocorrect' => 'off',
43
'autocapitalize' => 'off',
44
'spellcheck' => 'false',
45
));
46
47
$target = javelin_tag(
48
'div',
49
array(
50
'id' => $target_id,
51
'class' => 'phabricator-main-menu-search-target',
52
),
53
'');
54
55
$search_datasource = new PhabricatorSearchDatasource();
56
$scope_key = PhabricatorSearchScopeSetting::SETTINGKEY;
57
58
Javelin::initBehavior(
59
'phabricator-search-typeahead',
60
array(
61
'id' => $target_id,
62
'input' => $search_id,
63
'button' => $button_id,
64
'selectorID' => $selector_id,
65
'applicationID' => $application_id,
66
'defaultApplicationIcon' => self::DEFAULT_APPLICATION_ICON,
67
'appScope' => PhabricatorSearchController::SCOPE_CURRENT_APPLICATION,
68
'src' => $search_datasource->getDatasourceURI(),
69
'limit' => 10,
70
'placeholder' => pht('Search'),
71
'scopeUpdateURI' => '/settings/adjust/?key='.$scope_key,
72
));
73
74
$primary_input = phutil_tag(
75
'input',
76
array(
77
'type' => 'hidden',
78
'name' => 'search:primary',
79
'value' => 'true',
80
));
81
82
$search_text = javelin_tag(
83
'span',
84
array(
85
'aural' => true,
86
),
87
pht('Search'));
88
89
$selector = $this->buildModeSelector($selector_id, $application_id);
90
91
$form = phabricator_form(
92
$viewer,
93
array(
94
'action' => '/search/',
95
'method' => 'POST',
96
),
97
phutil_tag(
98
'div',
99
array(
100
'class' => 'phabricator-main-menu-search-container',
101
),
102
array(
103
$input,
104
phutil_tag(
105
'button',
106
array(
107
'id' => $button_id,
108
'class' => 'phui-icon-view phui-font-fa fa-search',
109
),
110
$search_text),
111
$selector,
112
$primary_input,
113
$target,
114
)));
115
116
return $form;
117
}
118
119
public static function getGlobalSearchScopeItems(
120
PhabricatorUser $viewer,
121
PhabricatorApplication $application = null,
122
$global_only = false) {
123
124
$items = array();
125
$items[] = array(
126
'name' => pht('Search'),
127
);
128
129
$items[] = array(
130
'icon' => 'fa-globe',
131
'name' => pht('All Documents'),
132
'value' => 'all',
133
);
134
135
$application_value = null;
136
$application_icon = self::DEFAULT_APPLICATION_ICON;
137
if ($application) {
138
$application_value = get_class($application);
139
if ($application->getApplicationSearchDocumentTypes()) {
140
$application_icon = $application->getIcon();
141
}
142
}
143
144
$items[] = array(
145
'icon' => $application_icon,
146
'name' => pht('Current Application'),
147
'value' => PhabricatorSearchController::SCOPE_CURRENT_APPLICATION,
148
);
149
150
$items[] = array(
151
'name' => pht('Saved Queries'),
152
);
153
154
155
$engine = id(new PhabricatorSearchApplicationSearchEngine())
156
->setViewer($viewer);
157
$engine_queries = $engine->loadEnabledNamedQueries();
158
foreach ($engine_queries as $query) {
159
$query_key = $query->getQueryKey();
160
if ($query_key == 'all') {
161
// Skip the builtin "All" query since it's redundant with the default
162
// setting.
163
continue;
164
}
165
166
// In the global "Settings" panel, we don't want to offer personal
167
// queries the viewer may have saved.
168
if ($global_only) {
169
if (!$query->isGlobal()) {
170
continue;
171
}
172
}
173
174
$query_name = $query->getQueryName();
175
176
$items[] = array(
177
'icon' => 'fa-certificate',
178
'name' => $query_name,
179
'value' => $query_key,
180
);
181
}
182
183
$items[] = array(
184
'name' => pht('More Options'),
185
);
186
187
$items[] = array(
188
'icon' => 'fa-search-plus',
189
'name' => pht('Advanced Search'),
190
'href' => '/search/query/advanced/',
191
);
192
193
$items[] = array(
194
'icon' => 'fa-book',
195
'name' => pht('User Guide: Search'),
196
'href' => PhabricatorEnv::getDoclink('Search User Guide'),
197
);
198
199
return $items;
200
}
201
202
private function buildModeSelector($selector_id, $application_id) {
203
$viewer = $this->getViewer();
204
205
$items = self::getGlobalSearchScopeItems($viewer, $this->getApplication());
206
207
$scope_key = PhabricatorSearchScopeSetting::SETTINGKEY;
208
$current_value = $viewer->getUserSetting($scope_key);
209
210
$current_icon = 'fa-globe';
211
foreach ($items as $item) {
212
if (idx($item, 'value') == $current_value) {
213
$current_icon = $item['icon'];
214
break;
215
}
216
}
217
218
$application = $this->getApplication();
219
220
$application_value = null;
221
if ($application) {
222
$application_value = get_class($application);
223
}
224
225
$selector = id(new PHUIButtonView())
226
->setID($selector_id)
227
->addClass('phabricator-main-menu-search-dropdown')
228
->addSigil('global-search-dropdown')
229
->setMetadata(
230
array(
231
'items' => $items,
232
'icon' => $current_icon,
233
'value' => $current_value,
234
))
235
->setIcon(
236
id(new PHUIIconView())
237
->addSigil('global-search-dropdown-icon')
238
->setIcon($current_icon))
239
->setAuralLabel(pht('Configure Global Search'))
240
->setDropdown(true);
241
242
$input = javelin_tag(
243
'input',
244
array(
245
'type' => 'hidden',
246
'sigil' => 'global-search-dropdown-input',
247
'name' => 'search:scope',
248
'value' => $current_value,
249
));
250
251
$application_input = javelin_tag(
252
'input',
253
array(
254
'type' => 'hidden',
255
'id' => $application_id,
256
'sigil' => 'global-search-dropdown-app',
257
'name' => 'search:application',
258
'value' => $application_value,
259
));
260
261
return array($selector, $input, $application_input);
262
}
263
264
}
265
266