##// END OF EJS Templates
diffs: made pills display on single side. Better UX and readability.
dan -
r3116:4d442652 default
parent child Browse files
Show More
@@ -1,1169 +1,1170 b''
1 1 // Default styles
2 2
3 3 .diff-collapse {
4 4 margin: @padding 0;
5 5 text-align: right;
6 6 }
7 7
8 8 .diff-container {
9 9 margin-bottom: @space;
10 10
11 11 .diffblock {
12 12 margin-bottom: @space;
13 13 }
14 14
15 15 &.hidden {
16 16 display: none;
17 17 overflow: hidden;
18 18 }
19 19 }
20 20
21 21
22 22 div.diffblock .sidebyside {
23 23 background: #ffffff;
24 24 }
25 25
26 26 div.diffblock {
27 27 overflow-x: auto;
28 28 overflow-y: hidden;
29 29 clear: both;
30 30 padding: 0px;
31 31 background: @grey6;
32 32 border: @border-thickness solid @grey5;
33 33 -webkit-border-radius: @border-radius @border-radius 0px 0px;
34 34 border-radius: @border-radius @border-radius 0px 0px;
35 35
36 36
37 37 .comments-number {
38 38 float: right;
39 39 }
40 40
41 41 // BEGIN CODE-HEADER STYLES
42 42
43 43 .code-header {
44 44 background: @grey6;
45 45 padding: 10px 0 10px 0;
46 46 height: auto;
47 47 width: 100%;
48 48
49 49 .hash {
50 50 float: left;
51 51 padding: 2px 0 0 2px;
52 52 }
53 53
54 54 .date {
55 55 float: left;
56 56 text-transform: uppercase;
57 57 padding: 4px 0px 0px 2px;
58 58 }
59 59
60 60 div {
61 61 margin-left: 4px;
62 62 }
63 63
64 64 div.compare_header {
65 65 min-height: 40px;
66 66 margin: 0;
67 67 padding: 0 @padding;
68 68
69 69 .drop-menu {
70 70 float:left;
71 71 display: block;
72 72 margin:0 0 @padding 0;
73 73 }
74 74
75 75 .compare-label {
76 76 float: left;
77 77 clear: both;
78 78 display: inline-block;
79 79 min-width: 5em;
80 80 margin: 0;
81 81 padding: @button-padding @button-padding @button-padding 0;
82 82 font-family: @text-semibold;
83 83 }
84 84
85 85 .compare-buttons {
86 86 float: left;
87 87 margin: 0;
88 88 padding: 0 0 @padding;
89 89
90 90 .btn {
91 91 margin: 0 @padding 0 0;
92 92 }
93 93 }
94 94 }
95 95
96 96 }
97 97
98 98 .parents {
99 99 float: left;
100 100 width: 100px;
101 101 font-weight: 400;
102 102 vertical-align: middle;
103 103 padding: 0px 2px 0px 2px;
104 104 background-color: @grey6;
105 105
106 106 #parent_link {
107 107 margin: 00px 2px;
108 108
109 109 &.double {
110 110 margin: 0px 2px;
111 111 }
112 112
113 113 &.disabled{
114 114 margin-right: @padding;
115 115 }
116 116 }
117 117 }
118 118
119 119 .children {
120 120 float: right;
121 121 width: 100px;
122 122 font-weight: 400;
123 123 vertical-align: middle;
124 124 text-align: right;
125 125 padding: 0px 2px 0px 2px;
126 126 background-color: @grey6;
127 127
128 128 #child_link {
129 129 margin: 0px 2px;
130 130
131 131 &.double {
132 132 margin: 0px 2px;
133 133 }
134 134
135 135 &.disabled{
136 136 margin-right: @padding;
137 137 }
138 138 }
139 139 }
140 140
141 141 .changeset_header {
142 142 height: 16px;
143 143
144 144 & > div{
145 145 margin-right: @padding;
146 146 }
147 147 }
148 148
149 149 .changeset_file {
150 150 text-align: left;
151 151 float: left;
152 152 padding: 0;
153 153
154 154 a{
155 155 display: inline-block;
156 156 margin-right: 0.5em;
157 157 }
158 158
159 159 #selected_mode{
160 160 margin-left: 0;
161 161 }
162 162 }
163 163
164 164 .diff-menu-wrapper {
165 165 float: left;
166 166 }
167 167
168 168 .diff-menu {
169 169 position: absolute;
170 170 background: none repeat scroll 0 0 #FFFFFF;
171 171 border-color: #003367 @grey3 @grey3;
172 172 border-right: 1px solid @grey3;
173 173 border-style: solid solid solid;
174 174 border-width: @border-thickness;
175 175 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
176 176 margin-top: 5px;
177 177 margin-left: 1px;
178 178 }
179 179
180 180 .diff-actions, .editor-actions {
181 181 float: left;
182 182
183 183 input{
184 184 margin: 0 0.5em 0 0;
185 185 }
186 186 }
187 187
188 188 // END CODE-HEADER STYLES
189 189
190 190 // BEGIN CODE-BODY STYLES
191 191
192 192 .code-body {
193 193 padding: 0;
194 194 background-color: #ffffff;
195 195 position: relative;
196 196 max-width: none;
197 197 box-sizing: border-box;
198 198 // TODO: johbo: Parent has overflow: auto, this forces the child here
199 199 // to have the intended size and to scroll. Should be simplified.
200 200 width: 100%;
201 201 overflow-x: auto;
202 202 }
203 203
204 204 pre.raw {
205 205 background: white;
206 206 color: @grey1;
207 207 }
208 208 // END CODE-BODY STYLES
209 209
210 210 }
211 211
212 212
213 213 table.code-difftable {
214 214 border-collapse: collapse;
215 215 width: 99%;
216 216 border-radius: 0px !important;
217 217
218 218 td {
219 219 padding: 0 !important;
220 220 background: none !important;
221 221 border: 0 !important;
222 222 }
223 223
224 224 .context {
225 225 background: none repeat scroll 0 0 #DDE7EF;
226 226 }
227 227
228 228 .add {
229 229 background: none repeat scroll 0 0 #DDFFDD;
230 230
231 231 ins {
232 232 background: none repeat scroll 0 0 #AAFFAA;
233 233 text-decoration: none;
234 234 }
235 235 }
236 236
237 237 .del {
238 238 background: none repeat scroll 0 0 #FFDDDD;
239 239
240 240 del {
241 241 background: none repeat scroll 0 0 #FFAAAA;
242 242 text-decoration: none;
243 243 }
244 244 }
245 245
246 246 /** LINE NUMBERS **/
247 247 .lineno {
248 248 padding-left: 2px !important;
249 249 padding-right: 2px;
250 250 text-align: right;
251 251 width: 32px;
252 252 -moz-user-select: none;
253 253 -webkit-user-select: none;
254 254 border-right: @border-thickness solid @grey5 !important;
255 255 border-left: 0px solid #CCC !important;
256 256 border-top: 0px solid #CCC !important;
257 257 border-bottom: none !important;
258 258
259 259 a {
260 260 &:extend(pre);
261 261 text-align: right;
262 262 padding-right: 2px;
263 263 cursor: pointer;
264 264 display: block;
265 265 width: 32px;
266 266 }
267 267 }
268 268
269 269 .context {
270 270 cursor: auto;
271 271 &:extend(pre);
272 272 }
273 273
274 274 .lineno-inline {
275 275 background: none repeat scroll 0 0 #FFF !important;
276 276 padding-left: 2px;
277 277 padding-right: 2px;
278 278 text-align: right;
279 279 width: 30px;
280 280 -moz-user-select: none;
281 281 -webkit-user-select: none;
282 282 }
283 283
284 284 /** CODE **/
285 285 .code {
286 286 display: block;
287 287 width: 100%;
288 288
289 289 td {
290 290 margin: 0;
291 291 padding: 0;
292 292 }
293 293
294 294 pre {
295 295 margin: 0;
296 296 padding: 0;
297 297 margin-left: .5em;
298 298 }
299 299 }
300 300 }
301 301
302 302
303 303 // Comments
304 304
305 305 div.comment:target {
306 306 border-left: 6px solid @comment-highlight-color !important;
307 307 padding-left: 3px;
308 308 margin-left: -9px;
309 309 }
310 310
311 311 //TODO: anderson: can't get an absolute number out of anything, so had to put the
312 312 //current values that might change. But to make it clear I put as a calculation
313 313 @comment-max-width: 1065px;
314 314 @pr-extra-margin: 34px;
315 315 @pr-border-spacing: 4px;
316 316 @pr-comment-width: @comment-max-width - @pr-extra-margin - @pr-border-spacing;
317 317
318 318 // Pull Request
319 319 .cs_files .code-difftable {
320 320 border: @border-thickness solid @grey5; //borders only on PRs
321 321
322 322 .comment-inline-form,
323 323 div.comment {
324 324 width: @pr-comment-width;
325 325 }
326 326 }
327 327
328 328 // Changeset
329 329 .code-difftable {
330 330 .comment-inline-form,
331 331 div.comment {
332 332 width: @comment-max-width;
333 333 }
334 334 }
335 335
336 336 //Style page
337 337 @style-extra-margin: @sidebar-width + (@sidebarpadding * 3) + @padding;
338 338 #style-page .code-difftable{
339 339 .comment-inline-form,
340 340 div.comment {
341 341 width: @comment-max-width - @style-extra-margin;
342 342 }
343 343 }
344 344
345 345 #context-bar > h2 {
346 346 font-size: 20px;
347 347 }
348 348
349 349 #context-bar > h2> a {
350 350 font-size: 20px;
351 351 }
352 352 // end of defaults
353 353
354 354 .file_diff_buttons {
355 355 padding: 0 0 @padding;
356 356
357 357 .drop-menu {
358 358 float: left;
359 359 margin: 0 @padding 0 0;
360 360 }
361 361 .btn {
362 362 margin: 0 @padding 0 0;
363 363 }
364 364 }
365 365
366 366 .code-body.textarea.editor {
367 367 max-width: none;
368 368 padding: 15px;
369 369 }
370 370
371 371 td.injected_diff{
372 372 max-width: 1178px;
373 373 overflow-x: auto;
374 374 overflow-y: hidden;
375 375
376 376 div.diff-container,
377 377 div.diffblock{
378 378 max-width: 100%;
379 379 }
380 380
381 381 div.code-body {
382 382 max-width: 1124px;
383 383 overflow-x: auto;
384 384 overflow-y: hidden;
385 385 padding: 0;
386 386 }
387 387 div.diffblock {
388 388 border: none;
389 389 }
390 390
391 391 &.inline-form {
392 392 width: 99%
393 393 }
394 394 }
395 395
396 396
397 397 table.code-difftable {
398 398 width: 100%;
399 399 }
400 400
401 401 /** PYGMENTS COLORING **/
402 402 div.codeblock {
403 403
404 404 // TODO: johbo: Added interim to get rid of the margin around
405 405 // Select2 widgets. This needs further cleanup.
406 406 margin-top: @padding;
407 407
408 408 overflow: auto;
409 409 padding: 0px;
410 410 border: @border-thickness solid @grey5;
411 411 background: @grey6;
412 412 .border-radius(@border-radius);
413 413
414 414 #remove_gist {
415 415 float: right;
416 416 }
417 417
418 418 .gist_url {
419 419 padding: 0px 0px 10px 0px;
420 420 }
421 421
422 422 .author {
423 423 clear: both;
424 424 vertical-align: middle;
425 425 font-family: @text-bold;
426 426 }
427 427
428 428 .btn-mini {
429 429 float: left;
430 430 margin: 0 5px 0 0;
431 431 }
432 432
433 433 .code-header {
434 434 padding: @padding;
435 435 border-bottom: @border-thickness solid @grey5;
436 436
437 437 .rc-user {
438 438 min-width: 0;
439 439 margin-right: .5em;
440 440 }
441 441
442 442 .stats {
443 443 clear: both;
444 444 margin: 0 0 @padding 0;
445 445 padding: 0;
446 446 .left {
447 447 float: left;
448 448 clear: left;
449 449 max-width: 75%;
450 450 margin: 0 0 @padding 0;
451 451
452 452 &.item {
453 453 margin-right: @padding;
454 454 &.last { border-right: none; }
455 455 }
456 456 }
457 457 .buttons { float: right; }
458 458 .author {
459 459 height: 25px; margin-left: 15px; font-weight: bold;
460 460 }
461 461 }
462 462
463 463 .commit {
464 464 margin: 5px 0 0 26px;
465 465 font-weight: normal;
466 466 white-space: pre-wrap;
467 467 }
468 468 }
469 469
470 470 .message {
471 471 position: relative;
472 472 margin: @padding;
473 473
474 474 .codeblock-label {
475 475 margin: 0 0 1em 0;
476 476 }
477 477 }
478 478
479 479 .code-body {
480 480 padding: @padding;
481 481 background-color: #ffffff;
482 482 min-width: 100%;
483 483 box-sizing: border-box;
484 484 // TODO: johbo: Parent has overflow: auto, this forces the child here
485 485 // to have the intended size and to scroll. Should be simplified.
486 486 width: 100%;
487 487 overflow-x: auto;
488 488
489 489 img.rendered-binary {
490 490 height: auto;
491 491 width: 100%;
492 492 }
493 493 }
494 494 }
495 495
496 496 .code-highlighttable,
497 497 div.codeblock {
498 498
499 499 &.readme {
500 500 background-color: white;
501 501 }
502 502
503 503 .markdown-block table {
504 504 border-collapse: collapse;
505 505
506 506 th,
507 507 td {
508 508 padding: .5em;
509 509 border: @border-thickness solid @border-default-color;
510 510 }
511 511 }
512 512
513 513 table {
514 514 border: 0px;
515 515 margin: 0;
516 516 letter-spacing: normal;
517 517
518 518
519 519 td {
520 520 border: 0px;
521 521 vertical-align: top;
522 522 }
523 523 }
524 524 }
525 525
526 526 div.codeblock .code-header .search-path { padding: 0 0 0 10px; }
527 527 div.search-code-body {
528 528 background-color: #ffffff; padding: 5px 0 5px 10px;
529 529 pre {
530 530 .match { background-color: #faffa6;}
531 531 .break { display: block; width: 100%; background-color: #DDE7EF; color: #747474; }
532 532 }
533 533 .code-highlighttable {
534 534 border-collapse: collapse;
535 535
536 536 tr:hover {
537 537 background: #fafafa;
538 538 }
539 539 td.code {
540 540 padding-left: 10px;
541 541 }
542 542 td.line {
543 543 border-right: 1px solid #ccc !important;
544 544 padding-right: 10px;
545 545 text-align: right;
546 546 font-family: "Lucida Console",Monaco,monospace;
547 547 span {
548 548 white-space: pre-wrap;
549 549 color: #666666;
550 550 }
551 551 }
552 552 }
553 553 }
554 554
555 555 div.annotatediv { margin-left: 2px; margin-right: 4px; }
556 556 .code-highlight {
557 557 margin: 0; padding: 0; border-left: @border-thickness solid @grey5;
558 558 pre, .linenodiv pre { padding: 0 5px; margin: 0; }
559 559 pre div:target {background-color: @comment-highlight-color !important;}
560 560 }
561 561
562 562 .linenos a { text-decoration: none; }
563 563
564 564 .CodeMirror-selected { background: @rchighlightblue; }
565 565 .CodeMirror-focused .CodeMirror-selected { background: @rchighlightblue; }
566 566 .CodeMirror ::selection { background: @rchighlightblue; }
567 567 .CodeMirror ::-moz-selection { background: @rchighlightblue; }
568 568
569 569 .code { display: block; border:0px !important; }
570 570 .code-highlight, /* TODO: dan: merge codehilite into code-highlight */
571 571 .codehilite {
572 572 .hll { background-color: #ffffcc }
573 573 .c { color: #408080; font-style: italic } /* Comment */
574 574 .err, .codehilite .err { border: none } /* Error */
575 575 .k { color: #008000; font-weight: bold } /* Keyword */
576 576 .o { color: #666666 } /* Operator */
577 577 .cm { color: #408080; font-style: italic } /* Comment.Multiline */
578 578 .cp { color: #BC7A00 } /* Comment.Preproc */
579 579 .c1 { color: #408080; font-style: italic } /* Comment.Single */
580 580 .cs { color: #408080; font-style: italic } /* Comment.Special */
581 581 .gd { color: #A00000 } /* Generic.Deleted */
582 582 .ge { font-style: italic } /* Generic.Emph */
583 583 .gr { color: #FF0000 } /* Generic.Error */
584 584 .gh { color: #000080; font-weight: bold } /* Generic.Heading */
585 585 .gi { color: #00A000 } /* Generic.Inserted */
586 586 .go { color: #808080 } /* Generic.Output */
587 587 .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
588 588 .gs { font-weight: bold } /* Generic.Strong */
589 589 .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
590 590 .gt { color: #0040D0 } /* Generic.Traceback */
591 591 .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
592 592 .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
593 593 .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
594 594 .kp { color: #008000 } /* Keyword.Pseudo */
595 595 .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
596 596 .kt { color: #B00040 } /* Keyword.Type */
597 597 .m { color: #666666 } /* Literal.Number */
598 598 .s { color: #BA2121 } /* Literal.String */
599 599 .na { color: #7D9029 } /* Name.Attribute */
600 600 .nb { color: #008000 } /* Name.Builtin */
601 601 .nc { color: #0000FF; font-weight: bold } /* Name.Class */
602 602 .no { color: #880000 } /* Name.Constant */
603 603 .nd { color: #AA22FF } /* Name.Decorator */
604 604 .ni { color: #999999; font-weight: bold } /* Name.Entity */
605 605 .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
606 606 .nf { color: #0000FF } /* Name.Function */
607 607 .nl { color: #A0A000 } /* Name.Label */
608 608 .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
609 609 .nt { color: #008000; font-weight: bold } /* Name.Tag */
610 610 .nv { color: #19177C } /* Name.Variable */
611 611 .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
612 612 .w { color: #bbbbbb } /* Text.Whitespace */
613 613 .mf { color: #666666 } /* Literal.Number.Float */
614 614 .mh { color: #666666 } /* Literal.Number.Hex */
615 615 .mi { color: #666666 } /* Literal.Number.Integer */
616 616 .mo { color: #666666 } /* Literal.Number.Oct */
617 617 .sb { color: #BA2121 } /* Literal.String.Backtick */
618 618 .sc { color: #BA2121 } /* Literal.String.Char */
619 619 .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
620 620 .s2 { color: #BA2121 } /* Literal.String.Double */
621 621 .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
622 622 .sh { color: #BA2121 } /* Literal.String.Heredoc */
623 623 .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
624 624 .sx { color: #008000 } /* Literal.String.Other */
625 625 .sr { color: #BB6688 } /* Literal.String.Regex */
626 626 .s1 { color: #BA2121 } /* Literal.String.Single */
627 627 .ss { color: #19177C } /* Literal.String.Symbol */
628 628 .bp { color: #008000 } /* Name.Builtin.Pseudo */
629 629 .vc { color: #19177C } /* Name.Variable.Class */
630 630 .vg { color: #19177C } /* Name.Variable.Global */
631 631 .vi { color: #19177C } /* Name.Variable.Instance */
632 632 .il { color: #666666 } /* Literal.Number.Integer.Long */
633 633 }
634 634
635 635 /* customized pre blocks for markdown/rst */
636 636 pre.literal-block, .codehilite pre{
637 637 padding: @padding;
638 638 border: 1px solid @grey6;
639 639 .border-radius(@border-radius);
640 640 background-color: @grey7;
641 641 }
642 642
643 643
644 644 /* START NEW CODE BLOCK CSS */
645 645
646 646 @cb-line-height: 18px;
647 647 @cb-line-code-padding: 10px;
648 648 @cb-text-padding: 5px;
649 649
650 650 @pill-padding: 2px 7px;
651 651 @pill-padding-small: 2px 2px 1px 2px;
652 652
653 653 input.filediff-collapse-state {
654 654 display: none;
655 655
656 656 &:checked + .filediff { /* file diff is collapsed */
657 657 .cb {
658 658 display: none
659 659 }
660 660 .filediff-collapse-indicator {
661 661 width: 0;
662 662 height: 0;
663 663 border-style: solid;
664 664 border-width: 4.5px 0 4.5px 9.3px;
665 665 border-color: transparent transparent transparent #aaa;
666 666 margin: 6px 0px;
667 667 }
668 668 .filediff-menu {
669 669 display: none;
670 670 }
671 671 margin: 10px 0 0 0;
672 672 }
673 673
674 674 &+ .filediff { /* file diff is expanded */
675 675 .filediff-collapse-indicator {
676 676 width: 0;
677 677 height: 0;
678 678 border-style: solid;
679 679 border-width: 9.3px 4.5px 0 4.5px;
680 680 border-color: #aaa transparent transparent transparent;
681 681 margin: 6px 0px;
682 682
683 683 }
684 684 .filediff-menu {
685 685 display: block;
686 686 }
687 687 margin: 10px 0;
688 688 &:nth-child(2) {
689 689 margin: 0;
690 690 }
691 691 }
692 692 }
693 693 .cs_files {
694 694 clear: both;
695 695 }
696 696
697 697 .diffset-menu {
698 698 margin-bottom: 20px;
699 699 }
700 700 .diffset {
701 701 margin: 20px auto;
702 702 .diffset-heading {
703 703 border: 1px solid @grey5;
704 704 margin-bottom: -1px;
705 705 // margin-top: 20px;
706 706 h2 {
707 707 margin: 0;
708 708 line-height: 38px;
709 709 padding-left: 10px;
710 710 }
711 711 .btn {
712 712 margin: 0;
713 713 }
714 714 background: @grey6;
715 715 display: block;
716 716 padding: 5px;
717 717 }
718 718 .diffset-heading-warning {
719 719 background: @alert3-inner;
720 720 border: 1px solid @alert3;
721 721 }
722 722 &.diffset-comments-disabled {
723 723 .cb-comment-box-opener, .comment-inline-form, .cb-comment-add-button {
724 724 display: none !important;
725 725 }
726 726 }
727 727 }
728 728
729 729 .filelist {
730 730 .pill {
731 731 display: block;
732 732 float: left;
733 733 padding: @pill-padding-small;
734 734 }
735 735 }
736 736
737 737 .pill {
738 738 display: block;
739 739 float: left;
740 740 padding: @pill-padding;
741 741 }
742 742
743 743 .pill-group {
744 744 .pill {
745 745 opacity: .8;
746 margin-right: 3px;
747
746 748 &:first-child {
747 749 border-radius: @border-radius 0 0 @border-radius;
748 margin-right: 3px;
749 750 }
750 751 &:last-child {
751 752 border-radius: 0 @border-radius @border-radius 0;
752 753 }
753 754 &:only-child {
754 755 border-radius: @border-radius;
755 756 margin-right: 0;
756 757 }
757 758 }
758 759 }
759 760
760 761 /* Main comments*/
761 762 #comments {
762 763 .comment-selected {
763 764 border-left: 6px solid @comment-highlight-color;
764 765 padding-left: 3px;
765 766 margin-left: -9px;
766 767 }
767 768 }
768 769
769 770 .filediff {
770 771 border: 1px solid @grey5;
771 772
772 773 /* START OVERRIDES */
773 774 .code-highlight {
774 775 border: none; // TODO: remove this border from the global
775 776 // .code-highlight, it doesn't belong there
776 777 }
777 778 label {
778 779 margin: 0; // TODO: remove this margin definition from global label
779 780 // it doesn't belong there - if margin on labels
780 781 // are needed for a form they should be defined
781 782 // in the form's class
782 783 }
783 784 /* END OVERRIDES */
784 785
785 786 * {
786 787 box-sizing: border-box;
787 788 }
788 789 .filediff-anchor {
789 790 visibility: hidden;
790 791 }
791 792 &:hover {
792 793 .filediff-anchor {
793 794 visibility: visible;
794 795 }
795 796 }
796 797
797 798 .filediff-collapse-indicator {
798 799 border-style: solid;
799 800 float: left;
800 801 margin: 4px 0px 0 0;
801 802 cursor: pointer;
802 803 }
803 804
804 805 .filediff-heading {
805 806 background: @grey7;
806 807 cursor: pointer;
807 808 display: block;
808 809 padding: 5px 10px;
809 810 }
810 811 .filediff-heading:after {
811 812 content: "";
812 813 display: table;
813 814 clear: both;
814 815 }
815 816 .filediff-heading:hover {
816 817 background: #e1e9f4 !important;
817 818 }
818 819
819 820 .filediff-menu {
820 821 float: right;
821 822 text-align: right;
822 823 padding: 5px 5px 5px 0px;
823 824
824 825 &> a,
825 826 &> span {
826 827 padding: 1px;
827 828 }
828 829 }
829 830
830 831 .filediff-collapse-button, .filediff-expand-button {
831 832 cursor: pointer;
832 833 }
833 834 .filediff-collapse-button {
834 835 display: inline;
835 836 }
836 837 .filediff-expand-button {
837 838 display: none;
838 839 }
839 840 .filediff-collapsed .filediff-collapse-button {
840 841 display: none;
841 842 }
842 843 .filediff-collapsed .filediff-expand-button {
843 844 display: inline;
844 845 }
845 846
846 847 /**** COMMENTS ****/
847 848
848 849 .filediff-menu {
849 850 .show-comment-button {
850 851 display: none;
851 852 }
852 853 }
853 854 &.hide-comments {
854 855 .inline-comments {
855 856 display: none;
856 857 }
857 858 .filediff-menu {
858 859 .show-comment-button {
859 860 display: inline;
860 861 }
861 862 .hide-comment-button {
862 863 display: none;
863 864 }
864 865 }
865 866 }
866 867
867 868 .hide-line-comments {
868 869 .inline-comments {
869 870 display: none;
870 871 }
871 872 }
872 873
873 874 /**** END COMMENTS ****/
874 875
875 876 }
876 877
877 878
878 879
879 880 .filediff, .filelist {
880 881 .pill {
881 882 &[op="name"] {
882 883 background: none;
883 884 opacity: 1;
884 885 color: white;
885 886 }
886 887 &[op="limited"] {
887 888 background: @grey2;
888 889 color: white;
889 890 }
890 891 &[op="binary"] {
891 892 background: @color7;
892 893 color: white;
893 894 }
894 895 &[op="modified"] {
895 896 background: @alert1;
896 897 color: white;
897 898 }
898 899 &[op="renamed"] {
899 900 background: @color4;
900 901 color: white;
901 902 }
902 903 &[op="copied"] {
903 904 background: @color4;
904 905 color: white;
905 906 }
906 907 &[op="mode"] {
907 908 background: @grey3;
908 909 color: white;
909 910 }
910 911 &[op="symlink"] {
911 912 background: @color8;
912 913 color: white;
913 914 }
914 915
915 916 &[op="added"] { /* added lines */
916 917 background: @alert1;
917 918 color: white;
918 919 }
919 920 &[op="deleted"] { /* deleted lines */
920 921 background: @alert2;
921 922 color: white;
922 923 }
923 924
924 925 &[op="created"] { /* created file */
925 926 background: @alert1;
926 927 color: white;
927 928 }
928 929 &[op="removed"] { /* deleted file */
929 930 background: @color5;
930 931 color: white;
931 932 }
932 933 }
933 934 }
934 935
935 936
936 937 .filediff-outdated {
937 938 padding: 8px 0;
938 939
939 940 .filediff-heading {
940 941 opacity: .5;
941 942 }
942 943 }
943 944
944 945 table.cb {
945 946 width: 100%;
946 947 border-collapse: collapse;
947 948
948 949 .cb-text {
949 950 padding: @cb-text-padding;
950 951 }
951 952 .cb-hunk {
952 953 padding: @cb-text-padding;
953 954 }
954 955 .cb-expand {
955 956 display: none;
956 957 }
957 958 .cb-collapse {
958 959 display: inline;
959 960 }
960 961 &.cb-collapsed {
961 962 .cb-line {
962 963 display: none;
963 964 }
964 965 .cb-expand {
965 966 display: inline;
966 967 }
967 968 .cb-collapse {
968 969 display: none;
969 970 }
970 971 }
971 972
972 973 /* intentionally general selector since .cb-line-selected must override it
973 974 and they both use !important since the td itself may have a random color
974 975 generated by annotation blocks. TLDR: if you change it, make sure
975 976 annotated block selection and line selection in file view still work */
976 977 .cb-line-fresh .cb-content {
977 978 background: white !important;
978 979 }
979 980 .cb-warning {
980 981 background: #fff4dd;
981 982 }
982 983
983 984 &.cb-diff-sideside {
984 985 td {
985 986 &.cb-content {
986 987 width: 50%;
987 988 }
988 989 }
989 990 }
990 991
991 992 tr {
992 993 &.cb-annotate {
993 994 border-top: 1px solid #eee;
994 995 }
995 996
996 997 &.cb-comment-info {
997 998 border-top: 1px solid #eee;
998 999 color: rgba(0, 0, 0, 0.3);
999 1000 background: #edf2f9;
1000 1001
1001 1002 td {
1002 1003
1003 1004 }
1004 1005 }
1005 1006
1006 1007 &.cb-hunk {
1007 1008 font-family: @font-family-monospace;
1008 1009 color: rgba(0, 0, 0, 0.3);
1009 1010
1010 1011 td {
1011 1012 &:first-child {
1012 1013 background: #edf2f9;
1013 1014 }
1014 1015 &:last-child {
1015 1016 background: #f4f7fb;
1016 1017 }
1017 1018 }
1018 1019 }
1019 1020 }
1020 1021
1021 1022
1022 1023 td {
1023 1024 vertical-align: top;
1024 1025 padding: 0;
1025 1026
1026 1027 &.cb-content {
1027 1028 font-size: 12.35px;
1028 1029
1029 1030 &.cb-line-selected .cb-code {
1030 1031 background: @comment-highlight-color !important;
1031 1032 }
1032 1033
1033 1034 span.cb-code {
1034 1035 line-height: @cb-line-height;
1035 1036 padding-left: @cb-line-code-padding;
1036 1037 padding-right: @cb-line-code-padding;
1037 1038 display: block;
1038 1039 white-space: pre-wrap;
1039 1040 font-family: @font-family-monospace;
1040 1041 word-break: break-all;
1041 1042 .nonl {
1042 1043 color: @color5;
1043 1044 }
1044 1045 }
1045 1046
1046 1047 &> button.cb-comment-box-opener {
1047 1048
1048 1049 padding: 2px 2px 1px 3px;
1049 1050 margin-left: -6px;
1050 1051 margin-top: -1px;
1051 1052
1052 1053 border-radius: @border-radius;
1053 1054 position: absolute;
1054 1055 display: none;
1055 1056 }
1056 1057 .cb-comment {
1057 1058 margin-top: 10px;
1058 1059 white-space: normal;
1059 1060 }
1060 1061 }
1061 1062 &:hover {
1062 1063 button.cb-comment-box-opener {
1063 1064 display: block;
1064 1065 }
1065 1066 &+ td button.cb-comment-box-opener {
1066 1067 display: block
1067 1068 }
1068 1069 }
1069 1070
1070 1071 &.cb-data {
1071 1072 text-align: right;
1072 1073 width: 30px;
1073 1074 font-family: @font-family-monospace;
1074 1075
1075 1076 .icon-comment {
1076 1077 cursor: pointer;
1077 1078 }
1078 1079 &.cb-line-selected > div {
1079 1080 display: block;
1080 1081 background: @comment-highlight-color !important;
1081 1082 line-height: @cb-line-height;
1082 1083 color: rgba(0, 0, 0, 0.3);
1083 1084 }
1084 1085 }
1085 1086
1086 1087 &.cb-lineno {
1087 1088 padding: 0;
1088 1089 width: 50px;
1089 1090 color: rgba(0, 0, 0, 0.3);
1090 1091 text-align: right;
1091 1092 border-right: 1px solid #eee;
1092 1093 font-family: @font-family-monospace;
1093 1094 user-select: none;
1094 1095
1095 1096 a::before {
1096 1097 content: attr(data-line-no);
1097 1098 }
1098 1099 &.cb-line-selected a {
1099 1100 background: @comment-highlight-color !important;
1100 1101 }
1101 1102
1102 1103 a {
1103 1104 display: block;
1104 1105 padding-right: @cb-line-code-padding;
1105 1106 padding-left: @cb-line-code-padding;
1106 1107 line-height: @cb-line-height;
1107 1108 color: rgba(0, 0, 0, 0.3);
1108 1109 }
1109 1110 }
1110 1111
1111 1112 &.cb-empty {
1112 1113 background: @grey7;
1113 1114 }
1114 1115
1115 1116 ins {
1116 1117 color: black;
1117 1118 background: #a6f3a6;
1118 1119 text-decoration: none;
1119 1120 }
1120 1121 del {
1121 1122 color: black;
1122 1123 background: #f8cbcb;
1123 1124 text-decoration: none;
1124 1125 }
1125 1126 &.cb-addition {
1126 1127 background: #ecffec;
1127 1128
1128 1129 &.blob-lineno {
1129 1130 background: #ddffdd;
1130 1131 }
1131 1132 }
1132 1133 &.cb-deletion {
1133 1134 background: #ffecec;
1134 1135
1135 1136 &.blob-lineno {
1136 1137 background: #ffdddd;
1137 1138 }
1138 1139 }
1139 1140 &.cb-annotate-message-spacer {
1140 1141 width:8px;
1141 1142 padding: 1px 0px 0px 3px;
1142 1143 }
1143 1144 &.cb-annotate-info {
1144 1145 width: 320px;
1145 1146 min-width: 320px;
1146 1147 max-width: 320px;
1147 1148 padding: 5px 2px;
1148 1149 font-size: 13px;
1149 1150
1150 1151 .cb-annotate-message {
1151 1152 padding: 2px 0px 0px 0px;
1152 1153 white-space: pre-line;
1153 1154 overflow: hidden;
1154 1155 }
1155 1156 .rc-user {
1156 1157 float: none;
1157 1158 padding: 0 6px 0 17px;
1158 1159 min-width: unset;
1159 1160 min-height: unset;
1160 1161 }
1161 1162 }
1162 1163
1163 1164 &.cb-annotate-revision {
1164 1165 cursor: pointer;
1165 1166 text-align: right;
1166 1167 padding: 1px 3px 0px 3px;
1167 1168 }
1168 1169 }
1169 1170 }
@@ -1,870 +1,869 b''
1 1 <%namespace name="commentblock" file="/changeset/changeset_file_comment.mako"/>
2 2
3 3 <%def name="diff_line_anchor(filename, line, type)"><%
4 4 return '%s_%s_%i' % (h.safeid(filename), type, line)
5 5 %></%def>
6 6
7 7 <%def name="action_class(action)">
8 8 <%
9 9 return {
10 10 '-': 'cb-deletion',
11 11 '+': 'cb-addition',
12 12 ' ': 'cb-context',
13 13 }.get(action, 'cb-empty')
14 14 %>
15 15 </%def>
16 16
17 17 <%def name="op_class(op_id)">
18 18 <%
19 19 return {
20 20 DEL_FILENODE: 'deletion', # file deleted
21 21 BIN_FILENODE: 'warning' # binary diff hidden
22 22 }.get(op_id, 'addition')
23 23 %>
24 24 </%def>
25 25
26 26
27 27
28 28 <%def name="render_diffset(diffset, commit=None,
29 29
30 30 # collapse all file diff entries when there are more than this amount of files in the diff
31 31 collapse_when_files_over=20,
32 32
33 33 # collapse lines in the diff when more than this amount of lines changed in the file diff
34 34 lines_changed_limit=500,
35 35
36 36 # add a ruler at to the output
37 37 ruler_at_chars=0,
38 38
39 39 # show inline comments
40 40 use_comments=False,
41 41
42 42 # disable new comments
43 43 disable_new_comments=False,
44 44
45 45 # special file-comments that were deleted in previous versions
46 46 # it's used for showing outdated comments for deleted files in a PR
47 47 deleted_files_comments=None,
48 48
49 49 # for cache purpose
50 50 inline_comments=None
51 51
52 52 )">
53 53 %if use_comments:
54 54 <div id="cb-comments-inline-container-template" class="js-template">
55 55 ${inline_comments_container([], inline_comments)}
56 56 </div>
57 57 <div class="js-template" id="cb-comment-inline-form-template">
58 58 <div class="comment-inline-form ac">
59 59
60 60 %if c.rhodecode_user.username != h.DEFAULT_USER:
61 61 ## render template for inline comments
62 62 ${commentblock.comment_form(form_type='inline')}
63 63 %else:
64 64 ${h.form('', class_='inline-form comment-form-login', method='get')}
65 65 <div class="pull-left">
66 66 <div class="comment-help pull-right">
67 67 ${_('You need to be logged in to leave comments.')} <a href="${h.route_path('login', _query={'came_from': h.current_route_path(request)})}">${_('Login now')}</a>
68 68 </div>
69 69 </div>
70 70 <div class="comment-button pull-right">
71 71 <button type="button" class="cb-comment-cancel" onclick="return Rhodecode.comments.cancelComment(this);">
72 72 ${_('Cancel')}
73 73 </button>
74 74 </div>
75 75 <div class="clearfix"></div>
76 76 ${h.end_form()}
77 77 %endif
78 78 </div>
79 79 </div>
80 80
81 81 %endif
82 82 <%
83 83 collapse_all = len(diffset.files) > collapse_when_files_over
84 84 %>
85 85
86 86 %if c.user_session_attrs["diffmode"] == 'sideside':
87 87 <style>
88 88 .wrapper {
89 89 max-width: 1600px !important;
90 90 }
91 91 </style>
92 92 %endif
93 93
94 94 %if ruler_at_chars:
95 95 <style>
96 96 .diff table.cb .cb-content:after {
97 97 content: "";
98 98 border-left: 1px solid blue;
99 99 position: absolute;
100 100 top: 0;
101 101 height: 18px;
102 102 opacity: .2;
103 103 z-index: 10;
104 104 //## +5 to account for diff action (+/-)
105 105 left: ${ruler_at_chars + 5}ch;
106 106 </style>
107 107 %endif
108 108
109 109 <div class="diffset ${disable_new_comments and 'diffset-comments-disabled'}">
110 110 <div class="diffset-heading ${diffset.limited_diff and 'diffset-heading-warning' or ''}">
111 111 %if commit:
112 112 <div class="pull-right">
113 113 <a class="btn tooltip" title="${h.tooltip(_('Browse Files at revision {}').format(commit.raw_id))}" href="${h.route_path('repo_files',repo_name=diffset.repo_name, commit_id=commit.raw_id, f_path='')}">
114 114 ${_('Browse Files')}
115 115 </a>
116 116 </div>
117 117 %endif
118 118 <h2 class="clearinner">
119 119 ## invidual commit
120 120 % if commit:
121 121 <a class="tooltip revision" title="${h.tooltip(commit.message)}" href="${h.route_path('repo_commit',repo_name=c.repo_name,commit_id=commit.raw_id)}">${('r%s:%s' % (commit.idx,h.short_id(commit.raw_id)))}</a> -
122 122 ${h.age_component(commit.date)}
123 123 % if diffset.limited_diff:
124 124 - ${_('The requested commit is too big and content was truncated.')}
125 125 ${_ungettext('%(num)s file changed.', '%(num)s files changed.', diffset.changed_files) % {'num': diffset.changed_files}}
126 126 <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
127 127 % elif hasattr(c, 'commit_ranges') and len(c.commit_ranges) > 1:
128 128 ## compare diff, has no file-selector and we want to show stats anyway
129 129 ${_ungettext('{num} file changed: {linesadd} inserted, ''{linesdel} deleted',
130 130 '{num} files changed: {linesadd} inserted, {linesdel} deleted', diffset.changed_files) \
131 131 .format(num=diffset.changed_files, linesadd=diffset.lines_added, linesdel=diffset.lines_deleted)}
132 132 % endif
133 133 % else:
134 134 ## pull requests/compare
135 135 ${_('File Changes')}
136 136 % endif
137 137
138 138 </h2>
139 139 </div>
140 140
141 141 %if diffset.has_hidden_changes:
142 142 <p class="empty_data">${_('Some changes may be hidden')}</p>
143 143 %elif not diffset.files:
144 144 <p class="empty_data">${_('No files')}</p>
145 145 %endif
146 146
147 147 <div class="filediffs">
148 148 ## initial value could be marked as False later on
149 149 <% over_lines_changed_limit = False %>
150 150 %for i, filediff in enumerate(diffset.files):
151 151
152 152 <%
153 153 lines_changed = filediff.patch['stats']['added'] + filediff.patch['stats']['deleted']
154 154 over_lines_changed_limit = lines_changed > lines_changed_limit
155 155 %>
156 156
157 157 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filediff)}" type="checkbox">
158 158 <div
159 159 class="filediff"
160 160 data-f-path="${filediff.patch['filename']}"
161 161 id="a_${h.FID('', filediff.patch['filename'])}"
162 162 >
163 163
164 164 <label for="filediff-collapse-${id(filediff)}" class="filediff-heading">
165 165 <div class="filediff-collapse-indicator"></div>
166 166 ${diff_ops(filediff)}
167 167 </label>
168 168 ${diff_menu(filediff, use_comments=use_comments)}
169 169 <table class="cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${(over_lines_changed_limit and 'cb-collapsed' or '')}">
170 170
171 171 ## new/deleted/empty content case
172 172 % if not filediff.hunks:
173 173 ## Comment container, on "fakes" hunk that contains all data to render comments
174 174 ${render_hunk_lines(c.user_session_attrs["diffmode"], filediff.hunk_ops, use_comments=use_comments, inline_comments=inline_comments)}
175 175 % endif
176 176
177 177 %if filediff.limited_diff:
178 178 <tr class="cb-warning cb-collapser">
179 179 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
180 180 ${_('The requested commit is too big and content was truncated.')} <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
181 181 </td>
182 182 </tr>
183 183 %else:
184 184 %if over_lines_changed_limit:
185 185 <tr class="cb-warning cb-collapser">
186 186 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
187 187 ${_('This diff has been collapsed as it changes many lines, (%i lines changed)' % lines_changed)}
188 188 <a href="#" class="cb-expand"
189 189 onclick="$(this).closest('table').removeClass('cb-collapsed'); return false;">${_('Show them')}
190 190 </a>
191 191 <a href="#" class="cb-collapse"
192 192 onclick="$(this).closest('table').addClass('cb-collapsed'); return false;">${_('Hide them')}
193 193 </a>
194 194 </td>
195 195 </tr>
196 196 %endif
197 197 %endif
198 198
199 199 % for hunk in filediff.hunks:
200 200 <tr class="cb-hunk">
201 201 <td ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=3' or '')}>
202 202 ## TODO: dan: add ajax loading of more context here
203 203 ## <a href="#">
204 204 <i class="icon-more"></i>
205 205 ## </a>
206 206 </td>
207 207 <td ${(c.user_session_attrs["diffmode"] == 'sideside' and 'colspan=5' or '')}>
208 208 @@
209 209 -${hunk.source_start},${hunk.source_length}
210 210 +${hunk.target_start},${hunk.target_length}
211 211 ${hunk.section_header}
212 212 </td>
213 213 </tr>
214 214 ${render_hunk_lines(c.user_session_attrs["diffmode"], hunk, use_comments=use_comments, inline_comments=inline_comments)}
215 215 % endfor
216 216
217 217 <% unmatched_comments = (inline_comments or {}).get(filediff.patch['filename'], {}) %>
218 218
219 219 ## outdated comments that do not fit into currently displayed lines
220 220 % for lineno, comments in unmatched_comments.items():
221 221
222 222 %if c.user_session_attrs["diffmode"] == 'unified':
223 223 % if loop.index == 0:
224 224 <tr class="cb-hunk">
225 225 <td colspan="3"></td>
226 226 <td>
227 227 <div>
228 228 ${_('Unmatched inline comments below')}
229 229 </div>
230 230 </td>
231 231 </tr>
232 232 % endif
233 233 <tr class="cb-line">
234 234 <td class="cb-data cb-context"></td>
235 235 <td class="cb-lineno cb-context"></td>
236 236 <td class="cb-lineno cb-context"></td>
237 237 <td class="cb-content cb-context">
238 238 ${inline_comments_container(comments, inline_comments)}
239 239 </td>
240 240 </tr>
241 241 %elif c.user_session_attrs["diffmode"] == 'sideside':
242 242 % if loop.index == 0:
243 243 <tr class="cb-comment-info">
244 244 <td colspan="2"></td>
245 245 <td class="cb-line">
246 246 <div>
247 247 ${_('Unmatched inline comments below')}
248 248 </div>
249 249 </td>
250 250 <td colspan="2"></td>
251 251 <td class="cb-line">
252 252 <div>
253 253 ${_('Unmatched comments below')}
254 254 </div>
255 255 </td>
256 256 </tr>
257 257 % endif
258 258 <tr class="cb-line">
259 259 <td class="cb-data cb-context"></td>
260 260 <td class="cb-lineno cb-context"></td>
261 261 <td class="cb-content cb-context">
262 262 % if lineno.startswith('o'):
263 263 ${inline_comments_container(comments, inline_comments)}
264 264 % endif
265 265 </td>
266 266
267 267 <td class="cb-data cb-context"></td>
268 268 <td class="cb-lineno cb-context"></td>
269 269 <td class="cb-content cb-context">
270 270 % if lineno.startswith('n'):
271 271 ${inline_comments_container(comments, inline_comments)}
272 272 % endif
273 273 </td>
274 274 </tr>
275 275 %endif
276 276
277 277 % endfor
278 278
279 279 </table>
280 280 </div>
281 281 %endfor
282 282
283 283 ## outdated comments that are made for a file that has been deleted
284 284 % for filename, comments_dict in (deleted_files_comments or {}).items():
285 285 <%
286 286 display_state = 'display: none'
287 287 open_comments_in_file = [x for x in comments_dict['comments'] if x.outdated is False]
288 288 if open_comments_in_file:
289 289 display_state = ''
290 290 %>
291 291 <div class="filediffs filediff-outdated" style="${display_state}">
292 292 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filename)}" type="checkbox">
293 293 <div class="filediff" data-f-path="${filename}" id="a_${h.FID('', filename)}">
294 294 <label for="filediff-collapse-${id(filename)}" class="filediff-heading">
295 295 <div class="filediff-collapse-indicator"></div>
296 296 <span class="pill">
297 297 ## file was deleted
298 298 <strong>${filename}</strong>
299 299 </span>
300 300 <span class="pill-group" style="float: left">
301 301 ## file op, doesn't need translation
302 302 <span class="pill" op="removed">removed in this version</span>
303 303 </span>
304 304 <a class="pill filediff-anchor" href="#a_${h.FID('', filename)}">ΒΆ</a>
305 305 <span class="pill-group" style="float: right">
306 306 <span class="pill" op="deleted">-${comments_dict['stats']}</span>
307 307 </span>
308 308 </label>
309 309
310 310 <table class="cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${over_lines_changed_limit and 'cb-collapsed' or ''}">
311 311 <tr>
312 312 % if c.user_session_attrs["diffmode"] == 'unified':
313 313 <td></td>
314 314 %endif
315 315
316 316 <td></td>
317 317 <td class="cb-text cb-${op_class(BIN_FILENODE)}" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=5')}>
318 318 ${_('File was deleted in this version. There are still outdated/unresolved comments attached to it.')}
319 319 </td>
320 320 </tr>
321 321 %if c.user_session_attrs["diffmode"] == 'unified':
322 322 <tr class="cb-line">
323 323 <td class="cb-data cb-context"></td>
324 324 <td class="cb-lineno cb-context"></td>
325 325 <td class="cb-lineno cb-context"></td>
326 326 <td class="cb-content cb-context">
327 327 ${inline_comments_container(comments_dict['comments'], inline_comments)}
328 328 </td>
329 329 </tr>
330 330 %elif c.user_session_attrs["diffmode"] == 'sideside':
331 331 <tr class="cb-line">
332 332 <td class="cb-data cb-context"></td>
333 333 <td class="cb-lineno cb-context"></td>
334 334 <td class="cb-content cb-context"></td>
335 335
336 336 <td class="cb-data cb-context"></td>
337 337 <td class="cb-lineno cb-context"></td>
338 338 <td class="cb-content cb-context">
339 339 ${inline_comments_container(comments_dict['comments'], inline_comments)}
340 340 </td>
341 341 </tr>
342 342 %endif
343 343 </table>
344 344 </div>
345 345 </div>
346 346 % endfor
347 347
348 348 </div>
349 349 </div>
350 350 </%def>
351 351
352 352 <%def name="diff_ops(filediff)">
353 353 <%
354 354 from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
355 355 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE, COPIED_FILENODE
356 356 %>
357 357 <span class="pill">
358 358 %if filediff.source_file_path and filediff.target_file_path:
359 359 %if filediff.source_file_path != filediff.target_file_path:
360 360 ## file was renamed, or copied
361 361 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
362 362 <strong>${filediff.target_file_path}</strong> β¬… <del>${filediff.source_file_path}</del>
363 363 <% final_path = filediff.target_file_path %>
364 364 %elif COPIED_FILENODE in filediff.patch['stats']['ops']:
365 365 <strong>${filediff.target_file_path}</strong> β¬… ${filediff.source_file_path}
366 366 <% final_path = filediff.target_file_path %>
367 367 %endif
368 368 %else:
369 369 ## file was modified
370 370 <strong>${filediff.source_file_path}</strong>
371 371 <% final_path = filediff.source_file_path %>
372 372 %endif
373 373 %else:
374 374 %if filediff.source_file_path:
375 375 ## file was deleted
376 376 <strong>${filediff.source_file_path}</strong>
377 377 <% final_path = filediff.source_file_path %>
378 378 %else:
379 379 ## file was added
380 380 <strong>${filediff.target_file_path}</strong>
381 381 <% final_path = filediff.target_file_path %>
382 382 %endif
383 383 %endif
384 384 <i style="color: #aaa" class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${final_path}" title="${_('Copy the full path')}" onclick="return false;"></i>
385 385 </span>
386 <span class="pill-group" style="float: left">
386 ## anchor link
387 <a class="pill filediff-anchor" href="#a_${h.FID('', filediff.patch['filename'])}">ΒΆ</a>
388
389 <span class="pill-group" style="float: right">
390
391 ## ops pills
387 392 %if filediff.limited_diff:
388 393 <span class="pill tooltip" op="limited" title="The stats for this diff are not complete">limited diff</span>
389 394 %endif
390 395
391 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
392 <span class="pill" op="renamed">renamed</span>
393 %endif
394
395 %if COPIED_FILENODE in filediff.patch['stats']['ops']:
396 <span class="pill" op="copied">copied</span>
397 %endif
398
399 396 %if NEW_FILENODE in filediff.patch['stats']['ops']:
400 397 <span class="pill" op="created">created</span>
401 398 %if filediff['target_mode'].startswith('120'):
402 399 <span class="pill" op="symlink">symlink</span>
403 400 %else:
404 401 <span class="pill" op="mode">${nice_mode(filediff['target_mode'])}</span>
405 402 %endif
406 403 %endif
407 404
405 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
406 <span class="pill" op="renamed">renamed</span>
407 %endif
408
409 %if COPIED_FILENODE in filediff.patch['stats']['ops']:
410 <span class="pill" op="copied">copied</span>
411 %endif
412
408 413 %if DEL_FILENODE in filediff.patch['stats']['ops']:
409 414 <span class="pill" op="removed">removed</span>
410 415 %endif
411 416
412 417 %if CHMOD_FILENODE in filediff.patch['stats']['ops']:
413 418 <span class="pill" op="mode">
414 419 ${nice_mode(filediff['source_mode'])} ➑ ${nice_mode(filediff['target_mode'])}
415 420 </span>
416 421 %endif
417 </span>
418 422
419 <a class="pill filediff-anchor" href="#a_${h.FID('', filediff.patch['filename'])}">ΒΆ</a>
420
421 <span class="pill-group" style="float: right">
422 423 %if BIN_FILENODE in filediff.patch['stats']['ops']:
423 424 <span class="pill" op="binary">binary</span>
424 425 %if MOD_FILENODE in filediff.patch['stats']['ops']:
425 <span class="pill" op="modified">modified</span>
426 <span class="pill" op="modified">modified</span>
426 427 %endif
427 428 %endif
428 %if filediff.patch['stats']['added']:
429 <span class="pill" op="added">+${filediff.patch['stats']['added']}</span>
430 %endif
431 %if filediff.patch['stats']['deleted']:
432 <span class="pill" op="deleted">-${filediff.patch['stats']['deleted']}</span>
433 %endif
429
430 <span class="pill" op="added">${('+' if filediff.patch['stats']['added'] else '')}${filediff.patch['stats']['added']}</span>
431 <span class="pill" op="deleted">${((h.safe_int(filediff.patch['stats']['deleted']) or 0) * -1)}</span>
432
434 433 </span>
435 434
436 435 </%def>
437 436
438 437 <%def name="nice_mode(filemode)">
439 438 ${(filemode.startswith('100') and filemode[3:] or filemode)}
440 439 </%def>
441 440
442 441 <%def name="diff_menu(filediff, use_comments=False)">
443 442 <div class="filediff-menu">
444 443 %if filediff.diffset.source_ref:
445 444 %if filediff.operation in ['D', 'M']:
446 445 <a
447 446 class="tooltip"
448 447 href="${h.route_path('repo_files',repo_name=filediff.diffset.repo_name,commit_id=filediff.diffset.source_ref,f_path=filediff.source_file_path)}"
449 448 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
450 449 >
451 450 ${_('Show file before')}
452 451 </a> |
453 452 %else:
454 453 <span
455 454 class="tooltip"
456 455 title="${h.tooltip(_('File no longer present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
457 456 >
458 457 ${_('Show file before')}
459 458 </span> |
460 459 %endif
461 460 %if filediff.operation in ['A', 'M']:
462 461 <a
463 462 class="tooltip"
464 463 href="${h.route_path('repo_files',repo_name=filediff.diffset.source_repo_name,commit_id=filediff.diffset.target_ref,f_path=filediff.target_file_path)}"
465 464 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
466 465 >
467 466 ${_('Show file after')}
468 467 </a> |
469 468 %else:
470 469 <span
471 470 class="tooltip"
472 471 title="${h.tooltip(_('File no longer present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
473 472 >
474 473 ${_('Show file after')}
475 474 </span> |
476 475 %endif
477 476 <a
478 477 class="tooltip"
479 478 title="${h.tooltip(_('Raw diff'))}"
480 479 href="${h.route_path('repo_files_diff',repo_name=filediff.diffset.repo_name,f_path=filediff.target_file_path, _query=dict(diff2=filediff.diffset.target_ref,diff1=filediff.diffset.source_ref,diff='raw'))}"
481 480 >
482 481 ${_('Raw diff')}
483 482 </a> |
484 483 <a
485 484 class="tooltip"
486 485 title="${h.tooltip(_('Download diff'))}"
487 486 href="${h.route_path('repo_files_diff',repo_name=filediff.diffset.repo_name,f_path=filediff.target_file_path, _query=dict(diff2=filediff.diffset.target_ref,diff1=filediff.diffset.source_ref,diff='download'))}"
488 487 >
489 488 ${_('Download diff')}
490 489 </a>
491 490 % if use_comments:
492 491 |
493 492 % endif
494 493
495 494 ## TODO: dan: refactor ignorews_url and context_url into the diff renderer same as diffmode=unified/sideside. Also use ajax to load more context (by clicking hunks)
496 495 %if hasattr(c, 'ignorews_url'):
497 496 ${c.ignorews_url(request, h.FID('', filediff.patch['filename']))}
498 497 %endif
499 498 %if hasattr(c, 'context_url'):
500 499 ${c.context_url(request, h.FID('', filediff.patch['filename']))}
501 500 %endif
502 501
503 502 %if use_comments:
504 503 <a href="#" onclick="return Rhodecode.comments.toggleComments(this);">
505 504 <span class="show-comment-button">${_('Show comments')}</span><span class="hide-comment-button">${_('Hide comments')}</span>
506 505 </a>
507 506 %endif
508 507 %endif
509 508 </div>
510 509 </%def>
511 510
512 511
513 512 <%def name="inline_comments_container(comments, inline_comments)">
514 513 <div class="inline-comments">
515 514 %for comment in comments:
516 515 ${commentblock.comment_block(comment, inline=True)}
517 516 %endfor
518 517 % if comments and comments[-1].outdated:
519 518 <span class="btn btn-secondary cb-comment-add-button comment-outdated}"
520 519 style="display: none;}">
521 520 ${_('Add another comment')}
522 521 </span>
523 522 % else:
524 523 <span onclick="return Rhodecode.comments.createComment(this)"
525 524 class="btn btn-secondary cb-comment-add-button">
526 525 ${_('Add another comment')}
527 526 </span>
528 527 % endif
529 528
530 529 </div>
531 530 </%def>
532 531
533 532 <%!
534 533 def get_comments_for(diff_type, comments, filename, line_version, line_number):
535 534 if hasattr(filename, 'unicode_path'):
536 535 filename = filename.unicode_path
537 536
538 537 if not isinstance(filename, basestring):
539 538 return None
540 539
541 540 line_key = '{}{}'.format(line_version, line_number) ## e.g o37, n12
542 541
543 542 if comments and filename in comments:
544 543 file_comments = comments[filename]
545 544 if line_key in file_comments:
546 545 data = file_comments.pop(line_key)
547 546 return data
548 547 %>
549 548
550 549 <%def name="render_hunk_lines_sideside(hunk, use_comments=False, inline_comments=None)">
551 550
552 551 %for i, line in enumerate(hunk.sideside):
553 552 <%
554 553 old_line_anchor, new_line_anchor = None, None
555 554 if line.original.lineno:
556 555 old_line_anchor = diff_line_anchor(hunk.source_file_path, line.original.lineno, 'o')
557 556 if line.modified.lineno:
558 557 new_line_anchor = diff_line_anchor(hunk.target_file_path, line.modified.lineno, 'n')
559 558 %>
560 559
561 560 <tr class="cb-line">
562 561 <td class="cb-data ${action_class(line.original.action)}"
563 562 data-line-no="${line.original.lineno}"
564 563 >
565 564 <div>
566 565
567 566 <% line_old_comments = None %>
568 567 %if line.original.get_comment_args:
569 568 <% line_old_comments = get_comments_for('side-by-side', inline_comments, *line.original.get_comment_args) %>
570 569 %endif
571 570 %if line_old_comments:
572 571 <% has_outdated = any([x.outdated for x in line_old_comments]) %>
573 572 % if has_outdated:
574 573 <i title="${_('comments including outdated')}:${len(line_old_comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
575 574 % else:
576 575 <i title="${_('comments')}: ${len(line_old_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
577 576 % endif
578 577 %endif
579 578 </div>
580 579 </td>
581 580 <td class="cb-lineno ${action_class(line.original.action)}"
582 581 data-line-no="${line.original.lineno}"
583 582 %if old_line_anchor:
584 583 id="${old_line_anchor}"
585 584 %endif
586 585 >
587 586 %if line.original.lineno:
588 587 <a name="${old_line_anchor}" href="#${old_line_anchor}">${line.original.lineno}</a>
589 588 %endif
590 589 </td>
591 590 <td class="cb-content ${action_class(line.original.action)}"
592 591 data-line-no="o${line.original.lineno}"
593 592 >
594 593 %if use_comments and line.original.lineno:
595 594 ${render_add_comment_button()}
596 595 %endif
597 596 <span class="cb-code">${line.original.action} ${line.original.content or '' | n}</span>
598 597
599 598 %if use_comments and line.original.lineno and line_old_comments:
600 599 ${inline_comments_container(line_old_comments, inline_comments)}
601 600 %endif
602 601
603 602 </td>
604 603 <td class="cb-data ${action_class(line.modified.action)}"
605 604 data-line-no="${line.modified.lineno}"
606 605 >
607 606 <div>
608 607
609 608 %if line.modified.get_comment_args:
610 609 <% line_new_comments = get_comments_for('side-by-side', inline_comments, *line.modified.get_comment_args) %>
611 610 %else:
612 611 <% line_new_comments = None%>
613 612 %endif
614 613 %if line_new_comments:
615 614 <% has_outdated = any([x.outdated for x in line_new_comments]) %>
616 615 % if has_outdated:
617 616 <i title="${_('comments including outdated')}:${len(line_new_comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
618 617 % else:
619 618 <i title="${_('comments')}: ${len(line_new_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
620 619 % endif
621 620 %endif
622 621 </div>
623 622 </td>
624 623 <td class="cb-lineno ${action_class(line.modified.action)}"
625 624 data-line-no="${line.modified.lineno}"
626 625 %if new_line_anchor:
627 626 id="${new_line_anchor}"
628 627 %endif
629 628 >
630 629 %if line.modified.lineno:
631 630 <a name="${new_line_anchor}" href="#${new_line_anchor}">${line.modified.lineno}</a>
632 631 %endif
633 632 </td>
634 633 <td class="cb-content ${action_class(line.modified.action)}"
635 634 data-line-no="n${line.modified.lineno}"
636 635 >
637 636 %if use_comments and line.modified.lineno:
638 637 ${render_add_comment_button()}
639 638 %endif
640 639 <span class="cb-code">${line.modified.action} ${line.modified.content or '' | n}</span>
641 640 %if use_comments and line.modified.lineno and line_new_comments:
642 641 ${inline_comments_container(line_new_comments, inline_comments)}
643 642 %endif
644 643 </td>
645 644 </tr>
646 645 %endfor
647 646 </%def>
648 647
649 648
650 649 <%def name="render_hunk_lines_unified(hunk, use_comments=False, inline_comments=None)">
651 650 %for old_line_no, new_line_no, action, content, comments_args in hunk.unified:
652 651 <%
653 652 old_line_anchor, new_line_anchor = None, None
654 653 if old_line_no:
655 654 old_line_anchor = diff_line_anchor(hunk.source_file_path, old_line_no, 'o')
656 655 if new_line_no:
657 656 new_line_anchor = diff_line_anchor(hunk.target_file_path, new_line_no, 'n')
658 657 %>
659 658 <tr class="cb-line">
660 659 <td class="cb-data ${action_class(action)}">
661 660 <div>
662 661
663 662 %if comments_args:
664 663 <% comments = get_comments_for('unified', inline_comments, *comments_args) %>
665 664 %else:
666 665 <% comments = None %>
667 666 %endif
668 667
669 668 % if comments:
670 669 <% has_outdated = any([x.outdated for x in comments]) %>
671 670 % if has_outdated:
672 671 <i title="${_('comments including outdated')}:${len(comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
673 672 % else:
674 673 <i title="${_('comments')}: ${len(comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
675 674 % endif
676 675 % endif
677 676 </div>
678 677 </td>
679 678 <td class="cb-lineno ${action_class(action)}"
680 679 data-line-no="${old_line_no}"
681 680 %if old_line_anchor:
682 681 id="${old_line_anchor}"
683 682 %endif
684 683 >
685 684 %if old_line_anchor:
686 685 <a name="${old_line_anchor}" href="#${old_line_anchor}">${old_line_no}</a>
687 686 %endif
688 687 </td>
689 688 <td class="cb-lineno ${action_class(action)}"
690 689 data-line-no="${new_line_no}"
691 690 %if new_line_anchor:
692 691 id="${new_line_anchor}"
693 692 %endif
694 693 >
695 694 %if new_line_anchor:
696 695 <a name="${new_line_anchor}" href="#${new_line_anchor}">${new_line_no}</a>
697 696 %endif
698 697 </td>
699 698 <td class="cb-content ${action_class(action)}"
700 699 data-line-no="${(new_line_no and 'n' or 'o')}${(new_line_no or old_line_no)}"
701 700 >
702 701 %if use_comments:
703 702 ${render_add_comment_button()}
704 703 %endif
705 704 <span class="cb-code">${action} ${content or '' | n}</span>
706 705 %if use_comments and comments:
707 706 ${inline_comments_container(comments, inline_comments)}
708 707 %endif
709 708 </td>
710 709 </tr>
711 710 %endfor
712 711 </%def>
713 712
714 713
715 714 <%def name="render_hunk_lines(diff_mode, hunk, use_comments, inline_comments)">
716 715 % if diff_mode == 'unified':
717 716 ${render_hunk_lines_unified(hunk, use_comments=use_comments, inline_comments=inline_comments)}
718 717 % elif diff_mode == 'sideside':
719 718 ${render_hunk_lines_sideside(hunk, use_comments=use_comments, inline_comments=inline_comments)}
720 719 % else:
721 720 <tr class="cb-line">
722 721 <td>unknown diff mode</td>
723 722 </tr>
724 723 % endif
725 724 </%def>
726 725
727 726
728 727 <%def name="render_add_comment_button()">
729 728 <button class="btn btn-small btn-primary cb-comment-box-opener" onclick="return Rhodecode.comments.createComment(this)">
730 729 <span><i class="icon-comment"></i></span>
731 730 </button>
732 731 </%def>
733 732
734 733 <%def name="render_diffset_menu(diffset=None)">
735 734
736 735 <div class="diffset-menu clearinner">
737 736 <div class="pull-right">
738 737 <div class="btn-group">
739 738
740 739 <a
741 740 class="btn ${(c.user_session_attrs["diffmode"] == 'sideside' and 'btn-primary')} tooltip"
742 741 title="${h.tooltip(_('View side by side'))}"
743 742 href="${h.current_route_path(request, diffmode='sideside')}">
744 743 <span>${_('Side by Side')}</span>
745 744 </a>
746 745 <a
747 746 class="btn ${(c.user_session_attrs["diffmode"] == 'unified' and 'btn-primary')} tooltip"
748 747 title="${h.tooltip(_('View unified'))}" href="${h.current_route_path(request, diffmode='unified')}">
749 748 <span>${_('Unified')}</span>
750 749 </a>
751 750 </div>
752 751 </div>
753 752
754 753 <div class="pull-left">
755 754 <div class="btn-group">
756 755 <div class="pull-left">
757 756 ${h.hidden('file_filter')}
758 757 </div>
759 758 <a
760 759 class="btn"
761 760 href="#"
762 761 onclick="$('input[class=filediff-collapse-state]').prop('checked', false); return false">${_('Expand All Files')}</a>
763 762 <a
764 763 class="btn"
765 764 href="#"
766 765 onclick="$('input[class=filediff-collapse-state]').prop('checked', true); return false">${_('Collapse All Files')}</a>
767 766 <a
768 767 class="btn"
769 768 href="#"
770 769 onclick="return Rhodecode.comments.toggleWideMode(this)">${_('Wide Mode Diff')}</a>
771 770
772 771 </div>
773 772 </div>
774 773 </div>
775 774
776 775 % if diffset:
777 776
778 777 %if diffset.limited_diff:
779 778 <% file_placeholder = _ungettext('%(num)s file changed', '%(num)s files changed', diffset.changed_files) % {'num': diffset.changed_files}%>
780 779 %else:
781 780 <% file_placeholder = _ungettext('%(num)s file changed: %(linesadd)s inserted, ''%(linesdel)s deleted', '%(num)s files changed: %(linesadd)s inserted, %(linesdel)s deleted', diffset.changed_files) % {'num': diffset.changed_files, 'linesadd': diffset.lines_added, 'linesdel': diffset.lines_deleted}%>
782 781 %endif
783 782
784 783 <script>
785 784
786 785 var feedFilesOptions = function (query, initialData) {
787 786 var data = {results: []};
788 787 var isQuery = typeof query.term !== 'undefined';
789 788
790 789 var section = _gettext('Changed files');
791 790 var filteredData = [];
792 791
793 792 //filter results
794 793 $.each(initialData.results, function (idx, value) {
795 794
796 795 if (!isQuery || query.term.length === 0 || value.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) {
797 796 filteredData.push({
798 797 'id': this.id,
799 798 'text': this.text,
800 799 "ops": this.ops,
801 800 })
802 801 }
803 802
804 803 });
805 804
806 805 data.results = filteredData;
807 806
808 807 query.callback(data);
809 808 };
810 809
811 810 var formatFileResult = function(result, container, query, escapeMarkup) {
812 811 return function(data, escapeMarkup) {
813 812 var container = '<div class="filelist" style="padding-right:100px">{0}</div>';
814 813 var tmpl = '<span style="margin-right:-50px"><strong>{0}</strong></span>'.format(escapeMarkup(data['text']));
815 814 var pill = '<span class="pill-group" style="float: right;margin-right: -100px">' +
816 815 '<span class="pill" op="added">{0}</span>' +
817 816 '<span class="pill" op="deleted">{1}</span>' +
818 817 '</span>'
819 818 ;
820 819 var added = data['ops']['added'];
821 820 if (added === 0) {
822 821 // don't show +0
823 822 added = 0;
824 823 } else {
825 824 added = '+' + added;
826 825 }
827 826
828 827 var deleted = -1*data['ops']['deleted'];
829 828
830 829 tmpl += pill.format(added, deleted);
831 830 return container.format(tmpl);
832 831
833 832 }(result, escapeMarkup);
834 833 };
835 834 var preloadData = {
836 835 results: [
837 836 % for filediff in diffset.files:
838 837 {id:"a_${h.FID('', filediff.patch['filename'])}",
839 838 text:"${filediff.patch['filename']}",
840 839 ops:${h.json.dumps(filediff.patch['stats'])|n}}${('' if loop.last else ',')}
841 840 % endfor
842 841 ]
843 842 };
844 843
845 844 $("#file_filter").select2({
846 845 'dropdownAutoWidth': true,
847 846 'width': 'auto',
848 847 'placeholder': "${file_placeholder}",
849 848 containerCssClass: "drop-menu",
850 849 dropdownCssClass: "drop-menu-dropdown",
851 850 data: preloadData,
852 851 query: function(query) {
853 852 feedFilesOptions(query, preloadData);
854 853 },
855 854 formatResult: formatFileResult
856 855 });
857 856
858 857 $("#file_filter").on('click', function (e) {
859 858 e.preventDefault();
860 859 var selected = $('#file_filter').select2('data');
861 860 var idSelector = "#"+selected.id;
862 861 window.location.hash = idSelector;
863 862 // expand the container if we quick-select the field
864 863 $(idSelector).prev().prop('checked', false);
865 864 })
866 865
867 866 </script>
868 867 % endif
869 868
870 869 </%def>
General Comments 0
You need to be logged in to leave comments. Login now