← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] lp:~wgrant/launchpad/ic-js-cleanup into lp:launchpad

 

William Grant has proposed merging lp:~wgrant/launchpad/ic-js-cleanup into lp:launchpad.

Requested reviews:
  Celso Providelo (cprov)
  Chris Johnston (cjohnston)
Related bugs:
  Bug #609297 in Launchpad itself: "need ability to do in-line reviews"
  https://bugs.launchpad.net/launchpad/+bug/609297

For more details, see:
https://code.launchpad.net/~wgrant/launchpad/ic-js-cleanup/+merge/219531
-- 
https://code.launchpad.net/~wgrant/launchpad/ic-js-cleanup/+merge/219531
Your team Launchpad code reviewers is subscribed to branch lp:launchpad.
=== modified file 'lib/canonical/launchpad/icing/css/modifiers.css'
--- lib/canonical/launchpad/icing/css/modifiers.css	2014-05-14 09:23:56 +0000
+++ lib/canonical/launchpad/icing/css/modifiers.css	2014-05-21 02:05:44 +0000
@@ -166,7 +166,8 @@
     }
 
 pre.changelog,
-table.diff,
+table.diff td.line-no,
+table.diff td.text,
 .comment-text,
 .bug-activity {
     font-family: monospace;

=== modified file 'lib/canonical/launchpad/icing/style.css'
--- lib/canonical/launchpad/icing/style.css	2014-05-14 09:23:56 +0000
+++ lib/canonical/launchpad/icing/style.css	2014-05-21 02:05:44 +0000
@@ -584,6 +584,7 @@
 table.diff {
    white-space: pre-wrap;
    width: 100%;
+   table-layout: fixed;
    background-color: white;
    margin-bottom: 0.5em;
 }
@@ -593,12 +594,53 @@
   background-color: #f6f6f6;
   color: #999;
   border-right: solid 4px white;
+  width: 4em;
+}
+table.diff .line-no.active {
+  background: url(/@@/add) #f6f6f6 center left no-repeat;
 }
 table.diff .diff-chunk, table.diff .diff-file, table.diff .diff-header {
  font-weight: bold;
 }
 table.diff .diff-added { background-color: #92ED92; }
 table.diff .diff-removed { background-color: #FF7F7F; }
+table.diff .inline-comments > td > div {
+  margin: 0 1em 1.5em 1em;
+}
+
+table.diff .inline-comments .yui3-ieditor { padding-right:0!important; }
+table.diff .inline-comments .yui3-ieditor-multiline .yui3-ieditor-btns
+    .bg-top-label button.lazr-btn {
+  word-wrap: normal;
+}
+
+table.diff .inline-comments .boardComment {
+  margin: 1em 0;
+}
+
+table.diff .inline-comments .boardCommentBody {
+  word-wrap: break-word;
+  font-family: monospace;
+}
+
+table.diff .inline-comments .yui3-ieditor-multiline .yui3-ieditor-btns
+    .bg-top-label {
+  background-image: none!important;
+  margin-right: -7px!important;
+  margin-top: 18px!important;
+}
+table.diff .inline-comments .yui3-ieditor-input textarea {
+  width: 92%;
+  max-width: 92%;
+  float: left;
+}
+table.diff .inline-comments .yui3-ieditor-input {
+  width: auto!important;
+  margin-right: 0;
+  margin-bottom: 5px;
+  overflow: hidden;
+}
+
 .back-link { margin-top: 3em; }
 
 .reviews {

=== modified file 'lib/lp/app/javascript/inlineedit/assets/skins/sam/editor-skin.css'
--- lib/lp/app/javascript/inlineedit/assets/skins/sam/editor-skin.css	2014-05-12 19:03:15 +0000
+++ lib/lp/app/javascript/inlineedit/assets/skins/sam/editor-skin.css	2014-05-21 02:05:44 +0000
@@ -204,52 +204,3 @@
   background: url('edit.png') top left no-repeat;
   padding: 2px 0 0 18px;
 }
-
-tr.ict-header {
-  margin: 20px 0 0 0;
-}
-td.ic-header {
-  border: 1px solid rgb(221, 221, 221);
-  border-right: 0;
-  padding: .5em 12px;
-  font-family: Ubuntu,"Bitstream Vera Sans","DejaVu Sans",Tahoma,sans-serif;
-  font-size: 12px;
-}
-td.inline-comment {
-  border: 1px solid rgb(221, 221, 221);
-  border-right: 0;
-  margin: 0 0 20px 0;
-  line-height: 25px;
-  background-color: rgb(248, 248, 255);
-  font-family: Ubuntu,"Bitstream Vera Sans","DejaVu Sans",Tahoma,sans-serif;
-  font-size: 12px;
-  padding: 0 12px 0;
-  word-break: break-all;
-}
-
-.inline-comment>div { line-height: 25px; }
-.inline-comment .yui3-ieditor { padding-right:0 !important }
-.inline-comment .yui3-ieditor > yui3-ieditor-input { width: auto!important }
-.inline-comment .yui3-ieditor-input {
-  width: auto!important;
-  margin-right: 0;
-  margin-bottom: 5px;
-  margin-top: -6px!important;
-  overflow: hidden;
-}
-.inline-comment .yui3-ieditor-content {top: 5px; left: -5px;}
-.inline-comment .yui3-ieditor-input textarea {
-  width: 92%;
-  max-width: 92%;
-  border-top: 1px solid rgb(214, 214, 214);
-  float: left;
-}
-.inline-comment .yui3-ieditor-input .bg-top-label { margin-right: 10px; }
-.inline-comment .bg-top-label {
-  margin-right: -7px!important;
-  background-image: none!important;
-  margin-top: 18px!important;
-}
-tr.ict-content .yui3-ieditor-multiline .yui3-ieditor-btns .bg-top-label button.lazr-btn { text-indent: -9999px; }
-.inline-comment .bg-top-label button.lazr-btn { text-indent: -9999px; }
-.diff-content .boardCommentBody { padding: 0!important }

=== modified file 'lib/lp/code/browser/codereviewcomment.py'
--- lib/lp/code/browser/codereviewcomment.py	2014-05-14 00:48:31 +0000
+++ lib/lp/code/browser/codereviewcomment.py	2014-05-21 02:05:44 +0000
@@ -17,6 +17,7 @@
 from zope.formlib.widgets import (
     DropdownWidget,
     TextAreaWidget,
+    TextWidget,
     )
 from zope.interface import (
     implements,
@@ -243,6 +244,7 @@
 
     schema = IEditCodeReviewComment
 
+    custom_widget('review_type', TextWidget, displayWidth=15)
     custom_widget('comment', TextAreaWidget, cssClass='comment-text')
     custom_widget('vote', MyDropWidget)
 

=== modified file 'lib/lp/code/javascript/branchmergeproposal.inlinecomments.js'
--- lib/lp/code/javascript/branchmergeproposal.inlinecomments.js	2014-05-20 02:53:37 +0000
+++ lib/lp/code/javascript/branchmergeproposal.inlinecomments.js	2014-05-21 02:05:44 +0000
@@ -18,48 +18,41 @@
 
 namespace.lp_client = new Y.lp.client.Launchpad();
 
+namespace.cleanup_empty_comment_containers = function() {
+    Y.one('.diff').all('tr.inline-comments > td > div:empty').each(
+        function(node) {
+            node.ancestor('tr.inline-comments').remove(true);
+        });
+};
+
 namespace.add_doubleclick_handler = function() {
-    var rows = Y.one('.diff').all('tr');
     var handling_request = false;
     handler = function(e) {
         if (handling_request === true) {
             return;
         }
         handling_request = true;
-        var linenumberdata = e.currentTarget.one('.line-no');
-        var line_number = linenumberdata.get('text');
-        // Retrieve or create a row container for the comment editor.
-        var header_row = Y.one(
-            '#ict-' + line_number + '-draft-header');
-        if (header_row === null) {
-            header_row = namespace.create_row(
-                {'line_number': line_number});
+        var text_row = e.currentTarget.ancestor('tr', true);
+        var line_number = text_row.one('.line-no').get('text');
+        // Retrieve or create a container for the comment editor.
+        var draft_div = Y.one('#comments-' + text_row.get('id') + ' .draft');
+        if (draft_div === null) {
+            draft_div = namespace.create_row({'line_number': line_number});
         }
-        var content_row = header_row.next();
         var widget = new Y.EditableText({
-            contentBox: content_row.one(
-                '#inlinecomment-' + line_number + '-draft'),
+            contentBox: draft_div.one('.boardCommentBody div'),
             initial_value_override: namespace.inlinecomments[line_number],
             accept_empty: true,
             multiline: true,
             buttons: 'top'
         });
         widget.render();
-        handle_widget_button = function(saved, comment) {
-            if (saved === false) {
-                handling_request = false;
-                if (namespace.inlinecomments[line_number] === undefined) {
-                    header_row.remove(true);
-                    content_row.remove(true);
-                }
-                return;
-            }
-
-            namespace.inlinecomments[line_number] = comment;
-            if (comment === '') {
+        widget.editor.on('save', function() {
+            namespace.inlinecomments[line_number] = this.get('value');
+            if (this.get('value') === '') {
                 delete namespace.inlinecomments[line_number];
-                header_row.remove(true);
-                content_row.remove(true);
+                draft_div.remove(true);
+                namespace.cleanup_empty_comment_containers();
             }
             var config = {
                 on: {
@@ -75,46 +68,68 @@
             namespace.lp_client.named_post(
                 LP.cache.context.self_link, 'saveDraftInlineComment', config);
             handling_request = false;
-        };
-        widget.editor.on('save', function() {
-            handle_widget_button(true, this.get('value'));
         });
         widget.editor.on('cancel', function(e) {
-            handle_widget_button(false, this.get('value'));
+            handling_request = false;
+            // If there's no saved comment to return to, just remove the
+            // draft UI.
+            if (namespace.inlinecomments[line_number] === undefined) {
+                draft_div.remove(true);
+                namespace.cleanup_empty_comment_containers();
+            }
         });
         widget._triggerEdit(e);
     };
-    rows.on('dblclick', handler);
+
+    // The editor can be invoked by double-clicking a diff line or
+    // clicking the line number. Hovering over a line shows an edit icon
+    // near the line number, to hint that it's clickable.
+    // XXX: Introduce a separate comment column.
+    Y.one('.diff').delegate('dblclick', handler, 'tr[id^="diff-line"]');
+    Y.one('.diff').delegate('click', handler, 'tr[id^="diff-line"] .line-no');
+    Y.one('.diff').delegate('hover',
+        function(e) {
+            e.currentTarget.one('.line-no').addClass('active');
+        },
+        function(e) {
+            e.currentTarget.one('.line-no').removeClass('active');
+        },
+        'tr[id^="diff-line"]');
 };
 
 namespace.create_row = function(comment) {
-    var ident = comment.line_number + '-draft';
-    var headerrow = Y.Node.create(
-        '<tr><td class="line-no"></td><td class="ic-header"></td></tr>')
-        .addClass('ict-header');
-    var headerspan;
-    var newrow;
+    // Find or create the container for this line's comments.
+    var comments_tr = Y.one('#comments-diff-line-' + comment.line_number);
+    if (comments_tr === null) {
+        var comments_tr = Y.Node.create(
+            '<tr class="inline-comments">'
+            + '<td colspan="2"><div></div></td></tr>')
+            .set('id', 'comments-diff-line-' + comment.line_number);
+        Y.one('#diff-line-' + comment.line_number)
+            .insert(comments_tr, 'after');
+    }
+    comments_div = comments_tr.one('div');
+
+    var newrow = Y.Node.create(
+        '<div class="boardComment">' +
+        '<div class="boardCommentDetails"></div>' +
+        '<div class="boardCommentBody"><div></div></div>' +
+        '</div>');
     if (Y.Lang.isUndefined(comment.person)) {
         // Creates a draft inline comment area.
-        headerspan = Y.Node.create('<span></span>').set(
-            'text', 'Draft comment');
-        headerrow.set('id', 'ict-' + ident + '-header');
-        newrow = Y.Node.create(
-            '<tr><td class="line-no"></td>' +
-            '<td class="inline-comment"><div>' +
-            '<span class="yui3-editable_text-text"></span>' +
-            '<div class="yui3-editable_text-trigger"></div>' +
-            '</div></td></tr>').set('id', 'ict-' + ident);
-        newrow.one('td>div').set('id', 'inlinecomment-' + ident);
         newrow.addClass('draft');
+        newrow.one('.boardCommentDetails').set('text', 'Unsaved comment');
+        newrow.one('.boardCommentBody div')
+            .append('<span class="yui3-editable_text-text"></span>')
+            .append('<div class="yui3-editable_text-trigger"></div>');
         if (!Y.Lang.isUndefined(comment.text)) {
             namespace.inlinecomments[comment.line_number] = comment.text;
             newrow.one('span').set('text', comment.text);
         }
     } else {
         // Creates a published inline comment area.
-        headerspan = Y.Node.create(
-            '<span>Comment by <a></a> <span></span></span>');
+        var headerspan = Y.Node.create(
+            '<span><a class="sprite person"></a> wrote <span></span>:</span>');
         // Wrap resources coming from LP.cache, as they come from
         // the LP API (updates during the page life-span). This way
         // the handling code can be unified.
@@ -133,42 +148,24 @@
         var fmt_date = 'on ' + Y.Date.format(
             new Date(comment.date), {format: '%Y-%m-%d'});
         headerspan.one('span').set('text', fmt_date);
-        newrow = Y.Node.create(
-            '<tr><td class="line-no"></td>' +
-            '<td class="inline-comment"><span></span></td></tr>');
-        newrow.one('span').set('text', comment.text);
+        newrow.one('.boardCommentDetails').append(headerspan);
+        newrow.one('.boardCommentBody div').append('<span></span>');
+        newrow.one('.boardCommentBody').one('span').set('text', comment.text);
     }
-    headerrow.one('td:last-child').appendChild(headerspan);
 
-    // We want to have the comments in order after the line.
-    var base_line = Y.one(
-        '#diff-line-' + (parseInt(comment.line_number, 10) + 1));
-    if (base_line !== null) {
-        // If there are drafts, they should remain at the bottom.
-        if (base_line.previous().hasClass('draft')) {
-            base_line = base_line.previous().previous();
-        }
-        base_line.insert(headerrow, 'before');
+    // Ensure that drafts always end up at the end.
+    var maybe_draft = comments_div.one('.draft');
+    if (comment.person !== undefined && maybe_draft !== null) {
+        maybe_draft.insert(newrow, 'before');
     } else {
-        // If this is the last row, grab the last child.
-        base_line = Y.one('.diff>tbody>tr:last-child');
-        // If there are drafts, they should remain at the bottom.
-        if (base_line.hasClass('draft')) {
-            base_line = base_line.previous().previous();
-        }
-        base_line.insert(headerrow, 'after');
+        comments_div.appendChild(newrow);
     }
-    headerrow.insert(newrow, 'after');
-
-    return headerrow;
+    return newrow;
 };
 
 namespace.cleanup_comments = function() {
-    // Cleanup previous inline review comments.
-    Y.all('.ict-header').each( function(line) {
-        line.next().remove(true);
-        line.remove(true);
-    });
+    // Cleanup existing inline review comments.
+    Y.all('.inline-comments').remove(true);
 };
 
 namespace.populate_comments = function() {
@@ -275,7 +272,7 @@
             Y.fire('CodeReviewComment.SET_DISABLED', true);
             return;
         }
-        var text = 'Publish ' + n_drafts + ' inline comment';
+        var text = 'Include ' + n_drafts + ' diff comment';
         if (n_drafts > 1) text += 's';
         var label = Y.Node.create('<a />')
             .set('text', text);
@@ -327,7 +324,7 @@
         }
         var ui = Y.Node.create('<li><label>' +
             '<input type="checkbox" checked="checked" id="show-ic"/>' +
-            '&nbsp;Show inline comments</label></li>');
+            '&nbsp;Show comments</label></li>');
         var ul = Y.one('#review-diff div div ul.horizontal');
         if (ul) {
             ul.appendChild(ui);
@@ -350,7 +347,7 @@
         if (display) {
             css_display = 'table-row';
         }
-        Y.all('.ict-header').each( function() {
+        Y.all('.inline-comments').each( function() {
             this.setStyle('display', css_display);
             this.next().setStyle('display', css_display);
         });
@@ -493,7 +490,7 @@
             }
             scroller = Y.Node.create(
                 '<a href="" class="ic-scroller" style="float: right;">' +
-                'View inline comments</a>');
+                'Show diff comments</a>');
             td.append(scroller);
             rc.link_scroller(scroller, '#review-diff', function() {
                 self._showPreviewDiff(previewdiff_id);
@@ -590,15 +587,17 @@
             return;
         }
 
-	var pub_drafts_container = Y.one('.publish_drafts_container')
-        if (pub_drafts_container === null) {
-            pub_drafts_container = Y.Node.create(
-                '<div class="publish_drafts_container">');
-            Y.one('[id="field.review_type"]').insert(
-                pub_drafts_container, 'after');
+        if (LP.links['me'] !== undefined) {
+            var pub_drafts_container = Y.one('.publish_drafts_container')
+            if (pub_drafts_container === null) {
+                pub_drafts_container = Y.Node.create(
+                    '<div class="publish_drafts_container">');
+                Y.one('[id="field.review_type"]').insert(
+                    pub_drafts_container, 'after');
+            }
+            (new namespace.PublishDrafts(
+                {'contentBox': pub_drafts_container})).render();
         }
-        (new namespace.PublishDrafts(
-            {'contentBox': pub_drafts_container})).render();
 
         var container = this.get('srcNode').one('.diff-navigator');
         container.empty();

=== modified file 'lib/lp/code/javascript/tests/test_branchmergeproposal.inlinecomments.js'
--- lib/lp/code/javascript/tests/test_branchmergeproposal.inlinecomments.js	2014-05-19 22:38:55 +0000
+++ lib/lp/code/javascript/tests/test_branchmergeproposal.inlinecomments.js	2014-05-21 02:05:44 +0000
@@ -81,28 +81,34 @@
                 responseHeaders: {'Content-Type': 'application/json'}});
 
             // Published comment is displayed.
-            var header = Y.one('#diff-line-2').next();
+            var comments = Y.one('#diff-line-2').next().one('div');
             // XXX cprov 20140226: test disabled due to ES4 lack of
             // ISO8601 support. Although the vast majority of production
             // clients run ES5.
             //Y.Assert.areEqual(
-            //    'Comment by Foo Bar (name16) on 2012-08-12',
+            //    'Foo Bar (name16) wrote on 2012-08-12',
             //    header.get('text'));
-            var text = header.next();
-            Y.Assert.areEqual('This is preloaded.', text.get('text'));
+            var first = comments.one('div:first-child')
+            Y.Assert.areEqual(
+                'This is preloaded.',
+                first.one('.boardCommentBody').get('text'));
 
             // Draft comment for line 2 is displayed after all published
             // comments.
-            header = text.next()
-            Y.Assert.areEqual('Draft comment', header.get('text'));
-            var text = header.next();
-            Y.Assert.areEqual('Boing!', text.get('text'));
+            var second = first.next()
+            Y.Assert.areEqual(
+                'Unsaved comment',
+                second.one('.boardCommentDetails').get('text'));
+            Y.Assert.areEqual(
+                'Boing!', second.one('.boardCommentBody').get('text'));
 
             // Draft comment for line 3 is displayed.
-            header = Y.one('#diff-line-3').next();
-            Y.Assert.areEqual('Draft comment', header.get('text'));
-            text = header.next();
-            Y.Assert.areEqual('Zoing!', text.get('text'));
+            var third = Y.one('#diff-line-3').next();
+            Y.Assert.areEqual(
+                'Unsaved comment',
+                third.one('.boardCommentDetails').get('text'));
+            Y.Assert.areEqual(
+                'Zoing!', third.one('.boardCommentBody').get('text'));
         },
 
         test_draft_handler: function() {
@@ -115,25 +121,26 @@
                 {io_provider: mockio});
 
             // No draft comment in line 1.
-            Y.Assert.isNull(Y.one('#ict-1-draft-header'));
+            Y.Assert.isNull(Y.one('#comments-diff-line-1 .draft'));
 
             // Let's create one.
             var line  = Y.one('#diff-line-1');
             line.simulate('dblclick');
-            var ic_area = line.next().next();
+            var ic_area = Y.one('#comments-diff-line-1 .draft');
             ic_area.one('.yui3-ieditor-input>textarea').set('value', 'Go!');
             ic_area.one('.lazr-pos').simulate('click');
 
             // LP was hit and a comment was created.
             Y.Assert.areEqual(1, mockio.requests.length);
             Y.Assert.areEqual(
-                'Draft comment', Y.one('#ict-1-draft-header').get('text'));
+                'Unsaved comment',
+                ic_area.one('.boardCommentDetails').get('text'));
             Y.Assert.areEqual(
                 'Go!', ic_area.one('.yui3-editable_text-text').get('text'));
 
             // Cancelling a draft comment attempt ...
             line.simulate('dblclick');
-            ic_area = line.next().next();
+            ic_area = line.next();
             ic_area.one('.yui3-ieditor-input>textarea').set('value', 'No!');
             ic_area.one('.lazr-neg').simulate('click');
 
@@ -144,14 +151,14 @@
 
             // Removing a draft comment by submitting an emtpy text.
             line.simulate('dblclick');
-            ic_area = line.next().next();
+            ic_area = line.next();
             ic_area.one('.yui3-ieditor-input>textarea').set('value', '');
             ic_area.one('.lazr-pos').simulate('click');
 
             // LP is hit again and the previous comment is removed,
             // the next row diplayed is the next diff line.
             Y.Assert.areEqual(2, mockio.requests.length);
-            Y.Assert.isNull(Y.one('#ict-1-draft-header'));
+            Y.Assert.isNull(Y.one('#comments-diff-line-1 .draft'));
             Y.Assert.areEqual('diff-line-2', line.next().get('id'));
         },
 
@@ -161,7 +168,7 @@
             module.add_doubleclick_handler();
             var line  = Y.one('#diff-line-1');
             line.simulate('dblclick');
-            ic_area = line.next().next();
+            ic_area = line.next();
             ic_area.one('.yui3-ieditor-input>textarea').set('value', '');
             ic_area.one('.lazr-neg').simulate('click');
             Y.Assert.areEqual('diff-line-2', line.next().get('id'));
@@ -395,17 +402,17 @@
             // Render a draft comment for tests.
             module.create_row({'line_number': '1', 'text': 'inline'});
             Y.Assert.areEqual(
-                'table-row', Y.one('tr.ict-header').getStyle('display'));
+                'table-row', Y.one('.inline-comments').getStyle('display'));
             ic_check.set('checked', false);
             ic_check.simulate('change');
             this.wait(function() {}, 1);
             Y.Assert.areEqual(
-                'none', Y.one('tr.ict-header').getStyle('display'));
+                'none', Y.one('.inline-comments').getStyle('display'));
             ic_check.set('checked', true);
             ic_check.simulate('change');
             this.wait(function() {}, 1);
             Y.Assert.areEqual(
-                'table-row', Y.one('tr.ict-header').getStyle('display'));
+                'table-row', Y.one('.inline-comments').getStyle('display'));
         },
 
         test_publish_drafts: function() {
@@ -418,13 +425,13 @@
             // A event is fired when the inlinecomments set changes.
             Y.fire('inlinecomment.UPDATED');
             Y.Assert.areEqual(
-                 'Publish 1 inline comment', container.get('text'));
+                 'Include 1 diff comment', container.get('text'));
             Y.Assert.isNotNull(container.one('[type=checkbox]'));
             // Adding another draft.
             module.create_row({'line_number': '2', 'text': 'another'});
             Y.fire('inlinecomment.UPDATED');
             Y.Assert.areEqual(
-                 'Publish 2 inline comments', container.get('text'));
+                 'Include 2 diff comments', container.get('text'));
             Y.Assert.isNotNull(container.one('[type=checkbox]'));
             // Removing all drafts.
             module.cleanup_comments();
@@ -442,7 +449,7 @@
             this.reply_diffcontent();
             var mockio = this.diffnav.get('lp_client').io_provider;
             Y.Assert.areEqual(2, mockio.requests.length);
-            // The needed review-comment scrollers (View inline comments)
+            // The needed review-comment scrollers (Show diff comments)
             // are created. Only 'current' (non-superseded) comments
             // associated with inline comments get a scroller.
             var lines = []
@@ -451,8 +458,8 @@
             );
             Y.ArrayAssert.itemsAreEqual(
                 ['Comment from superseded',
-                 'Comment One View inline comments',
-                 'Comment Two View inline comments',
+                 'Comment One Show diff comments',
+                 'Comment Two Show diff comments',
                  'No inlines'],
                 lines);
             // Scroller are identified as:

