##// END OF EJS Templates
quick-search-bar: show errors when search fails.
dan -
r3320:7faf2640 default
parent child Browse files
Show More
@@ -1,62 +1,63 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2016-2018 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
7 7 # (only), as published by the Free Software Foundation.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU Affero General Public License
15 15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 16 #
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21
22 22 def assert_and_get_main_filter_content(result):
23 23 repos = []
24 24 groups = []
25 25 commits = []
26 26 users = []
27 27 for data_item in result:
28 28 assert data_item['id']
29 29 assert data_item['value']
30 30 assert data_item['value_display']
31 31 assert data_item['url']
32 32
33 33 if data_item['type'] == 'search':
34 assert data_item['value_display'].startswith('Full text search for:')
34 display_val = data_item['value_display']
35 assert 'Search for:' in display_val, display_val
35 36 elif data_item['type'] == 'repo':
36 37 repos.append(data_item)
37 38 elif data_item['type'] == 'repo_group':
38 39 groups.append(data_item)
39 40 elif data_item['type'] == 'user':
40 41 users.append(data_item)
41 42 elif data_item['type'] == 'commit':
42 43 commits.append(data_item)
43 44 else:
44 45 raise Exception('invalid type `%s`' % data_item['type'])
45 46
46 47 return repos, groups, users, commits
47 48
48 49
49 50 def assert_and_get_repo_list_content(result):
50 51 repos = []
51 52 for data in result:
52 53 for data_item in data['children']:
53 54 assert data_item['id']
54 55 assert data_item['text']
55 56 assert data_item['url']
56 57
57 58 if data_item['type'] == 'repo':
58 59 repos.append(data_item)
59 60 else:
60 61 raise Exception('invalid type %s' % data_item['type'])
61 62
62 63 return repos
@@ -1,690 +1,696 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <%inherit file="root.mako"/>
3 3
4 4 <%include file="/ejs_templates/templates.html"/>
5 5
6 6 <div class="outerwrapper">
7 7 <!-- HEADER -->
8 8 <div class="header">
9 9 <div id="header-inner" class="wrapper">
10 10 <div id="logo">
11 11 <div class="logo-wrapper">
12 12 <a href="${h.route_path('home')}"><img src="${h.asset('images/rhodecode-logo-white-216x60.png')}" alt="RhodeCode"/></a>
13 13 </div>
14 14 %if c.rhodecode_name:
15 15 <div class="branding">- ${h.branding(c.rhodecode_name)}</div>
16 16 %endif
17 17 </div>
18 18 <!-- MENU BAR NAV -->
19 19 ${self.menu_bar_nav()}
20 20 <!-- END MENU BAR NAV -->
21 21 </div>
22 22 </div>
23 23 ${self.menu_bar_subnav()}
24 24 <!-- END HEADER -->
25 25
26 26 <!-- CONTENT -->
27 27 <div id="content" class="wrapper">
28 28
29 29 <rhodecode-toast id="notifications"></rhodecode-toast>
30 30
31 31 <div class="main">
32 32 ${next.main()}
33 33 </div>
34 34 </div>
35 35 <!-- END CONTENT -->
36 36
37 37 </div>
38 38 <!-- FOOTER -->
39 39 <div id="footer">
40 40 <div id="footer-inner" class="title wrapper">
41 41 <div>
42 42 <p class="footer-link-right">
43 43 % if c.visual.show_version:
44 44 RhodeCode Enterprise ${c.rhodecode_version} ${c.rhodecode_edition}
45 45 % endif
46 46 &copy; 2010-${h.datetime.today().year}, <a href="${h.route_url('rhodecode_official')}" target="_blank">RhodeCode GmbH</a>. All rights reserved.
47 47 % if c.visual.rhodecode_support_url:
48 48 <a href="${c.visual.rhodecode_support_url}" target="_blank">${_('Support')}</a>
49 49 % endif
50 50 </p>
51 51 <% sid = 'block' if request.GET.get('showrcid') else 'none' %>
52 52 <p class="server-instance" style="display:${sid}">
53 53 ## display hidden instance ID if specially defined
54 54 % if c.rhodecode_instanceid:
55 55 ${_('RhodeCode instance id: %s') % c.rhodecode_instanceid}
56 56 % endif
57 57 </p>
58 58 </div>
59 59 </div>
60 60 </div>
61 61
62 62 <!-- END FOOTER -->
63 63
64 64 ### MAKO DEFS ###
65 65
66 66 <%def name="menu_bar_subnav()">
67 67 </%def>
68 68
69 69 <%def name="breadcrumbs(class_='breadcrumbs')">
70 70 <div class="${class_}">
71 71 ${self.breadcrumbs_links()}
72 72 </div>
73 73 </%def>
74 74
75 75 <%def name="admin_menu()">
76 76 <ul class="admin_menu submenu">
77 77 <li><a href="${h.route_path('admin_audit_logs')}">${_('Admin audit logs')}</a></li>
78 78 <li><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
79 79 <li><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
80 80 <li><a href="${h.route_path('users')}">${_('Users')}</a></li>
81 81 <li><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
82 82 <li><a href="${h.route_path('admin_permissions_application')}">${_('Permissions')}</a></li>
83 83 <li><a href="${h.route_path('auth_home', traverse='')}">${_('Authentication')}</a></li>
84 84 <li><a href="${h.route_path('global_integrations_home')}">${_('Integrations')}</a></li>
85 85 <li><a href="${h.route_path('admin_defaults_repositories')}">${_('Defaults')}</a></li>
86 86 <li class="last"><a href="${h.route_path('admin_settings')}">${_('Settings')}</a></li>
87 87 </ul>
88 88 </%def>
89 89
90 90
91 91 <%def name="dt_info_panel(elements)">
92 92 <dl class="dl-horizontal">
93 93 %for dt, dd, title, show_items in elements:
94 94 <dt>${dt}:</dt>
95 95 <dd title="${h.tooltip(title)}">
96 96 %if callable(dd):
97 97 ## allow lazy evaluation of elements
98 98 ${dd()}
99 99 %else:
100 100 ${dd}
101 101 %endif
102 102 %if show_items:
103 103 <span class="btn-collapse" data-toggle="item-${h.md5_safe(dt)[:6]}-details">${_('Show More')} </span>
104 104 %endif
105 105 </dd>
106 106
107 107 %if show_items:
108 108 <div class="collapsable-content" data-toggle="item-${h.md5_safe(dt)[:6]}-details" style="display: none">
109 109 %for item in show_items:
110 110 <dt></dt>
111 111 <dd>${item}</dd>
112 112 %endfor
113 113 </div>
114 114 %endif
115 115
116 116 %endfor
117 117 </dl>
118 118 </%def>
119 119
120 120
121 121 <%def name="gravatar(email, size=16)">
122 122 <%
123 123 if (size > 16):
124 124 gravatar_class = 'gravatar gravatar-large'
125 125 else:
126 126 gravatar_class = 'gravatar'
127 127 %>
128 128 <%doc>
129 129 TODO: johbo: For now we serve double size images to make it smooth
130 130 for retina. This is how it worked until now. Should be replaced
131 131 with a better solution at some point.
132 132 </%doc>
133 133 <img class="${gravatar_class}" src="${h.gravatar_url(email, size * 2)}" height="${size}" width="${size}">
134 134 </%def>
135 135
136 136
137 137 <%def name="gravatar_with_user(contact, size=16, show_disabled=False)">
138 138 <% email = h.email_or_none(contact) %>
139 139 <div class="rc-user tooltip" title="${h.tooltip(h.author_string(email))}">
140 140 ${self.gravatar(email, size)}
141 141 <span class="${'user user-disabled' if show_disabled else 'user'}"> ${h.link_to_user(contact)}</span>
142 142 </div>
143 143 </%def>
144 144
145 145
146 146 ## admin menu used for people that have some admin resources
147 147 <%def name="admin_menu_simple(repositories=None, repository_groups=None, user_groups=None)">
148 148 <ul class="submenu">
149 149 %if repositories:
150 150 <li class="local-admin-repos"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
151 151 %endif
152 152 %if repository_groups:
153 153 <li class="local-admin-repo-groups"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
154 154 %endif
155 155 %if user_groups:
156 156 <li class="local-admin-user-groups"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
157 157 %endif
158 158 </ul>
159 159 </%def>
160 160
161 161 <%def name="repo_page_title(repo_instance)">
162 162 <div class="title-content">
163 163 <div class="title-main">
164 164 ## SVN/HG/GIT icons
165 165 %if h.is_hg(repo_instance):
166 166 <i class="icon-hg"></i>
167 167 %endif
168 168 %if h.is_git(repo_instance):
169 169 <i class="icon-git"></i>
170 170 %endif
171 171 %if h.is_svn(repo_instance):
172 172 <i class="icon-svn"></i>
173 173 %endif
174 174
175 175 ## public/private
176 176 %if repo_instance.private:
177 177 <i class="icon-repo-private"></i>
178 178 %else:
179 179 <i class="icon-repo-public"></i>
180 180 %endif
181 181
182 182 ## repo name with group name
183 183 ${h.breadcrumb_repo_link(c.rhodecode_db_repo)}
184 184
185 185 </div>
186 186
187 187 ## FORKED
188 188 %if repo_instance.fork:
189 189 <p>
190 190 <i class="icon-code-fork"></i> ${_('Fork of')}
191 191 <a href="${h.route_path('repo_summary',repo_name=repo_instance.fork.repo_name)}">${repo_instance.fork.repo_name}</a>
192 192 </p>
193 193 %endif
194 194
195 195 ## IMPORTED FROM REMOTE
196 196 %if repo_instance.clone_uri:
197 197 <p>
198 198 <i class="icon-code-fork"></i> ${_('Clone from')}
199 199 <a href="${h.safe_str(h.hide_credentials(repo_instance.clone_uri))}">${h.hide_credentials(repo_instance.clone_uri)}</a>
200 200 </p>
201 201 %endif
202 202
203 203 ## LOCKING STATUS
204 204 %if repo_instance.locked[0]:
205 205 <p class="locking_locked">
206 206 <i class="icon-repo-lock"></i>
207 207 ${_('Repository locked by %(user)s') % {'user': h.person_by_id(repo_instance.locked[0])}}
208 208 </p>
209 209 %elif repo_instance.enable_locking:
210 210 <p class="locking_unlocked">
211 211 <i class="icon-repo-unlock"></i>
212 212 ${_('Repository not locked. Pull repository to lock it.')}
213 213 </p>
214 214 %endif
215 215
216 216 </div>
217 217 </%def>
218 218
219 219 <%def name="repo_menu(active=None)">
220 220 <%
221 221 def is_active(selected):
222 222 if selected == active:
223 223 return "active"
224 224 %>
225 225
226 226 <!--- CONTEXT BAR -->
227 227 <div id="context-bar">
228 228 <div class="wrapper">
229 229 <ul id="context-pages" class="navigation horizontal-list">
230 230 <li class="${is_active('summary')}"><a class="menulink" href="${h.route_path('repo_summary', repo_name=c.repo_name)}"><div class="menulabel">${_('Summary')}</div></a></li>
231 231 <li class="${is_active('changelog')}"><a class="menulink" href="${h.route_path('repo_changelog', repo_name=c.repo_name)}"><div class="menulabel">${_('Changelog')}</div></a></li>
232 232 <li class="${is_active('files')}"><a class="menulink" href="${h.route_path('repo_files', repo_name=c.repo_name, commit_id=c.rhodecode_db_repo.landing_rev[1], f_path='')}"><div class="menulabel">${_('Files')}</div></a></li>
233 233 <li class="${is_active('compare')}"><a class="menulink" href="${h.route_path('repo_compare_select',repo_name=c.repo_name)}"><div class="menulabel">${_('Compare')}</div></a></li>
234 234 ## TODO: anderson: ideally it would have a function on the scm_instance "enable_pullrequest() and enable_fork()"
235 235 %if c.rhodecode_db_repo.repo_type in ['git','hg']:
236 236 <li class="${is_active('showpullrequest')}">
237 237 <a class="menulink" href="${h.route_path('pullrequest_show_all', repo_name=c.repo_name)}" title="${h.tooltip(_('Show Pull Requests for %s') % c.repo_name)}">
238 238 %if c.repository_pull_requests:
239 239 <span class="pr_notifications">${c.repository_pull_requests}</span>
240 240 %endif
241 241 <div class="menulabel">${_('Pull Requests')}</div>
242 242 </a>
243 243 </li>
244 244 %endif
245 245 <li class="${is_active('options')}">
246 246 <a class="menulink dropdown">
247 247 <div class="menulabel">${_('Options')} <div class="show_more"></div></div>
248 248 </a>
249 249 <ul class="submenu">
250 250 %if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
251 251 <li><a href="${h.route_path('edit_repo',repo_name=c.repo_name)}">${_('Settings')}</a></li>
252 252 %endif
253 253 %if c.rhodecode_db_repo.fork:
254 254 <li>
255 255 <a title="${h.tooltip(_('Compare fork with %s' % c.rhodecode_db_repo.fork.repo_name))}"
256 256 href="${h.route_path('repo_compare',
257 257 repo_name=c.rhodecode_db_repo.fork.repo_name,
258 258 source_ref_type=c.rhodecode_db_repo.landing_rev[0],
259 259 source_ref=c.rhodecode_db_repo.landing_rev[1],
260 260 target_repo=c.repo_name,target_ref_type='branch' if request.GET.get('branch') else c.rhodecode_db_repo.landing_rev[0],
261 261 target_ref=request.GET.get('branch') or c.rhodecode_db_repo.landing_rev[1],
262 262 _query=dict(merge=1))}"
263 263 >
264 264 ${_('Compare fork')}
265 265 </a>
266 266 </li>
267 267 %endif
268 268
269 269 <li><a href="${h.route_path('search_repo',repo_name=c.repo_name)}">${_('Search')}</a></li>
270 270
271 271 %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking:
272 272 %if c.rhodecode_db_repo.locked[0]:
273 273 <li><a class="locking_del" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Unlock')}</a></li>
274 274 %else:
275 275 <li><a class="locking_add" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Lock')}</a></li>
276 276 %endif
277 277 %endif
278 278 %if c.rhodecode_user.username != h.DEFAULT_USER:
279 279 %if c.rhodecode_db_repo.repo_type in ['git','hg']:
280 280 <li><a href="${h.route_path('repo_fork_new',repo_name=c.repo_name)}">${_('Fork')}</a></li>
281 281 <li><a href="${h.route_path('pullrequest_new',repo_name=c.repo_name)}">${_('Create Pull Request')}</a></li>
282 282 %endif
283 283 %endif
284 284 </ul>
285 285 </li>
286 286 </ul>
287 287 </div>
288 288 <div class="clear"></div>
289 289 </div>
290 290 % if c.rhodecode_db_repo.archived:
291 291 <div class="alert alert-warning text-center">
292 292 <strong>${_('This repository has been archived. It is now read-only.')}</strong>
293 293 </div>
294 294 % endif
295 295 <!--- END CONTEXT BAR -->
296 296
297 297 </%def>
298 298
299 299 <%def name="usermenu(active=False)">
300 300 ## USER MENU
301 301 <li id="quick_login_li" class="${'active' if active else ''}">
302 302 <a id="quick_login_link" class="menulink childs">
303 303 ${gravatar(c.rhodecode_user.email, 20)}
304 304 <span class="user">
305 305 %if c.rhodecode_user.username != h.DEFAULT_USER:
306 306 <span class="menu_link_user">${c.rhodecode_user.username}</span><div class="show_more"></div>
307 307 %else:
308 308 <span>${_('Sign in')}</span>
309 309 %endif
310 310 </span>
311 311 </a>
312 312
313 313 <div class="user-menu submenu">
314 314 <div id="quick_login">
315 315 %if c.rhodecode_user.username == h.DEFAULT_USER:
316 316 <h4>${_('Sign in to your account')}</h4>
317 317 ${h.form(h.route_path('login', _query={'came_from': h.current_route_path(request)}), needs_csrf_token=False)}
318 318 <div class="form form-vertical">
319 319 <div class="fields">
320 320 <div class="field">
321 321 <div class="label">
322 322 <label for="username">${_('Username')}:</label>
323 323 </div>
324 324 <div class="input">
325 325 ${h.text('username',class_='focus',tabindex=1)}
326 326 </div>
327 327
328 328 </div>
329 329 <div class="field">
330 330 <div class="label">
331 331 <label for="password">${_('Password')}:</label>
332 332 %if h.HasPermissionAny('hg.password_reset.enabled')():
333 333 <span class="forgot_password">${h.link_to(_('(Forgot password?)'),h.route_path('reset_password'), class_='pwd_reset')}</span>
334 334 %endif
335 335 </div>
336 336 <div class="input">
337 337 ${h.password('password',class_='focus',tabindex=2)}
338 338 </div>
339 339 </div>
340 340 <div class="buttons">
341 341 <div class="register">
342 342 %if h.HasPermissionAny('hg.admin', 'hg.register.auto_activate', 'hg.register.manual_activate')():
343 343 ${h.link_to(_("Don't have an account?"),h.route_path('register'))} <br/>
344 344 %endif
345 345 ${h.link_to(_("Using external auth? Sign In here."),h.route_path('login'))}
346 346 </div>
347 347 <div class="submit">
348 348 ${h.submit('sign_in',_('Sign In'),class_="btn btn-small",tabindex=3)}
349 349 </div>
350 350 </div>
351 351 </div>
352 352 </div>
353 353 ${h.end_form()}
354 354 %else:
355 355 <div class="">
356 356 <div class="big_gravatar">${gravatar(c.rhodecode_user.email, 48)}</div>
357 357 <div class="full_name">${c.rhodecode_user.full_name_or_username}</div>
358 358 <div class="email">${c.rhodecode_user.email}</div>
359 359 </div>
360 360 <div class="">
361 361 <ol class="links">
362 362 <li>${h.link_to(_(u'My account'),h.route_path('my_account_profile'))}</li>
363 363 % if c.rhodecode_user.personal_repo_group:
364 364 <li>${h.link_to(_(u'My personal group'), h.route_path('repo_group_home', repo_group_name=c.rhodecode_user.personal_repo_group.group_name))}</li>
365 365 % endif
366 366 <li>${h.link_to(_(u'Pull Requests'), h.route_path('my_account_pullrequests'))}</li>
367 367
368 368 <li class="logout">
369 369 ${h.secure_form(h.route_path('logout'), request=request)}
370 370 ${h.submit('log_out', _(u'Sign Out'),class_="btn btn-primary")}
371 371 ${h.end_form()}
372 372 </li>
373 373 </ol>
374 374 </div>
375 375 %endif
376 376 </div>
377 377 </div>
378 378 %if c.rhodecode_user.username != h.DEFAULT_USER:
379 379 <div class="pill_container">
380 380 <a class="menu_link_notifications ${'empty' if c.unread_notifications == 0 else ''}" href="${h.route_path('notifications_show_all')}">${c.unread_notifications}</a>
381 381 </div>
382 382 % endif
383 383 </li>
384 384 </%def>
385 385
386 386 <%def name="menu_items(active=None)">
387 387 <%
388 388 def is_active(selected):
389 389 if selected == active:
390 390 return "active"
391 391 return ""
392 392 %>
393 393
394 394 <ul id="quick" class="main_nav navigation horizontal-list">
395 395 ## notice box for important system messages
396 396 <li style="display: none">
397 397 <a class="notice-box" href="#openNotice" onclick="showNoticeBox(); return false">
398 398 <div class="menulabel-notice" >
399 399 0
400 400 </div>
401 401 </a>
402 402 </li>
403 403
404 404 ## Main filter
405 405 <li>
406 406 <div class="menulabel main_filter_box">
407 407 <div class="main_filter_input_box">
408 408 <input class="main_filter_input" id="main_filter" size="15" type="text" name="main_filter" placeholder="${_('search / go to...')}" value=""/>
409 409 </div>
410 410 <div class="main_filter_help_box">
411 411 <a href="#showFilterHelp" onclick="showMainFilterBox(); return false">?</a>
412 412 </div>
413 413 </div>
414 414
415 415 <div id="main_filter_help" style="display: none">
416 416 Use '/' key to quickly access this field.
417 417 Enter name of repository, or repository group for quick search.
418 418
419 419 Prefix query to allow special search:
420 420
421 421 user:admin, to search for usernames
422 422
423 423 user_group:devops, to search for user groups
424 424
425 425 commit:efced4, to search for commits
426 426
427 427 </div>
428 428 </li>
429 429
430 430 ## ROOT MENU
431 431 %if c.rhodecode_user.username != h.DEFAULT_USER:
432 432 <li class="${is_active('journal')}">
433 433 <a class="menulink" title="${_('Show activity journal')}" href="${h.route_path('journal')}">
434 434 <div class="menulabel">${_('Journal')}</div>
435 435 </a>
436 436 </li>
437 437 %else:
438 438 <li class="${is_active('journal')}">
439 439 <a class="menulink" title="${_('Show Public activity journal')}" href="${h.route_path('journal_public')}">
440 440 <div class="menulabel">${_('Public journal')}</div>
441 441 </a>
442 442 </li>
443 443 %endif
444 444 <li class="${is_active('gists')}">
445 445 <a class="menulink childs" title="${_('Show Gists')}" href="${h.route_path('gists_show')}">
446 446 <div class="menulabel">${_('Gists')}</div>
447 447 </a>
448 448 </li>
449 449 <li class="${is_active('search')}">
450 450 <a class="menulink" title="${_('Search in repositories you have access to')}" href="${h.route_path('search')}">
451 451 <div class="menulabel">${_('Search')}</div>
452 452 </a>
453 453 </li>
454 454 % if h.HasPermissionAll('hg.admin')('access admin main page'):
455 455 <li class="${is_active('admin')}">
456 456 <a class="menulink childs" title="${_('Admin settings')}" href="#" onclick="return false;">
457 457 <div class="menulabel">${_('Admin')} <div class="show_more"></div></div>
458 458 </a>
459 459 ${admin_menu()}
460 460 </li>
461 461 % elif c.rhodecode_user.repositories_admin or c.rhodecode_user.repository_groups_admin or c.rhodecode_user.user_groups_admin:
462 462 <li class="${is_active('admin')}">
463 463 <a class="menulink childs" title="${_('Delegated Admin settings')}">
464 464 <div class="menulabel">${_('Admin')} <div class="show_more"></div></div>
465 465 </a>
466 466 ${admin_menu_simple(c.rhodecode_user.repositories_admin,
467 467 c.rhodecode_user.repository_groups_admin,
468 468 c.rhodecode_user.user_groups_admin or h.HasPermissionAny('hg.usergroup.create.true')())}
469 469 </li>
470 470 % endif
471 471 ## render extra user menu
472 472 ${usermenu(active=(active=='my_account'))}
473 473
474 474 % if c.debug_style:
475 475 <li>
476 476 <a class="menulink" title="${_('Style')}" href="${h.route_path('debug_style_home')}">
477 477 <div class="menulabel">${_('[Style]')}</div>
478 478 </a>
479 479 </li>
480 480 % endif
481 481 </ul>
482 482
483 483 <script type="text/javascript">
484 484 var visualShowPublicIcon = "${c.visual.show_public_icon}" == "True";
485 485
486 486 var formatRepoResult = function(result, container, query, escapeMarkup) {
487 487 return function(data, escapeMarkup) {
488 488 if (!data.repo_id){
489 489 return data.text; // optgroup text Repositories
490 490 }
491 491
492 492 var tmpl = '';
493 493 var repoType = data['repo_type'];
494 494 var repoName = data['text'];
495 495
496 496 if(data && data.type == 'repo'){
497 497 if(repoType === 'hg'){
498 498 tmpl += '<i class="icon-hg"></i> ';
499 499 }
500 500 else if(repoType === 'git'){
501 501 tmpl += '<i class="icon-git"></i> ';
502 502 }
503 503 else if(repoType === 'svn'){
504 504 tmpl += '<i class="icon-svn"></i> ';
505 505 }
506 506 if(data['private']){
507 507 tmpl += '<i class="icon-lock" ></i> ';
508 508 }
509 509 else if(visualShowPublicIcon){
510 510 tmpl += '<i class="icon-unlock-alt"></i> ';
511 511 }
512 512 }
513 513 tmpl += escapeMarkup(repoName);
514 514 return tmpl;
515 515
516 516 }(result, escapeMarkup);
517 517 };
518 518
519 519
520 520 var autocompleteMainFilterFormatResult = function (data, value, org_formatter) {
521 521
522 522 if (value.split(':').length === 2) {
523 523 value = value.split(':')[1]
524 524 }
525 525
526 526 var searchType = data['type'];
527 527 var valueDisplay = data['value_display'];
528 528
529 529 var escapeRegExChars = function (value) {
530 530 return value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
531 531 };
532 532 var pattern = '(' + escapeRegExChars(value) + ')';
533 533
534 534 // highlight match
535 535 valueDisplay = Select2.util.escapeMarkup(valueDisplay);
536 536 valueDisplay = valueDisplay.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>');
537 537
538 538 var icon = '';
539 539
540 540 if (searchType === 'hint') {
541 541 icon += '<i class="icon-folder-close"></i> ';
542 542 }
543 543 else if (searchType === 'search') {
544 544 icon += '<i class="icon-more"></i> ';
545 545 }
546 546 else if (searchType === 'repo') {
547 547 if (data['repo_type'] === 'hg') {
548 548 icon += '<i class="icon-hg"></i> ';
549 549 }
550 550 else if (data['repo_type'] === 'git') {
551 551 icon += '<i class="icon-git"></i> ';
552 552 }
553 553 else if (data['repo_type'] === 'svn') {
554 554 icon += '<i class="icon-svn"></i> ';
555 555 }
556 556 if (data['private']) {
557 557 icon += '<i class="icon-lock" ></i> ';
558 558 }
559 559 else if (visualShowPublicIcon) {
560 560 icon += '<i class="icon-unlock-alt"></i> ';
561 561 }
562 562 }
563 563 else if (searchType === 'repo_group') {
564 564 icon += '<i class="icon-folder-close"></i> ';
565 565 }
566 566 else if (searchType === 'user_group') {
567 567 icon += '<i class="icon-group"></i> ';
568 568 }
569 569 else if (searchType === 'user') {
570 570 icon += '<img class="gravatar" src="{0}"/>'.format(data['icon_link']);
571 571 }
572 572 else if (searchType === 'commit') {
573 573 icon += '<i class="icon-tag"></i>';
574 574 }
575 575
576 576 var tmpl = '<div class="ac-container-wrap">{0}{1}</div>';
577 577 return tmpl.format(icon, valueDisplay);
578 578 };
579 579
580 580 var handleSelect = function(element, suggestion) {
581 581 if (suggestion.type === "hint") {
582 582 // we skip action
583 583 $('#main_filter').focus();
584 584 } else {
585 585 window.location = suggestion['url'];
586 586 }
587 587 };
588 588 var autocompleteMainFilterResult = function (suggestion, originalQuery, queryLowerCase) {
589 589 if (queryLowerCase.split(':').length === 2) {
590 590 queryLowerCase = queryLowerCase.split(':')[1]
591 591 }
592 592 return suggestion.value_display.toLowerCase().indexOf(queryLowerCase) !== -1;
593 593 };
594 594
595 595 $('#main_filter').autocomplete({
596 596 serviceUrl: pyroutes.url('goto_switcher_data'),
597 params: {"repo_group_id": templateContext.repo_group_id},
597 params: {"search_context": templateContext.search_context},
598 598 minChars:2,
599 599 maxHeight:400,
600 600 deferRequestBy: 300, //miliseconds
601 601 tabDisabled: true,
602 602 autoSelectFirst: true,
603 603 formatResult: autocompleteMainFilterFormatResult,
604 604 lookupFilter: autocompleteMainFilterResult,
605 onSelect: function(element, suggestion){
605 onSelect: function (element, suggestion) {
606 606 handleSelect(element, suggestion);
607 607 return false;
608 },
609 onSearchError: function (element, query, jqXHR, textStatus, errorThrown) {
610 if (jqXHR !== 'abort') {
611 alert("Error during search.\nError code: {0}".format(textStatus));
612 window.location = '';
613 }
608 614 }
609 615 });
610 616
611 617 showMainFilterBox = function () {
612 618 $('#main_filter_help').toggle();
613 619 }
614 620
615 621 </script>
616 622 <script src="${h.asset('js/rhodecode/base/keyboard-bindings.js', ver=c.rhodecode_version_hash)}"></script>
617 623 </%def>
618 624
619 625 <div class="modal" id="help_kb" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
620 626 <div class="modal-dialog">
621 627 <div class="modal-content">
622 628 <div class="modal-header">
623 629 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
624 630 <h4 class="modal-title" id="myModalLabel">${_('Keyboard shortcuts')}</h4>
625 631 </div>
626 632 <div class="modal-body">
627 633 <div class="block-left">
628 634 <table class="keyboard-mappings">
629 635 <tbody>
630 636 <tr>
631 637 <th></th>
632 638 <th>${_('Site-wide shortcuts')}</th>
633 639 </tr>
634 640 <%
635 641 elems = [
636 642 ('/', 'Use quick search box'),
637 643 ('g h', 'Goto home page'),
638 644 ('g g', 'Goto my private gists page'),
639 645 ('g G', 'Goto my public gists page'),
640 646 ('n r', 'New repository page'),
641 647 ('n g', 'New gist page'),
642 648 ]
643 649 %>
644 650 %for key, desc in elems:
645 651 <tr>
646 652 <td class="keys">
647 653 <span class="key tag">${key}</span>
648 654 </td>
649 655 <td>${desc}</td>
650 656 </tr>
651 657 %endfor
652 658 </tbody>
653 659 </table>
654 660 </div>
655 661 <div class="block-left">
656 662 <table class="keyboard-mappings">
657 663 <tbody>
658 664 <tr>
659 665 <th></th>
660 666 <th>${_('Repositories')}</th>
661 667 </tr>
662 668 <%
663 669 elems = [
664 670 ('g s', 'Goto summary page'),
665 671 ('g c', 'Goto changelog page'),
666 672 ('g f', 'Goto files page'),
667 673 ('g F', 'Goto files page with file search activated'),
668 674 ('g p', 'Goto pull requests page'),
669 675 ('g o', 'Goto repository settings'),
670 676 ('g O', 'Goto repository permissions settings'),
671 677 ]
672 678 %>
673 679 %for key, desc in elems:
674 680 <tr>
675 681 <td class="keys">
676 682 <span class="key tag">${key}</span>
677 683 </td>
678 684 <td>${desc}</td>
679 685 </tr>
680 686 %endfor
681 687 </tbody>
682 688 </table>
683 689 </div>
684 690 </div>
685 691 <div class="modal-footer">
686 692 </div>
687 693 </div><!-- /.modal-content -->
688 694 </div><!-- /.modal-dialog -->
689 695 </div><!-- /.modal -->
690 696
General Comments 0
You need to be logged in to leave comments. Login now