##// END OF EJS Templates
main-page: simplify footer, and expose docs link.
marcink -
r4375:ff491385 stable
parent child Browse files
Show More
@@ -1,179 +1,179 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2010-2020 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 import pytest
23 23
24 24 import rhodecode
25 25 from rhodecode.model.db import Repository, RepoGroup, User
26 26 from rhodecode.model.meta import Session
27 27 from rhodecode.model.repo import RepoModel
28 28 from rhodecode.model.repo_group import RepoGroupModel
29 29 from rhodecode.model.settings import SettingsModel
30 30 from rhodecode.tests import TestController
31 31 from rhodecode.tests.fixture import Fixture
32 32 from rhodecode.lib import helpers as h
33 33
34 34 fixture = Fixture()
35 35
36 36
37 37 def route_path(name, **kwargs):
38 38 return {
39 39 'home': '/',
40 40 'main_page_repos_data': '/_home_repos',
41 41 'main_page_repo_groups_data': '/_home_repo_groups',
42 42 'repo_group_home': '/{repo_group_name}'
43 43 }[name].format(**kwargs)
44 44
45 45
46 46 class TestHomeController(TestController):
47 47
48 48 def test_index(self):
49 49 self.log_user()
50 50 response = self.app.get(route_path('home'))
51 51 # if global permission is set
52 52 response.mustcontain('New Repository')
53 53
54 54 def test_index_grid_repos(self, xhr_header):
55 55 self.log_user()
56 56 response = self.app.get(route_path('main_page_repos_data'), extra_environ=xhr_header)
57 57 # search for objects inside the JavaScript JSON
58 58 for obj in Repository.getAll():
59 59 response.mustcontain('<a href=\\"/{}\\">'.format(obj.repo_name))
60 60
61 61 def test_index_grid_repo_groups(self, xhr_header):
62 62 self.log_user()
63 63 response = self.app.get(route_path('main_page_repo_groups_data'),
64 64 extra_environ=xhr_header,)
65 65
66 66 # search for objects inside the JavaScript JSON
67 67 for obj in RepoGroup.getAll():
68 68 response.mustcontain('<a href=\\"/{}\\">'.format(obj.group_name))
69 69
70 70 def test_index_grid_repo_groups_without_access(self, xhr_header, user_util):
71 71 user = user_util.create_user(password='qweqwe')
72 72 group_ok = user_util.create_repo_group(owner=user)
73 73 group_id_ok = group_ok.group_id
74 74
75 75 group_forbidden = user_util.create_repo_group(owner=User.get_first_super_admin())
76 76 group_id_forbidden = group_forbidden.group_id
77 77
78 78 user_util.grant_user_permission_to_repo_group(group_forbidden, user, 'group.none')
79 79 self.log_user(user.username, 'qweqwe')
80 80
81 81 self.app.get(route_path('main_page_repo_groups_data'),
82 82 extra_environ=xhr_header,
83 83 params={'repo_group_id': group_id_ok}, status=200)
84 84
85 85 self.app.get(route_path('main_page_repo_groups_data'),
86 86 extra_environ=xhr_header,
87 87 params={'repo_group_id': group_id_forbidden}, status=404)
88 88
89 89 def test_index_contains_statics_with_ver(self):
90 90 from rhodecode.lib.base import calculate_version_hash
91 91
92 92 self.log_user()
93 93 response = self.app.get(route_path('home'))
94 94
95 95 rhodecode_version_hash = calculate_version_hash(
96 96 {'beaker.session.secret': 'test-rc-uytcxaz'})
97 97 response.mustcontain('style.css?ver={0}'.format(rhodecode_version_hash))
98 98 response.mustcontain('scripts.min.js?ver={0}'.format(rhodecode_version_hash))
99 99
100 100 def test_index_contains_backend_specific_details(self, backend, xhr_header):
101 101 self.log_user()
102 102 response = self.app.get(route_path('main_page_repos_data'), extra_environ=xhr_header)
103 103 tip = backend.repo.get_commit().raw_id
104 104
105 105 # html in javascript variable:
106 106 response.mustcontain(r'<i class=\"icon-%s\"' % (backend.alias, ))
107 107 response.mustcontain(r'href=\"/%s\"' % (backend.repo_name, ))
108 108
109 109 response.mustcontain("""/%s/changeset/%s""" % (backend.repo_name, tip))
110 110 response.mustcontain("""Added a symlink""")
111 111
112 112 def test_index_with_anonymous_access_disabled(self):
113 113 with fixture.anon_access(False):
114 114 response = self.app.get(route_path('home'), status=302)
115 115 assert 'login' in response.location
116 116
117 117 def test_index_page_on_groups_with_wrong_group_id(self, autologin_user, xhr_header):
118 118 group_id = 918123
119 119 self.app.get(
120 120 route_path('main_page_repo_groups_data'),
121 121 params={'repo_group_id': group_id},
122 122 status=404, extra_environ=xhr_header)
123 123
124 124 def test_index_page_on_groups(self, autologin_user, user_util, xhr_header):
125 125 gr = user_util.create_repo_group()
126 126 repo = user_util.create_repo(parent=gr)
127 127 repo_name = repo.repo_name
128 128 group_id = gr.group_id
129 129
130 130 response = self.app.get(route_path(
131 131 'repo_group_home', repo_group_name=gr.group_name))
132 132 response.mustcontain('d.repo_group_id = {}'.format(group_id))
133 133
134 134 response = self.app.get(
135 135 route_path('main_page_repos_data'),
136 136 params={'repo_group_id': group_id},
137 137 extra_environ=xhr_header,)
138 138 response.mustcontain(repo_name)
139 139
140 140 def test_index_page_on_group_with_trailing_slash(self, autologin_user, user_util, xhr_header):
141 141 gr = user_util.create_repo_group()
142 142 repo = user_util.create_repo(parent=gr)
143 143 repo_name = repo.repo_name
144 144 group_id = gr.group_id
145 145
146 146 response = self.app.get(route_path(
147 147 'repo_group_home', repo_group_name=gr.group_name+'/'))
148 148 response.mustcontain('d.repo_group_id = {}'.format(group_id))
149 149
150 150 response = self.app.get(
151 151 route_path('main_page_repos_data'),
152 152 params={'repo_group_id': group_id},
153 153 extra_environ=xhr_header, )
154 154 response.mustcontain(repo_name)
155 155
156 156 @pytest.mark.parametrize("name, state", [
157 157 ('Disabled', False),
158 158 ('Enabled', True),
159 159 ])
160 160 def test_index_show_version(self, autologin_user, name, state):
161 version_string = 'RhodeCode Enterprise %s' % rhodecode.__version__
161 version_string = 'RhodeCode %s' % rhodecode.__version__
162 162
163 163 sett = SettingsModel().create_or_update_setting(
164 164 'show_version', state, 'bool')
165 165 Session().add(sett)
166 166 Session().commit()
167 167 SettingsModel().invalidate_settings_cache()
168 168
169 169 response = self.app.get(route_path('home'))
170 170 if state is True:
171 171 response.mustcontain(version_string)
172 172 if state is False:
173 173 response.mustcontain(no=[version_string])
174 174
175 175 def test_logout_form_contains_csrf(self, autologin_user, csrf_token):
176 176 response = self.app.get(route_path('home'))
177 177 assert_response = response.assert_response()
178 178 element = assert_response.get_element('.logout [name=csrf_token]')
179 179 assert element.value == csrf_token
@@ -1,3060 +1,3067 b''
1 1 //Primary CSS
2 2
3 3 //--- IMPORTS ------------------//
4 4
5 5 @import 'helpers';
6 6 @import 'mixins';
7 7 @import 'rcicons';
8 8 @import 'variables';
9 9 @import 'bootstrap-variables';
10 10 @import 'form-bootstrap';
11 11 @import 'codemirror';
12 12 @import 'legacy_code_styles';
13 13 @import 'readme-box';
14 14 @import 'progress-bar';
15 15
16 16 @import 'type';
17 17 @import 'alerts';
18 18 @import 'buttons';
19 19 @import 'tags';
20 20 @import 'code-block';
21 21 @import 'examples';
22 22 @import 'login';
23 23 @import 'main-content';
24 24 @import 'select2';
25 25 @import 'comments';
26 26 @import 'panels-bootstrap';
27 27 @import 'panels';
28 28 @import 'deform';
29 29 @import 'tooltips';
30 30 @import 'sweetalert2';
31 31
32 32
33 33 //--- BASE ------------------//
34 34 .noscript-error {
35 35 top: 0;
36 36 left: 0;
37 37 width: 100%;
38 38 z-index: 101;
39 39 text-align: center;
40 40 font-size: 120%;
41 41 color: white;
42 42 background-color: @alert2;
43 43 padding: 5px 0 5px 0;
44 44 font-weight: @text-semibold-weight;
45 45 font-family: @text-semibold;
46 46 }
47 47
48 48 html {
49 49 display: table;
50 50 height: 100%;
51 51 width: 100%;
52 52 }
53 53
54 54 body {
55 55 display: table-cell;
56 56 width: 100%;
57 57 }
58 58
59 59 //--- LAYOUT ------------------//
60 60
61 61 .hidden{
62 62 display: none !important;
63 63 }
64 64
65 65 .box{
66 66 float: left;
67 67 width: 100%;
68 68 }
69 69
70 70 .browser-header {
71 71 clear: both;
72 72 }
73 73 .main {
74 74 clear: both;
75 75 padding:0 0 @pagepadding;
76 76 height: auto;
77 77
78 78 &:after { //clearfix
79 79 content:"";
80 80 clear:both;
81 81 width:100%;
82 82 display:block;
83 83 }
84 84 }
85 85
86 86 .action-link{
87 87 margin-left: @padding;
88 88 padding-left: @padding;
89 89 border-left: @border-thickness solid @border-default-color;
90 90 }
91 91
92 92 .cursor-pointer {
93 93 cursor: pointer;
94 94 }
95 95
96 96 input + .action-link, .action-link.first{
97 97 border-left: none;
98 98 }
99 99
100 100 .action-link.last{
101 101 margin-right: @padding;
102 102 padding-right: @padding;
103 103 }
104 104
105 105 .action-link.active,
106 106 .action-link.active a{
107 107 color: @grey4;
108 108 }
109 109
110 110 .action-link.disabled {
111 111 color: @grey4;
112 112 cursor: inherit;
113 113 }
114 114
115 .grey-link-action {
116 cursor: pointer;
117 &:hover {
118 color: @grey2;
119 }
120 color: @grey4;
121 }
115 122
116 123 .clipboard-action {
117 124 cursor: pointer;
118 125 margin-left: 5px;
119 126
120 127 &:not(.no-grey) {
121 128
122 129 &:hover {
123 130 color: @grey2;
124 131 }
125 132 color: @grey4;
126 133 }
127 134 }
128 135
129 136 ul.simple-list{
130 137 list-style: none;
131 138 margin: 0;
132 139 padding: 0;
133 140 }
134 141
135 142 .main-content {
136 143 padding-bottom: @pagepadding;
137 144 }
138 145
139 146 .wide-mode-wrapper {
140 147 max-width:4000px !important;
141 148 }
142 149
143 150 .wrapper {
144 151 position: relative;
145 152 max-width: @wrapper-maxwidth;
146 153 margin: 0 auto;
147 154 }
148 155
149 156 #content {
150 157 clear: both;
151 158 padding: 0 @contentpadding;
152 159 }
153 160
154 161 .advanced-settings-fields{
155 162 input{
156 163 margin-left: @textmargin;
157 164 margin-right: @padding/2;
158 165 }
159 166 }
160 167
161 168 .cs_files_title {
162 169 margin: @pagepadding 0 0;
163 170 }
164 171
165 172 input.inline[type="file"] {
166 173 display: inline;
167 174 }
168 175
169 176 .error_page {
170 177 margin: 10% auto;
171 178
172 179 h1 {
173 180 color: @grey2;
174 181 }
175 182
176 183 .alert {
177 184 margin: @padding 0;
178 185 }
179 186
180 187 .error-branding {
181 188 color: @grey4;
182 189 font-weight: @text-semibold-weight;
183 190 font-family: @text-semibold;
184 191 }
185 192
186 193 .error_message {
187 194 font-family: @text-regular;
188 195 }
189 196
190 197 .sidebar {
191 198 min-height: 275px;
192 199 margin: 0;
193 200 padding: 0 0 @sidebarpadding @sidebarpadding;
194 201 border: none;
195 202 }
196 203
197 204 .main-content {
198 205 position: relative;
199 206 margin: 0 @sidebarpadding @sidebarpadding;
200 207 padding: 0 0 0 @sidebarpadding;
201 208 border-left: @border-thickness solid @grey5;
202 209
203 210 @media (max-width:767px) {
204 211 clear: both;
205 212 width: 100%;
206 213 margin: 0;
207 214 border: none;
208 215 }
209 216 }
210 217
211 218 .inner-column {
212 219 float: left;
213 220 width: 29.75%;
214 221 min-height: 150px;
215 222 margin: @sidebarpadding 2% 0 0;
216 223 padding: 0 2% 0 0;
217 224 border-right: @border-thickness solid @grey5;
218 225
219 226 @media (max-width:767px) {
220 227 clear: both;
221 228 width: 100%;
222 229 border: none;
223 230 }
224 231
225 232 ul {
226 233 padding-left: 1.25em;
227 234 }
228 235
229 236 &:last-child {
230 237 margin: @sidebarpadding 0 0;
231 238 border: none;
232 239 }
233 240
234 241 h4 {
235 242 margin: 0 0 @padding;
236 243 font-weight: @text-semibold-weight;
237 244 font-family: @text-semibold;
238 245 }
239 246 }
240 247 }
241 248 .error-page-logo {
242 249 width: 130px;
243 250 height: 160px;
244 251 }
245 252
246 253 // HEADER
247 254 .header {
248 255
249 256 // TODO: johbo: Fix login pages, so that they work without a min-height
250 257 // for the header and then remove the min-height. I chose a smaller value
251 258 // intentionally here to avoid rendering issues in the main navigation.
252 259 min-height: 49px;
253 260 min-width: 1024px;
254 261
255 262 position: relative;
256 263 vertical-align: bottom;
257 264 padding: 0 @header-padding;
258 265 background-color: @grey1;
259 266 color: @grey5;
260 267
261 268 .title {
262 269 overflow: visible;
263 270 }
264 271
265 272 &:before,
266 273 &:after {
267 274 content: "";
268 275 clear: both;
269 276 width: 100%;
270 277 }
271 278
272 279 // TODO: johbo: Avoids breaking "Repositories" chooser
273 280 .select2-container .select2-choice .select2-arrow {
274 281 display: none;
275 282 }
276 283 }
277 284
278 285 #header-inner {
279 286 &.title {
280 287 margin: 0;
281 288 }
282 289 &:before,
283 290 &:after {
284 291 content: "";
285 292 clear: both;
286 293 }
287 294 }
288 295
289 296 // Gists
290 297 #files_data {
291 298 clear: both; //for firefox
292 299 padding-top: 10px;
293 300 }
294 301
295 302 #gistid {
296 303 margin-right: @padding;
297 304 }
298 305
299 306 // Global Settings Editor
300 307 .textarea.editor {
301 308 float: left;
302 309 position: relative;
303 310 max-width: @texteditor-width;
304 311
305 312 select {
306 313 position: absolute;
307 314 top:10px;
308 315 right:0;
309 316 }
310 317
311 318 .CodeMirror {
312 319 margin: 0;
313 320 }
314 321
315 322 .help-block {
316 323 margin: 0 0 @padding;
317 324 padding:.5em;
318 325 background-color: @grey6;
319 326 &.pre-formatting {
320 327 white-space: pre;
321 328 }
322 329 }
323 330 }
324 331
325 332 ul.auth_plugins {
326 333 margin: @padding 0 @padding @legend-width;
327 334 padding: 0;
328 335
329 336 li {
330 337 margin-bottom: @padding;
331 338 line-height: 1em;
332 339 list-style-type: none;
333 340
334 341 .auth_buttons .btn {
335 342 margin-right: @padding;
336 343 }
337 344
338 345 }
339 346 }
340 347
341 348
342 349 // My Account PR list
343 350
344 351 #show_closed {
345 352 margin: 0 1em 0 0;
346 353 }
347 354
348 355 #pull_request_list_table {
349 356 .closed {
350 357 background-color: @grey6;
351 358 }
352 359
353 360 .state-creating,
354 361 .state-updating,
355 362 .state-merging
356 363 {
357 364 background-color: @grey6;
358 365 }
359 366
360 367 .td-status {
361 368 padding-left: .5em;
362 369 }
363 370 .log-container .truncate {
364 371 height: 2.75em;
365 372 white-space: pre-line;
366 373 }
367 374 table.rctable .user {
368 375 padding-left: 0;
369 376 }
370 377 table.rctable {
371 378 td.td-description,
372 379 .rc-user {
373 380 min-width: auto;
374 381 }
375 382 }
376 383 }
377 384
378 385 // Pull Requests
379 386
380 387 .pullrequests_section_head {
381 388 display: block;
382 389 clear: both;
383 390 margin: @padding 0;
384 391 font-weight: @text-bold-weight;
385 392 font-family: @text-bold;
386 393 }
387 394
388 395 .pr-commit-flow {
389 396 position: relative;
390 397 font-weight: 600;
391 398
392 399 .tag {
393 400 display: inline-block;
394 401 margin: 0 1em .5em 0;
395 402 }
396 403
397 404 .clone-url {
398 405 display: inline-block;
399 406 margin: 0 0 .5em 0;
400 407 padding: 0;
401 408 line-height: 1.2em;
402 409 }
403 410 }
404 411
405 412 .pr-mergeinfo {
406 413 min-width: 95% !important;
407 414 padding: 0 !important;
408 415 border: 0;
409 416 }
410 417 .pr-mergeinfo-copy {
411 418 padding: 0 0;
412 419 }
413 420
414 421 .pr-pullinfo {
415 422 min-width: 95% !important;
416 423 padding: 0 !important;
417 424 border: 0;
418 425 }
419 426 .pr-pullinfo-copy {
420 427 padding: 0 0;
421 428 }
422 429
423 430 .pr-title-input {
424 431 width: 100%;
425 432 font-size: 18px;
426 433 margin: 0 0 4px 0;
427 434 padding: 0;
428 435 line-height: 1.7em;
429 436 color: @text-color;
430 437 letter-spacing: .02em;
431 438 font-weight: @text-bold-weight;
432 439 font-family: @text-bold;
433 440
434 441 &:hover {
435 442 box-shadow: none;
436 443 }
437 444 }
438 445
439 446 #pr-title {
440 447 input {
441 448 border: 1px transparent;
442 449 color: black;
443 450 opacity: 1;
444 451 background: #fff;
445 452 font-size: 18px;
446 453 }
447 454 }
448 455
449 456 .pr-title-closed-tag {
450 457 font-size: 16px;
451 458 }
452 459
453 460 #pr-desc {
454 461 padding: 10px 0;
455 462
456 463 .markdown-block {
457 464 padding: 0;
458 465 margin-bottom: -30px;
459 466 }
460 467 }
461 468
462 469 #pullrequest_title {
463 470 width: 100%;
464 471 box-sizing: border-box;
465 472 }
466 473
467 474 #pr_open_message {
468 475 border: @border-thickness solid #fff;
469 476 border-radius: @border-radius;
470 477 text-align: left;
471 478 overflow: hidden;
472 479 white-space: pre-line;
473 480 }
474 481
475 482 .pr-details-title {
476 483 height: 16px
477 484 }
478 485
479 486 .pr-details-title-author-pref {
480 487 padding-right: 10px
481 488 }
482 489
483 490 .label-pr-detail {
484 491 display: table-cell;
485 492 width: 120px;
486 493 padding-top: 7.5px;
487 494 padding-bottom: 7.5px;
488 495 padding-right: 7.5px;
489 496 }
490 497
491 498 .source-details ul {
492 499 padding: 10px 16px;
493 500 }
494 501
495 502 .source-details-action {
496 503 color: @grey4;
497 504 font-size: 11px
498 505 }
499 506
500 507 .pr-submit-button {
501 508 float: right;
502 509 margin: 0 0 0 5px;
503 510 }
504 511
505 512 .pr-spacing-container {
506 513 padding: 20px;
507 514 clear: both
508 515 }
509 516
510 517 #pr-description-input {
511 518 margin-bottom: 0;
512 519 }
513 520
514 521 .pr-description-label {
515 522 vertical-align: top;
516 523 }
517 524
518 525 #open_edit_pullrequest {
519 526 padding: 0;
520 527 }
521 528
522 529 #close_edit_pullrequest {
523 530
524 531 }
525 532
526 533 #delete_pullrequest {
527 534 clear: inherit;
528 535
529 536 form {
530 537 display: inline;
531 538 }
532 539
533 540 }
534 541
535 542 .perms_section_head {
536 543 min-width: 625px;
537 544
538 545 h2 {
539 546 margin-bottom: 0;
540 547 }
541 548
542 549 .label-checkbox {
543 550 float: left;
544 551 }
545 552
546 553 &.field {
547 554 margin: @space 0 @padding;
548 555 }
549 556
550 557 &:first-child.field {
551 558 margin-top: 0;
552 559
553 560 .label {
554 561 margin-top: 0;
555 562 padding-top: 0;
556 563 }
557 564
558 565 .radios {
559 566 padding-top: 0;
560 567 }
561 568 }
562 569
563 570 .radios {
564 571 position: relative;
565 572 width: 505px;
566 573 }
567 574 }
568 575
569 576 //--- MODULES ------------------//
570 577
571 578
572 579 // Server Announcement
573 580 #server-announcement {
574 581 width: 95%;
575 582 margin: @padding auto;
576 583 padding: @padding;
577 584 border-width: 2px;
578 585 border-style: solid;
579 586 .border-radius(2px);
580 587 font-weight: @text-bold-weight;
581 588 font-family: @text-bold;
582 589
583 590 &.info { border-color: @alert4; background-color: @alert4-inner; }
584 591 &.warning { border-color: @alert3; background-color: @alert3-inner; }
585 592 &.error { border-color: @alert2; background-color: @alert2-inner; }
586 593 &.success { border-color: @alert1; background-color: @alert1-inner; }
587 594 &.neutral { border-color: @grey3; background-color: @grey6; }
588 595 }
589 596
590 597 // Fixed Sidebar Column
591 598 .sidebar-col-wrapper {
592 599 padding-left: @sidebar-all-width;
593 600
594 601 .sidebar {
595 602 width: @sidebar-width;
596 603 margin-left: -@sidebar-all-width;
597 604 }
598 605 }
599 606
600 607 .sidebar-col-wrapper.scw-small {
601 608 padding-left: @sidebar-small-all-width;
602 609
603 610 .sidebar {
604 611 width: @sidebar-small-width;
605 612 margin-left: -@sidebar-small-all-width;
606 613 }
607 614 }
608 615
609 616
610 617 // FOOTER
611 618 #footer {
612 619 padding: 0;
613 620 text-align: center;
614 621 vertical-align: middle;
615 622 color: @grey2;
616 623 font-size: 11px;
617 624
618 625 p {
619 626 margin: 0;
620 627 padding: 1em;
621 628 line-height: 1em;
622 629 }
623 630
624 631 .server-instance { //server instance
625 632 display: none;
626 633 }
627 634
628 635 .title {
629 636 float: none;
630 637 margin: 0 auto;
631 638 }
632 639 }
633 640
634 641 button.close {
635 642 padding: 0;
636 643 cursor: pointer;
637 644 background: transparent;
638 645 border: 0;
639 646 .box-shadow(none);
640 647 -webkit-appearance: none;
641 648 }
642 649
643 650 .close {
644 651 float: right;
645 652 font-size: 21px;
646 653 font-family: @text-bootstrap;
647 654 line-height: 1em;
648 655 font-weight: bold;
649 656 color: @grey2;
650 657
651 658 &:hover,
652 659 &:focus {
653 660 color: @grey1;
654 661 text-decoration: none;
655 662 cursor: pointer;
656 663 }
657 664 }
658 665
659 666 // GRID
660 667 .sorting,
661 668 .sorting_desc,
662 669 .sorting_asc {
663 670 cursor: pointer;
664 671 }
665 672 .sorting_desc:after {
666 673 content: "\00A0\25B2";
667 674 font-size: .75em;
668 675 }
669 676 .sorting_asc:after {
670 677 content: "\00A0\25BC";
671 678 font-size: .68em;
672 679 }
673 680
674 681
675 682 .user_auth_tokens {
676 683
677 684 &.truncate {
678 685 white-space: nowrap;
679 686 overflow: hidden;
680 687 text-overflow: ellipsis;
681 688 }
682 689
683 690 .fields .field .input {
684 691 margin: 0;
685 692 }
686 693
687 694 input#description {
688 695 width: 100px;
689 696 margin: 0;
690 697 }
691 698
692 699 .drop-menu {
693 700 // TODO: johbo: Remove this, should work out of the box when
694 701 // having multiple inputs inline
695 702 margin: 0 0 0 5px;
696 703 }
697 704 }
698 705 #user_list_table {
699 706 .closed {
700 707 background-color: @grey6;
701 708 }
702 709 }
703 710
704 711
705 712 input, textarea {
706 713 &.disabled {
707 714 opacity: .5;
708 715 }
709 716
710 717 &:hover {
711 718 border-color: @grey3;
712 719 box-shadow: @button-shadow;
713 720 }
714 721
715 722 &:focus {
716 723 border-color: @rcblue;
717 724 box-shadow: @button-shadow;
718 725 }
719 726 }
720 727
721 728 // remove extra padding in firefox
722 729 input::-moz-focus-inner { border:0; padding:0 }
723 730
724 731 .adjacent input {
725 732 margin-bottom: @padding;
726 733 }
727 734
728 735 .permissions_boxes {
729 736 display: block;
730 737 }
731 738
732 739 //FORMS
733 740
734 741 .medium-inline,
735 742 input#description.medium-inline {
736 743 display: inline;
737 744 width: @medium-inline-input-width;
738 745 min-width: 100px;
739 746 }
740 747
741 748 select {
742 749 //reset
743 750 -webkit-appearance: none;
744 751 -moz-appearance: none;
745 752
746 753 display: inline-block;
747 754 height: 28px;
748 755 width: auto;
749 756 margin: 0 @padding @padding 0;
750 757 padding: 0 18px 0 8px;
751 758 line-height:1em;
752 759 font-size: @basefontsize;
753 760 border: @border-thickness solid @grey5;
754 761 border-radius: @border-radius;
755 762 background:white url("../images/dt-arrow-dn.png") no-repeat 100% 50%;
756 763 color: @grey4;
757 764 box-shadow: @button-shadow;
758 765
759 766 &:after {
760 767 content: "\00A0\25BE";
761 768 }
762 769
763 770 &:focus, &:hover {
764 771 outline: none;
765 772 border-color: @grey4;
766 773 color: @rcdarkblue;
767 774 }
768 775 }
769 776
770 777 option {
771 778 &:focus {
772 779 outline: none;
773 780 }
774 781 }
775 782
776 783 input,
777 784 textarea {
778 785 padding: @input-padding;
779 786 border: @input-border-thickness solid @border-highlight-color;
780 787 .border-radius (@border-radius);
781 788 font-family: @text-light;
782 789 font-size: @basefontsize;
783 790
784 791 &.input-sm {
785 792 padding: 5px;
786 793 }
787 794
788 795 &#description {
789 796 min-width: @input-description-minwidth;
790 797 min-height: 1em;
791 798 padding: 10px;
792 799 }
793 800 }
794 801
795 802 .field-sm {
796 803 input,
797 804 textarea {
798 805 padding: 5px;
799 806 }
800 807 }
801 808
802 809 textarea {
803 810 display: block;
804 811 clear: both;
805 812 width: 100%;
806 813 min-height: 100px;
807 814 margin-bottom: @padding;
808 815 .box-sizing(border-box);
809 816 overflow: auto;
810 817 }
811 818
812 819 label {
813 820 font-family: @text-light;
814 821 }
815 822
816 823 // GRAVATARS
817 824 // centers gravatar on username to the right
818 825
819 826 .gravatar {
820 827 display: inline;
821 828 min-width: 16px;
822 829 min-height: 16px;
823 830 margin: -5px 0;
824 831 padding: 0;
825 832 line-height: 1em;
826 833 box-sizing: content-box;
827 834 border-radius: 50%;
828 835
829 836 &.gravatar-large {
830 837 margin: -0.5em .25em -0.5em 0;
831 838 }
832 839
833 840 & + .user {
834 841 display: inline;
835 842 margin: 0;
836 843 padding: 0 0 0 .17em;
837 844 line-height: 1em;
838 845 }
839 846
840 847 & + .no-margin {
841 848 margin: 0
842 849 }
843 850
844 851 }
845 852
846 853 .user-inline-data {
847 854 display: inline-block;
848 855 float: left;
849 856 padding-left: .5em;
850 857 line-height: 1.3em;
851 858 }
852 859
853 860 .rc-user { // gravatar + user wrapper
854 861 float: left;
855 862 position: relative;
856 863 min-width: 100px;
857 864 max-width: 200px;
858 865 min-height: (@gravatar-size + @border-thickness * 2); // account for border
859 866 display: block;
860 867 padding: 0 0 0 (@gravatar-size + @basefontsize/4);
861 868
862 869
863 870 .gravatar {
864 871 display: block;
865 872 position: absolute;
866 873 top: 0;
867 874 left: 0;
868 875 min-width: @gravatar-size;
869 876 min-height: @gravatar-size;
870 877 margin: 0;
871 878 }
872 879
873 880 .user {
874 881 display: block;
875 882 max-width: 175px;
876 883 padding-top: 2px;
877 884 overflow: hidden;
878 885 text-overflow: ellipsis;
879 886 }
880 887 }
881 888
882 889 .gist-gravatar,
883 890 .journal_container {
884 891 .gravatar-large {
885 892 margin: 0 .5em -10px 0;
886 893 }
887 894 }
888 895
889 896 .gist-type-fields {
890 897 line-height: 30px;
891 898 height: 30px;
892 899
893 900 .gist-type-fields-wrapper {
894 901 vertical-align: middle;
895 902 display: inline-block;
896 903 line-height: 25px;
897 904 }
898 905 }
899 906
900 907 // ADMIN SETTINGS
901 908
902 909 // Tag Patterns
903 910 .tag_patterns {
904 911 .tag_input {
905 912 margin-bottom: @padding;
906 913 }
907 914 }
908 915
909 916 .locked_input {
910 917 position: relative;
911 918
912 919 input {
913 920 display: inline;
914 921 margin: 3px 5px 0px 0px;
915 922 }
916 923
917 924 br {
918 925 display: none;
919 926 }
920 927
921 928 .error-message {
922 929 float: left;
923 930 width: 100%;
924 931 }
925 932
926 933 .lock_input_button {
927 934 display: inline;
928 935 }
929 936
930 937 .help-block {
931 938 clear: both;
932 939 }
933 940 }
934 941
935 942 // Notifications
936 943
937 944 .notifications_buttons {
938 945 margin: 0 0 @space 0;
939 946 padding: 0;
940 947
941 948 .btn {
942 949 display: inline-block;
943 950 }
944 951 }
945 952
946 953 .notification-list {
947 954
948 955 div {
949 956 vertical-align: middle;
950 957 }
951 958
952 959 .container {
953 960 display: block;
954 961 margin: 0 0 @padding 0;
955 962 }
956 963
957 964 .delete-notifications {
958 965 margin-left: @padding;
959 966 text-align: right;
960 967 cursor: pointer;
961 968 }
962 969
963 970 .read-notifications {
964 971 margin-left: @padding/2;
965 972 text-align: right;
966 973 width: 35px;
967 974 cursor: pointer;
968 975 }
969 976
970 977 .icon-minus-sign {
971 978 color: @alert2;
972 979 }
973 980
974 981 .icon-ok-sign {
975 982 color: @alert1;
976 983 }
977 984 }
978 985
979 986 .user_settings {
980 987 float: left;
981 988 clear: both;
982 989 display: block;
983 990 width: 100%;
984 991
985 992 .gravatar_box {
986 993 margin-bottom: @padding;
987 994
988 995 &:after {
989 996 content: " ";
990 997 clear: both;
991 998 width: 100%;
992 999 }
993 1000 }
994 1001
995 1002 .fields .field {
996 1003 clear: both;
997 1004 }
998 1005 }
999 1006
1000 1007 .advanced_settings {
1001 1008 margin-bottom: @space;
1002 1009
1003 1010 .help-block {
1004 1011 margin-left: 0;
1005 1012 }
1006 1013
1007 1014 button + .help-block {
1008 1015 margin-top: @padding;
1009 1016 }
1010 1017 }
1011 1018
1012 1019 // admin settings radio buttons and labels
1013 1020 .label-2 {
1014 1021 float: left;
1015 1022 width: @label2-width;
1016 1023
1017 1024 label {
1018 1025 color: @grey1;
1019 1026 }
1020 1027 }
1021 1028 .checkboxes {
1022 1029 float: left;
1023 1030 width: @checkboxes-width;
1024 1031 margin-bottom: @padding;
1025 1032
1026 1033 .checkbox {
1027 1034 width: 100%;
1028 1035
1029 1036 label {
1030 1037 margin: 0;
1031 1038 padding: 0;
1032 1039 }
1033 1040 }
1034 1041
1035 1042 .checkbox + .checkbox {
1036 1043 display: inline-block;
1037 1044 }
1038 1045
1039 1046 label {
1040 1047 margin-right: 1em;
1041 1048 }
1042 1049 }
1043 1050
1044 1051 // CHANGELOG
1045 1052 .container_header {
1046 1053 float: left;
1047 1054 display: block;
1048 1055 width: 100%;
1049 1056 margin: @padding 0 @padding;
1050 1057
1051 1058 #filter_changelog {
1052 1059 float: left;
1053 1060 margin-right: @padding;
1054 1061 }
1055 1062
1056 1063 .breadcrumbs_light {
1057 1064 display: inline-block;
1058 1065 }
1059 1066 }
1060 1067
1061 1068 .info_box {
1062 1069 float: right;
1063 1070 }
1064 1071
1065 1072
1066 1073
1067 1074 #graph_content{
1068 1075
1069 1076 // adjust for table headers so that graph renders properly
1070 1077 // #graph_nodes padding - table cell padding
1071 1078 padding-top: (@space - (@basefontsize * 2.4));
1072 1079
1073 1080 &.graph_full_width {
1074 1081 width: 100%;
1075 1082 max-width: 100%;
1076 1083 }
1077 1084 }
1078 1085
1079 1086 #graph {
1080 1087
1081 1088 .pagination-left {
1082 1089 float: left;
1083 1090 clear: both;
1084 1091 }
1085 1092
1086 1093 .log-container {
1087 1094 max-width: 345px;
1088 1095
1089 1096 .message{
1090 1097 max-width: 340px;
1091 1098 }
1092 1099 }
1093 1100
1094 1101 .graph-col-wrapper {
1095 1102
1096 1103 #graph_nodes {
1097 1104 width: 100px;
1098 1105 position: absolute;
1099 1106 left: 70px;
1100 1107 z-index: -1;
1101 1108 }
1102 1109 }
1103 1110
1104 1111 .load-more-commits {
1105 1112 text-align: center;
1106 1113 }
1107 1114 .load-more-commits:hover {
1108 1115 background-color: @grey7;
1109 1116 }
1110 1117 .load-more-commits {
1111 1118 a {
1112 1119 display: block;
1113 1120 }
1114 1121 }
1115 1122 }
1116 1123
1117 1124 .obsolete-toggle {
1118 1125 line-height: 30px;
1119 1126 margin-left: -15px;
1120 1127 }
1121 1128
1122 1129 #rev_range_container, #rev_range_clear, #rev_range_more {
1123 1130 margin-top: -5px;
1124 1131 margin-bottom: -5px;
1125 1132 }
1126 1133
1127 1134 #filter_changelog {
1128 1135 float: left;
1129 1136 }
1130 1137
1131 1138
1132 1139 //--- THEME ------------------//
1133 1140
1134 1141 #logo {
1135 1142 float: left;
1136 1143 margin: 9px 0 0 0;
1137 1144
1138 1145 .header {
1139 1146 background-color: transparent;
1140 1147 }
1141 1148
1142 1149 a {
1143 1150 display: inline-block;
1144 1151 }
1145 1152
1146 1153 img {
1147 1154 height:30px;
1148 1155 }
1149 1156 }
1150 1157
1151 1158 .logo-wrapper {
1152 1159 float:left;
1153 1160 }
1154 1161
1155 1162 .branding {
1156 1163 float: left;
1157 1164 padding: 9px 2px;
1158 1165 line-height: 1em;
1159 1166 font-size: @navigation-fontsize;
1160 1167
1161 1168 a {
1162 1169 color: @grey5
1163 1170 }
1164 1171 @media screen and (max-width: 1200px) {
1165 1172 display: none;
1166 1173 }
1167 1174 }
1168 1175
1169 1176 img {
1170 1177 border: none;
1171 1178 outline: none;
1172 1179 }
1173 1180 user-profile-header
1174 1181 label {
1175 1182
1176 1183 input[type="checkbox"] {
1177 1184 margin-right: 1em;
1178 1185 }
1179 1186 input[type="radio"] {
1180 1187 margin-right: 1em;
1181 1188 }
1182 1189 }
1183 1190
1184 1191 .review-status {
1185 1192 &.under_review {
1186 1193 color: @alert3;
1187 1194 }
1188 1195 &.approved {
1189 1196 color: @alert1;
1190 1197 }
1191 1198 &.rejected,
1192 1199 &.forced_closed{
1193 1200 color: @alert2;
1194 1201 }
1195 1202 &.not_reviewed {
1196 1203 color: @grey5;
1197 1204 }
1198 1205 }
1199 1206
1200 1207 .review-status-under_review {
1201 1208 color: @alert3;
1202 1209 }
1203 1210 .status-tag-under_review {
1204 1211 border-color: @alert3;
1205 1212 }
1206 1213
1207 1214 .review-status-approved {
1208 1215 color: @alert1;
1209 1216 }
1210 1217 .status-tag-approved {
1211 1218 border-color: @alert1;
1212 1219 }
1213 1220
1214 1221 .review-status-rejected,
1215 1222 .review-status-forced_closed {
1216 1223 color: @alert2;
1217 1224 }
1218 1225 .status-tag-rejected,
1219 1226 .status-tag-forced_closed {
1220 1227 border-color: @alert2;
1221 1228 }
1222 1229
1223 1230 .review-status-not_reviewed {
1224 1231 color: @grey5;
1225 1232 }
1226 1233 .status-tag-not_reviewed {
1227 1234 border-color: @grey5;
1228 1235 }
1229 1236
1230 1237 .test_pattern_preview {
1231 1238 margin: @space 0;
1232 1239
1233 1240 p {
1234 1241 margin-bottom: 0;
1235 1242 border-bottom: @border-thickness solid @border-default-color;
1236 1243 color: @grey3;
1237 1244 }
1238 1245
1239 1246 .btn {
1240 1247 margin-bottom: @padding;
1241 1248 }
1242 1249 }
1243 1250 #test_pattern_result {
1244 1251 display: none;
1245 1252 &:extend(pre);
1246 1253 padding: .9em;
1247 1254 color: @grey3;
1248 1255 background-color: @grey7;
1249 1256 border-right: @border-thickness solid @border-default-color;
1250 1257 border-bottom: @border-thickness solid @border-default-color;
1251 1258 border-left: @border-thickness solid @border-default-color;
1252 1259 }
1253 1260
1254 1261 #repo_vcs_settings {
1255 1262 #inherit_overlay_vcs_default {
1256 1263 display: none;
1257 1264 }
1258 1265 #inherit_overlay_vcs_custom {
1259 1266 display: custom;
1260 1267 }
1261 1268 &.inherited {
1262 1269 #inherit_overlay_vcs_default {
1263 1270 display: block;
1264 1271 }
1265 1272 #inherit_overlay_vcs_custom {
1266 1273 display: none;
1267 1274 }
1268 1275 }
1269 1276 }
1270 1277
1271 1278 .issue-tracker-link {
1272 1279 color: @rcblue;
1273 1280 }
1274 1281
1275 1282 // Issue Tracker Table Show/Hide
1276 1283 #repo_issue_tracker {
1277 1284 #inherit_overlay {
1278 1285 display: none;
1279 1286 }
1280 1287 #custom_overlay {
1281 1288 display: custom;
1282 1289 }
1283 1290 &.inherited {
1284 1291 #inherit_overlay {
1285 1292 display: block;
1286 1293 }
1287 1294 #custom_overlay {
1288 1295 display: none;
1289 1296 }
1290 1297 }
1291 1298 }
1292 1299 table.issuetracker {
1293 1300 &.readonly {
1294 1301 tr, td {
1295 1302 color: @grey3;
1296 1303 }
1297 1304 }
1298 1305 .edit {
1299 1306 display: none;
1300 1307 }
1301 1308 .editopen {
1302 1309 .edit {
1303 1310 display: inline;
1304 1311 }
1305 1312 .entry {
1306 1313 display: none;
1307 1314 }
1308 1315 }
1309 1316 tr td.td-action {
1310 1317 min-width: 117px;
1311 1318 }
1312 1319 td input {
1313 1320 max-width: none;
1314 1321 min-width: 30px;
1315 1322 width: 80%;
1316 1323 }
1317 1324 .issuetracker_pref input {
1318 1325 width: 40%;
1319 1326 }
1320 1327 input.edit_issuetracker_update {
1321 1328 margin-right: 0;
1322 1329 width: auto;
1323 1330 }
1324 1331 }
1325 1332
1326 1333 table.integrations {
1327 1334 .td-icon {
1328 1335 width: 20px;
1329 1336 .integration-icon {
1330 1337 height: 20px;
1331 1338 width: 20px;
1332 1339 }
1333 1340 }
1334 1341 }
1335 1342
1336 1343 .integrations {
1337 1344 a.integration-box {
1338 1345 color: @text-color;
1339 1346 &:hover {
1340 1347 .panel {
1341 1348 background: #fbfbfb;
1342 1349 }
1343 1350 }
1344 1351 .integration-icon {
1345 1352 width: 30px;
1346 1353 height: 30px;
1347 1354 margin-right: 20px;
1348 1355 float: left;
1349 1356 }
1350 1357
1351 1358 .panel-body {
1352 1359 padding: 10px;
1353 1360 }
1354 1361 .panel {
1355 1362 margin-bottom: 10px;
1356 1363 }
1357 1364 h2 {
1358 1365 display: inline-block;
1359 1366 margin: 0;
1360 1367 min-width: 140px;
1361 1368 }
1362 1369 }
1363 1370 a.integration-box.dummy-integration {
1364 1371 color: @grey4
1365 1372 }
1366 1373 }
1367 1374
1368 1375 //Permissions Settings
1369 1376 #add_perm {
1370 1377 margin: 0 0 @padding;
1371 1378 cursor: pointer;
1372 1379 }
1373 1380
1374 1381 .perm_ac {
1375 1382 input {
1376 1383 width: 95%;
1377 1384 }
1378 1385 }
1379 1386
1380 1387 .autocomplete-suggestions {
1381 1388 width: auto !important; // overrides autocomplete.js
1382 1389 min-width: 278px;
1383 1390 margin: 0;
1384 1391 border: @border-thickness solid @grey5;
1385 1392 border-radius: @border-radius;
1386 1393 color: @grey2;
1387 1394 background-color: white;
1388 1395 }
1389 1396
1390 1397 .autocomplete-qfilter-suggestions {
1391 1398 width: auto !important; // overrides autocomplete.js
1392 1399 max-height: 100% !important;
1393 1400 min-width: 376px;
1394 1401 margin: 0;
1395 1402 border: @border-thickness solid @grey5;
1396 1403 color: @grey2;
1397 1404 background-color: white;
1398 1405 }
1399 1406
1400 1407 .autocomplete-selected {
1401 1408 background: #F0F0F0;
1402 1409 }
1403 1410
1404 1411 .ac-container-wrap {
1405 1412 margin: 0;
1406 1413 padding: 8px;
1407 1414 border-bottom: @border-thickness solid @grey5;
1408 1415 list-style-type: none;
1409 1416 cursor: pointer;
1410 1417
1411 1418 &:hover {
1412 1419 background-color: @grey7;
1413 1420 }
1414 1421
1415 1422 img {
1416 1423 height: @gravatar-size;
1417 1424 width: @gravatar-size;
1418 1425 margin-right: 1em;
1419 1426 }
1420 1427
1421 1428 strong {
1422 1429 font-weight: normal;
1423 1430 }
1424 1431 }
1425 1432
1426 1433 // Settings Dropdown
1427 1434 .user-menu .container {
1428 1435 padding: 0 4px;
1429 1436 margin: 0;
1430 1437 }
1431 1438
1432 1439 .user-menu .gravatar {
1433 1440 cursor: pointer;
1434 1441 }
1435 1442
1436 1443 .codeblock {
1437 1444 margin-bottom: @padding;
1438 1445 clear: both;
1439 1446
1440 1447 .stats {
1441 1448 overflow: hidden;
1442 1449 }
1443 1450
1444 1451 .message{
1445 1452 textarea{
1446 1453 margin: 0;
1447 1454 }
1448 1455 }
1449 1456
1450 1457 .code-header {
1451 1458 .stats {
1452 1459 line-height: 2em;
1453 1460
1454 1461 .revision_id {
1455 1462 margin-left: 0;
1456 1463 }
1457 1464 .buttons {
1458 1465 padding-right: 0;
1459 1466 }
1460 1467 }
1461 1468
1462 1469 .item{
1463 1470 margin-right: 0.5em;
1464 1471 }
1465 1472 }
1466 1473
1467 1474 #editor_container {
1468 1475 position: relative;
1469 1476 margin: @padding 10px;
1470 1477 }
1471 1478 }
1472 1479
1473 1480 #file_history_container {
1474 1481 display: none;
1475 1482 }
1476 1483
1477 1484 .file-history-inner {
1478 1485 margin-bottom: 10px;
1479 1486 }
1480 1487
1481 1488 // Pull Requests
1482 1489 .summary-details {
1483 1490 width: 72%;
1484 1491 }
1485 1492 .pr-summary {
1486 1493 border-bottom: @border-thickness solid @grey5;
1487 1494 margin-bottom: @space;
1488 1495 }
1489 1496
1490 1497 .reviewers-title {
1491 1498 width: 25%;
1492 1499 min-width: 200px;
1493 1500
1494 1501 &.first-panel {
1495 1502 margin-top: 34px;
1496 1503 }
1497 1504 }
1498 1505
1499 1506 .reviewers {
1500 1507 width: 25%;
1501 1508 min-width: 200px;
1502 1509 }
1503 1510 .reviewers ul li {
1504 1511 position: relative;
1505 1512 width: 100%;
1506 1513 padding-bottom: 8px;
1507 1514 list-style-type: none;
1508 1515 }
1509 1516
1510 1517 .reviewer_entry {
1511 1518 min-height: 55px;
1512 1519 }
1513 1520
1514 1521 .reviewers_member {
1515 1522 width: 100%;
1516 1523 overflow: auto;
1517 1524 }
1518 1525 .reviewer_reason {
1519 1526 padding-left: 20px;
1520 1527 line-height: 1.5em;
1521 1528 }
1522 1529 .reviewer_status {
1523 1530 display: inline-block;
1524 1531 width: 25px;
1525 1532 min-width: 25px;
1526 1533 height: 1.2em;
1527 1534 line-height: 1em;
1528 1535 }
1529 1536
1530 1537 .reviewer_name {
1531 1538 display: inline-block;
1532 1539 max-width: 83%;
1533 1540 padding-right: 20px;
1534 1541 vertical-align: middle;
1535 1542 line-height: 1;
1536 1543
1537 1544 .rc-user {
1538 1545 min-width: 0;
1539 1546 margin: -2px 1em 0 0;
1540 1547 }
1541 1548
1542 1549 .reviewer {
1543 1550 float: left;
1544 1551 }
1545 1552 }
1546 1553
1547 1554 .reviewer_member_mandatory {
1548 1555 position: absolute;
1549 1556 left: 15px;
1550 1557 top: 8px;
1551 1558 width: 16px;
1552 1559 font-size: 11px;
1553 1560 margin: 0;
1554 1561 padding: 0;
1555 1562 color: black;
1556 1563 }
1557 1564
1558 1565 .reviewer_member_mandatory_remove,
1559 1566 .reviewer_member_remove {
1560 1567 position: absolute;
1561 1568 right: 0;
1562 1569 top: 0;
1563 1570 width: 16px;
1564 1571 margin-bottom: 10px;
1565 1572 padding: 0;
1566 1573 color: black;
1567 1574 }
1568 1575
1569 1576 .reviewer_member_mandatory_remove {
1570 1577 color: @grey4;
1571 1578 }
1572 1579
1573 1580 .reviewer_member_status {
1574 1581 margin-top: 5px;
1575 1582 }
1576 1583 .pr-summary #summary{
1577 1584 width: 100%;
1578 1585 }
1579 1586 .pr-summary .action_button:hover {
1580 1587 border: 0;
1581 1588 cursor: pointer;
1582 1589 }
1583 1590 .pr-details-title {
1584 1591 padding-bottom: 8px;
1585 1592 border-bottom: @border-thickness solid @grey5;
1586 1593
1587 1594 .action_button.disabled {
1588 1595 color: @grey4;
1589 1596 cursor: inherit;
1590 1597 }
1591 1598 .action_button {
1592 1599 color: @rcblue;
1593 1600 }
1594 1601 }
1595 1602 .pr-details-content {
1596 1603 margin-top: @textmargin - 5;
1597 1604 margin-bottom: @textmargin - 5;
1598 1605 }
1599 1606
1600 1607 .pr-reviewer-rules {
1601 1608 padding: 10px 0px 20px 0px;
1602 1609 }
1603 1610
1604 1611 .todo-resolved {
1605 1612 text-decoration: line-through;
1606 1613 }
1607 1614
1608 1615 .todo-table {
1609 1616 width: 100%;
1610 1617
1611 1618 td {
1612 1619 padding: 5px 0px;
1613 1620 }
1614 1621
1615 1622 .td-todo-number {
1616 1623 text-align: left;
1617 1624 white-space: nowrap;
1618 1625 width: 15%;
1619 1626 }
1620 1627
1621 1628 .td-todo-gravatar {
1622 1629 width: 5%;
1623 1630
1624 1631 img {
1625 1632 margin: -3px 0;
1626 1633 }
1627 1634 }
1628 1635
1629 1636 }
1630 1637
1631 1638 .todo-comment-text-wrapper {
1632 1639 display: inline-grid;
1633 1640 }
1634 1641
1635 1642 .todo-comment-text {
1636 1643 margin-left: 5px;
1637 1644 white-space: nowrap;
1638 1645 overflow: hidden;
1639 1646 text-overflow: ellipsis;
1640 1647 }
1641 1648
1642 1649 .group_members {
1643 1650 margin-top: 0;
1644 1651 padding: 0;
1645 1652 list-style: outside none none;
1646 1653
1647 1654 img {
1648 1655 height: @gravatar-size;
1649 1656 width: @gravatar-size;
1650 1657 margin-right: .5em;
1651 1658 margin-left: 3px;
1652 1659 }
1653 1660
1654 1661 .to-delete {
1655 1662 .user {
1656 1663 text-decoration: line-through;
1657 1664 }
1658 1665 }
1659 1666 }
1660 1667
1661 1668 .compare_view_commits_title {
1662 1669 .disabled {
1663 1670 cursor: inherit;
1664 1671 &:hover{
1665 1672 background-color: inherit;
1666 1673 color: inherit;
1667 1674 }
1668 1675 }
1669 1676 }
1670 1677
1671 1678 .subtitle-compare {
1672 1679 margin: -15px 0px 0px 0px;
1673 1680 }
1674 1681
1675 1682 // new entry in group_members
1676 1683 .td-author-new-entry {
1677 1684 background-color: rgba(red(@alert1), green(@alert1), blue(@alert1), 0.3);
1678 1685 }
1679 1686
1680 1687 .usergroup_member_remove {
1681 1688 width: 16px;
1682 1689 margin-bottom: 10px;
1683 1690 padding: 0;
1684 1691 color: black !important;
1685 1692 cursor: pointer;
1686 1693 }
1687 1694
1688 1695 .reviewer_ac .ac-input {
1689 1696 width: 92%;
1690 1697 margin-bottom: 1em;
1691 1698 }
1692 1699
1693 1700 .compare_view_commits tr{
1694 1701 height: 20px;
1695 1702 }
1696 1703 .compare_view_commits td {
1697 1704 vertical-align: top;
1698 1705 padding-top: 10px;
1699 1706 }
1700 1707 .compare_view_commits .author {
1701 1708 margin-left: 5px;
1702 1709 }
1703 1710
1704 1711 .compare_view_commits {
1705 1712 .color-a {
1706 1713 color: @alert1;
1707 1714 }
1708 1715
1709 1716 .color-c {
1710 1717 color: @color3;
1711 1718 }
1712 1719
1713 1720 .color-r {
1714 1721 color: @color5;
1715 1722 }
1716 1723
1717 1724 .color-a-bg {
1718 1725 background-color: @alert1;
1719 1726 }
1720 1727
1721 1728 .color-c-bg {
1722 1729 background-color: @alert3;
1723 1730 }
1724 1731
1725 1732 .color-r-bg {
1726 1733 background-color: @alert2;
1727 1734 }
1728 1735
1729 1736 .color-a-border {
1730 1737 border: 1px solid @alert1;
1731 1738 }
1732 1739
1733 1740 .color-c-border {
1734 1741 border: 1px solid @alert3;
1735 1742 }
1736 1743
1737 1744 .color-r-border {
1738 1745 border: 1px solid @alert2;
1739 1746 }
1740 1747
1741 1748 .commit-change-indicator {
1742 1749 width: 15px;
1743 1750 height: 15px;
1744 1751 position: relative;
1745 1752 left: 15px;
1746 1753 }
1747 1754
1748 1755 .commit-change-content {
1749 1756 text-align: center;
1750 1757 vertical-align: middle;
1751 1758 line-height: 15px;
1752 1759 }
1753 1760 }
1754 1761
1755 1762 .compare_view_filepath {
1756 1763 color: @grey1;
1757 1764 }
1758 1765
1759 1766 .show_more {
1760 1767 display: inline-block;
1761 1768 width: 0;
1762 1769 height: 0;
1763 1770 vertical-align: middle;
1764 1771 content: "";
1765 1772 border: 4px solid;
1766 1773 border-right-color: transparent;
1767 1774 border-bottom-color: transparent;
1768 1775 border-left-color: transparent;
1769 1776 font-size: 0;
1770 1777 }
1771 1778
1772 1779 .journal_more .show_more {
1773 1780 display: inline;
1774 1781
1775 1782 &:after {
1776 1783 content: none;
1777 1784 }
1778 1785 }
1779 1786
1780 1787 .compare_view_commits .collapse_commit:after {
1781 1788 cursor: pointer;
1782 1789 content: "\00A0\25B4";
1783 1790 margin-left: -3px;
1784 1791 font-size: 17px;
1785 1792 color: @grey4;
1786 1793 }
1787 1794
1788 1795 .diff_links {
1789 1796 margin-left: 8px;
1790 1797 }
1791 1798
1792 1799 #pull_request_overview {
1793 1800 div.ancestor {
1794 1801 margin: -33px 0;
1795 1802 }
1796 1803 }
1797 1804
1798 1805 div.ancestor {
1799 1806
1800 1807 }
1801 1808
1802 1809 .cs_icon_td input[type="checkbox"] {
1803 1810 display: none;
1804 1811 }
1805 1812
1806 1813 .cs_icon_td .expand_file_icon:after {
1807 1814 cursor: pointer;
1808 1815 content: "\00A0\25B6";
1809 1816 font-size: 12px;
1810 1817 color: @grey4;
1811 1818 }
1812 1819
1813 1820 .cs_icon_td .collapse_file_icon:after {
1814 1821 cursor: pointer;
1815 1822 content: "\00A0\25BC";
1816 1823 font-size: 12px;
1817 1824 color: @grey4;
1818 1825 }
1819 1826
1820 1827 /*new binary
1821 1828 NEW_FILENODE = 1
1822 1829 DEL_FILENODE = 2
1823 1830 MOD_FILENODE = 3
1824 1831 RENAMED_FILENODE = 4
1825 1832 COPIED_FILENODE = 5
1826 1833 CHMOD_FILENODE = 6
1827 1834 BIN_FILENODE = 7
1828 1835 */
1829 1836 .cs_files_expand {
1830 1837 font-size: @basefontsize + 5px;
1831 1838 line-height: 1.8em;
1832 1839 float: right;
1833 1840 }
1834 1841
1835 1842 .cs_files_expand span{
1836 1843 color: @rcblue;
1837 1844 cursor: pointer;
1838 1845 }
1839 1846 .cs_files {
1840 1847 clear: both;
1841 1848 padding-bottom: @padding;
1842 1849
1843 1850 .cur_cs {
1844 1851 margin: 10px 2px;
1845 1852 font-weight: bold;
1846 1853 }
1847 1854
1848 1855 .node {
1849 1856 float: left;
1850 1857 }
1851 1858
1852 1859 .changes {
1853 1860 float: right;
1854 1861 color: white;
1855 1862 font-size: @basefontsize - 4px;
1856 1863 margin-top: 4px;
1857 1864 opacity: 0.6;
1858 1865 filter: Alpha(opacity=60); /* IE8 and earlier */
1859 1866
1860 1867 .added {
1861 1868 background-color: @alert1;
1862 1869 float: left;
1863 1870 text-align: center;
1864 1871 }
1865 1872
1866 1873 .deleted {
1867 1874 background-color: @alert2;
1868 1875 float: left;
1869 1876 text-align: center;
1870 1877 }
1871 1878
1872 1879 .bin {
1873 1880 background-color: @alert1;
1874 1881 text-align: center;
1875 1882 }
1876 1883
1877 1884 /*new binary*/
1878 1885 .bin.bin1 {
1879 1886 background-color: @alert1;
1880 1887 text-align: center;
1881 1888 }
1882 1889
1883 1890 /*deleted binary*/
1884 1891 .bin.bin2 {
1885 1892 background-color: @alert2;
1886 1893 text-align: center;
1887 1894 }
1888 1895
1889 1896 /*mod binary*/
1890 1897 .bin.bin3 {
1891 1898 background-color: @grey2;
1892 1899 text-align: center;
1893 1900 }
1894 1901
1895 1902 /*rename file*/
1896 1903 .bin.bin4 {
1897 1904 background-color: @alert4;
1898 1905 text-align: center;
1899 1906 }
1900 1907
1901 1908 /*copied file*/
1902 1909 .bin.bin5 {
1903 1910 background-color: @alert4;
1904 1911 text-align: center;
1905 1912 }
1906 1913
1907 1914 /*chmod file*/
1908 1915 .bin.bin6 {
1909 1916 background-color: @grey2;
1910 1917 text-align: center;
1911 1918 }
1912 1919 }
1913 1920 }
1914 1921
1915 1922 .cs_files .cs_added, .cs_files .cs_A,
1916 1923 .cs_files .cs_added, .cs_files .cs_M,
1917 1924 .cs_files .cs_added, .cs_files .cs_D {
1918 1925 height: 16px;
1919 1926 padding-right: 10px;
1920 1927 margin-top: 7px;
1921 1928 text-align: left;
1922 1929 }
1923 1930
1924 1931 .cs_icon_td {
1925 1932 min-width: 16px;
1926 1933 width: 16px;
1927 1934 }
1928 1935
1929 1936 .pull-request-merge {
1930 1937 border: 1px solid @grey5;
1931 1938 padding: 10px 0px 20px;
1932 1939 margin-top: 10px;
1933 1940 margin-bottom: 20px;
1934 1941 }
1935 1942
1936 1943 .pull-request-merge-refresh {
1937 1944 margin: 2px 7px;
1938 1945 a {
1939 1946 color: @grey3;
1940 1947 }
1941 1948 }
1942 1949
1943 1950 .pull-request-merge ul {
1944 1951 padding: 0px 0px;
1945 1952 }
1946 1953
1947 1954 .pull-request-merge li {
1948 1955 list-style-type: none;
1949 1956 }
1950 1957
1951 1958 .pull-request-merge .pull-request-wrap {
1952 1959 height: auto;
1953 1960 padding: 0px 0px;
1954 1961 text-align: right;
1955 1962 }
1956 1963
1957 1964 .pull-request-merge span {
1958 1965 margin-right: 5px;
1959 1966 }
1960 1967
1961 1968 .pull-request-merge-actions {
1962 1969 min-height: 30px;
1963 1970 padding: 0px 0px;
1964 1971 }
1965 1972
1966 1973 .pull-request-merge-info {
1967 1974 padding: 0px 5px 5px 0px;
1968 1975 }
1969 1976
1970 1977 .merge-status {
1971 1978 margin-right: 5px;
1972 1979 }
1973 1980
1974 1981 .merge-message {
1975 1982 font-size: 1.2em
1976 1983 }
1977 1984
1978 1985 .merge-message.success i,
1979 1986 .merge-icon.success i {
1980 1987 color:@alert1;
1981 1988 }
1982 1989
1983 1990 .merge-message.warning i,
1984 1991 .merge-icon.warning i {
1985 1992 color: @alert3;
1986 1993 }
1987 1994
1988 1995 .merge-message.error i,
1989 1996 .merge-icon.error i {
1990 1997 color:@alert2;
1991 1998 }
1992 1999
1993 2000 .pr-versions {
1994 2001 font-size: 1.1em;
1995 2002 padding: 7.5px;
1996 2003
1997 2004 table {
1998 2005
1999 2006 }
2000 2007
2001 2008 td {
2002 2009 line-height: 15px;
2003 2010 }
2004 2011
2005 2012 .compare-radio-button {
2006 2013 position: relative;
2007 2014 top: -3px;
2008 2015 }
2009 2016 }
2010 2017
2011 2018
2012 2019 #close_pull_request {
2013 2020 margin-right: 0px;
2014 2021 }
2015 2022
2016 2023 .empty_data {
2017 2024 color: @grey4;
2018 2025 }
2019 2026
2020 2027 #changeset_compare_view_content {
2021 2028 clear: both;
2022 2029 width: 100%;
2023 2030 box-sizing: border-box;
2024 2031 .border-radius(@border-radius);
2025 2032
2026 2033 .help-block {
2027 2034 margin: @padding 0;
2028 2035 color: @text-color;
2029 2036 &.pre-formatting {
2030 2037 white-space: pre;
2031 2038 }
2032 2039 }
2033 2040
2034 2041 .empty_data {
2035 2042 margin: @padding 0;
2036 2043 }
2037 2044
2038 2045 .alert {
2039 2046 margin-bottom: @space;
2040 2047 }
2041 2048 }
2042 2049
2043 2050 .table_disp {
2044 2051 .status {
2045 2052 width: auto;
2046 2053 }
2047 2054 }
2048 2055
2049 2056
2050 2057 .creation_in_progress {
2051 2058 color: @grey4
2052 2059 }
2053 2060
2054 2061 .status_box_menu {
2055 2062 margin: 0;
2056 2063 }
2057 2064
2058 2065 .notification-table{
2059 2066 margin-bottom: @space;
2060 2067 display: table;
2061 2068 width: 100%;
2062 2069
2063 2070 .container{
2064 2071 display: table-row;
2065 2072
2066 2073 .notification-header{
2067 2074 border-bottom: @border-thickness solid @border-default-color;
2068 2075 }
2069 2076
2070 2077 .notification-subject{
2071 2078 display: table-cell;
2072 2079 }
2073 2080 }
2074 2081 }
2075 2082
2076 2083 // Notifications
2077 2084 .notification-header{
2078 2085 display: table;
2079 2086 width: 100%;
2080 2087 padding: floor(@basefontsize/2) 0;
2081 2088 line-height: 1em;
2082 2089
2083 2090 .desc, .delete-notifications, .read-notifications{
2084 2091 display: table-cell;
2085 2092 text-align: left;
2086 2093 }
2087 2094
2088 2095 .delete-notifications, .read-notifications{
2089 2096 width: 35px;
2090 2097 min-width: 35px; //fixes when only one button is displayed
2091 2098 }
2092 2099 }
2093 2100
2094 2101 .notification-body {
2095 2102 .markdown-block,
2096 2103 .rst-block {
2097 2104 padding: @padding 0;
2098 2105 }
2099 2106
2100 2107 .notification-subject {
2101 2108 padding: @textmargin 0;
2102 2109 border-bottom: @border-thickness solid @border-default-color;
2103 2110 }
2104 2111 }
2105 2112
2106 2113 .notice-messages {
2107 2114 .markdown-block,
2108 2115 .rst-block {
2109 2116 padding: 0;
2110 2117 }
2111 2118 }
2112 2119
2113 2120 .notifications_buttons{
2114 2121 float: right;
2115 2122 }
2116 2123
2117 2124 #notification-status{
2118 2125 display: inline;
2119 2126 }
2120 2127
2121 2128 // Repositories
2122 2129
2123 2130 #summary.fields{
2124 2131 display: table;
2125 2132
2126 2133 .field{
2127 2134 display: table-row;
2128 2135
2129 2136 .label-summary{
2130 2137 display: table-cell;
2131 2138 min-width: @label-summary-minwidth;
2132 2139 padding-top: @padding/2;
2133 2140 padding-bottom: @padding/2;
2134 2141 padding-right: @padding/2;
2135 2142 }
2136 2143
2137 2144 .input{
2138 2145 display: table-cell;
2139 2146 padding: @padding/2;
2140 2147
2141 2148 input{
2142 2149 min-width: 29em;
2143 2150 padding: @padding/4;
2144 2151 }
2145 2152 }
2146 2153 .statistics, .downloads{
2147 2154 .disabled{
2148 2155 color: @grey4;
2149 2156 }
2150 2157 }
2151 2158 }
2152 2159 }
2153 2160
2154 2161 #summary{
2155 2162 width: 70%;
2156 2163 }
2157 2164
2158 2165
2159 2166 // Journal
2160 2167 .journal.title {
2161 2168 h5 {
2162 2169 float: left;
2163 2170 margin: 0;
2164 2171 width: 70%;
2165 2172 }
2166 2173
2167 2174 ul {
2168 2175 float: right;
2169 2176 display: inline-block;
2170 2177 margin: 0;
2171 2178 width: 30%;
2172 2179 text-align: right;
2173 2180
2174 2181 li {
2175 2182 display: inline;
2176 2183 font-size: @journal-fontsize;
2177 2184 line-height: 1em;
2178 2185
2179 2186 list-style-type: none;
2180 2187 }
2181 2188 }
2182 2189 }
2183 2190
2184 2191 .filterexample {
2185 2192 position: absolute;
2186 2193 top: 95px;
2187 2194 left: @contentpadding;
2188 2195 color: @rcblue;
2189 2196 font-size: 11px;
2190 2197 font-family: @text-regular;
2191 2198 cursor: help;
2192 2199
2193 2200 &:hover {
2194 2201 color: @rcdarkblue;
2195 2202 }
2196 2203
2197 2204 @media (max-width:768px) {
2198 2205 position: relative;
2199 2206 top: auto;
2200 2207 left: auto;
2201 2208 display: block;
2202 2209 }
2203 2210 }
2204 2211
2205 2212
2206 2213 #journal{
2207 2214 margin-bottom: @space;
2208 2215
2209 2216 .journal_day{
2210 2217 margin-bottom: @textmargin/2;
2211 2218 padding-bottom: @textmargin/2;
2212 2219 font-size: @journal-fontsize;
2213 2220 border-bottom: @border-thickness solid @border-default-color;
2214 2221 }
2215 2222
2216 2223 .journal_container{
2217 2224 margin-bottom: @space;
2218 2225
2219 2226 .journal_user{
2220 2227 display: inline-block;
2221 2228 }
2222 2229 .journal_action_container{
2223 2230 display: block;
2224 2231 margin-top: @textmargin;
2225 2232
2226 2233 div{
2227 2234 display: inline;
2228 2235 }
2229 2236
2230 2237 div.journal_action_params{
2231 2238 display: block;
2232 2239 }
2233 2240
2234 2241 div.journal_repo:after{
2235 2242 content: "\A";
2236 2243 white-space: pre;
2237 2244 }
2238 2245
2239 2246 div.date{
2240 2247 display: block;
2241 2248 margin-bottom: @textmargin;
2242 2249 }
2243 2250 }
2244 2251 }
2245 2252 }
2246 2253
2247 2254 // Files
2248 2255 .edit-file-title {
2249 2256 font-size: 16px;
2250 2257
2251 2258 .title-heading {
2252 2259 padding: 2px;
2253 2260 }
2254 2261 }
2255 2262
2256 2263 .edit-file-fieldset {
2257 2264 margin: @sidebarpadding 0;
2258 2265
2259 2266 .fieldset {
2260 2267 .left-label {
2261 2268 width: 13%;
2262 2269 }
2263 2270 .right-content {
2264 2271 width: 87%;
2265 2272 max-width: 100%;
2266 2273 }
2267 2274 .filename-label {
2268 2275 margin-top: 13px;
2269 2276 }
2270 2277 .commit-message-label {
2271 2278 margin-top: 4px;
2272 2279 }
2273 2280 .file-upload-input {
2274 2281 input {
2275 2282 display: none;
2276 2283 }
2277 2284 margin-top: 10px;
2278 2285 }
2279 2286 .file-upload-label {
2280 2287 margin-top: 10px;
2281 2288 }
2282 2289 p {
2283 2290 margin-top: 5px;
2284 2291 }
2285 2292
2286 2293 }
2287 2294 .custom-path-link {
2288 2295 margin-left: 5px;
2289 2296 }
2290 2297 #commit {
2291 2298 resize: vertical;
2292 2299 }
2293 2300 }
2294 2301
2295 2302 .delete-file-preview {
2296 2303 max-height: 250px;
2297 2304 }
2298 2305
2299 2306 .new-file,
2300 2307 #filter_activate,
2301 2308 #filter_deactivate {
2302 2309 float: right;
2303 2310 margin: 0 0 0 10px;
2304 2311 }
2305 2312
2306 2313 .file-upload-transaction-wrapper {
2307 2314 margin-top: 57px;
2308 2315 clear: both;
2309 2316 }
2310 2317
2311 2318 .file-upload-transaction-wrapper .error {
2312 2319 color: @color5;
2313 2320 }
2314 2321
2315 2322 .file-upload-transaction {
2316 2323 min-height: 200px;
2317 2324 padding: 54px;
2318 2325 border: 1px solid @grey5;
2319 2326 text-align: center;
2320 2327 clear: both;
2321 2328 }
2322 2329
2323 2330 .file-upload-transaction i {
2324 2331 font-size: 48px
2325 2332 }
2326 2333
2327 2334 h3.files_location{
2328 2335 line-height: 2.4em;
2329 2336 }
2330 2337
2331 2338 .browser-nav {
2332 2339 width: 100%;
2333 2340 display: table;
2334 2341 margin-bottom: 20px;
2335 2342
2336 2343 .info_box {
2337 2344 float: left;
2338 2345 display: inline-table;
2339 2346 height: 2.5em;
2340 2347
2341 2348 .browser-cur-rev, .info_box_elem {
2342 2349 display: table-cell;
2343 2350 vertical-align: middle;
2344 2351 }
2345 2352
2346 2353 .drop-menu {
2347 2354 margin: 0 10px;
2348 2355 }
2349 2356
2350 2357 .info_box_elem {
2351 2358 border-top: @border-thickness solid @grey5;
2352 2359 border-bottom: @border-thickness solid @grey5;
2353 2360 box-shadow: @button-shadow;
2354 2361
2355 2362 #at_rev, a {
2356 2363 padding: 0.6em 0.4em;
2357 2364 margin: 0;
2358 2365 .box-shadow(none);
2359 2366 border: 0;
2360 2367 height: 12px;
2361 2368 color: @grey2;
2362 2369 }
2363 2370
2364 2371 input#at_rev {
2365 2372 max-width: 50px;
2366 2373 text-align: center;
2367 2374 }
2368 2375
2369 2376 &.previous {
2370 2377 border: @border-thickness solid @grey5;
2371 2378 border-top-left-radius: @border-radius;
2372 2379 border-bottom-left-radius: @border-radius;
2373 2380
2374 2381 &:hover {
2375 2382 border-color: @grey4;
2376 2383 }
2377 2384
2378 2385 .disabled {
2379 2386 color: @grey5;
2380 2387 cursor: not-allowed;
2381 2388 opacity: 0.5;
2382 2389 }
2383 2390 }
2384 2391
2385 2392 &.next {
2386 2393 border: @border-thickness solid @grey5;
2387 2394 border-top-right-radius: @border-radius;
2388 2395 border-bottom-right-radius: @border-radius;
2389 2396
2390 2397 &:hover {
2391 2398 border-color: @grey4;
2392 2399 }
2393 2400
2394 2401 .disabled {
2395 2402 color: @grey5;
2396 2403 cursor: not-allowed;
2397 2404 opacity: 0.5;
2398 2405 }
2399 2406 }
2400 2407 }
2401 2408
2402 2409 .browser-cur-rev {
2403 2410
2404 2411 span{
2405 2412 margin: 0;
2406 2413 color: @rcblue;
2407 2414 height: 12px;
2408 2415 display: inline-block;
2409 2416 padding: 0.7em 1em ;
2410 2417 border: @border-thickness solid @rcblue;
2411 2418 margin-right: @padding;
2412 2419 }
2413 2420 }
2414 2421
2415 2422 }
2416 2423
2417 2424 .select-index-number {
2418 2425 margin: 0 0 0 20px;
2419 2426 color: @grey3;
2420 2427 }
2421 2428
2422 2429 .search_activate {
2423 2430 display: table-cell;
2424 2431 vertical-align: middle;
2425 2432
2426 2433 input, label{
2427 2434 margin: 0;
2428 2435 padding: 0;
2429 2436 }
2430 2437
2431 2438 input{
2432 2439 margin-left: @textmargin;
2433 2440 }
2434 2441
2435 2442 }
2436 2443 }
2437 2444
2438 2445 .browser-cur-rev{
2439 2446 margin-bottom: @textmargin;
2440 2447 }
2441 2448
2442 2449 #node_filter_box_loading{
2443 2450 .info_text;
2444 2451 }
2445 2452
2446 2453 .browser-search {
2447 2454 margin: -25px 0px 5px 0px;
2448 2455 }
2449 2456
2450 2457 .files-quick-filter {
2451 2458 float: right;
2452 2459 width: 180px;
2453 2460 position: relative;
2454 2461 }
2455 2462
2456 2463 .files-filter-box {
2457 2464 display: flex;
2458 2465 padding: 0px;
2459 2466 border-radius: 3px;
2460 2467 margin-bottom: 0;
2461 2468
2462 2469 a {
2463 2470 border: none !important;
2464 2471 }
2465 2472
2466 2473 li {
2467 2474 list-style-type: none
2468 2475 }
2469 2476 }
2470 2477
2471 2478 .files-filter-box-path {
2472 2479 line-height: 33px;
2473 2480 padding: 0;
2474 2481 width: 20px;
2475 2482 position: absolute;
2476 2483 z-index: 11;
2477 2484 left: 5px;
2478 2485 }
2479 2486
2480 2487 .files-filter-box-input {
2481 2488 margin-right: 0;
2482 2489
2483 2490 input {
2484 2491 border: 1px solid @white;
2485 2492 padding-left: 25px;
2486 2493 width: 145px;
2487 2494
2488 2495 &:hover {
2489 2496 border-color: @grey6;
2490 2497 }
2491 2498
2492 2499 &:focus {
2493 2500 border-color: @grey5;
2494 2501 }
2495 2502 }
2496 2503 }
2497 2504
2498 2505 .browser-result{
2499 2506 td a{
2500 2507 margin-left: 0.5em;
2501 2508 display: inline-block;
2502 2509
2503 2510 em {
2504 2511 font-weight: @text-bold-weight;
2505 2512 font-family: @text-bold;
2506 2513 }
2507 2514 }
2508 2515 }
2509 2516
2510 2517 .browser-highlight{
2511 2518 background-color: @grey5-alpha;
2512 2519 }
2513 2520
2514 2521
2515 2522 .edit-file-fieldset #location,
2516 2523 .edit-file-fieldset #filename {
2517 2524 display: flex;
2518 2525 width: -moz-available; /* WebKit-based browsers will ignore this. */
2519 2526 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
2520 2527 width: fill-available;
2521 2528 border: 0;
2522 2529 }
2523 2530
2524 2531 .path-items {
2525 2532 display: flex;
2526 2533 padding: 0;
2527 2534 border: 1px solid #eeeeee;
2528 2535 width: 100%;
2529 2536 float: left;
2530 2537
2531 2538 .breadcrumb-path {
2532 2539 line-height: 30px;
2533 2540 padding: 0 4px;
2534 2541 white-space: nowrap;
2535 2542 }
2536 2543
2537 2544 .upload-form {
2538 2545 margin-top: 46px;
2539 2546 }
2540 2547
2541 2548 .location-path {
2542 2549 width: -moz-available; /* WebKit-based browsers will ignore this. */
2543 2550 width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */
2544 2551 width: fill-available;
2545 2552
2546 2553 .file-name-input {
2547 2554 padding: 0.5em 0;
2548 2555 }
2549 2556
2550 2557 }
2551 2558
2552 2559 ul {
2553 2560 display: flex;
2554 2561 margin: 0;
2555 2562 padding: 0;
2556 2563 width: 100%;
2557 2564 }
2558 2565
2559 2566 li {
2560 2567 list-style-type: none;
2561 2568 }
2562 2569
2563 2570 }
2564 2571
2565 2572 .editor-items {
2566 2573 height: 40px;
2567 2574 margin: 10px 0 -17px 10px;
2568 2575
2569 2576 .editor-action {
2570 2577 cursor: pointer;
2571 2578 }
2572 2579
2573 2580 .editor-action.active {
2574 2581 border-bottom: 2px solid #5C5C5C;
2575 2582 }
2576 2583
2577 2584 li {
2578 2585 list-style-type: none;
2579 2586 }
2580 2587 }
2581 2588
2582 2589 .edit-file-fieldset .message textarea {
2583 2590 border: 1px solid #eeeeee;
2584 2591 }
2585 2592
2586 2593 #files_data .codeblock {
2587 2594 background-color: #F5F5F5;
2588 2595 }
2589 2596
2590 2597 #editor_preview {
2591 2598 background: white;
2592 2599 }
2593 2600
2594 2601 .show-editor {
2595 2602 padding: 10px;
2596 2603 background-color: white;
2597 2604
2598 2605 }
2599 2606
2600 2607 .show-preview {
2601 2608 padding: 10px;
2602 2609 background-color: white;
2603 2610 border-left: 1px solid #eeeeee;
2604 2611 }
2605 2612 // quick filter
2606 2613 .grid-quick-filter {
2607 2614 float: right;
2608 2615 position: relative;
2609 2616 }
2610 2617
2611 2618 .grid-filter-box {
2612 2619 display: flex;
2613 2620 padding: 0px;
2614 2621 border-radius: 3px;
2615 2622 margin-bottom: 0;
2616 2623
2617 2624 a {
2618 2625 border: none !important;
2619 2626 }
2620 2627
2621 2628 li {
2622 2629 list-style-type: none
2623 2630 }
2624 2631 }
2625 2632
2626 2633 .grid-filter-box-icon {
2627 2634 line-height: 33px;
2628 2635 padding: 0;
2629 2636 width: 20px;
2630 2637 position: absolute;
2631 2638 z-index: 11;
2632 2639 left: 5px;
2633 2640 }
2634 2641
2635 2642 .grid-filter-box-input {
2636 2643 margin-right: 0;
2637 2644
2638 2645 input {
2639 2646 border: 1px solid @white;
2640 2647 padding-left: 25px;
2641 2648 width: 145px;
2642 2649
2643 2650 &:hover {
2644 2651 border-color: @grey6;
2645 2652 }
2646 2653
2647 2654 &:focus {
2648 2655 border-color: @grey5;
2649 2656 }
2650 2657 }
2651 2658 }
2652 2659
2653 2660
2654 2661
2655 2662 // Search
2656 2663
2657 2664 .search-form{
2658 2665 #q {
2659 2666 width: @search-form-width;
2660 2667 }
2661 2668 .fields{
2662 2669 margin: 0 0 @space;
2663 2670 }
2664 2671
2665 2672 label{
2666 2673 display: inline-block;
2667 2674 margin-right: @textmargin;
2668 2675 padding-top: 0.25em;
2669 2676 }
2670 2677
2671 2678
2672 2679 .results{
2673 2680 clear: both;
2674 2681 margin: 0 0 @padding;
2675 2682 }
2676 2683
2677 2684 .search-tags {
2678 2685 padding: 5px 0;
2679 2686 }
2680 2687 }
2681 2688
2682 2689 div.search-feedback-items {
2683 2690 display: inline-block;
2684 2691 }
2685 2692
2686 2693 div.search-code-body {
2687 2694 background-color: #ffffff; padding: 5px 0 5px 10px;
2688 2695 pre {
2689 2696 .match { background-color: #faffa6;}
2690 2697 .break { display: block; width: 100%; background-color: #DDE7EF; color: #747474; }
2691 2698 }
2692 2699 }
2693 2700
2694 2701 .expand_commit.search {
2695 2702 .show_more.open {
2696 2703 height: auto;
2697 2704 max-height: none;
2698 2705 }
2699 2706 }
2700 2707
2701 2708 .search-results {
2702 2709
2703 2710 h2 {
2704 2711 margin-bottom: 0;
2705 2712 }
2706 2713 .codeblock {
2707 2714 border: none;
2708 2715 background: transparent;
2709 2716 }
2710 2717
2711 2718 .codeblock-header {
2712 2719 border: none;
2713 2720 background: transparent;
2714 2721 }
2715 2722
2716 2723 .code-body {
2717 2724 border: @border-thickness solid @grey6;
2718 2725 .border-radius(@border-radius);
2719 2726 }
2720 2727
2721 2728 .td-commit {
2722 2729 &:extend(pre);
2723 2730 border-bottom: @border-thickness solid @border-default-color;
2724 2731 }
2725 2732
2726 2733 .message {
2727 2734 height: auto;
2728 2735 max-width: 350px;
2729 2736 white-space: normal;
2730 2737 text-overflow: initial;
2731 2738 overflow: visible;
2732 2739
2733 2740 .match { background-color: #faffa6;}
2734 2741 .break { background-color: #DDE7EF; width: 100%; color: #747474; display: block; }
2735 2742 }
2736 2743
2737 2744 .path {
2738 2745 border-bottom: none !important;
2739 2746 border-left: 1px solid @grey6 !important;
2740 2747 border-right: 1px solid @grey6 !important;
2741 2748 }
2742 2749 }
2743 2750
2744 2751 table.rctable td.td-search-results div {
2745 2752 max-width: 100%;
2746 2753 }
2747 2754
2748 2755 #tip-box, .tip-box{
2749 2756 padding: @menupadding/2;
2750 2757 display: block;
2751 2758 border: @border-thickness solid @border-highlight-color;
2752 2759 .border-radius(@border-radius);
2753 2760 background-color: white;
2754 2761 z-index: 99;
2755 2762 white-space: pre-wrap;
2756 2763 }
2757 2764
2758 2765 #linktt {
2759 2766 width: 79px;
2760 2767 }
2761 2768
2762 2769 #help_kb .modal-content{
2763 2770 max-width: 750px;
2764 2771 margin: 10% auto;
2765 2772
2766 2773 table{
2767 2774 td,th{
2768 2775 border-bottom: none;
2769 2776 line-height: 2.5em;
2770 2777 }
2771 2778 th{
2772 2779 padding-bottom: @textmargin/2;
2773 2780 }
2774 2781 td.keys{
2775 2782 text-align: center;
2776 2783 }
2777 2784 }
2778 2785
2779 2786 .block-left{
2780 2787 width: 45%;
2781 2788 margin-right: 5%;
2782 2789 }
2783 2790 .modal-footer{
2784 2791 clear: both;
2785 2792 }
2786 2793 .key.tag{
2787 2794 padding: 0.5em;
2788 2795 background-color: @rcblue;
2789 2796 color: white;
2790 2797 border-color: @rcblue;
2791 2798 .box-shadow(none);
2792 2799 }
2793 2800 }
2794 2801
2795 2802
2796 2803
2797 2804 //--- IMPORTS FOR REFACTORED STYLES ------------------//
2798 2805
2799 2806 @import 'statistics-graph';
2800 2807 @import 'tables';
2801 2808 @import 'forms';
2802 2809 @import 'diff';
2803 2810 @import 'summary';
2804 2811 @import 'navigation';
2805 2812
2806 2813 //--- SHOW/HIDE SECTIONS --//
2807 2814
2808 2815 .btn-collapse {
2809 2816 float: right;
2810 2817 text-align: right;
2811 2818 font-family: @text-light;
2812 2819 font-size: @basefontsize;
2813 2820 cursor: pointer;
2814 2821 border: none;
2815 2822 color: @rcblue;
2816 2823 }
2817 2824
2818 2825 table.rctable,
2819 2826 table.dataTable {
2820 2827 .btn-collapse {
2821 2828 float: right;
2822 2829 text-align: right;
2823 2830 }
2824 2831 }
2825 2832
2826 2833 table.rctable {
2827 2834 &.permissions {
2828 2835
2829 2836 th.td-owner {
2830 2837 padding: 0;
2831 2838 }
2832 2839
2833 2840 th {
2834 2841 font-weight: normal;
2835 2842 padding: 0 5px;
2836 2843 }
2837 2844
2838 2845 }
2839 2846 }
2840 2847
2841 2848
2842 2849 // TODO: johbo: Fix for IE10, this avoids that we see a border
2843 2850 // and padding around checkboxes and radio boxes. Move to the right place,
2844 2851 // or better: Remove this once we did the form refactoring.
2845 2852 input[type=checkbox],
2846 2853 input[type=radio] {
2847 2854 padding: 0;
2848 2855 border: none;
2849 2856 }
2850 2857
2851 2858 .toggle-ajax-spinner{
2852 2859 height: 16px;
2853 2860 width: 16px;
2854 2861 }
2855 2862
2856 2863
2857 2864 .markup-form .clearfix {
2858 2865 .border-radius(@border-radius);
2859 2866 margin: 0px;
2860 2867 }
2861 2868
2862 2869 .markup-form-area {
2863 2870 padding: 8px 12px;
2864 2871 border: 1px solid @grey4;
2865 2872 .border-radius(@border-radius);
2866 2873 }
2867 2874
2868 2875 .markup-form-area-header .nav-links {
2869 2876 display: flex;
2870 2877 flex-flow: row wrap;
2871 2878 -webkit-flex-flow: row wrap;
2872 2879 width: 100%;
2873 2880 }
2874 2881
2875 2882 .markup-form-area-footer {
2876 2883 display: flex;
2877 2884 }
2878 2885
2879 2886 .markup-form-area-footer .toolbar {
2880 2887
2881 2888 }
2882 2889
2883 2890 // markup Form
2884 2891 div.markup-form {
2885 2892 margin-top: 20px;
2886 2893 }
2887 2894
2888 2895 .markup-form strong {
2889 2896 display: block;
2890 2897 margin-bottom: 15px;
2891 2898 }
2892 2899
2893 2900 .markup-form textarea {
2894 2901 width: 100%;
2895 2902 height: 100px;
2896 2903 font-family: @text-monospace;
2897 2904 }
2898 2905
2899 2906 form.markup-form {
2900 2907 margin-top: 10px;
2901 2908 margin-left: 10px;
2902 2909 }
2903 2910
2904 2911 .markup-form .comment-block-ta,
2905 2912 .markup-form .preview-box {
2906 2913 .border-radius(@border-radius);
2907 2914 .box-sizing(border-box);
2908 2915 background-color: white;
2909 2916 }
2910 2917
2911 2918 .markup-form .preview-box.unloaded {
2912 2919 height: 50px;
2913 2920 text-align: center;
2914 2921 padding: 20px;
2915 2922 background-color: white;
2916 2923 }
2917 2924
2918 2925
2919 2926 .dropzone-wrapper {
2920 2927 border: 1px solid @grey5;
2921 2928 padding: 20px;
2922 2929 }
2923 2930
2924 2931 .dropzone,
2925 2932 .dropzone-pure {
2926 2933 border: 2px dashed @grey5;
2927 2934 border-radius: 5px;
2928 2935 background: white;
2929 2936 min-height: 200px;
2930 2937 padding: 54px;
2931 2938
2932 2939 .dz-message {
2933 2940 font-weight: 700;
2934 2941 text-align: center;
2935 2942 margin: 2em 0;
2936 2943 }
2937 2944
2938 2945 }
2939 2946
2940 2947 .dz-preview {
2941 2948 margin: 10px 0 !important;
2942 2949 position: relative;
2943 2950 vertical-align: top;
2944 2951 padding: 10px;
2945 2952 border-bottom: 1px solid @grey5;
2946 2953 }
2947 2954
2948 2955 .dz-filename {
2949 2956 font-weight: 700;
2950 2957 float: left;
2951 2958 }
2952 2959
2953 2960 .dz-sending {
2954 2961 float: right;
2955 2962 }
2956 2963
2957 2964 .dz-response {
2958 2965 clear: both
2959 2966 }
2960 2967
2961 2968 .dz-filename-size {
2962 2969 float: right
2963 2970 }
2964 2971
2965 2972 .dz-error-message {
2966 2973 color: @alert2;
2967 2974 padding-top: 10px;
2968 2975 clear: both;
2969 2976 }
2970 2977
2971 2978
2972 2979 .user-hovercard {
2973 2980 padding: 5px;
2974 2981 }
2975 2982
2976 2983 .user-hovercard-icon {
2977 2984 display: inline;
2978 2985 padding: 0;
2979 2986 box-sizing: content-box;
2980 2987 border-radius: 50%;
2981 2988 float: left;
2982 2989 }
2983 2990
2984 2991 .user-hovercard-name {
2985 2992 float: right;
2986 2993 vertical-align: top;
2987 2994 padding-left: 10px;
2988 2995 min-width: 150px;
2989 2996 }
2990 2997
2991 2998 .user-hovercard-bio {
2992 2999 clear: both;
2993 3000 padding-top: 10px;
2994 3001 }
2995 3002
2996 3003 .user-hovercard-header {
2997 3004 clear: both;
2998 3005 min-height: 10px;
2999 3006 }
3000 3007
3001 3008 .user-hovercard-footer {
3002 3009 clear: both;
3003 3010 min-height: 10px;
3004 3011 }
3005 3012
3006 3013 .user-group-hovercard {
3007 3014 padding: 5px;
3008 3015 }
3009 3016
3010 3017 .user-group-hovercard-icon {
3011 3018 display: inline;
3012 3019 padding: 0;
3013 3020 box-sizing: content-box;
3014 3021 border-radius: 50%;
3015 3022 float: left;
3016 3023 }
3017 3024
3018 3025 .user-group-hovercard-name {
3019 3026 float: left;
3020 3027 vertical-align: top;
3021 3028 padding-left: 10px;
3022 3029 min-width: 150px;
3023 3030 }
3024 3031
3025 3032 .user-group-hovercard-icon i {
3026 3033 border: 1px solid @grey4;
3027 3034 border-radius: 4px;
3028 3035 }
3029 3036
3030 3037 .user-group-hovercard-bio {
3031 3038 clear: both;
3032 3039 padding-top: 10px;
3033 3040 line-height: 1.0em;
3034 3041 }
3035 3042
3036 3043 .user-group-hovercard-header {
3037 3044 clear: both;
3038 3045 min-height: 10px;
3039 3046 }
3040 3047
3041 3048 .user-group-hovercard-footer {
3042 3049 clear: both;
3043 3050 min-height: 10px;
3044 3051 }
3045 3052
3046 3053 .pr-hovercard-header {
3047 3054 clear: both;
3048 3055 display: block;
3049 3056 line-height: 20px;
3050 3057 }
3051 3058
3052 3059 .pr-hovercard-user {
3053 3060 display: flex;
3054 3061 align-items: center;
3055 3062 padding-left: 5px;
3056 3063 }
3057 3064
3058 3065 .pr-hovercard-title {
3059 3066 padding-top: 5px;
3060 3067 } No newline at end of file
@@ -1,1201 +1,1210 b''
1 1 ## -*- coding: utf-8 -*-
2 2
3 3 <%!
4 4 ## base64 filter e.g ${ example | base64 }
5 5 def base64(text):
6 6 import base64
7 7 from rhodecode.lib.helpers import safe_str
8 8 return base64.encodestring(safe_str(text))
9 9 %>
10 10
11 11 <%inherit file="root.mako"/>
12 12
13 13 <%include file="/ejs_templates/templates.html"/>
14 14
15 15 <div class="outerwrapper">
16 16 <!-- HEADER -->
17 17 <div class="header">
18 18 <div id="header-inner" class="wrapper">
19 19 <div id="logo">
20 20 <div class="logo-wrapper">
21 21 <a href="${h.route_path('home')}"><img src="${h.asset('images/rhodecode-logo-white-60x60.png')}" alt="RhodeCode"/></a>
22 22 </div>
23 23 % if c.rhodecode_name:
24 24 <div class="branding">
25 25 <a href="${h.route_path('home')}">${h.branding(c.rhodecode_name)}</a>
26 26 </div>
27 27 % endif
28 28 </div>
29 29 <!-- MENU BAR NAV -->
30 30 ${self.menu_bar_nav()}
31 31 <!-- END MENU BAR NAV -->
32 32 </div>
33 33 </div>
34 34 ${self.menu_bar_subnav()}
35 35 <!-- END HEADER -->
36 36
37 37 <!-- CONTENT -->
38 38 <div id="content" class="wrapper">
39 39
40 40 <rhodecode-toast id="notifications"></rhodecode-toast>
41 41
42 42 <div class="main">
43 43 ${next.main()}
44 44 </div>
45 45 </div>
46 46 <!-- END CONTENT -->
47 47
48 48 </div>
49 49 <!-- FOOTER -->
50 50 <div id="footer">
51 51 <div id="footer-inner" class="title wrapper">
52 52 <div>
53 <% sid = 'block' if request.GET.get('showrcid') else 'none' %>
54
53 55 <p class="footer-link-right">
56 <a class="grey-link-action" href="${h.route_path('home', _query={'showrcid': 1})}">
57 RhodeCode
54 58 % if c.visual.show_version:
55 RhodeCode Enterprise ${c.rhodecode_version} ${c.rhodecode_edition}
59 ${c.rhodecode_version}
56 60 % endif
57 &copy; 2010-${h.datetime.today().year}, <a href="${h.route_url('rhodecode_official')}" target="_blank">RhodeCode GmbH</a>. All rights reserved.
61 ${c.rhodecode_edition}
62 </a> |
63
58 64 % if c.visual.rhodecode_support_url:
59 <a href="${c.visual.rhodecode_support_url}" target="_blank">${_('Support')}</a>
65 <a class="grey-link-action" href="${c.visual.rhodecode_support_url}" target="_blank">${_('Support')}</a> |
66 <a class="grey-link-action" href="https://docs.rhodecode.com" target="_blank">${_('Documentation')}</a>
60 67 % endif
68
61 69 </p>
62 <% sid = 'block' if request.GET.get('showrcid') else 'none' %>
70
63 71 <p class="server-instance" style="display:${sid}">
64 72 ## display hidden instance ID if specially defined
73 &copy; 2010-${h.datetime.today().year}, <a href="${h.route_url('rhodecode_official')}" target="_blank">RhodeCode GmbH</a>. All rights reserved.
65 74 % if c.rhodecode_instanceid:
66 75 ${_('RhodeCode instance id: {}').format(c.rhodecode_instanceid)}
67 76 % endif
68 77 </p>
69 78 </div>
70 79 </div>
71 80 </div>
72 81
73 82 <!-- END FOOTER -->
74 83
75 84 ### MAKO DEFS ###
76 85
77 86 <%def name="menu_bar_subnav()">
78 87 </%def>
79 88
80 89 <%def name="breadcrumbs(class_='breadcrumbs')">
81 90 <div class="${class_}">
82 91 ${self.breadcrumbs_links()}
83 92 </div>
84 93 </%def>
85 94
86 95 <%def name="admin_menu(active=None)">
87 96
88 97 <div id="context-bar">
89 98 <div class="wrapper">
90 99 <div class="title">
91 100 <div class="title-content">
92 101 <div class="title-main">
93 102 % if c.is_super_admin:
94 103 ${_('Super-admin Panel')}
95 104 % else:
96 105 ${_('Delegated Admin Panel')}
97 106 % endif
98 107 </div>
99 108 </div>
100 109 </div>
101 110
102 111 <ul id="context-pages" class="navigation horizontal-list">
103 112
104 113 ## super-admin case
105 114 % if c.is_super_admin:
106 115 <li class="${h.is_active('audit_logs', active)}"><a href="${h.route_path('admin_audit_logs')}">${_('Admin audit logs')}</a></li>
107 116 <li class="${h.is_active('repositories', active)}"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
108 117 <li class="${h.is_active('repository_groups', active)}"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
109 118 <li class="${h.is_active('users', active)}"><a href="${h.route_path('users')}">${_('Users')}</a></li>
110 119 <li class="${h.is_active('user_groups', active)}"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
111 120 <li class="${h.is_active('permissions', active)}"><a href="${h.route_path('admin_permissions_application')}">${_('Permissions')}</a></li>
112 121 <li class="${h.is_active('authentication', active)}"><a href="${h.route_path('auth_home', traverse='')}">${_('Authentication')}</a></li>
113 122 <li class="${h.is_active('integrations', active)}"><a href="${h.route_path('global_integrations_home')}">${_('Integrations')}</a></li>
114 123 <li class="${h.is_active('defaults', active)}"><a href="${h.route_path('admin_defaults_repositories')}">${_('Defaults')}</a></li>
115 124 <li class="${h.is_active('settings', active)}"><a href="${h.route_path('admin_settings')}">${_('Settings')}</a></li>
116 125
117 126 ## delegated admin
118 127 % elif c.is_delegated_admin:
119 128 <%
120 129 repositories=c.auth_user.repositories_admin or c.can_create_repo
121 130 repository_groups=c.auth_user.repository_groups_admin or c.can_create_repo_group
122 131 user_groups=c.auth_user.user_groups_admin or c.can_create_user_group
123 132 %>
124 133
125 134 %if repositories:
126 135 <li class="${h.is_active('repositories', active)} local-admin-repos"><a href="${h.route_path('repos')}">${_('Repositories')}</a></li>
127 136 %endif
128 137 %if repository_groups:
129 138 <li class="${h.is_active('repository_groups', active)} local-admin-repo-groups"><a href="${h.route_path('repo_groups')}">${_('Repository groups')}</a></li>
130 139 %endif
131 140 %if user_groups:
132 141 <li class="${h.is_active('user_groups', active)} local-admin-user-groups"><a href="${h.route_path('user_groups')}">${_('User groups')}</a></li>
133 142 %endif
134 143 % endif
135 144 </ul>
136 145
137 146 </div>
138 147 <div class="clear"></div>
139 148 </div>
140 149 </%def>
141 150
142 151 <%def name="dt_info_panel(elements)">
143 152 <dl class="dl-horizontal">
144 153 %for dt, dd, title, show_items in elements:
145 154 <dt>${dt}:</dt>
146 155 <dd title="${h.tooltip(title)}">
147 156 %if callable(dd):
148 157 ## allow lazy evaluation of elements
149 158 ${dd()}
150 159 %else:
151 160 ${dd}
152 161 %endif
153 162 %if show_items:
154 163 <span class="btn-collapse" data-toggle="item-${h.md5_safe(dt)[:6]}-details">${_('Show More')} </span>
155 164 %endif
156 165 </dd>
157 166
158 167 %if show_items:
159 168 <div class="collapsable-content" data-toggle="item-${h.md5_safe(dt)[:6]}-details" style="display: none">
160 169 %for item in show_items:
161 170 <dt></dt>
162 171 <dd>${item}</dd>
163 172 %endfor
164 173 </div>
165 174 %endif
166 175
167 176 %endfor
168 177 </dl>
169 178 </%def>
170 179
171 180 <%def name="tr_info_entry(element)">
172 181 <% key, val, title, show_items = element %>
173 182
174 183 <tr>
175 184 <td style="vertical-align: top">${key}</td>
176 185 <td title="${h.tooltip(title)}">
177 186 %if callable(val):
178 187 ## allow lazy evaluation of elements
179 188 ${val()}
180 189 %else:
181 190 ${val}
182 191 %endif
183 192 %if show_items:
184 193 <div class="collapsable-content" data-toggle="item-${h.md5_safe(val)[:6]}-details" style="display: none">
185 194 % for item in show_items:
186 195 <dt></dt>
187 196 <dd>${item}</dd>
188 197 % endfor
189 198 </div>
190 199 %endif
191 200 </td>
192 201 <td style="vertical-align: top">
193 202 %if show_items:
194 203 <span class="btn-collapse" data-toggle="item-${h.md5_safe(val)[:6]}-details">${_('Show More')} </span>
195 204 %endif
196 205 </td>
197 206 </tr>
198 207
199 208 </%def>
200 209
201 210 <%def name="gravatar(email, size=16, tooltip=False, tooltip_alt=None, user=None, extra_class=None)">
202 211 <%
203 212 if size > 16:
204 213 gravatar_class = ['gravatar','gravatar-large']
205 214 else:
206 215 gravatar_class = ['gravatar']
207 216
208 217 data_hovercard_url = ''
209 218 data_hovercard_alt = tooltip_alt.replace('<', '&lt;').replace('>', '&gt;') if tooltip_alt else ''
210 219
211 220 if tooltip:
212 221 gravatar_class += ['tooltip-hovercard']
213 222 if extra_class:
214 223 gravatar_class += extra_class
215 224 if tooltip and user:
216 225 if user.username == h.DEFAULT_USER:
217 226 gravatar_class.pop(-1)
218 227 else:
219 228 data_hovercard_url = request.route_path('hovercard_user', user_id=getattr(user, 'user_id', ''))
220 229 gravatar_class = ' '.join(gravatar_class)
221 230
222 231 %>
223 232 <%doc>
224 233 TODO: johbo: For now we serve double size images to make it smooth
225 234 for retina. This is how it worked until now. Should be replaced
226 235 with a better solution at some point.
227 236 </%doc>
228 237
229 238 <img class="${gravatar_class}" height="${size}" width="${size}" data-hovercard-url="${data_hovercard_url}" data-hovercard-alt="${data_hovercard_alt}" src="${h.gravatar_url(email, size * 2)}" />
230 239 </%def>
231 240
232 241
233 242 <%def name="gravatar_with_user(contact, size=16, show_disabled=False, tooltip=False, _class='rc-user')">
234 243 <%
235 244 email = h.email_or_none(contact)
236 245 rc_user = h.discover_user(contact)
237 246 %>
238 247
239 248 <div class="${_class}">
240 249 ${self.gravatar(email, size, tooltip=tooltip, tooltip_alt=contact, user=rc_user)}
241 250 <span class="${('user user-disabled' if show_disabled else 'user')}"> ${h.link_to_user(rc_user or contact)}</span>
242 251 </div>
243 252 </%def>
244 253
245 254
246 255 <%def name="user_group_icon(user_group=None, size=16, tooltip=False)">
247 256 <%
248 257 if (size > 16):
249 258 gravatar_class = 'icon-user-group-alt'
250 259 else:
251 260 gravatar_class = 'icon-user-group-alt'
252 261
253 262 if tooltip:
254 263 gravatar_class += ' tooltip-hovercard'
255 264
256 265 data_hovercard_url = request.route_path('hovercard_user_group', user_group_id=user_group.users_group_id)
257 266 %>
258 267 <%doc>
259 268 TODO: johbo: For now we serve double size images to make it smooth
260 269 for retina. This is how it worked until now. Should be replaced
261 270 with a better solution at some point.
262 271 </%doc>
263 272
264 273 <i style="font-size: ${size}px" class="${gravatar_class} x-icon-size-${size}" data-hovercard-url="${data_hovercard_url}"></i>
265 274 </%def>
266 275
267 276 <%def name="repo_page_title(repo_instance)">
268 277 <div class="title-content repo-title">
269 278
270 279 <div class="title-main">
271 280 ## SVN/HG/GIT icons
272 281 %if h.is_hg(repo_instance):
273 282 <i class="icon-hg"></i>
274 283 %endif
275 284 %if h.is_git(repo_instance):
276 285 <i class="icon-git"></i>
277 286 %endif
278 287 %if h.is_svn(repo_instance):
279 288 <i class="icon-svn"></i>
280 289 %endif
281 290
282 291 ## public/private
283 292 %if repo_instance.private:
284 293 <i class="icon-repo-private"></i>
285 294 %else:
286 295 <i class="icon-repo-public"></i>
287 296 %endif
288 297
289 298 ## repo name with group name
290 299 ${h.breadcrumb_repo_link(repo_instance)}
291 300
292 301 ## Context Actions
293 302 <div class="pull-right">
294 303 %if c.rhodecode_user.username != h.DEFAULT_USER:
295 304 <a href="${h.route_path('atom_feed_home', repo_name=c.rhodecode_db_repo.repo_uid, _query=dict(auth_token=c.rhodecode_user.feed_token))}" title="${_('RSS Feed')}" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
296 305
297 306 <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 '')}">
298 307 % if c.repository_is_user_following:
299 308 <i class="icon-eye-off"></i>${_('Unwatch')}
300 309 % else:
301 310 <i class="icon-eye"></i>${_('Watch')}
302 311 % endif
303 312
304 313 </a>
305 314 %else:
306 315 <a href="${h.route_path('atom_feed_home', repo_name=c.rhodecode_db_repo.repo_uid)}" title="${_('RSS Feed')}" class="btn btn-sm"><i class="icon-rss-sign"></i>RSS</a>
307 316 %endif
308 317 </div>
309 318
310 319 </div>
311 320
312 321 ## FORKED
313 322 %if repo_instance.fork:
314 323 <p class="discreet">
315 324 <i class="icon-code-fork"></i> ${_('Fork of')}
316 325 ${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))}
317 326 </p>
318 327 %endif
319 328
320 329 ## IMPORTED FROM REMOTE
321 330 %if repo_instance.clone_uri:
322 331 <p class="discreet">
323 332 <i class="icon-code-fork"></i> ${_('Clone from')}
324 333 <a href="${h.safe_str(h.hide_credentials(repo_instance.clone_uri))}">${h.hide_credentials(repo_instance.clone_uri)}</a>
325 334 </p>
326 335 %endif
327 336
328 337 ## LOCKING STATUS
329 338 %if repo_instance.locked[0]:
330 339 <p class="locking_locked discreet">
331 340 <i class="icon-repo-lock"></i>
332 341 ${_('Repository locked by %(user)s') % {'user': h.person_by_id(repo_instance.locked[0])}}
333 342 </p>
334 343 %elif repo_instance.enable_locking:
335 344 <p class="locking_unlocked discreet">
336 345 <i class="icon-repo-unlock"></i>
337 346 ${_('Repository not locked. Pull repository to lock it.')}
338 347 </p>
339 348 %endif
340 349
341 350 </div>
342 351 </%def>
343 352
344 353 <%def name="repo_menu(active=None)">
345 354 <%
346 355 ## determine if we have "any" option available
347 356 can_lock = h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking
348 357 has_actions = can_lock
349 358
350 359 %>
351 360 % if c.rhodecode_db_repo.archived:
352 361 <div class="alert alert-warning text-center">
353 362 <strong>${_('This repository has been archived. It is now read-only.')}</strong>
354 363 </div>
355 364 % endif
356 365
357 366 <!--- REPO CONTEXT BAR -->
358 367 <div id="context-bar">
359 368 <div class="wrapper">
360 369
361 370 <div class="title">
362 371 ${self.repo_page_title(c.rhodecode_db_repo)}
363 372 </div>
364 373
365 374 <ul id="context-pages" class="navigation horizontal-list">
366 375 <li class="${h.is_active('summary', active)}"><a class="menulink" href="${h.route_path('repo_summary', repo_name=c.repo_name)}"><div class="menulabel">${_('Summary')}</div></a></li>
367 376 <li class="${h.is_active('commits', active)}"><a class="menulink" href="${h.route_path('repo_commits', repo_name=c.repo_name)}"><div class="menulabel">${_('Commits')}</div></a></li>
368 377 <li class="${h.is_active('files', active)}"><a class="menulink" href="${h.repo_files_by_ref_url(c.repo_name, c.rhodecode_db_repo.repo_type, f_path='', ref_name=c.rhodecode_db_repo.landing_ref_name, commit_id='tip', query={'at':c.rhodecode_db_repo.landing_ref_name})}"><div class="menulabel">${_('Files')}</div></a></li>
369 378 <li class="${h.is_active('compare', active)}"><a class="menulink" href="${h.route_path('repo_compare_select',repo_name=c.repo_name)}"><div class="menulabel">${_('Compare')}</div></a></li>
370 379
371 380 ## TODO: anderson: ideally it would have a function on the scm_instance "enable_pullrequest() and enable_fork()"
372 381 %if c.rhodecode_db_repo.repo_type in ['git','hg']:
373 382 <li class="${h.is_active('showpullrequest', active)}">
374 383 <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)}">
375 384 <div class="menulabel">
376 385 ${_('Pull Requests')} <span class="menulink-counter">${c.repository_pull_requests}</span>
377 386 </div>
378 387 </a>
379 388 </li>
380 389 %endif
381 390
382 391 <li class="${h.is_active('artifacts', active)}">
383 392 <a class="menulink" href="${h.route_path('repo_artifacts_list',repo_name=c.repo_name)}">
384 393 <div class="menulabel">
385 394 ${_('Artifacts')} <span class="menulink-counter">${c.repository_artifacts}</span>
386 395 </div>
387 396 </a>
388 397 </li>
389 398
390 399 %if h.HasRepoPermissionAll('repository.admin')(c.repo_name):
391 400 <li class="${h.is_active('settings', active)}"><a class="menulink" href="${h.route_path('edit_repo',repo_name=c.repo_name)}"><div class="menulabel">${_('Repository Settings')}</div></a></li>
392 401 %endif
393 402
394 403 <li class="${h.is_active('options', active)}">
395 404 % if has_actions:
396 405 <a class="menulink dropdown">
397 406 <div class="menulabel">${_('Options')}<div class="show_more"></div></div>
398 407 </a>
399 408 <ul class="submenu">
400 409 %if can_lock:
401 410 %if c.rhodecode_db_repo.locked[0]:
402 411 <li><a class="locking_del" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Unlock Repository')}</a></li>
403 412 %else:
404 413 <li><a class="locking_add" href="${h.route_path('repo_edit_toggle_locking',repo_name=c.repo_name)}">${_('Lock Repository')}</a></li>
405 414 %endif
406 415 %endif
407 416 </ul>
408 417 % endif
409 418 </li>
410 419
411 420 </ul>
412 421 </div>
413 422 <div class="clear"></div>
414 423 </div>
415 424
416 425 <!--- REPO END CONTEXT BAR -->
417 426
418 427 </%def>
419 428
420 429 <%def name="repo_group_page_title(repo_group_instance)">
421 430 <div class="title-content">
422 431 <div class="title-main">
423 432 ## Repository Group icon
424 433 <i class="icon-repo-group"></i>
425 434
426 435 ## repo name with group name
427 436 ${h.breadcrumb_repo_group_link(repo_group_instance)}
428 437 </div>
429 438
430 439 <%namespace name="dt" file="/data_table/_dt_elements.mako"/>
431 440 <div class="repo-group-desc discreet">
432 441 ${dt.repo_group_desc(repo_group_instance.description_safe, repo_group_instance.personal, c.visual.stylify_metatags)}
433 442 </div>
434 443
435 444 </div>
436 445 </%def>
437 446
438 447
439 448 <%def name="repo_group_menu(active=None)">
440 449 <%
441 450 gr_name = c.repo_group.group_name if c.repo_group else None
442 451 # create repositories with write permission on group is set to true
443 452 group_admin = h.HasRepoGroupPermissionAny('group.admin')(gr_name, 'group admin index page')
444 453
445 454 %>
446 455
447 456
448 457 <!--- REPO GROUP CONTEXT BAR -->
449 458 <div id="context-bar">
450 459 <div class="wrapper">
451 460 <div class="title">
452 461 ${self.repo_group_page_title(c.repo_group)}
453 462 </div>
454 463
455 464 <ul id="context-pages" class="navigation horizontal-list">
456 465 <li class="${h.is_active('home', active)}">
457 466 <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>
458 467 </li>
459 468 % if c.is_super_admin or group_admin:
460 469 <li class="${h.is_active('settings', active)}">
461 470 <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>
462 471 </li>
463 472 % endif
464 473
465 474 </ul>
466 475 </div>
467 476 <div class="clear"></div>
468 477 </div>
469 478
470 479 <!--- REPO GROUP CONTEXT BAR -->
471 480
472 481 </%def>
473 482
474 483
475 484 <%def name="usermenu(active=False)">
476 485 <%
477 486 not_anonymous = c.rhodecode_user.username != h.DEFAULT_USER
478 487
479 488 gr_name = c.repo_group.group_name if (hasattr(c, 'repo_group') and c.repo_group) else None
480 489 # create repositories with write permission on group is set to true
481 490
482 491 can_fork = c.is_super_admin or h.HasPermissionAny('hg.fork.repository')()
483 492 create_on_write = h.HasPermissionAny('hg.create.write_on_repogroup.true')()
484 493 group_write = h.HasRepoGroupPermissionAny('group.write')(gr_name, 'can write into group index page')
485 494 group_admin = h.HasRepoGroupPermissionAny('group.admin')(gr_name, 'group admin index page')
486 495
487 496 can_create_repos = c.is_super_admin or c.can_create_repo
488 497 can_create_repo_groups = c.is_super_admin or c.can_create_repo_group
489 498
490 499 can_create_repos_in_group = c.is_super_admin or group_admin or (group_write and create_on_write)
491 500 can_create_repo_groups_in_group = c.is_super_admin or group_admin
492 501 %>
493 502
494 503 % if not_anonymous:
495 504 <%
496 505 default_target_group = dict()
497 506 if c.rhodecode_user.personal_repo_group:
498 507 default_target_group = dict(parent_group=c.rhodecode_user.personal_repo_group.group_id)
499 508 %>
500 509
501 510 ## create action
502 511 <li>
503 512 <a href="#create-actions" onclick="return false;" class="menulink childs">
504 513 <i class="tooltip icon-plus-circled" title="${_('Create')}"></i>
505 514 </a>
506 515
507 516 <div class="action-menu submenu">
508 517
509 518 <ol>
510 519 ## scope of within a repository
511 520 % if hasattr(c, 'rhodecode_db_repo') and c.rhodecode_db_repo:
512 521 <li class="submenu-title">${_('This Repository')}</li>
513 522 <li>
514 523 <a href="${h.route_path('pullrequest_new',repo_name=c.repo_name)}">${_('Create Pull Request')}</a>
515 524 </li>
516 525 % if can_fork:
517 526 <li>
518 527 <a href="${h.route_path('repo_fork_new',repo_name=c.repo_name,_query=default_target_group)}">${_('Fork this repository')}</a>
519 528 </li>
520 529 % endif
521 530 % endif
522 531
523 532 ## scope of within repository groups
524 533 % if hasattr(c, 'repo_group') and c.repo_group and (can_create_repos_in_group or can_create_repo_groups_in_group):
525 534 <li class="submenu-title">${_('This Repository Group')}</li>
526 535
527 536 % if can_create_repos_in_group:
528 537 <li>
529 538 <a href="${h.route_path('repo_new',_query=dict(parent_group=c.repo_group.group_id))}">${_('New Repository')}</a>
530 539 </li>
531 540 % endif
532 541
533 542 % if can_create_repo_groups_in_group:
534 543 <li>
535 544 <a href="${h.route_path('repo_group_new',_query=dict(parent_group=c.repo_group.group_id))}">${_(u'New Repository Group')}</a>
536 545 </li>
537 546 % endif
538 547 % endif
539 548
540 549 ## personal group
541 550 % if c.rhodecode_user.personal_repo_group:
542 551 <li class="submenu-title">Personal Group</li>
543 552
544 553 <li>
545 554 <a href="${h.route_path('repo_new',_query=dict(parent_group=c.rhodecode_user.personal_repo_group.group_id))}" >${_('New Repository')} </a>
546 555 </li>
547 556
548 557 <li>
549 558 <a href="${h.route_path('repo_group_new',_query=dict(parent_group=c.rhodecode_user.personal_repo_group.group_id))}">${_('New Repository Group')} </a>
550 559 </li>
551 560 % endif
552 561
553 562 ## Global actions
554 563 <li class="submenu-title">RhodeCode</li>
555 564 % if can_create_repos:
556 565 <li>
557 566 <a href="${h.route_path('repo_new')}" >${_('New Repository')}</a>
558 567 </li>
559 568 % endif
560 569
561 570 % if can_create_repo_groups:
562 571 <li>
563 572 <a href="${h.route_path('repo_group_new')}" >${_(u'New Repository Group')}</a>
564 573 </li>
565 574 % endif
566 575
567 576 <li>
568 577 <a href="${h.route_path('gists_new')}">${_(u'New Gist')}</a>
569 578 </li>
570 579
571 580 </ol>
572 581
573 582 </div>
574 583 </li>
575 584
576 585 ## notifications
577 586 <li>
578 587 <a class="${('empty' if c.unread_notifications == 0 else '')}" href="${h.route_path('notifications_show_all')}">
579 588 ${c.unread_notifications}
580 589 </a>
581 590 </li>
582 591 % endif
583 592
584 593 ## USER MENU
585 594 <li id="quick_login_li" class="${'active' if active else ''}">
586 595 % if c.rhodecode_user.username == h.DEFAULT_USER:
587 596 <a id="quick_login_link" class="menulink childs" href="${h.route_path('login', _query={'came_from': h.current_route_path(request)})}">
588 597 ${gravatar(c.rhodecode_user.email, 20)}
589 598 <span class="user">
590 599 <span>${_('Sign in')}</span>
591 600 </span>
592 601 </a>
593 602 % else:
594 603 ## logged in user
595 604 <a id="quick_login_link" class="menulink childs">
596 605 ${gravatar(c.rhodecode_user.email, 20)}
597 606 <span class="user">
598 607 <span class="menu_link_user">${c.rhodecode_user.username}</span>
599 608 <div class="show_more"></div>
600 609 </span>
601 610 </a>
602 611 ## subnav with menu for logged in user
603 612 <div class="user-menu submenu">
604 613 <div id="quick_login">
605 614 %if c.rhodecode_user.username != h.DEFAULT_USER:
606 615 <div class="">
607 616 <div class="big_gravatar">${gravatar(c.rhodecode_user.email, 48)}</div>
608 617 <div class="full_name">${c.rhodecode_user.full_name_or_username}</div>
609 618 <div class="email">${c.rhodecode_user.email}</div>
610 619 </div>
611 620 <div class="">
612 621 <ol class="links">
613 622 <li>${h.link_to(_(u'My account'),h.route_path('my_account_profile'))}</li>
614 623 % if c.rhodecode_user.personal_repo_group:
615 624 <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>
616 625 % endif
617 626 <li>${h.link_to(_(u'Pull Requests'), h.route_path('my_account_pullrequests'))}</li>
618 627
619 628 % if c.debug_style:
620 629 <li>
621 630 <a class="menulink" title="${_('Style')}" href="${h.route_path('debug_style_home')}">
622 631 <div class="menulabel">${_('[Style]')}</div>
623 632 </a>
624 633 </li>
625 634 % endif
626 635
627 636 ## bookmark-items
628 637 <li class="bookmark-items">
629 638 ${_('Bookmarks')}
630 639 <div class="pull-right">
631 640 <a href="${h.route_path('my_account_bookmarks')}">
632 641
633 642 <i class="icon-cog"></i>
634 643 </a>
635 644 </div>
636 645 </li>
637 646 % if not c.bookmark_items:
638 647 <li>
639 648 <a href="${h.route_path('my_account_bookmarks')}">${_('No Bookmarks yet.')}</a>
640 649 </li>
641 650 % endif
642 651 % for item in c.bookmark_items:
643 652 <li>
644 653 % if item.repository:
645 654 <div>
646 655 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
647 656 <code>${item.position}</code>
648 657 % if item.repository.repo_type == 'hg':
649 658 <i class="icon-hg" title="${_('Repository')}" style="font-size: 16px"></i>
650 659 % elif item.repository.repo_type == 'git':
651 660 <i class="icon-git" title="${_('Repository')}" style="font-size: 16px"></i>
652 661 % elif item.repository.repo_type == 'svn':
653 662 <i class="icon-svn" title="${_('Repository')}" style="font-size: 16px"></i>
654 663 % endif
655 664 ${(item.title or h.shorter(item.repository.repo_name, 30))}
656 665 </a>
657 666 </div>
658 667 % elif item.repository_group:
659 668 <div>
660 669 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
661 670 <code>${item.position}</code>
662 671 <i class="icon-repo-group" title="${_('Repository group')}" style="font-size: 14px"></i>
663 672 ${(item.title or h.shorter(item.repository_group.group_name, 30))}
664 673 </a>
665 674 </div>
666 675 % else:
667 676 <a class="bookmark-item" href="${h.route_path('my_account_goto_bookmark', bookmark_id=item.position)}">
668 677 <code>${item.position}</code>
669 678 ${item.title}
670 679 </a>
671 680 % endif
672 681 </li>
673 682 % endfor
674 683
675 684 <li class="logout">
676 685 ${h.secure_form(h.route_path('logout'), request=request)}
677 686 ${h.submit('log_out', _(u'Sign Out'),class_="btn btn-primary")}
678 687 ${h.end_form()}
679 688 </li>
680 689 </ol>
681 690 </div>
682 691 %endif
683 692 </div>
684 693 </div>
685 694
686 695 % endif
687 696 </li>
688 697 </%def>
689 698
690 699 <%def name="menu_items(active=None)">
691 700 <%
692 701 notice_messages, notice_level = c.rhodecode_user.get_notice_messages()
693 702 notice_display = 'none' if len(notice_messages) == 0 else ''
694 703 %>
695 704 <style>
696 705
697 706 </style>
698 707
699 708 <ul id="quick" class="main_nav navigation horizontal-list">
700 709 ## notice box for important system messages
701 710 <li style="display: ${notice_display}">
702 711 <a class="notice-box" href="#openNotice" onclick="$('.notice-messages-container').toggle(); return false">
703 712 <div class="menulabel-notice ${notice_level}" >
704 713 ${len(notice_messages)}
705 714 </div>
706 715 </a>
707 716 </li>
708 717 <div class="notice-messages-container" style="display: none">
709 718 <div class="notice-messages">
710 719 <table class="rctable">
711 720 % for notice in notice_messages:
712 721 <tr id="notice-message-${notice['msg_id']}" class="notice-message-${notice['level']}">
713 722 <td style="vertical-align: text-top; width: 20px">
714 723 <i class="tooltip icon-info notice-color-${notice['level']}" title="${notice['level']}"></i>
715 724 </td>
716 725 <td>
717 726 <span><i class="icon-plus-squared cursor-pointer" onclick="$('#notice-${notice['msg_id']}').toggle()"></i> </span>
718 727 ${notice['subject']}
719 728
720 729 <div id="notice-${notice['msg_id']}" style="display: none">
721 730 ${h.render(notice['body'], renderer='markdown')}
722 731 </div>
723 732 </td>
724 733 <td style="vertical-align: text-top; width: 35px;">
725 734 <a class="tooltip" title="${_('dismiss')}" href="#dismiss" onclick="dismissNotice(${notice['msg_id']});return false">
726 735 <i class="icon-remove icon-filled-red"></i>
727 736 </a>
728 737 </td>
729 738 </tr>
730 739
731 740 % endfor
732 741 </table>
733 742 </div>
734 743 </div>
735 744 ## Main filter
736 745 <li>
737 746 <div class="menulabel main_filter_box">
738 747 <div class="main_filter_input_box">
739 748 <ul class="searchItems">
740 749
741 750 <li class="searchTag searchTagIcon">
742 751 <i class="icon-search"></i>
743 752 </li>
744 753
745 754 % if c.template_context['search_context']['repo_id']:
746 755 <li class="searchTag searchTagFilter searchTagHidable" >
747 756 ##<a href="${h.route_path('search_repo',repo_name=c.template_context['search_context']['repo_name'])}">
748 757 <span class="tag">
749 758 This repo
750 759 <a href="#removeGoToFilter" onclick="removeGoToFilter(); return false"><i class="icon-cancel-circled"></i></a>
751 760 </span>
752 761 ##</a>
753 762 </li>
754 763 % elif c.template_context['search_context']['repo_group_id']:
755 764 <li class="searchTag searchTagFilter searchTagHidable">
756 765 ##<a href="${h.route_path('search_repo_group',repo_group_name=c.template_context['search_context']['repo_group_name'])}">
757 766 <span class="tag">
758 767 This group
759 768 <a href="#removeGoToFilter" onclick="removeGoToFilter(); return false"><i class="icon-cancel-circled"></i></a>
760 769 </span>
761 770 ##</a>
762 771 </li>
763 772 % endif
764 773
765 774 <li class="searchTagInput">
766 775 <input class="main_filter_input" id="main_filter" size="25" type="text" name="main_filter" placeholder="${_('search / go to...')}" value="" />
767 776 </li>
768 777 <li class="searchTag searchTagHelp">
769 778 <a href="#showFilterHelp" onclick="showMainFilterBox(); return false">?</a>
770 779 </li>
771 780 </ul>
772 781 </div>
773 782 </div>
774 783
775 784 <div id="main_filter_help" style="display: none">
776 785 - Use '/' key to quickly access this field.
777 786
778 787 - Enter a name of repository, or repository group for quick search.
779 788
780 789 - Prefix query to allow special search:
781 790
782 791 user:admin, to search for usernames, always global
783 792
784 793 user_group:devops, to search for user groups, always global
785 794
786 795 pr:303, to search for pull request number, title, or description, always global
787 796
788 797 commit:efced4, to search for commits, scoped to repositories or groups
789 798
790 799 file:models.py, to search for file paths, scoped to repositories or groups
791 800
792 801 % if c.template_context['search_context']['repo_id']:
793 802 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>
794 803 % elif c.template_context['search_context']['repo_group_id']:
795 804 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>
796 805 % else:
797 806 For advanced full text search visit: <a href="${h.route_path('search')}">global search</a>
798 807 % endif
799 808 </div>
800 809 </li>
801 810
802 811 ## ROOT MENU
803 812 <li class="${h.is_active('home', active)}">
804 813 <a class="menulink" title="${_('Home')}" href="${h.route_path('home')}">
805 814 <div class="menulabel">${_('Home')}</div>
806 815 </a>
807 816 </li>
808 817
809 818 %if c.rhodecode_user.username != h.DEFAULT_USER:
810 819 <li class="${h.is_active('journal', active)}">
811 820 <a class="menulink" title="${_('Show activity journal')}" href="${h.route_path('journal')}">
812 821 <div class="menulabel">${_('Journal')}</div>
813 822 </a>
814 823 </li>
815 824 %else:
816 825 <li class="${h.is_active('journal', active)}">
817 826 <a class="menulink" title="${_('Show Public activity journal')}" href="${h.route_path('journal_public')}">
818 827 <div class="menulabel">${_('Public journal')}</div>
819 828 </a>
820 829 </li>
821 830 %endif
822 831
823 832 <li class="${h.is_active('gists', active)}">
824 833 <a class="menulink childs" title="${_('Show Gists')}" href="${h.route_path('gists_show')}">
825 834 <div class="menulabel">${_('Gists')}</div>
826 835 </a>
827 836 </li>
828 837
829 838 % if c.is_super_admin or c.is_delegated_admin:
830 839 <li class="${h.is_active('admin', active)}">
831 840 <a class="menulink childs" title="${_('Admin settings')}" href="${h.route_path('admin_home')}">
832 841 <div class="menulabel">${_('Admin')} </div>
833 842 </a>
834 843 </li>
835 844 % endif
836 845
837 846 ## render extra user menu
838 847 ${usermenu(active=(active=='my_account'))}
839 848
840 849 </ul>
841 850
842 851 <script type="text/javascript">
843 852 var visualShowPublicIcon = "${c.visual.show_public_icon}" == "True";
844 853
845 854 var formatRepoResult = function(result, container, query, escapeMarkup) {
846 855 return function(data, escapeMarkup) {
847 856 if (!data.repo_id){
848 857 return data.text; // optgroup text Repositories
849 858 }
850 859
851 860 var tmpl = '';
852 861 var repoType = data['repo_type'];
853 862 var repoName = data['text'];
854 863
855 864 if(data && data.type == 'repo'){
856 865 if(repoType === 'hg'){
857 866 tmpl += '<i class="icon-hg"></i> ';
858 867 }
859 868 else if(repoType === 'git'){
860 869 tmpl += '<i class="icon-git"></i> ';
861 870 }
862 871 else if(repoType === 'svn'){
863 872 tmpl += '<i class="icon-svn"></i> ';
864 873 }
865 874 if(data['private']){
866 875 tmpl += '<i class="icon-lock" ></i> ';
867 876 }
868 877 else if(visualShowPublicIcon){
869 878 tmpl += '<i class="icon-unlock-alt"></i> ';
870 879 }
871 880 }
872 881 tmpl += escapeMarkup(repoName);
873 882 return tmpl;
874 883
875 884 }(result, escapeMarkup);
876 885 };
877 886
878 887 var formatRepoGroupResult = function(result, container, query, escapeMarkup) {
879 888 return function(data, escapeMarkup) {
880 889 if (!data.repo_group_id){
881 890 return data.text; // optgroup text Repositories
882 891 }
883 892
884 893 var tmpl = '';
885 894 var repoGroupName = data['text'];
886 895
887 896 if(data){
888 897
889 898 tmpl += '<i class="icon-repo-group"></i> ';
890 899
891 900 }
892 901 tmpl += escapeMarkup(repoGroupName);
893 902 return tmpl;
894 903
895 904 }(result, escapeMarkup);
896 905 };
897 906
898 907 var escapeRegExChars = function (value) {
899 908 return value.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
900 909 };
901 910
902 911 var getRepoIcon = function(repo_type) {
903 912 if (repo_type === 'hg') {
904 913 return '<i class="icon-hg"></i> ';
905 914 }
906 915 else if (repo_type === 'git') {
907 916 return '<i class="icon-git"></i> ';
908 917 }
909 918 else if (repo_type === 'svn') {
910 919 return '<i class="icon-svn"></i> ';
911 920 }
912 921 return ''
913 922 };
914 923
915 924 var autocompleteMainFilterFormatResult = function (data, value, org_formatter) {
916 925
917 926 if (value.split(':').length === 2) {
918 927 value = value.split(':')[1]
919 928 }
920 929
921 930 var searchType = data['type'];
922 931 var searchSubType = data['subtype'];
923 932 var valueDisplay = data['value_display'];
924 933 var valueIcon = data['value_icon'];
925 934
926 935 var pattern = '(' + escapeRegExChars(value) + ')';
927 936
928 937 valueDisplay = Select2.util.escapeMarkup(valueDisplay);
929 938
930 939 // highlight match
931 940 if (searchType != 'text') {
932 941 valueDisplay = valueDisplay.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>');
933 942 }
934 943
935 944 var icon = '';
936 945
937 946 if (searchType === 'hint') {
938 947 icon += '<i class="icon-repo-group"></i> ';
939 948 }
940 949 // full text search/hints
941 950 else if (searchType === 'search') {
942 951 if (valueIcon === undefined) {
943 952 icon += '<i class="icon-more"></i> ';
944 953 } else {
945 954 icon += valueIcon + ' ';
946 955 }
947 956
948 957 if (searchSubType !== undefined && searchSubType == 'repo') {
949 958 valueDisplay += '<div class="pull-right tag">repository</div>';
950 959 }
951 960 else if (searchSubType !== undefined && searchSubType == 'repo_group') {
952 961 valueDisplay += '<div class="pull-right tag">repo group</div>';
953 962 }
954 963 }
955 964 // repository
956 965 else if (searchType === 'repo') {
957 966
958 967 var repoIcon = getRepoIcon(data['repo_type']);
959 968 icon += repoIcon;
960 969
961 970 if (data['private']) {
962 971 icon += '<i class="icon-lock" ></i> ';
963 972 }
964 973 else if (visualShowPublicIcon) {
965 974 icon += '<i class="icon-unlock-alt"></i> ';
966 975 }
967 976 }
968 977 // repository groups
969 978 else if (searchType === 'repo_group') {
970 979 icon += '<i class="icon-repo-group"></i> ';
971 980 }
972 981 // user group
973 982 else if (searchType === 'user_group') {
974 983 icon += '<i class="icon-group"></i> ';
975 984 }
976 985 // user
977 986 else if (searchType === 'user') {
978 987 icon += '<img class="gravatar" src="{0}"/>'.format(data['icon_link']);
979 988 }
980 989 // pull request
981 990 else if (searchType === 'pull_request') {
982 991 icon += '<i class="icon-merge"></i> ';
983 992 }
984 993 // commit
985 994 else if (searchType === 'commit') {
986 995 var repo_data = data['repo_data'];
987 996 var repoIcon = getRepoIcon(repo_data['repository_type']);
988 997 if (repoIcon) {
989 998 icon += repoIcon;
990 999 } else {
991 1000 icon += '<i class="icon-tag"></i>';
992 1001 }
993 1002 }
994 1003 // file
995 1004 else if (searchType === 'file') {
996 1005 var repo_data = data['repo_data'];
997 1006 var repoIcon = getRepoIcon(repo_data['repository_type']);
998 1007 if (repoIcon) {
999 1008 icon += repoIcon;
1000 1009 } else {
1001 1010 icon += '<i class="icon-tag"></i>';
1002 1011 }
1003 1012 }
1004 1013 // generic text
1005 1014 else if (searchType === 'text') {
1006 1015 icon = '';
1007 1016 }
1008 1017
1009 1018 var tmpl = '<div class="ac-container-wrap">{0}{1}</div>';
1010 1019 return tmpl.format(icon, valueDisplay);
1011 1020 };
1012 1021
1013 1022 var handleSelect = function(element, suggestion) {
1014 1023 if (suggestion.type === "hint") {
1015 1024 // we skip action
1016 1025 $('#main_filter').focus();
1017 1026 }
1018 1027 else if (suggestion.type === "text") {
1019 1028 // we skip action
1020 1029 $('#main_filter').focus();
1021 1030
1022 1031 } else {
1023 1032 window.location = suggestion['url'];
1024 1033 }
1025 1034 };
1026 1035
1027 1036 var autocompleteMainFilterResult = function (suggestion, originalQuery, queryLowerCase) {
1028 1037 if (queryLowerCase.split(':').length === 2) {
1029 1038 queryLowerCase = queryLowerCase.split(':')[1]
1030 1039 }
1031 1040 if (suggestion.type === "text") {
1032 1041 // special case we don't want to "skip" display for
1033 1042 return true
1034 1043 }
1035 1044 return suggestion.value_display.toLowerCase().indexOf(queryLowerCase) !== -1;
1036 1045 };
1037 1046
1038 1047 var cleanContext = {
1039 1048 repo_view_type: null,
1040 1049
1041 1050 repo_id: null,
1042 1051 repo_name: "",
1043 1052
1044 1053 repo_group_id: null,
1045 1054 repo_group_name: null
1046 1055 };
1047 1056 var removeGoToFilter = function () {
1048 1057 $('.searchTagHidable').hide();
1049 1058 $('#main_filter').autocomplete(
1050 1059 'setOptions', {params:{search_context: cleanContext}});
1051 1060 };
1052 1061
1053 1062 $('#main_filter').autocomplete({
1054 1063 serviceUrl: pyroutes.url('goto_switcher_data'),
1055 1064 params: {
1056 1065 "search_context": templateContext.search_context
1057 1066 },
1058 1067 minChars:2,
1059 1068 maxHeight:400,
1060 1069 deferRequestBy: 300, //miliseconds
1061 1070 tabDisabled: true,
1062 1071 autoSelectFirst: false,
1063 1072 containerClass: 'autocomplete-qfilter-suggestions',
1064 1073 formatResult: autocompleteMainFilterFormatResult,
1065 1074 lookupFilter: autocompleteMainFilterResult,
1066 1075 onSelect: function (element, suggestion) {
1067 1076 handleSelect(element, suggestion);
1068 1077 return false;
1069 1078 },
1070 1079 onSearchError: function (element, query, jqXHR, textStatus, errorThrown) {
1071 1080 if (jqXHR !== 'abort') {
1072 1081 var message = formatErrorMessage(jqXHR, textStatus, errorThrown);
1073 1082 SwalNoAnimation.fire({
1074 1083 icon: 'error',
1075 1084 title: _gettext('Error during search operation'),
1076 1085 html: '<span style="white-space: pre-line">{0}</span>'.format(message),
1077 1086 }).then(function(result) {
1078 1087 window.location.reload();
1079 1088 })
1080 1089 }
1081 1090 },
1082 1091 onSearchStart: function (params) {
1083 1092 $('.searchTag.searchTagIcon').html('<i class="icon-spin animate-spin"></i>')
1084 1093 },
1085 1094 onSearchComplete: function (query, suggestions) {
1086 1095 $('.searchTag.searchTagIcon').html('<i class="icon-search"></i>')
1087 1096 },
1088 1097 });
1089 1098
1090 1099 showMainFilterBox = function () {
1091 1100 $('#main_filter_help').toggle();
1092 1101 };
1093 1102
1094 1103 $('#main_filter').on('keydown.autocomplete', function (e) {
1095 1104
1096 1105 var BACKSPACE = 8;
1097 1106 var el = $(e.currentTarget);
1098 1107 if(e.which === BACKSPACE){
1099 1108 var inputVal = el.val();
1100 1109 if (inputVal === ""){
1101 1110 removeGoToFilter()
1102 1111 }
1103 1112 }
1104 1113 });
1105 1114
1106 1115 var dismissNotice = function(noticeId) {
1107 1116
1108 1117 var url = pyroutes.url('user_notice_dismiss',
1109 1118 {"user_id": templateContext.rhodecode_user.user_id});
1110 1119
1111 1120 var postData = {
1112 1121 'csrf_token': CSRF_TOKEN,
1113 1122 'notice_id': noticeId,
1114 1123 };
1115 1124
1116 1125 var success = function(response) {
1117 1126 $('#notice-message-' + noticeId).remove();
1118 1127 return false;
1119 1128 };
1120 1129 var failure = function(data, textStatus, xhr) {
1121 1130 alert("error processing request: " + textStatus);
1122 1131 return false;
1123 1132 };
1124 1133 ajaxPOST(url, postData, success, failure);
1125 1134 }
1126 1135 </script>
1127 1136 <script src="${h.asset('js/rhodecode/base/keyboard-bindings.js', ver=c.rhodecode_version_hash)}"></script>
1128 1137 </%def>
1129 1138
1130 1139 <div class="modal" id="help_kb" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
1131 1140 <div class="modal-dialog">
1132 1141 <div class="modal-content">
1133 1142 <div class="modal-header">
1134 1143 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
1135 1144 <h4 class="modal-title" id="myModalLabel">${_('Keyboard shortcuts')}</h4>
1136 1145 </div>
1137 1146 <div class="modal-body">
1138 1147 <div class="block-left">
1139 1148 <table class="keyboard-mappings">
1140 1149 <tbody>
1141 1150 <tr>
1142 1151 <th></th>
1143 1152 <th>${_('Site-wide shortcuts')}</th>
1144 1153 </tr>
1145 1154 <%
1146 1155 elems = [
1147 1156 ('/', 'Use quick search box'),
1148 1157 ('g h', 'Goto home page'),
1149 1158 ('g g', 'Goto my private gists page'),
1150 1159 ('g G', 'Goto my public gists page'),
1151 1160 ('g 0-9', 'Goto bookmarked items from 0-9'),
1152 1161 ('n r', 'New repository page'),
1153 1162 ('n g', 'New gist page'),
1154 1163 ]
1155 1164 %>
1156 1165 %for key, desc in elems:
1157 1166 <tr>
1158 1167 <td class="keys">
1159 1168 <span class="key tag">${key}</span>
1160 1169 </td>
1161 1170 <td>${desc}</td>
1162 1171 </tr>
1163 1172 %endfor
1164 1173 </tbody>
1165 1174 </table>
1166 1175 </div>
1167 1176 <div class="block-left">
1168 1177 <table class="keyboard-mappings">
1169 1178 <tbody>
1170 1179 <tr>
1171 1180 <th></th>
1172 1181 <th>${_('Repositories')}</th>
1173 1182 </tr>
1174 1183 <%
1175 1184 elems = [
1176 1185 ('g s', 'Goto summary page'),
1177 1186 ('g c', 'Goto changelog page'),
1178 1187 ('g f', 'Goto files page'),
1179 1188 ('g F', 'Goto files page with file search activated'),
1180 1189 ('g p', 'Goto pull requests page'),
1181 1190 ('g o', 'Goto repository settings'),
1182 1191 ('g O', 'Goto repository access permissions settings'),
1183 1192 ]
1184 1193 %>
1185 1194 %for key, desc in elems:
1186 1195 <tr>
1187 1196 <td class="keys">
1188 1197 <span class="key tag">${key}</span>
1189 1198 </td>
1190 1199 <td>${desc}</td>
1191 1200 </tr>
1192 1201 %endfor
1193 1202 </tbody>
1194 1203 </table>
1195 1204 </div>
1196 1205 </div>
1197 1206 <div class="modal-footer">
1198 1207 </div>
1199 1208 </div><!-- /.modal-content -->
1200 1209 </div><!-- /.modal-dialog -->
1201 1210 </div><!-- /.modal -->
General Comments 0
You need to be logged in to leave comments. Login now