MR diff comment form is in wrong place when switching between Inline/Side-by-side in a different tab
Steps to reproduce
- Open two merge requests in two tabs, on their regular Discussion tab (not Changes), say A and B
- On A, open the Changes tab and switch from Inline to Side-by-side or the other way around
- On B, open the Changes tab
- Click the comment button in the gutter of a line in B
- Submit a comment
Expected behavior
- The comment form opens in the right place
- The newly created comment is in the right place
Actual behavior
- If B is in Side-by-side view, lines on the right side have no comment button
- If B is in Inline view, the comment button is on the second line number instead of the first
- The comment form doesn't open in the right place
- The newly created comment isn't in the right place
Relevant logs and/or screenshots
Possible fixes
The problem is in http://gitlab.com/gitlab-org/gitlab-ce/blob/master/app/views/projects/notes/_form.html.haml#L4 and https://gitlab.com/gitlab-org/gitlab-ce/blob/master/app/assets/javascripts/files_comment_button.js#L37
The value of this input is set when the note form is loaded as part of the initial main MR page load. The value is then used on the Changes tab to comment on the diff.
Since the Changes tab is asynchronously loaded on-demand, it may get a different value for diff_view
(cookies[:diff_view]
) than the initial MR page load did, and render the diffs in parallel when the input still says inline
, or the other way around.
The result is that the HTML/DOM is built for parallel view, while the JS reads from the input and tries to manipulate the diff DOM as it were inline.
We can fix this by:
- Reading the diff view in a slightly more robust way, as in https://gitlab.com/gitlab-org/gitlab-ce/blob/master/app/assets/javascripts/diff.js.es6#L101
- Automatically updating the input with the cookie value using JS so that it always holds the right value when the form is submitted.
/cc @rspeicher @jschatz1