=== modified file 'lib/lp/code/mail/codereviewcomment.py'
--- lib/lp/code/mail/codereviewcomment.py	2014-05-15 00:08:49 +0000
+++ lib/lp/code/mail/codereviewcomment.py	2014-05-21 02:05:44 +0000
@@ -184,4 +184,4 @@
 
     result_text = u'\n'.join(result_lines)
 
-    return '\n\nInline comments:\n\n%s\n\n' % result_text
+    return '\n\nDiff comments:\n\n%s\n\n' % result_text

=== modified file 'lib/lp/code/mail/tests/test_codereviewcomment.py'
--- lib/lp/code/mail/tests/test_codereviewcomment.py	2014-05-15 00:08:49 +0000
+++ lib/lp/code/mail/tests/test_codereviewcomment.py	2014-05-21 02:05:44 +0000
@@ -253,7 +253,7 @@
 
         expected_lines = [
             '',
-            'Inline comments:',
+            'Diff comments:',
             '',
             '> --- yvo/yc/pbqr/vagresnprf/qvss.cl      '
             '2009-10-01 13:25:12 +0000',
@@ -432,7 +432,7 @@
         self.assertEqual(
             ['',
              '',
-             'Inline comments:',
+             'Diff comments:',
              '',
              '> +++ bar\t1969-12-31 19:00:00.000000000 -0500'],
             header)

=== modified file 'lib/lp/code/templates/branchmergeproposal-diff.pt'
--- lib/lp/code/templates/branchmergeproposal-diff.pt	2012-11-28 21:48:48 +0000
+++ lib/lp/code/templates/branchmergeproposal-diff.pt	2014-05-21 02:05:44 +0000
@@ -15,7 +15,7 @@
           </li>
         </ul>
       </div>
-      <div class="boardCommentBody attachmentBody">
+      <div class="attachmentBody">
         <tal:diff replace="structure view/preview_diff_text/fmt:diff" />
         <tal:diff-not-available condition="not: view/diff_available">
             The diff is not available at this time. You can reload the

=== modified file 'lib/lp/code/templates/branchmergeproposal-index.pt'
--- lib/lp/code/templates/branchmergeproposal-index.pt	2014-05-14 00:48:31 +0000
+++ lib/lp/code/templates/branchmergeproposal-index.pt	2014-05-21 02:05:44 +0000
@@ -36,6 +36,9 @@
     #add-comment-review-fields div {
       display: inline;
     }
+    .yui3-publishdrafts:before {
+      content: " ";
+    }
     #proposal-summary th {
       font-weight: bold;
       color: #717171;


Follow ups