DeokHong Kim (a.k.a insanehong) DeokHong Kim (a.k.a insanehong) 2013-12-18
Diff:fix diff full scroll and hide comment orver code line wrap
@1af5fe5c7e0c69f87a7b1ae0131f0894f0e3ab3d
app/assets/stylesheets/less/_page.less
--- app/assets/stylesheets/less/_page.less
+++ app/assets/stylesheets/less/_page.less
@@ -412,6 +412,10 @@
 .project-page-wrap {
     width: 1170px;
     margin:20px auto 0;
+
+    label {
+        display: inline-block;
+    }
 }
 
 .site-breadcrumb-outer {
@@ -4595,82 +4599,181 @@
 
 .diff-body {
     font-family: "monospace", Consolas, Tahoma;
-    overflow:auto;
 
-    .isBinary { color:#bbb; text-shadow:-1px -1px #fff; }
+    .isBinary { color:#bbb; text-shadow:-1px -1px #fff; padding:5px 10px; }
 
-    table {
-        border: 1px solid #eee;
-        width: 100%;
-    }
-    table {
+    .diff-partial-outer {
+        border: 1px solid #bbb;
         margin-bottom: 20px;
-    }
-    td {
-        border-width: 0px 1px;
-        border-color: #e5e5e5;
-        border-style: solid;
-    }
-    td.linenum {
-        text-align: right;
-        color: rgba(0, 0, 0, 0.3);
-        white-space: nowrap;
-        .user-select();
-        
-        &:before {
-            content: attr(data-line-num);
-            width:40px;
-        }
-    }
-    .code {
-        white-space: pre;
-    }
-    span.add {
-        background-color: #aaffaa;
-    }
-    span.remove {
-        background-color: #ffaaaa;
-    }
-    tr.add {
-        background-color: #eeffcc;
-    }
-    tr.remove {
-        background-color: #fdd;
-    }
-    tr.file {
-        background-color: #eee;
-        border:1px solid #bbb;
-        height:30px; /* 40px? */
-        font-weight: bold;
-    }
-    tr.range {
-        color: #999;
-        background-color: #f8f8ff;
-    }
-    .yobicon-comments {
-        visibility: hidden;
-        opacity: 0.6;
-    }
-    .icon-comment {
-        display:none;
-        float: left;
-        opacity: 0.6;
-    }
-    tr:hover .icon-comment {
-        display:block;
-    }
-    .linenum:hover .icon-comment {
-        opacity: 1.0;
-    }
-    .linenum, .filemode {
-        width: 40px;
-    }
-    .linenum-from { min-width:15px; }
-    .filename { float:left; line-height:30px; }
 
-    .hide {
-        display:none;
-    }
+        .diff-partial-inner {
+            .diff-partial-meta {
+                background-color: #eee;
+                border-bottom: 1px solid #bbb;
+                height: 30px;
+
+                .diff-partial-commit {
+                    float:left;
+
+                    .diff-partial-commit-id {
+                        float:left;
+                        padding:5px 2px;  
+                        font-weight: bold;
+                        border-right:1px solid #bbb;
+                        width:52px;
+                        text-align: center;
+                    }
+                }
+
+                .diff-partial-file {
+                    float: left;
+                    padding:5px 10px;
+                    font-weight: bold;
+                }
+
+                .diff-partial-utility {
+                    float:right;
+                    padding:2px 5px;
+                }
+            }
+
+            .diff-partial-code {
+                overflow: auto;
+                overflow-x: auto;
+                overflow-y: hidden;
+
+                table {
+                    width: 100%;
+                    border-collapse: separate;
+                    border-spacing: 0;
+
+                    tr {
+                        position: relative;
+                        td {
+                            &.linenum {
+                                text-align: right;
+                                color: rgba(0, 0, 0, 0.3);
+                                white-space: nowrap;
+                                border-right: 1px solid #e5e5e5;
+                                width:50px;
+                                padding:0 3px;
+                                .user-select(none);
+                                cursor: pointer;
+
+                                .line-number {
+                                    width: 50px;
+                                    height: 20px;
+                                    position: relative;
+
+                                    &:before { 
+                                        position: absolute;
+                                        content: attr(data-line-num); 
+                                        width: 50px;
+                                        display: block;
+                                    } 
+                                }
+                            }
+
+                            &.code {
+                                white-space: nowrap;
+                                padding:0 5px;
+                                .diff-partial-codeline {
+                                    font-family: "monospace", Consolas, Tahoma;
+                                    background-color: transparent;
+                                    border:none;
+                                    margin:0;
+                                    padding:0;
+                                    font-size:12px;
+                                    white-space: pre;
+                                }
+                            }
+
+                            &.diff-comment-box {
+                                border:1px solid #e5e5e5;
+                                border-left: none;
+                                border-right: none;
+
+                                form { margin:0;}
+                                
+                                .write-comment-box {
+                                    background-color: #f5f5f5;
+                                    margin:0;
+                                    .write-comment-wrap {
+                                        max-width: 1070px;
+                                    }
+                                }
+                            }
+                        }
+
+                        &.add {
+                            background-color: #eeffcc;
+                        }
+
+                        &.remove {
+                            background-color: #fdd;
+                        }
+
+                        &.range {
+                            color: #999;
+                            background-color: #f8f8ff;
+
+                            td {
+                                text-align: right;
+                                border-right: 1px solid #e5e5e5;
+
+                                &.hunk {
+                                    text-align: left;
+                                    padding-left:5px;
+                                }
+                            }
+                        }
+
+                        &.comments {
+                            display: table-row;
+                            td {
+                                border:1px solid #e5e5e5;
+                                border-left: none;
+                                border-right: none;
+                                padding:10px 5px;
+
+                                li {
+                                    max-width: 1150px;
+                                }
+                            }
+                        }
+                    }
+                }
+               
+                .icon-comment {
+                    position:absolute;
+                    cursor: pointer; 
+                    .opacity(0);
+                    margin-left: -75px;
+                    width: 25px;
+                    margin-top:2px;
+
+                }
+
+                tr.add:hover, tr.remove:hover,tr.context:hover{
+                    background-color: #CCE9FF !important;
+
+                    .icon-comment {
+                        .opacity(100);
+                    }
+                }
+                
+                .linenum:hover .icon-comment {
+                    opacity: 1.0;
+                }
+                
+                .linenum-from { min-width:15px; }
+                
+                .hide {
+                    display:none;
+                }    
+            }
+        }
+    }    
 }
 
 div.diff-body[data-outdated="true"] tr:hover .icon-comment {
app/views/partial_diff_line.scala.html
--- app/views/partial_diff_line.scala.html
+++ app/views/partial_diff_line.scala.html
@@ -2,4 +2,17 @@
 
 @import utils.TemplateHelper.DiffRenderer._
 
-<tr class="@klass" data-line="@num" data-type="@klass"><td class="linenum" data-line-num="@Option(numA).getOrElse("")"><i class="icon-comment"></i><span class="hidden">@Option(numA).getOrElse("")</span></td><td class="linenum" data-line-num="@Option(numB).getOrElse("")"><span class="hidden">@Option(numB).getOrElse("")</span></td><td class="code"><span>@prefix</span>@content @if(isEndOfLineMissing){@Html(noNewlineAtEof)}</td></tr>
+<tr class="@klass" data-line="@num" data-type="@klass">
+    <td class="linenum">
+        <i class="icon-comment"></i>
+        <div class="line-number" data-line-num="@Option(numA).getOrElse("")"></div>
+        <span class="hidden">@Option(numA).getOrElse("")</span>
+    </td>
+    <td class="linenum" >
+        <div class="line-number" data-line-num="@Option(numB).getOrElse("")"></div>
+        <span class="hidden">@Option(numB).getOrElse("")</span>
+    </td>
+    <td class="code">
+        <pre class="diff-partial-codeline">@prefix@content</pre> @if(isEndOfLineMissing){@Html(noNewlineAtEof)}
+    </td>
+</tr>
app/views/partial_filediff.scala.html
--- app/views/partial_filediff.scala.html
+++ app/views/partial_filediff.scala.html
@@ -20,11 +20,11 @@
 **@
 @renderDiffLines(diff: playRepository.FileDiff, comments: Map[String, List[_ <: CodeComment]]) = {
   @if(diff.isFileModeChanged) {
-    <tr><td class="filemode">@diff.oldMode</td><td class="filemode">@diff.newMode</td><td>@Messages("code.fileModeChanged")</td></tr>
+    <tr><td class="linenum"><div class="line-number" data-line-num="@diff.oldMode"></div><span class="hidden">@diff.oldMode</span></td><td class="linenum"><div class="line-number" data-line-num="@diff.newMode"></div><span class="hidden">@diff.newMode</span></td><td class="isBinary">@Messages("code.fileModeChanged")</td></tr>
   }
   @if(diff.getHunks.size > 0){
     @for(hunk <- diff.getHunks) {
-      <tr class="range"><td>...</td><td>...</td><td>@@@@ -@(hunk.beginA + 1),@(hunk.endA - hunk.beginA) +@(hunk.beginB + 1),@(hunk.endB - hunk.beginB) @@@@</td></tr>
+      <tr class="range"><td class="linenum"><div class="line-number" data-line-num="..."><span class="hidden">...</span></div></td><td class="linenum"><div class="line-number" data-line-num="..."><span class="hidden">...</span></div></td><td class="hunk">@@@@ -@(hunk.beginA + 1),@(hunk.endA - hunk.beginA) +@(hunk.beginB + 1),@(hunk.endB - hunk.beginB) @@@@</td></tr>
       @Html(renderLines(hunk.lines.toList, comments, eolMissingChecker(diff)))
     }
   } else {
@@ -57,18 +57,18 @@
             builder.append(i + 1)
             builder.append("' data-type='")
             builder.append(klass)
-            builder.append("'><td class='linenum'><i class='icon-comment'></i></td><td class='linenum' data-line-num='")
+            builder.append("'><td class='linenum'><i class='icon-comment'></i><div class='line-number'></div></td>")
+            builder.append("<td class='linenum'><div class='line-number' data-line-num='")
             builder.append(i + 1)
-            builder.append("'><span class='hidden'>")
+            builder.append("'></div><span class='hidden'>")
             builder.append(i + 1)
-            builder.append("</span></td><td class='code'><span>")
+            builder.append("</span></td><td class='code'><pre class='diff-partial-codeline'>")
             builder.append(prefix)
-            builder.append("</span>")
             builder.append(escapeHtml(rawText.getString(i)))
             if ((i + 1 == rawText.size) && rawText.isMissingNewlineAtEnd) {
                 builder.append(noNewlineAtEof)
             }
-            builder.append("</td></tr>")
+            builder.append("</pre></td></tr>")
             builder.append(partial_diff_comment_on_line(commentsOrEmpty(comments, commentKey(path, side, i + 1))).toString.trim)
         }
 
@@ -136,30 +136,47 @@
  * @param renderedLines
 **@
 @renderFile(diff: FileDiff, fileHeader: String, renderedLines: Html) = {
-  <table class="diff-body show-comments" data-path-a="@diff.pathA" data-path-b="@diff.pathB" data-commit-a="@diff.commitA" data-commit-b="@diff.commitB"><tbody>
-  <tr id="@getFileHeadId(diff)" class="file">
-      <td class="linenum-from">
-          @if(diff.commitA != null && diff.pathA != null){
-          <a href="@routes.CodeApp.codeBrowserWithBranch(projectA.owner, projectA.name, diff.commitA, diff.pathA)" title="@diff.commitA" target="_blank">@getShortenedCommitId(diff.commitA)</a>
-          }
-      </td>
-      <td class="linenum-to">
-          @if(diff.commitB != null && diff.pathB != null){
-          <a href="@routes.CodeApp.codeBrowserWithBranch(projectB.owner, projectB.name, diff.commitB, diff.pathB)" title="@diff.commitB" target="_blank">@getShortenedCommitId(diff.commitB)</a></td>
-          }
-      <td class="line-body">
+  <div class="diff-partial-outer">
+    <div class="diff-partial-inner">
+      <div class="diff-partial-meta">
+        <div class="diff-partial-commit">
+          <div class="diff-partial-commit-id">
+            @if(diff.commitA != null && diff.pathA != null){
+            <a href="@routes.CodeApp.codeBrowserWithBranch(projectA.owner, projectA.name, diff.commitA, diff.pathA)" title="@diff.commitA" target="_blank">@getShortenedCommitId(diff.commitA)</a>
+            } else {
+            &nbsp;
+            }
+          </div>
+          <div class="diff-partial-commit-id">
+            @if(diff.commitB != null && diff.pathB != null){
+            <a href="@routes.CodeApp.codeBrowserWithBranch(projectB.owner, projectB.name, diff.commitB, diff.pathB)" title="@diff.commitB" target="_blank">@getShortenedCommitId(diff.commitB)</a></td>
+            } else {
+            &nbsp;
+            }
+          </div>
+        </div>
+        <div class="diff-partial-file">
           <span class="filename">@fileHeader</span>
+        </div>
+        <div class="diff-partial-utility">
           @if(diff.commitA && diff.commitB && diff.pathA && diff.pathB){
-          <button type="button" class="ybtn pull-right" data-toggle="mergely"
-            data-pathA="@diff.pathA" data-pathB="@diff.pathB" data-commitA="@diff.commitA" data-commitB="@diff.commitB"
-            data-rawA="@routes.CodeApp.showRawFile(projectA.owner, projectA.name, diff.commitA, diff.pathA)" 
-            data-rawB="@routes.CodeApp.showRawFile(projectB.owner, projectB.name, diff.commitB, diff.pathB)"
-          >@Messages("code.fullDiff")</button>
+              <button type="button" class="ybtn ybtn-small" data-toggle="mergely"
+                data-pathA="@diff.pathA" data-pathB="@diff.pathB" data-commitA="@diff.commitA" data-commitB="@diff.commitB"
+                data-rawA="@routes.CodeApp.showRawFile(projectA.owner, projectA.name, diff.commitA, diff.pathA)" 
+                data-rawB="@routes.CodeApp.showRawFile(projectB.owner, projectB.name, diff.commitB, diff.pathB)"
+              >@Messages("code.fullDiff")</button>
           }
-      </td>
-  </tr>
-  @renderedLines
-  </tbody></table>
+        </div>
+      </div>
+      <div class="diff-partial-code">
+        <table class="diff-container show-comments" data-path-a="@diff.pathA" data-path-b="@diff.pathB" data-commit-a="@diff.commitA" data-commit-b="@diff.commitB">
+        <tbody>
+          @renderedLines
+        </tbody>
+        </table>
+      </div>
+    </div>
+  </div>
 }
 
 @**
@@ -197,7 +214,7 @@
  * @param prefix
 **@
 @renderCodeIsBinary(klass:String = "", prefix:String = "") = {
-    <tr class="@klass"><td></td><td></td><td class="isBinary">@prefix@Messages("code.isBinary")</td></tr>
+    <tr class="@klass"><td class='linenum'><div class='line-number'></div></td><td class='linenum'><div class='line-number'></div></td><td class="isBinary">@prefix@Messages("code.isBinary")</td></tr>
 }
 
 @getComments(comments: java.util.List[_ <: CodeComment]) = @{
public/javascripts/common/yobi.CodeCommentBox.js
--- public/javascripts/common/yobi.CodeCommentBox.js
+++ public/javascripts/common/yobi.CodeCommentBox.js
@@ -74,14 +74,15 @@
      * @param {Object} welTr
      */
     function _show(welTr, fCallback) {
-        var welTd = $("<td colspan=3>");
+        var welTd = $('<td colspan="3">');
+        welTd.addClass('diff-comment-box');
         var welCommentTr;
         var nLine = parseInt(welTr.data('line'));
         var sType = welTr.data('type');
         var sCommitId;
         var sPath;
-        var sCommitA = welTr.closest('.diff-body').data('commitA');
-        var sCommitB = welTr.closest('.diff-body').data('commitB');
+        var sCommitA = welTr.closest('.diff-container').data('commitA');
+        var sCommitB = welTr.closest('.diff-container').data('commitB');
 
         if (isNaN(nLine)) {
             nLine = parseInt(welTr.prev().data('line'));
Add a comment
List