##// END OF EJS Templates
ui: fixed archived repo page new look.
marcink -
r3744:de115229 new-ui
parent child Browse files
Show More
@@ -1,965 +1,966 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-60x60.png')}" alt="RhodeCode"/></a>
13 13 </div>
14 14 % if c.rhodecode_name:
15 15 <div class="branding">
16 16 <a href="${h.route_path('home')}">${h.branding(c.rhodecode_name)}</a>
17 17 </div>
18 18 % endif
19 19 </div>
20 20 <!-- MENU BAR NAV -->
21 21 ${self.menu_bar_nav()}
22 22 <!-- END MENU BAR NAV -->
23 23 </div>
24 24 </div>
25 25 ${self.menu_bar_subnav()}
26 26 <!-- END HEADER -->
27 27
28 28 <!-- CONTENT -->
29 29 <div id="content" class="wrapper">
30 30
31 31 <rhodecode-toast id="notifications"></rhodecode-toast>
32 32
33 33 <div class="main">
34 34 ${next.main()}
35 35 </div>
36 36 </div>
37 37 <!-- END CONTENT -->
38 38
39 39 </div>
40 40 <!-- FOOTER -->
41 41 <div id="footer">
42 42 <div id="footer-inner" class="title wrapper">
43 43 <div>
44 44 <p class="footer-link-right">
45 45 % if c.visual.show_version:
46 46 RhodeCode Enterprise ${c.rhodecode_version} ${c.rhodecode_edition}
47 47 % endif
48 48 &copy; 2010-${h.datetime.today().year}, <a href="${h.route_url('rhodecode_official')}" target="_blank">RhodeCode GmbH</a>. All rights reserved.
49 49 % if c.visual.rhodecode_support_url:
50 50 <a href="${c.visual.rhodecode_support_url}" target="_blank">${_('Support')}</a>
51 51 % endif
52 52 </p>
53 53 <% sid = 'block' if request.GET.get('showrcid') else 'none' %>
54 54 <p class="server-instance" style="display:${sid}">
55 55 ## display hidden instance ID if specially defined
56 56 % if c.rhodecode_instanceid:
57 57 ${_('RhodeCode instance id: {}').format(c.rhodecode_instanceid)}
58 58 % endif
59 59 </p>
60 60 </div>
61 61 </div>
62 62 </div>
63 63
64 64 <!-- END FOOTER -->
65 65
66 66 ### MAKO DEFS ###
67 67
68 68 <%def name="menu_bar_subnav()">
69 69 </%def>
70 70
71 71 <%def name="breadcrumbs(class_='breadcrumbs')">
72 72 <div class="${class_}">
73 73 ${self.breadcrumbs_links()}
74 74 </div>
75 75 </%def>
76 76
77 77 <%def name="admin_menu(active=None)">
78 78 <%
79 79 def is_active(selected):
80 80 if selected == active:
81 81 return "active"
82 82 %>
83 83
84 84 <div id="context-bar">
85 85 <div class="wrapper">
86 86 <div class="title">
87 87 <div class="title-content">
88 88 <div class="title-main">
89 89 % if c.is_super_admin:
90 90 ${_('Super Admin Panel')}
91 91 % else:
92 92 ${_('Delegated Admin Panel')}
93 93 % endif
94 94 </div>
95 95 </div>
96 96 </div>
97 97
98 98 <ul id="context-pages" class="navigation horizontal-list">
99 99
100 100 ## super admin case
101 101 % if c.is_super_admin:
102 102 <li class="${is_active('audit_logs')}"><a href="${h.route_path('admin_audit_logs')}">${_('Admin audit logs')}</a></li>
103 103 <li class="${is_active('repositories')}"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
104 104 <li class="${is_active('repository_groups')}"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
105 105 <li class="${is_active('users')}"><a href="${h.route_path('users')}">${_('Users')}</a></li>
106 106 <li class="${is_active('user_groups')}"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
107 107 <li class="${is_active('permissions')}"><a href="${h.route_path('admin_permissions_application')}">${_('Permissions')}</a></li>
108 108 <li class="${is_active('authentication')}"><a href="${h.route_path('auth_home', traverse='')}">${_('Authentication')}</a></li>
109 109 <li class="${is_active('integrations')}"><a href="${h.route_path('global_integrations_home')}">${_('Integrations')}</a></li>
110 110 <li class="${is_active('defaults')}"><a href="${h.route_path('admin_defaults_repositories')}">${_('Defaults')}</a></li>
111 111 <li class="${is_active('settings')}"><a href="${h.route_path('admin_settings')}">${_('Settings')}</a></li>
112 112
113 113 ## delegated admin
114 114 % elif c.is_delegated_admin:
115 115 <%
116 116 repositories=c.auth_user.repositories_admin or c.can_create_repo
117 117 repository_groups=c.auth_user.repository_groups_admin or c.can_create_repo_group
118 118 user_groups=c.auth_user.user_groups_admin or c.can_create_user_group
119 119 %>
120 120
121 121 %if repositories:
122 122 <li class="${is_active('repositories')} local-admin-repos"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
123 123 %endif
124 124 %if repository_groups:
125 125 <li class="${is_active('repository_groups')} local-admin-repo-groups"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
126 126 %endif
127 127 %if user_groups:
128 128 <li class="${is_active('user_groups')} local-admin-user-groups"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
129 129 %endif
130 130 % endif
131 131 </ul>
132 132
133 133 </div>
134 134 <div class="clear"></div>
135 135 </div>
136 136 </%def>
137 137
138 138 <%def name="dt_info_panel(elements)">
139 139 <dl class="dl-horizontal">
140 140 %for dt, dd, title, show_items in elements:
141 141 <dt>${dt}:</dt>
142 142 <dd title="${h.tooltip(title)}">
143 143 %if callable(dd):
144 144 ## allow lazy evaluation of elements
145 145 ${dd()}
146 146 %else:
147 147 ${dd}
148 148 %endif
149 149 %if show_items:
150 150 <span class="btn-collapse" data-toggle="item-${h.md5_safe(dt)[:6]}-details">${_('Show More')} </span>
151 151 %endif
152 152 </dd>
153 153
154 154 %if show_items:
155 155 <div class="collapsable-content" data-toggle="item-${h.md5_safe(dt)[:6]}-details" style="display: none">
156 156 %for item in show_items:
157 157 <dt></dt>
158 158 <dd>${item}</dd>
159 159 %endfor
160 160 </div>
161 161 %endif
162 162
163 163 %endfor
164 164 </dl>
165 165 </%def>
166 166
167 167 <%def name="gravatar(email, size=16)">
168 168 <%
169 169 if (size > 16):
170 170 gravatar_class = 'gravatar gravatar-large'
171 171 else:
172 172 gravatar_class = 'gravatar'
173 173 %>
174 174 <%doc>
175 175 TODO: johbo: For now we serve double size images to make it smooth
176 176 for retina. This is how it worked until now. Should be replaced
177 177 with a better solution at some point.
178 178 </%doc>
179 179 <img class="${gravatar_class}" src="${h.gravatar_url(email, size * 2)}" height="${size}" width="${size}">
180 180 </%def>
181 181
182 182
183 183 <%def name="gravatar_with_user(contact, size=16, show_disabled=False)">
184 184 <% email = h.email_or_none(contact) %>
185 185 <div class="rc-user tooltip" title="${h.tooltip(h.author_string(email))}">
186 186 ${self.gravatar(email, size)}
187 187 <span class="${'user user-disabled' if show_disabled else 'user'}"> ${h.link_to_user(contact)}</span>
188 188 </div>
189 189 </%def>
190 190
191 191
192 192 <%def name="repo_page_title(repo_instance)">
193 193 <div class="title-content repo-title">
194 194
195 195 <div class="title-main">
196 196 ## SVN/HG/GIT icons
197 197 %if h.is_hg(repo_instance):
198 198 <i class="icon-hg"></i>
199 199 %endif
200 200 %if h.is_git(repo_instance):
201 201 <i class="icon-git"></i>
202 202 %endif
203 203 %if h.is_svn(repo_instance):
204 204 <i class="icon-svn"></i>
205 205 %endif
206 206
207 207 ## public/private
208 208 %if repo_instance.private:
209 209 <i class="icon-repo-private"></i>
210 210 %else:
211 211 <i class="icon-repo-public"></i>
212 212 %endif
213 213
214 214 ## repo name with group name
215 215 ${h.breadcrumb_repo_link(repo_instance)}
216 216
217 217 ## Context Actions
218 218 <div class="pull-right">
219 219 %if c.rhodecode_user.username != h.DEFAULT_USER:
220 220 <a href="${h.route_path('atom_feed_home', repo_name=c.rhodecode_db_repo.repo_name, _query=dict(auth_token=c.rhodecode_user.feed_token))}" title="${_('RSS Feed')}" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
221 221
222 222 <a href="#WatchRepo" onclick="toggleFollowingRepo(this, templateContext.repo_id); return false" title="${_('Watch this Repository and actions on it in your personalized journal')}" class="btn btn-sm ${('watching' if c.repository_is_user_following else '')}">
223 223 % if c.repository_is_user_following:
224 224 <i class="icon-eye-off"></i>${_('Unwatch')}
225 225 % else:
226 226 <i class="icon-eye"></i>${_('Watch')}
227 227 % endif
228 228
229 229 </a>
230 230 %else:
231 231 <a href="${h.route_path('atom_feed_home', repo_name=c.rhodecode_db_repo.repo_name)}" title="${_('RSS Feed')}" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
232 232 %endif
233 233 </div>
234 234
235 235 </div>
236 236
237 237 ## FORKED
238 238 %if repo_instance.fork:
239 239 <p class="discreet">
240 240 <i class="icon-code-fork"></i> ${_('Fork of')}
241 241 ${h.link_to_if(c.has_origin_repo_read_perm,repo_instance.fork.repo_name, h.route_path('repo_summary', repo_name=repo_instance.fork.repo_name))}
242 242 </p>
243 243 %endif
244 244
245 245 ## IMPORTED FROM REMOTE
246 246 %if repo_instance.clone_uri:
247 247 <p class="discreet">
248 248 <i class="icon-code-fork"></i> ${_('Clone from')}
249 249 <a href="${h.safe_str(h.hide_credentials(repo_instance.clone_uri))}">${h.hide_credentials(repo_instance.clone_uri)}</a>
250 250 </p>
251 251 %endif
252 252
253 253 ## LOCKING STATUS
254 254 %if repo_instance.locked[0]:
255 255 <p class="locking_locked discreet">
256 256 <i class="icon-repo-lock"></i>
257 257 ${_('Repository locked by %(user)s') % {'user': h.person_by_id(repo_instance.locked[0])}}
258 258 </p>
259 259 %elif repo_instance.enable_locking:
260 260 <p class="locking_unlocked discreet">
261 261 <i class="icon-repo-unlock"></i>
262 262 ${_('Repository not locked. Pull repository to lock it.')}
263 263 </p>
264 264 %endif
265 265
266 266 </div>
267 267 </%def>
268 268
269 269 <%def name="repo_menu(active=None)">
270 270 <%
271 271 def is_active(selected):
272 272 if selected == active:
273 273 return "active"
274 274 %>
275 % if c.rhodecode_db_repo.archived:
276 <div class="alert alert-warning text-center">
277 <strong>${_('This repository has been archived. It is now read-only.')}</strong>
278 </div>
279 % endif
275 280
276 281 <!--- REPO CONTEXT BAR -->
277 282 <div id="context-bar">
278 283 <div class="wrapper">
279 284
280 285 <div class="title">
281 286 ${self.repo_page_title(c.rhodecode_db_repo)}
282 287 </div>
283 288
284 289 <ul id="context-pages" class="navigation horizontal-list">
285 290 <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>
286 291 <li class="${is_active('commits')}"><a class="menulink" href="${h.route_path('repo_commits', repo_name=c.repo_name)}"><div class="menulabel">${_('Commits')}</div></a></li>
287 292 <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>
288 293 <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>
289 294
290 295 ## TODO: anderson: ideally it would have a function on the scm_instance "enable_pullrequest() and enable_fork()"
291 296 %if c.rhodecode_db_repo.repo_type in ['git','hg']:
292 297 <li class="${is_active('showpullrequest')}">
293 298 <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)}">
294 299 <div class="menulabel">
295 300 %if c.repository_pull_requests == 1:
296 301 ${c.repository_pull_requests} ${_('Pull Request')}
297 302 %else:
298 303 ${c.repository_pull_requests} ${_('Pull Requests')}
299 304 %endif
300 305 </div>
301 306 </a>
302 307 </li>
303 308 %endif
304 309
305 310 <li class="${is_active('artifacts')}"><a class="menulink" href="${h.route_path('repo_artifacts_list',repo_name=c.repo_name)}"><div class="menulabel">${_('Artifacts')} (BETA)</div></a></li>
306 311
307 312 %if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
308 313 <li class="${is_active('settings')}"><a class="menulink" href="${h.route_path('edit_repo',repo_name=c.repo_name)}"><div class="menulabel">${_('Repository Settings')}</div></a></li>
309 314 %endif
310 315
311 316 ## determine if we have "any" option available
312 317 <%
313 318 can_lock = h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking
314 319 has_actions = (c.rhodecode_user.username != h.DEFAULT_USER and c.rhodecode_db_repo.repo_type in ['git','hg'] ) or can_lock
315 320 %>
316 321 <li class="${is_active('options')}">
317 322 % if has_actions:
318 323 <a class="menulink dropdown">
319 324 <div class="menulabel">${_('Options')}<div class="show_more"></div></div>
320 325 </a>
321 326 <ul class="submenu">
322 327 <li><a href="${h.route_path('repo_fork_new',repo_name=c.repo_name)}">${_('Fork this repository')}</a></li>
323 328 <li><a href="${h.route_path('pullrequest_new',repo_name=c.repo_name)}">${_('Create Pull Request')}</a></li>
324 329 %if can_lock:
325 330 %if c.rhodecode_db_repo.locked[0]:
326 331 <li><a class="locking_del" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Unlock Repository')}</a></li>
327 332 %else:
328 333 <li><a class="locking_add" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Lock Repository')}</a></li>
329 334 %endif
330 335 %endif
331 336 </ul>
332 337 % else:
333 338 <a class="menulink disabled">
334 339 <div class="menulabel">${_('Options')}<div class="show_more"></div></div>
335 340 </a>
336 341 % endif
337 342 </li>
338 343
339 344 </ul>
340 345 </div>
341 346 <div class="clear"></div>
342 347 </div>
343 % if c.rhodecode_db_repo.archived:
344 <div class="alert alert-warning text-center">
345 <strong>${_('This repository has been archived. It is now read-only.')}</strong>
346 </div>
347 % endif
348
348 349 <!--- REPO END CONTEXT BAR -->
349 350
350 351 </%def>
351 352
352 353 <%def name="repo_group_page_title(repo_group_instance)">
353 354 <div class="title-content">
354 355 <div class="title-main">
355 356 ## Repository Group icon
356 357 <i class="icon-repo-group"></i>
357 358
358 359 ## repo name with group name
359 360 ${h.breadcrumb_repo_group_link(repo_group_instance)}
360 361 </div>
361 362
362 363 <%namespace name="dt" file="/data_table/_dt_elements.mako"/>
363 364 <div class="repo-group-desc discreet">
364 365 ${dt.repo_group_desc(repo_group_instance.description_safe, repo_group_instance.personal, c.visual.stylify_metatags)}
365 366 </div>
366 367
367 368 </div>
368 369 </%def>
369 370
370 371 <%def name="repo_group_menu(active=None)">
371 372 <%
372 373 def is_active(selected):
373 374 if selected == active:
374 375 return "active"
375 376
376 377 gr_name = c.repo_group.group_name if c.repo_group else None
377 378 # create repositories with write permission on group is set to true
378 379 create_on_write = h.HasPermissionAny('hg.create.write_on_repogroup.true')()
379 380 group_admin = h.HasRepoGroupPermissionAny('group.admin')(gr_name, 'group admin index page')
380 381 group_write = h.HasRepoGroupPermissionAny('group.write')(gr_name, 'can write into group index page')
381 382
382 383 %>
383 384
384 385 <!--- REPO GROUP CONTEXT BAR -->
385 386 <div id="context-bar">
386 387 <div class="wrapper">
387 388 <div class="title">
388 389 ${self.repo_group_page_title(c.repo_group)}
389 390 </div>
390 391
391 392 <ul id="context-pages" class="navigation horizontal-list">
392 393 <li class="${is_active('home')}"><a class="menulink" href="${h.route_path('repo_group_home', repo_group_name=c.repo_group.group_name)}"><div class="menulabel">${_('Group Home')}</div></a></li>
393 394 % if c.is_super_admin or group_admin:
394 395 <li class="${is_active('settings')}"><a class="menulink" href="${h.route_path('edit_repo_group',repo_group_name=c.repo_group.group_name)}" title="${_('You have admin right to this group, and can edit it')}"><div class="menulabel">${_('Group Settings')}</div></a></li>
395 396 % endif
396 397 ## determine if we have "any" option available
397 398 <%
398 399 can_create_repos = c.is_super_admin or group_admin or (group_write and create_on_write)
399 400 can_create_repo_groups = c.is_super_admin or group_admin
400 401 has_actions = can_create_repos or can_create_repo_groups
401 402 %>
402 403 <li class="${is_active('options')}">
403 404 % if has_actions:
404 405 <a class="menulink dropdown">
405 406 <div class="menulabel">${_('Options')} <div class="show_more"></div></div>
406 407 </a>
407 408 <ul class="submenu">
408 409 %if can_create_repos:
409 410 <li><a href="${h.route_path('repo_new',_query=dict(parent_group=c.repo_group.group_id))}">${_('Add Repository')}</a></li>
410 411 %endif
411 412 %if can_create_repo_groups:
412 413 <li><a href="${h.route_path('repo_group_new',_query=dict(parent_group=c.repo_group.group_id))}">${_(u'Add Repository Group')}</a></li>
413 414 %endif
414 415 </ul>
415 416 % else:
416 417 <a class="menulink disabled">
417 418 <div class="menulabel">${_('Options')} <div class="show_more"></div></div>
418 419 </a>
419 420 % endif
420 421 </li>
421 422 </ul>
422 423 </div>
423 424 <div class="clear"></div>
424 425 </div>
425 426
426 427 <!--- REPO GROUP CONTEXT BAR -->
427 428
428 429 </%def>
429 430
430 431
431 432 <%def name="usermenu(active=False)">
432 433 ## USER MENU
433 434 <li id="quick_login_li" class="${'active' if active else ''}">
434 435 % if c.rhodecode_user.username == h.DEFAULT_USER:
435 436 <a id="quick_login_link" class="menulink childs" href="${h.route_path('login', _query={'came_from': h.current_route_path(request)})}">
436 437 ${gravatar(c.rhodecode_user.email, 20)}
437 438 <span class="user">
438 439 <span>${_('Sign in')}</span>
439 440 </span>
440 441 </a>
441 442 % else:
442 443 ## logged in user
443 444 <a id="quick_login_link" class="menulink childs">
444 445 ${gravatar(c.rhodecode_user.email, 20)}
445 446 <span class="user">
446 447 <span class="menu_link_user">${c.rhodecode_user.username}</span>
447 448 <div class="show_more"></div>
448 449 </span>
449 450 </a>
450 451 ## subnav with menu for logged in user
451 452 <div class="user-menu submenu">
452 453 <div id="quick_login">
453 454 %if c.rhodecode_user.username != h.DEFAULT_USER:
454 455 <div class="">
455 456 <div class="big_gravatar">${gravatar(c.rhodecode_user.email, 48)}</div>
456 457 <div class="full_name">${c.rhodecode_user.full_name_or_username}</div>
457 458 <div class="email">${c.rhodecode_user.email}</div>
458 459 </div>
459 460 <div class="">
460 461 <ol class="links">
461 462 <li>${h.link_to(_(u'My account'),h.route_path('my_account_profile'))}</li>
462 463 % if c.rhodecode_user.personal_repo_group:
463 464 <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>
464 465 % endif
465 466 <li>${h.link_to(_(u'Pull Requests'), h.route_path('my_account_pullrequests'))}</li>
466 467 ## bookmark-items
467 468 <li class="bookmark-items">
468 469 ${_('Bookmarks')}
469 470 <div class="pull-right">
470 471 <a href="${h.route_path('my_account_bookmarks')}">${_('Manage')}</a>
471 472 </div>
472 473 </li>
473 474 % if not c.bookmark_items:
474 475 <li>
475 476 <a href="${h.route_path('my_account_bookmarks')}">${_('No Bookmarks yet.')}</a>
476 477 </li>
477 478 % endif
478 479 % for item in c.bookmark_items:
479 480 <li>
480 481 % if item.repository:
481 482 <div>
482 483 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
483 484 <code>${item.position}</code>
484 485 % if item.repository.repo_type == 'hg':
485 486 <i class="icon-hg" title="${_('Repository')}" style="font-size: 16px"></i>
486 487 % elif item.repository.repo_type == 'git':
487 488 <i class="icon-git" title="${_('Repository')}" style="font-size: 16px"></i>
488 489 % elif item.repository.repo_type == 'svn':
489 490 <i class="icon-svn" title="${_('Repository')}" style="font-size: 16px"></i>
490 491 % endif
491 492 ${(item.title or h.shorter(item.repository.repo_name, 30))}
492 493 </a>
493 494 </div>
494 495 % elif item.repository_group:
495 496 <div>
496 497 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
497 498 <code>${item.position}</code>
498 499 <i class="icon-repo-group" title="${_('Repository group')}" style="font-size: 14px"></i>
499 500 ${(item.title or h.shorter(item.repository_group.group_name, 30))}
500 501 </a>
501 502 </div>
502 503 % else:
503 504 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
504 505 <code>${item.position}</code>
505 506 ${item.title}
506 507 </a>
507 508 % endif
508 509 </li>
509 510 % endfor
510 511
511 512 <li class="logout">
512 513 ${h.secure_form(h.route_path('logout'), request=request)}
513 514 ${h.submit('log_out', _(u'Sign Out'),class_="btn btn-primary")}
514 515 ${h.end_form()}
515 516 </li>
516 517 </ol>
517 518 </div>
518 519 %endif
519 520 </div>
520 521 </div>
521 522 ## unread counter
522 523 <div class="pill_container">
523 524 <a class="menu_link_notifications ${'empty' if c.unread_notifications == 0 else ''}" href="${h.route_path('notifications_show_all')}">${c.unread_notifications}</a>
524 525 </div>
525 526 % endif
526 527 </li>
527 528 </%def>
528 529
529 530 <%def name="menu_items(active=None)">
530 531 <%
531 532 def is_active(selected):
532 533 if selected == active:
533 534 return "active"
534 535 return ""
535 536 %>
536 537
537 538 <ul id="quick" class="main_nav navigation horizontal-list">
538 539 ## notice box for important system messages
539 540 <li style="display: none">
540 541 <a class="notice-box" href="#openNotice" onclick="showNoticeBox(); return false">
541 542 <div class="menulabel-notice" >
542 543 0
543 544 </div>
544 545 </a>
545 546 </li>
546 547
547 548 ## Main filter
548 549 <li>
549 550 <div class="menulabel main_filter_box">
550 551 <div class="main_filter_input_box">
551 552 <ul class="searchItems">
552 553
553 554 % if c.template_context['search_context']['repo_id']:
554 555 <li class="searchTag searchTagFilter searchTagHidable" >
555 556 ##<a href="${h.route_path('search_repo',repo_name=c.template_context['search_context']['repo_name'])}">
556 557 <span class="tag">
557 558 This repo
558 559 <a href="#removeGoToFilter" onclick="removeGoToFilter(); return false"><i class="icon-cancel-circled"></i></a>
559 560 </span>
560 561 ##</a>
561 562 </li>
562 563 % elif c.template_context['search_context']['repo_group_id']:
563 564 <li class="searchTag searchTagFilter searchTagHidable">
564 565 ##<a href="${h.route_path('search_repo_group',repo_group_name=c.template_context['search_context']['repo_group_name'])}">
565 566 <span class="tag">
566 567 This group
567 568 <a href="#removeGoToFilter" onclick="removeGoToFilter(); return false"><i class="icon-cancel-circled"></i></a>
568 569 </span>
569 570 ##</a>
570 571 </li>
571 572 % endif
572 573
573 574 <li class="searchTagInput">
574 575 <input class="main_filter_input" id="main_filter" size="15" type="text" name="main_filter" placeholder="${_('search / go to...')}" value="" />
575 576 </li>
576 577 <li class="searchTag searchTagHelp">
577 578 <a href="#showFilterHelp" onclick="showMainFilterBox(); return false">?</a>
578 579 </li>
579 580 </ul>
580 581 </div>
581 582 </div>
582 583
583 584 <div id="main_filter_help" style="display: none">
584 585 - Use '/' key to quickly access this field.
585 586
586 587 - Enter a name of repository, or repository group for quick search.
587 588
588 589 - Prefix query to allow special search:
589 590
590 591 user:admin, to search for usernames, always global
591 592
592 593 user_group:devops, to search for user groups, always global
593 594
594 595 commit:efced4, to search for commits, scoped to repositories or groups
595 596
596 597 file:models.py, to search for file paths, scoped to repositories or groups
597 598
598 599 % if c.template_context['search_context']['repo_id']:
599 600 For advanced full text search visit: <a href="${h.route_path('search_repo',repo_name=c.template_context['search_context']['repo_name'])}">repository search</a>
600 601 % elif c.template_context['search_context']['repo_group_id']:
601 602 For advanced full text search visit: <a href="${h.route_path('search_repo_group',repo_group_name=c.template_context['search_context']['repo_group_name'])}">repository group search</a>
602 603 % else:
603 604 For advanced full text search visit: <a href="${h.route_path('search')}">global search</a>
604 605 % endif
605 606 </div>
606 607 </li>
607 608
608 609 ## ROOT MENU
609 610 <li class="${is_active('home')}">
610 611 <a class="menulink" title="${_('Home')}" href="${h.route_path('home')}">
611 612 <div class="menulabel">${_('Home')}</div>
612 613 </a>
613 614 </li>
614 615
615 616 %if c.rhodecode_user.username != h.DEFAULT_USER:
616 617 <li class="${is_active('journal')}">
617 618 <a class="menulink" title="${_('Show activity journal')}" href="${h.route_path('journal')}">
618 619 <div class="menulabel">${_('Journal')}</div>
619 620 </a>
620 621 </li>
621 622 %else:
622 623 <li class="${is_active('journal')}">
623 624 <a class="menulink" title="${_('Show Public activity journal')}" href="${h.route_path('journal_public')}">
624 625 <div class="menulabel">${_('Public journal')}</div>
625 626 </a>
626 627 </li>
627 628 %endif
628 629
629 630 <li class="${is_active('gists')}">
630 631 <a class="menulink childs" title="${_('Show Gists')}" href="${h.route_path('gists_show')}">
631 632 <div class="menulabel">${_('Gists')}</div>
632 633 </a>
633 634 </li>
634 635
635 636 % if c.is_super_admin or c.is_delegated_admin:
636 637 <li class="${is_active('admin')}">
637 638 <a class="menulink childs" title="${_('Admin settings')}" href="${h.route_path('admin_home')}">
638 639 <div class="menulabel">${_('Admin')} </div>
639 640 </a>
640 641 </li>
641 642 % endif
642 643
643 644 ## render extra user menu
644 645 ${usermenu(active=(active=='my_account'))}
645 646
646 647 % if c.debug_style:
647 648 <li>
648 649 <a class="menulink" title="${_('Style')}" href="${h.route_path('debug_style_home')}">
649 650 <div class="menulabel">${_('[Style]')}</div>
650 651 </a>
651 652 </li>
652 653 % endif
653 654 </ul>
654 655
655 656 <script type="text/javascript">
656 657 var visualShowPublicIcon = "${c.visual.show_public_icon}" == "True";
657 658
658 659 var formatRepoResult = function(result, container, query, escapeMarkup) {
659 660 return function(data, escapeMarkup) {
660 661 if (!data.repo_id){
661 662 return data.text; // optgroup text Repositories
662 663 }
663 664
664 665 var tmpl = '';
665 666 var repoType = data['repo_type'];
666 667 var repoName = data['text'];
667 668
668 669 if(data && data.type == 'repo'){
669 670 if(repoType === 'hg'){
670 671 tmpl += '<i class="icon-hg"></i> ';
671 672 }
672 673 else if(repoType === 'git'){
673 674 tmpl += '<i class="icon-git"></i> ';
674 675 }
675 676 else if(repoType === 'svn'){
676 677 tmpl += '<i class="icon-svn"></i> ';
677 678 }
678 679 if(data['private']){
679 680 tmpl += '<i class="icon-lock" ></i> ';
680 681 }
681 682 else if(visualShowPublicIcon){
682 683 tmpl += '<i class="icon-unlock-alt"></i> ';
683 684 }
684 685 }
685 686 tmpl += escapeMarkup(repoName);
686 687 return tmpl;
687 688
688 689 }(result, escapeMarkup);
689 690 };
690 691
691 692 var formatRepoGroupResult = function(result, container, query, escapeMarkup) {
692 693 return function(data, escapeMarkup) {
693 694 if (!data.repo_group_id){
694 695 return data.text; // optgroup text Repositories
695 696 }
696 697
697 698 var tmpl = '';
698 699 var repoGroupName = data['text'];
699 700
700 701 if(data){
701 702
702 703 tmpl += '<i class="icon-repo-group"></i> ';
703 704
704 705 }
705 706 tmpl += escapeMarkup(repoGroupName);
706 707 return tmpl;
707 708
708 709 }(result, escapeMarkup);
709 710 };
710 711
711 712 var escapeRegExChars = function (value) {
712 713 return value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
713 714 };
714 715
715 716 var getRepoIcon = function(repo_type) {
716 717 if (repo_type === 'hg') {
717 718 return '<i class="icon-hg"></i> ';
718 719 }
719 720 else if (repo_type === 'git') {
720 721 return '<i class="icon-git"></i> ';
721 722 }
722 723 else if (repo_type === 'svn') {
723 724 return '<i class="icon-svn"></i> ';
724 725 }
725 726 return ''
726 727 };
727 728
728 729 var autocompleteMainFilterFormatResult = function (data, value, org_formatter) {
729 730
730 731 if (value.split(':').length === 2) {
731 732 value = value.split(':')[1]
732 733 }
733 734
734 735 var searchType = data['type'];
735 736 var valueDisplay = data['value_display'];
736 737
737 738 var pattern = '(' + escapeRegExChars(value) + ')';
738 739
739 740 valueDisplay = Select2.util.escapeMarkup(valueDisplay);
740 741
741 742 // highlight match
742 743 if (searchType != 'text') {
743 744 valueDisplay = valueDisplay.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>');
744 745 }
745 746
746 747 var icon = '';
747 748
748 749 if (searchType === 'hint') {
749 750 icon += '<i class="icon-repo-group"></i> ';
750 751 }
751 752 // full text search
752 753 else if (searchType === 'search') {
753 754 icon += '<i class="icon-more"></i> ';
754 755 }
755 756 // repository
756 757 else if (searchType === 'repo') {
757 758
758 759 var repoIcon = getRepoIcon(data['repo_type']);
759 760 icon += repoIcon;
760 761
761 762 if (data['private']) {
762 763 icon += '<i class="icon-lock" ></i> ';
763 764 }
764 765 else if (visualShowPublicIcon) {
765 766 icon += '<i class="icon-unlock-alt"></i> ';
766 767 }
767 768 }
768 769 // repository groups
769 770 else if (searchType === 'repo_group') {
770 771 icon += '<i class="icon-repo-group"></i> ';
771 772 }
772 773 // user group
773 774 else if (searchType === 'user_group') {
774 775 icon += '<i class="icon-group"></i> ';
775 776 }
776 777 // user
777 778 else if (searchType === 'user') {
778 779 icon += '<img class="gravatar" src="{0}"/>'.format(data['icon_link']);
779 780 }
780 781 // commit
781 782 else if (searchType === 'commit') {
782 783 var repo_data = data['repo_data'];
783 784 var repoIcon = getRepoIcon(repo_data['repository_type']);
784 785 if (repoIcon) {
785 786 icon += repoIcon;
786 787 } else {
787 788 icon += '<i class="icon-tag"></i>';
788 789 }
789 790 }
790 791 // file
791 792 else if (searchType === 'file') {
792 793 var repo_data = data['repo_data'];
793 794 var repoIcon = getRepoIcon(repo_data['repository_type']);
794 795 if (repoIcon) {
795 796 icon += repoIcon;
796 797 } else {
797 798 icon += '<i class="icon-tag"></i>';
798 799 }
799 800 }
800 801 // generic text
801 802 else if (searchType === 'text') {
802 803 icon = '';
803 804 }
804 805
805 806 var tmpl = '<div class="ac-container-wrap">{0}{1}</div>';
806 807 return tmpl.format(icon, valueDisplay);
807 808 };
808 809
809 810 var handleSelect = function(element, suggestion) {
810 811 if (suggestion.type === "hint") {
811 812 // we skip action
812 813 $('#main_filter').focus();
813 814 }
814 815 else if (suggestion.type === "text") {
815 816 // we skip action
816 817 $('#main_filter').focus();
817 818
818 819 } else {
819 820 window.location = suggestion['url'];
820 821 }
821 822 };
822 823
823 824 var autocompleteMainFilterResult = function (suggestion, originalQuery, queryLowerCase) {
824 825 if (queryLowerCase.split(':').length === 2) {
825 826 queryLowerCase = queryLowerCase.split(':')[1]
826 827 }
827 828 if (suggestion.type === "text") {
828 829 // special case we don't want to "skip" display for
829 830 return true
830 831 }
831 832 return suggestion.value_display.toLowerCase().indexOf(queryLowerCase) !== -1;
832 833 };
833 834
834 835 var cleanContext = {
835 836 repo_view_type: null,
836 837
837 838 repo_id: null,
838 839 repo_name: "",
839 840
840 841 repo_group_id: null,
841 842 repo_group_name: null
842 843 };
843 844 var removeGoToFilter = function () {
844 845 $('.searchTagHidable').hide();
845 846 $('#main_filter').autocomplete(
846 847 'setOptions', {params:{search_context: cleanContext}});
847 848 };
848 849
849 850 $('#main_filter').autocomplete({
850 851 serviceUrl: pyroutes.url('goto_switcher_data'),
851 852 params: {
852 853 "search_context": templateContext.search_context
853 854 },
854 855 minChars:2,
855 856 maxHeight:400,
856 857 deferRequestBy: 300, //miliseconds
857 858 tabDisabled: true,
858 859 autoSelectFirst: false,
859 860 formatResult: autocompleteMainFilterFormatResult,
860 861 lookupFilter: autocompleteMainFilterResult,
861 862 onSelect: function (element, suggestion) {
862 863 handleSelect(element, suggestion);
863 864 return false;
864 865 },
865 866 onSearchError: function (element, query, jqXHR, textStatus, errorThrown) {
866 867 if (jqXHR !== 'abort') {
867 868 alert("Error during search.\nError code: {0}".format(textStatus));
868 869 window.location = '';
869 870 }
870 871 }
871 872 });
872 873
873 874 showMainFilterBox = function () {
874 875 $('#main_filter_help').toggle();
875 876 };
876 877
877 878 $('#main_filter').on('keydown.autocomplete', function (e) {
878 879
879 880 var BACKSPACE = 8;
880 881 var el = $(e.currentTarget);
881 882 if(e.which === BACKSPACE){
882 883 var inputVal = el.val();
883 884 if (inputVal === ""){
884 885 removeGoToFilter()
885 886 }
886 887 }
887 888 });
888 889
889 890 </script>
890 891 <script src="${h.asset('js/rhodecode/base/keyboard-bindings.js', ver=c.rhodecode_version_hash)}"></script>
891 892 </%def>
892 893
893 894 <div class="modal" id="help_kb" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
894 895 <div class="modal-dialog">
895 896 <div class="modal-content">
896 897 <div class="modal-header">
897 898 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
898 899 <h4 class="modal-title" id="myModalLabel">${_('Keyboard shortcuts')}</h4>
899 900 </div>
900 901 <div class="modal-body">
901 902 <div class="block-left">
902 903 <table class="keyboard-mappings">
903 904 <tbody>
904 905 <tr>
905 906 <th></th>
906 907 <th>${_('Site-wide shortcuts')}</th>
907 908 </tr>
908 909 <%
909 910 elems = [
910 911 ('/', 'Use quick search box'),
911 912 ('g h', 'Goto home page'),
912 913 ('g g', 'Goto my private gists page'),
913 914 ('g G', 'Goto my public gists page'),
914 915 ('g 0-9', 'Goto bookmarked items from 0-9'),
915 916 ('n r', 'New repository page'),
916 917 ('n g', 'New gist page'),
917 918 ]
918 919 %>
919 920 %for key, desc in elems:
920 921 <tr>
921 922 <td class="keys">
922 923 <span class="key tag">${key}</span>
923 924 </td>
924 925 <td>${desc}</td>
925 926 </tr>
926 927 %endfor
927 928 </tbody>
928 929 </table>
929 930 </div>
930 931 <div class="block-left">
931 932 <table class="keyboard-mappings">
932 933 <tbody>
933 934 <tr>
934 935 <th></th>
935 936 <th>${_('Repositories')}</th>
936 937 </tr>
937 938 <%
938 939 elems = [
939 940 ('g s', 'Goto summary page'),
940 941 ('g c', 'Goto changelog page'),
941 942 ('g f', 'Goto files page'),
942 943 ('g F', 'Goto files page with file search activated'),
943 944 ('g p', 'Goto pull requests page'),
944 945 ('g o', 'Goto repository settings'),
945 946 ('g O', 'Goto repository permissions settings'),
946 947 ]
947 948 %>
948 949 %for key, desc in elems:
949 950 <tr>
950 951 <td class="keys">
951 952 <span class="key tag">${key}</span>
952 953 </td>
953 954 <td>${desc}</td>
954 955 </tr>
955 956 %endfor
956 957 </tbody>
957 958 </table>
958 959 </div>
959 960 </div>
960 961 <div class="modal-footer">
961 962 </div>
962 963 </div><!-- /.modal-content -->
963 964 </div><!-- /.modal-dialog -->
964 965 </div><!-- /.modal -->
965 966
General Comments 0
You need to be logged in to leave comments. Login now