##// END OF EJS Templates
nav-bar: added placeholder for notice box.
marcink -
r2898:89a17f27 default
parent child Browse files
Show More
@@ -1,684 +1,695 b''
1 1 // navigation.less
2 2 // For use in RhodeCode applications;
3 3 // see style guide documentation for guidelines.
4 4
5 5 // HEADER NAVIGATION
6 6
7 7 .horizontal-list {
8 8 float: right;
9 9 display: block;
10 10 margin: 0;
11 11 padding: 0;
12 12 -webkit-padding-start: 0;
13 13 text-align: left;
14 14 font-size: @navigation-fontsize;
15 15 color: @grey6;
16 16 z-index:10;
17 17
18 18 li {
19 19 line-height: 1em;
20 20 list-style-type: none;
21 21
22 22 a {
23 23 padding: 0 .5em;
24 24
25 25 &.menu_link_notifications {
26 26 .pill(7px,@rcblue);
27 27 display: inline;
28 28 margin: 0 7px 0 .7em;
29 29 font-size: @basefontsize;
30 30 color: white;
31 31
32 32 &.empty {
33 33 background-color: @grey4;
34 34 }
35 35
36 36 &:hover {
37 37 background-color: @rcdarkblue;
38 38 }
39 39 }
40 40 }
41 41 .pill_container {
42 42 margin: 1.25em 0px 0px 0px;
43 43 float: right;
44 44 }
45 45
46 46 &#quick_login_li {
47 47 &:hover {
48 48 color: @grey5;
49 49 }
50 50
51 51 a.menu_link_notifications {
52 52 color: white;
53 53 }
54 54
55 55 .user {
56 56 padding-bottom: 10px;
57 57 }
58 58
59 59 &.open {
60 60 .user {
61 61 border-bottom: 5px solid @rcblue;
62 62 }
63 63 }
64 64 }
65 65
66 66 &:before { content: none; }
67 67
68 68 &:last-child {
69 69 .menulabel {
70 70 padding-right: 0;
71 71 border-right: none;
72 72
73 73 .show_more {
74 74 padding-right: 0;
75 75 }
76 76 }
77 77
78 78 &> a {
79 79 border-bottom: none;
80 80 }
81 81 }
82 82
83 83 &.active {
84 84 border-bottom: 5px solid @rcblue;
85 85 }
86 86
87 87 &.open {
88 88
89 89 a {
90 90 color: white;
91 91 }
92 92 }
93 93
94 94 &:focus {
95 95 outline: none;
96 96 }
97 97
98 98 ul li {
99 99 display: block;
100 100
101 101 &:last-child> a {
102 102 border-bottom: none;
103 103 }
104 104
105 105 ul li:last-child a {
106 106 /* we don't expect more then 3 levels of submenu and the third
107 107 level can have different html structure */
108 108 border-bottom: none;
109 109 }
110 110 }
111 111 }
112 112
113 113 > li {
114 114 float: left;
115 115 display: block;
116 116 padding: 0;
117 117
118 118 > a,
119 119 &.has_select2 a {
120 120 display: block;
121 121 padding: 10px 0 2px;
122 122
123 123 .show_more {
124 124 margin-top: -4px;
125 125 padding-right: .5em;
126 126 }
127 127 }
128 128
129 129 .menulabel {
130 130 padding: 0 .5em;
131 131 line-height: 1em;
132 132 // for this specifically we do not use a variable
133 133 border-right: 1px solid @grey4;
134 134 }
135 135
136 136 .pr_notifications {
137 137 padding-left: .5em;
138 138 }
139 139
140 140 .pr_notifications + .menulabel {
141 141 display:inline;
142 142 padding-left: 0;
143 143 }
144 144
145 145 &:hover,
146 146 &.open,
147 147 &.active {
148 148 a {
149 149 color: @grey1;
150 150 }
151 151 }
152 152 }
153 153
154 154 pre {
155 155 margin: 0;
156 156 padding: 0;
157 157 }
158 158
159 159 .select2-container,
160 160 .menulink.childs {
161 161 position: relative;
162 162 }
163 163
164 164 #quick_login {
165 165
166 166 li a {
167 167 padding: .5em 0;
168 168 border-bottom: none;
169 169 color: @grey2;
170 170
171 171 &:hover { color: @grey1; }
172 172 }
173 173
174 174 .show_more {
175 175 padding-left: .5em;
176 176 }
177 177 }
178 178
179 179 #quick_login_link {
180 180 display: inline-block;
181 181
182 182 .gravatar {
183 183 border: 1px solid @grey2;
184 184 }
185 185
186 186 .gravatar-login {
187 187 height: 20px;
188 188 width: 20px;
189 189 margin: -8px 0;
190 190 padding: 0;
191 191 }
192 192
193 193 &:hover .user {
194 194 color: @grey6;
195 195 }
196 196 }
197 197 }
198 198 .header .horizontal-list {
199 199
200 200 li {
201 201
202 202 &#quick_login_li {
203 203 padding-left: .5em;
204 204
205 205 &:hover #quick_login_link {
206 206 color: inherit;
207 207 }
208 208 }
209 209
210 210 &:before { content: none; }
211 211 }
212 212
213 213 > li {
214 214
215 215 a {
216 216 padding: 18px 0 12px 0;
217 217 color: @nav-grey;
218 218
219 219 &.menu_link_notifications {
220 220 padding: 1px 8px;
221 221 }
222 222 }
223 223
224 224 &:hover,
225 225 &.open,
226 226 &.active {
227 227 .pill_container a {
228 228 // don't select text for the pill container, it has it' own
229 229 // hover behaviour
230 230 color: @nav-grey;
231 231 }
232 232 }
233 233
234 234 &:hover,
235 235 &.open,
236 236 &.active {
237 237 a {
238 238 color: @grey6;
239 239 }
240 240 }
241 241
242 242 .select2-dropdown-open a {
243 243 color: @grey6;
244 244 }
245 245
246 246 .repo-switcher {
247 247 padding-left: 0;
248 248
249 249 .menulabel {
250 250 padding-left: 0;
251 251 }
252 252 }
253 253 }
254 254
255 255 li ul li {
256 256 background-color:@grey2;
257 257
258 258 a {
259 259 padding: .5em 0;
260 260 border-bottom: @border-thickness solid @border-default-color;
261 261 color: @grey6;
262 262 }
263 263
264 264 &:last-child a, &.last a{
265 265 border-bottom: none;
266 266 }
267 267
268 268 &:hover {
269 269 background-color: @grey3;
270 270 }
271 271 }
272 272
273 273 .submenu {
274 274 margin-top: 5px;
275 275 }
276 276 }
277 277
278 278 // SUBMENUS
279 279 .navigation .submenu {
280 280 display: none;
281 281 }
282 282
283 283 .navigation li.open {
284 284 .submenu {
285 285 display: block;
286 286 }
287 287 }
288 288
289 289 .navigation li:last-child .submenu {
290 290 right: -20px;
291 291 left: auto;
292 292 }
293 293
294 294 .submenu {
295 295 position: absolute;
296 296 top: 100%;
297 297 left: 0;
298 298 min-width: 150px;
299 299 margin: 6px 0 0;
300 300 padding: 0;
301 301 text-align: left;
302 302 font-family: @text-light;
303 303 border-radius: @border-radius;
304 304 z-index: 20;
305 305
306 306 li {
307 307 display: block;
308 308 margin: 0;
309 309 padding: 0 .5em;
310 310 line-height: 1em;
311 311 color: @grey3;
312 312 background-color: @grey6;
313 313
314 314 &:before { content: none; }
315 315
316 316 a {
317 317 display: block;
318 318 width: 100%;
319 319 padding: .5em 0;
320 320 border-right: none;
321 321 border-bottom: @border-thickness solid white;
322 322 color: @grey3;
323 323 }
324 324
325 325 ul {
326 326 display: none;
327 327 position: absolute;
328 328 top: 0;
329 329 right: 100%;
330 330 padding: 0;
331 331 z-index: 30;
332 332 }
333 333 &:hover {
334 334 background-color: @grey5;
335 335 -webkit-transition: background .3s;
336 336 -moz-transition: background .3s;
337 337 -o-transition: background .3s;
338 338 transition: background .3s;
339 339
340 340 ul {
341 341 display: block;
342 342 }
343 343 }
344 344 }
345 345 }
346 346
347 347
348 348
349 349
350 350 // repo dropdown
351 351 .quick_repo_menu {
352 352 width: 15px;
353 353 text-align: center;
354 354 position: relative;
355 355 cursor: pointer;
356 356
357 357 div {
358 358 overflow: visible !important;
359 359 }
360 360
361 361 &.sorting {
362 362 cursor: auto;
363 363 }
364 364
365 365 &:hover {
366 366 .menu_items_container {
367 367 position: absolute;
368 368 display: block;
369 369 }
370 370 .menu_items {
371 371 display: block;
372 372 }
373 373 }
374 374
375 375 i {
376 376 margin: 0;
377 377 color: @grey4;
378 378 }
379 379
380 380 .menu_items_container {
381 381 position: absolute;
382 382 top: 0;
383 383 left: 100%;
384 384 margin: 0;
385 385 padding: 0;
386 386 list-style: none;
387 387 background-color: @grey6;
388 388 z-index: 999;
389 389 text-align: left;
390 390
391 391 a {
392 392 color: @grey2;
393 393 }
394 394
395 395 ul.menu_items {
396 396 margin: 0;
397 397 padding: 0;
398 398 }
399 399
400 400 li {
401 401 margin: 0;
402 402 padding: 0;
403 403 line-height: 1em;
404 404 list-style-type: none;
405 405
406 406 &:before { content: none; }
407 407
408 408 a {
409 409 display: block;
410 410 height: 16px;
411 411 padding: 8px; //must add up to td height (28px)
412 412
413 413 &:hover {
414 414 background-color: @grey5;
415 415 -webkit-transition: background .3s;
416 416 -moz-transition: background .3s;
417 417 -o-transition: background .3s;
418 418 transition: background .3s;
419 419 }
420 420 }
421 421 }
422 422 }
423 423 }
424 424
425 425 // Header Repository Switcher
426 426 // Select2 Dropdown
427 427 #select2-drop.select2-drop.repo-switcher-dropdown {
428 428 width: auto !important;
429 429 margin-top: 5px;
430 430 padding: 1em 0;
431 431 text-align: left;
432 432 .border-radius-bottom(@border-radius);
433 433 border-color: transparent;
434 434 color: @grey6;
435 435 background-color: @grey2;
436 436
437 437 input {
438 438 min-width: 90%;
439 439 }
440 440
441 441 ul.select2-result-sub {
442 442
443 443 li {
444 444 line-height: 1em;
445 445
446 446 &:hover,
447 447 &.select2-highlighted {
448 448 background-color: @grey3;
449 449 }
450 450 }
451 451
452 452 &:before { content: none; }
453 453 }
454 454
455 455 ul.select2-results {
456 456 min-width: 200px;
457 457 margin: 0;
458 458 padding: 0;
459 459 list-style-type: none;
460 460 overflow-x: visible;
461 461 overflow-y: scroll;
462 462
463 463 li {
464 464 padding: 0 8px;
465 465 line-height: 1em;
466 466 color: @grey6;
467 467
468 468 &:before { content: none; }
469 469
470 470 &>.select2-result-label {
471 471 padding: 8px 0;
472 472 border-bottom: @border-thickness solid @grey3;
473 473 white-space: nowrap;
474 474 color: @grey5;
475 475 cursor: pointer;
476 476 }
477 477
478 478 &.select2-result-with-children {
479 479 margin: 0;
480 480 padding: 0;
481 481 }
482 482
483 483 &.select2-result-unselectable > .select2-result-label {
484 484 margin: 0 8px;
485 485 }
486 486
487 487 }
488 488 }
489 489
490 490 ul.select2-result-sub {
491 491 margin: 0;
492 492 padding: 0;
493 493
494 494 li {
495 495 display: block;
496 496 margin: 0;
497 497 border-right: none;
498 498 line-height: 1em;
499 499 font-family: @text-light;
500 500 color: @grey2;
501 501
502 502 &:before { content: none; }
503 503
504 504 &:hover {
505 505 background-color: @grey3;
506 506 }
507 507 }
508 508 }
509 509 }
510 510
511 511
512 512 #context-bar {
513 513 display: block;
514 514 margin: 0 auto;
515 515 padding: 0 @header-padding;
516 516 background-color: @grey6;
517 517 border-bottom: @border-thickness solid @grey5;
518 518
519 519 .clear {
520 520 clear: both;
521 521 }
522 522 }
523 523
524 524 ul#context-pages {
525 525 li {
526 526 line-height: 1em;
527 527
528 528 &:before { content: none; }
529 529
530 530 a {
531 531 color: @grey3;
532 532 }
533 533
534 534 &.active {
535 535 // special case, non-variable color
536 536 border-bottom: 4px solid @nav-grey;
537 537
538 538 a {
539 539 color: @grey1;
540 540 }
541 541 }
542 542 }
543 543 }
544 544
545 545 // PAGINATION
546 546
547 547 .pagination {
548 548 border: @border-thickness solid @rcblue;
549 549 color: @rcblue;
550 550
551 551 .current {
552 552 color: @grey4;
553 553 }
554 554 }
555 555
556 556 .dataTables_processing {
557 557 text-align: center;
558 558 font-size: 1.1em;
559 559 position: relative;
560 560 top: 95px;
561 561 }
562 562
563 563 .dataTables_paginate, .pagination-wh {
564 564 text-align: left;
565 565 display: inline-block;
566 566 border-left: 1px solid @rcblue;
567 567 float: none;
568 568 overflow: hidden;
569 569
570 570 .paginate_button, .pager_curpage,
571 571 .pager_link, .pg-previous, .pg-next, .pager_dotdot {
572 572 display: inline-block;
573 573 padding: @menupadding/4 @menupadding;
574 574 border: 1px solid @rcblue;
575 575 border-left: 0;
576 576 color: @rcblue;
577 577 cursor: pointer;
578 578 float: left;
579 579 }
580 580
581 581 .pager_curpage, .pager_dotdot,
582 582 .paginate_button.current, .paginate_button.disabled,
583 583 .disabled {
584 584 color: @grey3;
585 585 cursor: default;
586 586 }
587 587
588 588 .ellipsis {
589 589 display: inline-block;
590 590 text-align: left;
591 591 padding: @menupadding/4 @menupadding;
592 592 border: 1px solid @rcblue;
593 593 border-left: 0;
594 594 float: left;
595 595 }
596 596 }
597 597
598 598 // SIDEBAR
599 599
600 600 .sidebar {
601 601 .block-left;
602 602 clear: left;
603 603 max-width: @sidebar-width;
604 604 margin-right: @sidebarpadding;
605 605 padding-right: @sidebarpadding;
606 606 font-family: @text-regular;
607 607 color: @grey1;
608 608
609 609 &#graph_nodes {
610 610 clear:both;
611 611 width: auto;
612 612 margin-left: -100px;
613 613 padding: 0;
614 614 border: none;
615 615 }
616 616
617 617 .nav-pills {
618 618 margin: 0;
619 619 }
620 620
621 621 .nav {
622 622 list-style: none;
623 623 padding: 0;
624 624
625 625 li {
626 626 padding-bottom: @menupadding;
627 627 line-height: 1em;
628 628 color: @grey4;
629 629
630 630 &.active a {
631 631 color: @grey2;
632 632 }
633 633
634 634 a {
635 635 color: @grey4;
636 636 }
637 637
638 638 &:before { content: none; }
639 639 }
640 640
641 641 }
642 642 }
643 643
644 644 .main_filter_help_box {
645 645 padding: 7px 7px;
646 646 border-top: 1px solid @grey4;
647 647 border-right: 1px solid @grey4;
648 648 border-bottom: 1px solid @grey4;
649 649 display: inline-block;
650 650 vertical-align: top;
651 651 margin-left: -5px;
652 652 background: @grey3;
653 653 }
654 654
655 655 .main_filter_input_box {
656 656 display: inline-block;
657 657 }
658 658
659 659 .main_filter_box {
660 660 margin: 9px 0 0 0;
661 661 }
662 662
663 663 #main_filter_help {
664 664 background: @grey3;
665 665 border: 1px solid black;
666 666 position: absolute;
667 667 white-space: pre-wrap;
668 668 z-index: 9999;
669 669 color: @nav-grey;
670 670 margin: 1px 7px;
671 671 padding: 0 2px;
672 672 }
673 673
674 674 .main_filter_input {
675 675 padding: 6px;
676 676 min-width: 220px;
677 677 color: @nav-grey;
678 678 background: @grey3;
679 679 }
680 680
681 681 .main_filter_input::placeholder {
682 682 color: @nav-grey;
683 683 opacity: 1;
684 684 }
685
686 .notice-box {
687 display:block !important;
688 padding: 9px 0 !important;
689 }
690
691 .menulabel-notice {
692 border: 1px solid @color5;
693 padding:7px 10px;
694 color: @color5;
695 }
@@ -1,676 +1,685 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 <!--- END CONTEXT BAR -->
291 291
292 292 </%def>
293 293
294 294 <%def name="usermenu(active=False)">
295 295 ## USER MENU
296 296 <li id="quick_login_li" class="${'active' if active else ''}">
297 297 <a id="quick_login_link" class="menulink childs">
298 298 ${gravatar(c.rhodecode_user.email, 20)}
299 299 <span class="user">
300 300 %if c.rhodecode_user.username != h.DEFAULT_USER:
301 301 <span class="menu_link_user">${c.rhodecode_user.username}</span><div class="show_more"></div>
302 302 %else:
303 303 <span>${_('Sign in')}</span>
304 304 %endif
305 305 </span>
306 306 </a>
307 307
308 308 <div class="user-menu submenu">
309 309 <div id="quick_login">
310 310 %if c.rhodecode_user.username == h.DEFAULT_USER:
311 311 <h4>${_('Sign in to your account')}</h4>
312 312 ${h.form(h.route_path('login', _query={'came_from': h.current_route_path(request)}), needs_csrf_token=False)}
313 313 <div class="form form-vertical">
314 314 <div class="fields">
315 315 <div class="field">
316 316 <div class="label">
317 317 <label for="username">${_('Username')}:</label>
318 318 </div>
319 319 <div class="input">
320 320 ${h.text('username',class_='focus',tabindex=1)}
321 321 </div>
322 322
323 323 </div>
324 324 <div class="field">
325 325 <div class="label">
326 326 <label for="password">${_('Password')}:</label>
327 327 %if h.HasPermissionAny('hg.password_reset.enabled')():
328 328 <span class="forgot_password">${h.link_to(_('(Forgot password?)'),h.route_path('reset_password'), class_='pwd_reset')}</span>
329 329 %endif
330 330 </div>
331 331 <div class="input">
332 332 ${h.password('password',class_='focus',tabindex=2)}
333 333 </div>
334 334 </div>
335 335 <div class="buttons">
336 336 <div class="register">
337 337 %if h.HasPermissionAny('hg.admin', 'hg.register.auto_activate', 'hg.register.manual_activate')():
338 338 ${h.link_to(_("Don't have an account?"),h.route_path('register'))} <br/>
339 339 %endif
340 340 ${h.link_to(_("Using external auth? Sign In here."),h.route_path('login'))}
341 341 </div>
342 342 <div class="submit">
343 343 ${h.submit('sign_in',_('Sign In'),class_="btn btn-small",tabindex=3)}
344 344 </div>
345 345 </div>
346 346 </div>
347 347 </div>
348 348 ${h.end_form()}
349 349 %else:
350 350 <div class="">
351 351 <div class="big_gravatar">${gravatar(c.rhodecode_user.email, 48)}</div>
352 352 <div class="full_name">${c.rhodecode_user.full_name_or_username}</div>
353 353 <div class="email">${c.rhodecode_user.email}</div>
354 354 </div>
355 355 <div class="">
356 356 <ol class="links">
357 357 <li>${h.link_to(_(u'My account'),h.route_path('my_account_profile'))}</li>
358 358 % if c.rhodecode_user.personal_repo_group:
359 359 <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>
360 360 % endif
361 361 <li>${h.link_to(_(u'Pull Requests'), h.route_path('my_account_pullrequests'))}</li>
362 362
363 363 <li class="logout">
364 364 ${h.secure_form(h.route_path('logout'), request=request)}
365 365 ${h.submit('log_out', _(u'Sign Out'),class_="btn btn-primary")}
366 366 ${h.end_form()}
367 367 </li>
368 368 </ol>
369 369 </div>
370 370 %endif
371 371 </div>
372 372 </div>
373 373 %if c.rhodecode_user.username != h.DEFAULT_USER:
374 374 <div class="pill_container">
375 375 <a class="menu_link_notifications ${'empty' if c.unread_notifications == 0 else ''}" href="${h.route_path('notifications_show_all')}">${c.unread_notifications}</a>
376 376 </div>
377 377 % endif
378 378 </li>
379 379 </%def>
380 380
381 381 <%def name="menu_items(active=None)">
382 382 <%
383 383 def is_active(selected):
384 384 if selected == active:
385 385 return "active"
386 386 return ""
387 387 %>
388
388 389 <ul id="quick" class="main_nav navigation horizontal-list">
390 ## notice box for important system messages
391 <li style="display: none">
392 <a class="notice-box" href="#openNotice" onclick="showNoticeBox(); return false">
393 <div class="menulabel-notice" >
394 0
395 </div>
396 </a>
397 </li>
389 398
390 399 ## Main filter
391 400 <li>
392 401 <div class="menulabel main_filter_box">
393 402 <div class="main_filter_input_box">
394 403 <input class="main_filter_input" id="main_filter" size="15" type="text" name="main_filter" placeholder="${_('search / go to...')}" value=""/>
395 404 </div>
396 405 <div class="main_filter_help_box">
397 406 <a href="#showFilterHelp" onclick="showMainFilterBox(); return false">?</a>
398 407 </div>
399 408 </div>
400 409
401 410 <div id="main_filter_help" style="display: none">
402 411 Use '/' key to quickly access this field.
403 412 Enter name of repository, or repository group for quick search.
404 413
405 414 Prefix query to allow special search:
406 415
407 416 user:admin, to search for usernames
408 417
409 418 user_group:devops, to search for user groups
410 419
411 420 commit:efced4, to search for commits
412 421
413 422 </div>
414 423 </li>
415 424
416 425 ## ROOT MENU
417 426 %if c.rhodecode_user.username != h.DEFAULT_USER:
418 427 <li class="${is_active('journal')}">
419 428 <a class="menulink" title="${_('Show activity journal')}" href="${h.route_path('journal')}">
420 429 <div class="menulabel">${_('Journal')}</div>
421 430 </a>
422 431 </li>
423 432 %else:
424 433 <li class="${is_active('journal')}">
425 434 <a class="menulink" title="${_('Show Public activity journal')}" href="${h.route_path('journal_public')}">
426 435 <div class="menulabel">${_('Public journal')}</div>
427 436 </a>
428 437 </li>
429 438 %endif
430 439 <li class="${is_active('gists')}">
431 440 <a class="menulink childs" title="${_('Show Gists')}" href="${h.route_path('gists_show')}">
432 441 <div class="menulabel">${_('Gists')}</div>
433 442 </a>
434 443 </li>
435 444 <li class="${is_active('search')}">
436 445 <a class="menulink" title="${_('Search in repositories you have access to')}" href="${h.route_path('search')}">
437 446 <div class="menulabel">${_('Search')}</div>
438 447 </a>
439 448 </li>
440 449 % if h.HasPermissionAll('hg.admin')('access admin main page'):
441 450 <li class="${is_active('admin')}">
442 451 <a class="menulink childs" title="${_('Admin settings')}" href="#" onclick="return false;">
443 452 <div class="menulabel">${_('Admin')} <div class="show_more"></div></div>
444 453 </a>
445 454 ${admin_menu()}
446 455 </li>
447 456 % elif c.rhodecode_user.repositories_admin or c.rhodecode_user.repository_groups_admin or c.rhodecode_user.user_groups_admin:
448 457 <li class="${is_active('admin')}">
449 458 <a class="menulink childs" title="${_('Delegated Admin settings')}">
450 459 <div class="menulabel">${_('Admin')} <div class="show_more"></div></div>
451 460 </a>
452 461 ${admin_menu_simple(c.rhodecode_user.repositories_admin,
453 462 c.rhodecode_user.repository_groups_admin,
454 463 c.rhodecode_user.user_groups_admin or h.HasPermissionAny('hg.usergroup.create.true')())}
455 464 </li>
456 465 % endif
457 466 ## render extra user menu
458 467 ${usermenu(active=(active=='my_account'))}
459 468
460 469 % if c.debug_style:
461 470 <li>
462 471 <a class="menulink" title="${_('Style')}" href="${h.route_path('debug_style_home')}">
463 472 <div class="menulabel">${_('[Style]')}</div>
464 473 </a>
465 474 </li>
466 475 % endif
467 476 </ul>
468 477
469 478 <script type="text/javascript">
470 479 var visualShowPublicIcon = "${c.visual.show_public_icon}" == "True";
471 480
472 481 var formatRepoResult = function(result, container, query, escapeMarkup) {
473 482 return function(data, escapeMarkup) {
474 483 if (!data.repo_id){
475 484 return data.text; // optgroup text Repositories
476 485 }
477 486
478 487 var tmpl = '';
479 488 var repoType = data['repo_type'];
480 489 var repoName = data['text'];
481 490
482 491 if(data && data.type == 'repo'){
483 492 if(repoType === 'hg'){
484 493 tmpl += '<i class="icon-hg"></i> ';
485 494 }
486 495 else if(repoType === 'git'){
487 496 tmpl += '<i class="icon-git"></i> ';
488 497 }
489 498 else if(repoType === 'svn'){
490 499 tmpl += '<i class="icon-svn"></i> ';
491 500 }
492 501 if(data['private']){
493 502 tmpl += '<i class="icon-lock" ></i> ';
494 503 }
495 504 else if(visualShowPublicIcon){
496 505 tmpl += '<i class="icon-unlock-alt"></i> ';
497 506 }
498 507 }
499 508 tmpl += escapeMarkup(repoName);
500 509 return tmpl;
501 510
502 511 }(result, escapeMarkup);
503 512 };
504 513
505 514
506 515 var autocompleteMainFilterFormatResult = function (data, value, org_formatter) {
507 516
508 517 if (value.split(':').length === 2) {
509 518 value = value.split(':')[1]
510 519 }
511 520
512 521 var searchType = data['type'];
513 522 var valueDisplay = data['value_display'];
514 523
515 524 var escapeRegExChars = function (value) {
516 525 return value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
517 526 };
518 527 var pattern = '(' + escapeRegExChars(value) + ')';
519 528
520 529 // highlight match
521 530 valueDisplay = Select2.util.escapeMarkup(valueDisplay);
522 531 valueDisplay = valueDisplay.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>');
523 532
524 533 var icon = '';
525 534
526 535 if (searchType === 'hint') {
527 536 icon += '<i class="icon-folder-close"></i> ';
528 537 }
529 538 else if (searchType === 'search') {
530 539 icon += '<i class="icon-more"></i> ';
531 540 }
532 541 else if (searchType === 'repo') {
533 542 if (data['repo_type'] === 'hg') {
534 543 icon += '<i class="icon-hg"></i> ';
535 544 }
536 545 else if (data['repo_type'] === 'git') {
537 546 icon += '<i class="icon-git"></i> ';
538 547 }
539 548 else if (data['repo_type'] === 'svn') {
540 549 icon += '<i class="icon-svn"></i> ';
541 550 }
542 551 if (data['private']) {
543 552 icon += '<i class="icon-lock" ></i> ';
544 553 }
545 554 else if (visualShowPublicIcon) {
546 555 icon += '<i class="icon-unlock-alt"></i> ';
547 556 }
548 557 }
549 558 else if (searchType === 'repo_group') {
550 559 icon += '<i class="icon-folder-close"></i> ';
551 560 }
552 561 else if (searchType === 'user_group') {
553 562 icon += '<i class="icon-group"></i> ';
554 563 }
555 564 else if (searchType === 'user') {
556 565 icon += '<img class="gravatar" src="{0}"/>'.format(data['icon_link']);
557 566 }
558 567 else if (searchType === 'commit') {
559 568 icon += '<i class="icon-tag"></i>';
560 569 }
561 570
562 571 var tmpl = '<div class="ac-container-wrap">{0}{1}</div>';
563 572 return tmpl.format(icon, valueDisplay);
564 573 };
565 574
566 575 var handleSelect = function(element, suggestion) {
567 576 if (suggestion.type === "hint") {
568 577 // we skip action
569 578 $('#main_filter').focus();
570 579 } else {
571 580 window.location = suggestion['url'];
572 581 }
573 582 };
574 583 var autocompleteMainFilterResult = function (suggestion, originalQuery, queryLowerCase) {
575 584 if (queryLowerCase.split(':').length === 2) {
576 585 queryLowerCase = queryLowerCase.split(':')[1]
577 586 }
578 587 return suggestion.value_display.toLowerCase().indexOf(queryLowerCase) !== -1;
579 588 };
580 589
581 590 $('#main_filter').autocomplete({
582 591 serviceUrl: pyroutes.url('goto_switcher_data'),
583 592 params: {"repo_group_id": templateContext.repo_group_id},
584 593 minChars:2,
585 594 maxHeight:400,
586 595 deferRequestBy: 300, //miliseconds
587 596 tabDisabled: true,
588 597 autoSelectFirst: true,
589 598 formatResult: autocompleteMainFilterFormatResult,
590 599 lookupFilter: autocompleteMainFilterResult,
591 600 onSelect: function(element, suggestion){
592 601 handleSelect(element, suggestion);
593 602 return false;
594 603 }
595 604 });
596 605
597 606 showMainFilterBox = function () {
598 607 $('#main_filter_help').toggle();
599 608 }
600 609
601 610 </script>
602 611 <script src="${h.asset('js/rhodecode/base/keyboard-bindings.js', ver=c.rhodecode_version_hash)}"></script>
603 612 </%def>
604 613
605 614 <div class="modal" id="help_kb" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
606 615 <div class="modal-dialog">
607 616 <div class="modal-content">
608 617 <div class="modal-header">
609 618 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
610 619 <h4 class="modal-title" id="myModalLabel">${_('Keyboard shortcuts')}</h4>
611 620 </div>
612 621 <div class="modal-body">
613 622 <div class="block-left">
614 623 <table class="keyboard-mappings">
615 624 <tbody>
616 625 <tr>
617 626 <th></th>
618 627 <th>${_('Site-wide shortcuts')}</th>
619 628 </tr>
620 629 <%
621 630 elems = [
622 631 ('/', 'Use quick search box'),
623 632 ('g h', 'Goto home page'),
624 633 ('g g', 'Goto my private gists page'),
625 634 ('g G', 'Goto my public gists page'),
626 635 ('n r', 'New repository page'),
627 636 ('n g', 'New gist page'),
628 637 ]
629 638 %>
630 639 %for key, desc in elems:
631 640 <tr>
632 641 <td class="keys">
633 642 <span class="key tag">${key}</span>
634 643 </td>
635 644 <td>${desc}</td>
636 645 </tr>
637 646 %endfor
638 647 </tbody>
639 648 </table>
640 649 </div>
641 650 <div class="block-left">
642 651 <table class="keyboard-mappings">
643 652 <tbody>
644 653 <tr>
645 654 <th></th>
646 655 <th>${_('Repositories')}</th>
647 656 </tr>
648 657 <%
649 658 elems = [
650 659 ('g s', 'Goto summary page'),
651 660 ('g c', 'Goto changelog page'),
652 661 ('g f', 'Goto files page'),
653 662 ('g F', 'Goto files page with file search activated'),
654 663 ('g p', 'Goto pull requests page'),
655 664 ('g o', 'Goto repository settings'),
656 665 ('g O', 'Goto repository permissions settings'),
657 666 ]
658 667 %>
659 668 %for key, desc in elems:
660 669 <tr>
661 670 <td class="keys">
662 671 <span class="key tag">${key}</span>
663 672 </td>
664 673 <td>${desc}</td>
665 674 </tr>
666 675 %endfor
667 676 </tbody>
668 677 </table>
669 678 </div>
670 679 </div>
671 680 <div class="modal-footer">
672 681 </div>
673 682 </div><!-- /.modal-content -->
674 683 </div><!-- /.modal-dialog -->
675 684 </div><!-- /.modal -->
676 685
General Comments 0
You need to be logged in to leave comments. Login now