Commit 494ae87840bf719e5fb4094781cc1dfc179af463
1 parent
1319373d
Exists in
master
and in
4 other branches
Refactor discussion reply
Showing
27 changed files
with
229 additions
and
197 deletions
Show diff stats
app/assets/javascripts/notes.js
... | ... | @@ -63,18 +63,19 @@ var NoteList = { |
63 | 63 | |
64 | 64 | // reply to diff notes |
65 | 65 | $(document).on("click", |
66 | - ".js-diff-note-reply-button", | |
67 | - NoteList.replyToDiffNote); | |
66 | + ".js-discussion-reply-button", | |
67 | + NoteList.replyToDiscussionNote); | |
68 | 68 | |
69 | 69 | // hide diff note form |
70 | 70 | $(document).on("click", |
71 | - ".js-hide-diff-note-form", | |
72 | - NoteList.removeDiffNoteForm); | |
71 | + ".js-close-discussion-note-form", | |
72 | + NoteList.removeDiscussionNoteForm); | |
73 | 73 | |
74 | - // do some diff note specific housekeeping when removing a diff note | |
74 | + // do some specific housekeeping when removing a diff or discussion note | |
75 | 75 | $(document).on("click", |
76 | - ".diff_file .js-note-delete", | |
77 | - NoteList.removeDiffNote); | |
76 | + ".diff_file .js-note-delete," + | |
77 | + ".discussion .js-note-delete", | |
78 | + NoteList.removeDiscussionNote); | |
78 | 79 | |
79 | 80 | // remove a note (in general) |
80 | 81 | $(document).on("click", |
... | ... | @@ -102,14 +103,14 @@ var NoteList = { |
102 | 103 | */ |
103 | 104 | addDiffNote: function(e) { |
104 | 105 | // find the form |
105 | - var form = $(".js-note-forms .js-diff-note-form"); | |
106 | + var form = $(".js-note-forms .js-discussion-note-form"); | |
106 | 107 | var row = $(this).closest("tr"); |
107 | 108 | var nextRow = row.next(); |
108 | 109 | |
109 | 110 | // does it already have notes? |
110 | 111 | if (nextRow.is(".notes_holder")) { |
111 | - $.proxy(NoteList.replyToDiffNote, | |
112 | - nextRow.find(".js-diff-note-reply-button") | |
112 | + $.proxy(NoteList.replyToDiscussionNote, | |
113 | + nextRow.find(".js-discussion-reply-button") | |
113 | 114 | ).call(); |
114 | 115 | } else { |
115 | 116 | // add a notes row and insert the form |
... | ... | @@ -117,7 +118,7 @@ var NoteList = { |
117 | 118 | form.clone().appendTo(row.next().find(".notes_content")); |
118 | 119 | |
119 | 120 | // show the form |
120 | - NoteList.setupDiffNoteForm($(this), row.next().find("form")); | |
121 | + NoteList.setupDiscussionNoteForm($(this), row.next().find("form")); | |
121 | 122 | } |
122 | 123 | |
123 | 124 | e.preventDefault(); |
... | ... | @@ -131,11 +132,15 @@ var NoteList = { |
131 | 132 | * |
132 | 133 | * Note: must be called before removeNote() |
133 | 134 | */ |
134 | - removeDiffNote: function() { | |
135 | + removeDiscussionNote: function() { | |
135 | 136 | var notes = $(this).closest(".notes"); |
136 | 137 | |
137 | 138 | // check if this is the last note for this line |
138 | 139 | if (notes.find(".note").length === 1) { |
140 | + // for discussions | |
141 | + notes.closest(".discussion").remove(); | |
142 | + | |
143 | + // for diff lines | |
139 | 144 | notes.closest("tr").remove(); |
140 | 145 | } |
141 | 146 | }, |
... | ... | @@ -146,15 +151,15 @@ var NoteList = { |
146 | 151 | * Shows the reply button again. |
147 | 152 | * Removes the form and if necessary it's temporary row. |
148 | 153 | */ |
149 | - removeDiffNoteForm: function(e) { | |
154 | + removeDiscussionNoteForm: function(e) { | |
150 | 155 | var form = $(this).closest("form"); |
151 | 156 | var row = form.closest("tr"); |
152 | 157 | |
153 | 158 | // show the reply button (will only work for replys) |
154 | - form.prev(".js-diff-note-reply-button").show(); | |
159 | + form.prev(".js-discussion-reply-button").show(); | |
155 | 160 | |
156 | 161 | if (row.is(".js-temp-notes-holder")) { |
157 | - // remove temporary row | |
162 | + // remove temporary row for diff lines | |
158 | 163 | row.remove(); |
159 | 164 | } else { |
160 | 165 | // only remove the form |
... | ... | @@ -179,10 +184,9 @@ var NoteList = { |
179 | 184 | * |
180 | 185 | * Shows the note form below the notes. |
181 | 186 | */ |
182 | - replyToDiffNote: function() { | |
187 | + replyToDiscussionNote: function() { | |
183 | 188 | // find the form |
184 | - var form = $(".js-note-forms .js-diff-note-form"); | |
185 | - | |
189 | + var form = $(".js-note-forms .js-discussion-note-form"); | |
186 | 190 | |
187 | 191 | // hide reply button |
188 | 192 | $(this).hide(); |
... | ... | @@ -190,7 +194,7 @@ var NoteList = { |
190 | 194 | form.clone().insertAfter($(this)); |
191 | 195 | |
192 | 196 | // show the form |
193 | - NoteList.setupDiffNoteForm($(this), $(this).next("form")); | |
197 | + NoteList.setupDiscussionNoteForm($(this), $(this).next("form")); | |
194 | 198 | }, |
195 | 199 | |
196 | 200 | /** |
... | ... | @@ -201,7 +205,7 @@ var NoteList = { |
201 | 205 | * Note: "this" must have the "discussionId", "lineCode", "noteableType" and |
202 | 206 | * "noteableId" data attributes set. |
203 | 207 | */ |
204 | - setupDiffNoteForm: function(data_holder, form) { | |
208 | + setupDiscussionNoteForm: function(data_holder, form) { | |
205 | 209 | // setup note target |
206 | 210 | form.attr("rel", data_holder.data("discussionId")); |
207 | 211 | form.find("#note_line_code").val(data_holder.data("lineCode")); |
... | ... | @@ -210,10 +214,10 @@ var NoteList = { |
210 | 214 | |
211 | 215 | // setup interaction |
212 | 216 | disableButtonIfEmptyField(form.find(".js-note-text"), form.find(".js-comment-button")); |
213 | - setupGfmAutoComplete(); | |
217 | + GitLab.GfmAutoComplete.setup(); | |
214 | 218 | |
215 | 219 | // cleanup after successfully creating a diff note |
216 | - form.on("ajax:success", NoteList.removeDiffNoteForm); | |
220 | + form.on("ajax:success", NoteList.removeDiscussionNoteForm); | |
217 | 221 | |
218 | 222 | form.show(); |
219 | 223 | }, |
... | ... | @@ -249,11 +253,11 @@ var NoteList = { |
249 | 253 | this.bottom_id = newNoteIds.last(); |
250 | 254 | $("#notes-list").html(html); |
251 | 255 | |
252 | - // init infinite scrolling | |
253 | - this.initLoadMore(); | |
254 | - | |
255 | - // init getting new notes | |
256 | 256 | if (this.reversed) { |
257 | + // init infinite scrolling | |
258 | + this.initLoadMore(); | |
259 | + | |
260 | + // init getting new notes | |
257 | 261 | this.initRefreshNew(); |
258 | 262 | } |
259 | 263 | }, |
... | ... | @@ -377,9 +381,9 @@ var NoteList = { |
377 | 381 | appendNewNote: |
378 | 382 | function(id, html) { |
379 | 383 | if (this.reversed) { |
380 | - $("#new-notes-list").prepend(html); | |
384 | + $("#notes-list").prepend(html); | |
381 | 385 | } else { |
382 | - $("#new-notes-list").append(html); | |
386 | + $("#notes-list").append(html); | |
383 | 387 | } |
384 | 388 | this.updateVotes(); |
385 | 389 | }, | ... | ... |
app/assets/stylesheets/sections/notes.scss
... | ... | @@ -46,9 +46,12 @@ ul.notes { |
46 | 46 | @extend .borders; |
47 | 47 | background-color: #F9F9F9; |
48 | 48 | } |
49 | - .diff_file .note { | |
50 | - border-bottom: 0px; | |
51 | - padding: 0px; | |
49 | + .diff_file .notes { | |
50 | + /* reset */ | |
51 | + background: inherit; | |
52 | + border: none; | |
53 | + @include box-shadow(none); | |
54 | + | |
52 | 55 | } |
53 | 56 | .discussion-hidden .note { |
54 | 57 | @extend .cgray; |
... | ... | @@ -59,6 +62,9 @@ ul.notes { |
59 | 62 | border-color: #ddd; |
60 | 63 | padding: 8px; |
61 | 64 | } |
65 | + .reply-btn { | |
66 | + margin-top: 8px; | |
67 | + } | |
62 | 68 | } |
63 | 69 | } |
64 | 70 | |
... | ... | @@ -92,7 +98,7 @@ ul.notes { |
92 | 98 | } |
93 | 99 | } |
94 | 100 | |
95 | -.diff_file tr.notes_holder { | |
101 | +.diff_file .notes_holder { | |
96 | 102 | font-family: $sansFontFamily; |
97 | 103 | font-size: 13px; |
98 | 104 | line-height: 18px; |
... | ... | @@ -112,38 +118,9 @@ ul.notes { |
112 | 118 | } |
113 | 119 | } |
114 | 120 | |
115 | - .comment-btn { | |
121 | + .reply-btn { | |
116 | 122 | margin-top: 8px; |
117 | 123 | } |
118 | - | |
119 | - // TODO: start cleanup | |
120 | - form { | |
121 | - // hide it by default | |
122 | - display: none; | |
123 | - margin: 8px 0; | |
124 | - | |
125 | - .note_actions { | |
126 | - margin:0; | |
127 | - padding-top: 10px; | |
128 | - | |
129 | - .buttons { | |
130 | - float:left; | |
131 | - width:300px; | |
132 | - } | |
133 | - .options { | |
134 | - .labels { | |
135 | - float:left; | |
136 | - padding-left:10px; | |
137 | - label { | |
138 | - padding: 6px 0; | |
139 | - margin: 0; | |
140 | - width:120px; | |
141 | - } | |
142 | - } | |
143 | - } | |
144 | - } | |
145 | - } | |
146 | - // TODO: end cleanup | |
147 | 124 | } |
148 | 125 | |
149 | 126 | /** |
... | ... | @@ -185,6 +162,7 @@ ul.notes { |
185 | 162 | top: 0; |
186 | 163 | } |
187 | 164 | |
165 | +// TODO: start cleaup | |
188 | 166 | .issue_notes, |
189 | 167 | .wiki_notes { |
190 | 168 | .note_content { |
... | ... | @@ -193,6 +171,7 @@ ul.notes { |
193 | 171 | } |
194 | 172 | } |
195 | 173 | |
174 | +/* for loading indicator */ | |
196 | 175 | .notes-status { |
197 | 176 | margin: 18px; |
198 | 177 | } |
... | ... | @@ -205,6 +184,7 @@ p.notify_controls input{ |
205 | 184 | p.notify_controls span{ |
206 | 185 | font-weight: 700; |
207 | 186 | } |
187 | +// TODO: end cleaup | |
208 | 188 | |
209 | 189 | /** |
210 | 190 | * add line note button on the side of diffs |
... | ... | @@ -242,56 +222,49 @@ p.notify_controls span{ |
242 | 222 | * Note Forms |
243 | 223 | */ |
244 | 224 | |
245 | -.comment-btn { | |
225 | +.comment-btn, | |
226 | +.reply-btn { | |
246 | 227 | @extend .save-btn; |
247 | 228 | } |
229 | +.new_discussion_note { | |
230 | + // hide it by default | |
231 | + display: none; | |
232 | + margin: 8px 5px 8px 0; | |
233 | + | |
234 | + // TODO: start cleanup | |
235 | + .note_actions { | |
236 | + margin:0; | |
237 | + padding-top: 10px; | |
238 | + | |
239 | + .buttons { | |
240 | + float:left; | |
241 | + width:300px; | |
242 | + } | |
243 | + .options { | |
244 | + .labels { | |
245 | + float:left; | |
246 | + padding-left:10px; | |
247 | + label { | |
248 | + padding: 6px 0; | |
249 | + margin: 0; | |
250 | + width:120px; | |
251 | + } | |
252 | + } | |
253 | + } | |
254 | + } | |
255 | + // TODO: end cleanup | |
256 | +} | |
248 | 257 | .new_note { |
249 | 258 | textarea { |
250 | 259 | height:80px; |
251 | 260 | width:99%; |
252 | 261 | font-size:14px; |
253 | 262 | } |
254 | -} | |
255 | -.note-forms { | |
256 | - .new_diff_note { | |
257 | - display: none; | |
258 | - } | |
259 | -} | |
260 | - | |
261 | 263 | |
262 | -#new_note { | |
264 | + // TODO: start cleanup | |
263 | 265 | .attach_holder { |
264 | 266 | display:none; |
265 | 267 | } |
266 | -} | |
267 | - | |
268 | -.preview_note { | |
269 | - margin: 2px; | |
270 | - border: 1px solid #ddd; | |
271 | - padding: 10px; | |
272 | - min-height: 60px; | |
273 | - background:#f5f5f5; | |
274 | -} | |
275 | - | |
276 | -form.new_note { | |
277 | - .input-file { | |
278 | - font: 500px monospace; | |
279 | - opacity: 0; | |
280 | - filter: alpha(opacity=0); | |
281 | - position: absolute; | |
282 | - z-index: 1; | |
283 | - top: 0; | |
284 | - right: 0; | |
285 | - padding: 0; | |
286 | - margin: 0; | |
287 | - } | |
288 | - | |
289 | - .note_advanced_opts { | |
290 | - h6 { | |
291 | - line-height: 32px; | |
292 | - padding-right: 15px; | |
293 | - } | |
294 | - } | |
295 | 268 | |
296 | 269 | .attachments { |
297 | 270 | position: relative; |
... | ... | @@ -301,18 +274,17 @@ form.new_note { |
301 | 274 | margin:0 0 5px !important; |
302 | 275 | |
303 | 276 | .input_file { |
304 | - .file_upload { | |
305 | - position: absolute; | |
306 | - right: 14px; | |
307 | - top: 7px; | |
308 | - } | |
309 | - | |
310 | 277 | .file_name { |
311 | 278 | line-height: 30px; |
312 | 279 | width: 240px; |
313 | 280 | height: 28px; |
314 | 281 | overflow: hidden; |
315 | 282 | } |
283 | + .file_upload { | |
284 | + position: absolute; | |
285 | + right:14px; | |
286 | + top:7px; | |
287 | + } | |
316 | 288 | .input-file { |
317 | 289 | width: 260px; |
318 | 290 | height: 41px; |
... | ... | @@ -320,9 +292,41 @@ form.new_note { |
320 | 292 | } |
321 | 293 | } |
322 | 294 | } |
295 | + .input-file { | |
296 | + font: 500px monospace; | |
297 | + opacity:0; | |
298 | + filter: alpha(opacity=0); | |
299 | + position: absolute; | |
300 | + z-index: 1; | |
301 | + top:0; | |
302 | + right:0; | |
303 | + padding:0; | |
304 | + margin: 0; | |
305 | + } | |
306 | + .note_advanced_opts { | |
307 | + h6 { | |
308 | + line-height: 32px; | |
309 | + padding-right: 15px; | |
310 | + } | |
311 | + } | |
312 | + .note-text { | |
313 | + border: 1px solid #aaa; | |
314 | + box-shadow:none; | |
315 | + } | |
316 | + // TODO: end cleanup | |
317 | +} | |
318 | + | |
319 | +// hide the new discussion note form template | |
320 | +.note-forms { | |
321 | + .new_discussion_note { | |
322 | + display: none; | |
323 | + } | |
323 | 324 | } |
324 | 325 | |
325 | -.note-text { | |
326 | - border: 1px solid #aaa; | |
327 | - box-shadow: none; | |
326 | +.preview_note { | |
327 | + margin: 2px; | |
328 | + border: 1px solid #ddd; | |
329 | + padding: 10px; | |
330 | + min-height: 60px; | |
331 | + background:#f5f5f5; | |
328 | 332 | } | ... | ... |
app/controllers/commit_controller.rb
... | ... | @@ -13,10 +13,14 @@ class CommitController < ProjectResourceController |
13 | 13 | @commit = result[:commit] |
14 | 14 | git_not_found! unless @commit |
15 | 15 | |
16 | - @suppress_diff = result[:suppress_diff] | |
17 | - @note = result[:note] | |
18 | - @line_notes = result[:line_notes] | |
19 | - @notes_count = result[:notes_count] | |
16 | + @suppress_diff = result[:suppress_diff] | |
17 | + | |
18 | + @note = result[:note] | |
19 | + @line_notes = result[:line_notes] | |
20 | + @notes_count = result[:notes_count] | |
21 | + @target_type = :commit | |
22 | + @target_id = @commit.id | |
23 | + | |
20 | 24 | @comments_allowed = @reply_allowed = true |
21 | 25 | @comments_target = { noteable_type: 'Commit', |
22 | 26 | noteable_id: @commit.id } | ... | ... |
app/controllers/issues_controller.rb
app/controllers/merge_requests_controller.rb
app/controllers/notes_controller.rb
... | ... | @@ -6,13 +6,11 @@ class NotesController < ProjectResourceController |
6 | 6 | respond_to :js |
7 | 7 | |
8 | 8 | def index |
9 | - @target_note = Note.new(noteable_type: params[:target_type].camelize, | |
10 | - noteable_id: params[:target_id]) | |
11 | - @target = @target_note.noteable | |
12 | 9 | @notes = Notes::LoadContext.new(project, current_user, params).execute |
10 | + @target_type = params[:target_type].camelize | |
11 | + @target_id = params[:target_id] | |
13 | 12 | |
14 | 13 | if params[:target_type] == "merge_request" |
15 | - @mixed_targets = true | |
16 | 14 | @discussions = discussions_from_notes |
17 | 15 | end |
18 | 16 | |
... | ... | @@ -21,6 +19,8 @@ class NotesController < ProjectResourceController |
21 | 19 | |
22 | 20 | def create |
23 | 21 | @note = Notes::CreateContext.new(project, current_user, params).execute |
22 | + @target_type = params[:target_type].camelize | |
23 | + @target_id = params[:target_id] | |
24 | 24 | |
25 | 25 | respond_to do |format| |
26 | 26 | format.html {redirect_to :back} |
... | ... | @@ -58,7 +58,7 @@ class NotesController < ProjectResourceController |
58 | 58 | next if discussion_ids.include?(note.discussion_id) |
59 | 59 | |
60 | 60 | # don't group notes for the main target |
61 | - if for_main_target?(note) | |
61 | + if note_for_main_target?(note) | |
62 | 62 | discussions << [note] |
63 | 63 | else |
64 | 64 | discussions << discussion_notes_for(note) |
... | ... | @@ -70,7 +70,7 @@ class NotesController < ProjectResourceController |
70 | 70 | end |
71 | 71 | |
72 | 72 | # Helps to distinguish e.g. commit notes in mr notes list |
73 | - def for_main_target?(note) | |
74 | - !@mixed_targets || (@target.class.name == note.noteable_type && !note.for_diff_line?) | |
73 | + def note_for_main_target?(note) | |
74 | + @target_type.camelize == note.noteable_type && !note.for_diff_line? | |
75 | 75 | end |
76 | 76 | end | ... | ... |
app/controllers/projects_controller.rb
... | ... | @@ -75,7 +75,10 @@ class ProjectsController < ProjectResourceController |
75 | 75 | |
76 | 76 | def wall |
77 | 77 | return render_404 unless @project.wall_enabled |
78 | - @note = Note.new | |
78 | + | |
79 | + @target_type = :wall | |
80 | + @target_id = nil | |
81 | + @note = @project.notes.new | |
79 | 82 | |
80 | 83 | respond_to do |format| |
81 | 84 | format.html | ... | ... |
app/controllers/snippets_controller.rb
app/helpers/notes_helper.rb
1 | 1 | module NotesHelper |
2 | 2 | # Helps to distinguish e.g. commit notes in mr notes list |
3 | 3 | def note_for_main_target?(note) |
4 | - !@mixed_targets || (@target.class.name == note.noteable_type && !note.for_diff_line?) | |
4 | + @target_type.camelize == note.noteable_type && !note.for_diff_line? | |
5 | + end | |
6 | + | |
7 | + def note_target_fields | |
8 | + hidden_field_tag(:target_type, @target_type) + | |
9 | + hidden_field_tag(:target_id, @target_id) | |
5 | 10 | end |
6 | 11 | |
7 | 12 | def link_to_commit_diff_line_note(note) | ... | ... |
app/views/commit/show.html.haml
app/views/issues/show.html.haml
app/views/merge_requests/_show.html.haml
... | ... | @@ -16,7 +16,7 @@ |
16 | 16 | Diff |
17 | 17 | |
18 | 18 | .merge_request_notes.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" } |
19 | - = render("notes/notes_with_form", tid: @merge_request.id, tt: "merge_request") | |
19 | + = render "notes/notes_with_form" | |
20 | 20 | .merge-request-diffs |
21 | 21 | = render "merge_requests/show/diffs" if @diffs |
22 | 22 | .status | ... | ... |
app/views/merge_requests/show.js.haml
app/views/notes/_common_form.html.haml
1 | 1 | .note-form-holder |
2 | 2 | = form_for [@project, @note], remote: "true", multipart: true do |f| |
3 | + | |
4 | + = note_target_fields | |
5 | + = f.hidden_field :noteable_id | |
6 | + = f.hidden_field :noteable_type | |
7 | + | |
3 | 8 | %h3.page_title Leave a comment |
4 | 9 | -if @note.errors.any? |
5 | 10 | .alert-message.block-message.error |
6 | 11 | - @note.errors.full_messages.each do |msg| |
7 | 12 | %div= msg |
8 | 13 | |
9 | - = f.hidden_field :noteable_id | |
10 | - = f.hidden_field :noteable_type | |
11 | 14 | = f.text_area :note, size: 255, class: 'js-note-text js-gfm-input' |
12 | 15 | #preview-note.preview_note.hide |
13 | 16 | .hint | ... | ... |
app/views/notes/_create_diff_note.js.haml
... | ... | @@ -1,14 +0,0 @@ |
1 | -- if note.valid? | |
2 | - :plain | |
3 | - // hide and reset the form | |
4 | - var form = $("form[rel='#{note.discussion_id}']"); | |
5 | - var row = form.closest("tr"); | |
6 | - | |
7 | - // is this the first note? | |
8 | - if (row.is(".js-temp-notes-holder")) { | |
9 | - // insert the note and the reply button after it | |
10 | - row.after("#{escape_javascript(render "notes/diff_notes_with_reply", notes: [note])}"); | |
11 | - } else { | |
12 | - // instert new note before reply button | |
13 | - row.find(".notes").append("#{escape_javascript(render "notes/note", note: note)}"); | |
14 | - } |
... | ... | @@ -0,0 +1,13 @@ |
1 | +- if note.valid? | |
2 | + :plain | |
3 | + // is this the first note of discussion? | |
4 | + var row = $("form[rel='#{note.discussion_id}']").closest("tr"); | |
5 | + if (row.is(".js-temp-notes-holder")) { | |
6 | + // insert the note and the reply button after it | |
7 | + row.after("#{escape_javascript(render "notes/diff_notes_with_reply", notes: [note])}"); | |
8 | + // will be added again below | |
9 | + row.next().find(".note").remove(); | |
10 | + } | |
11 | + | |
12 | + // append new note to all discussions | |
13 | + $(".notes[rel='#{note.discussion_id}']").append("#{escape_javascript(render "notes/note", note: note)}"); | ... | ... |
app/views/notes/_diff_note_form.html.haml
... | ... | @@ -1,26 +0,0 @@ |
1 | -= form_for [@project, @note], remote: true, html: { multipart: true, class: "new_note new_diff_note js-diff-note-form" } do |f| | |
2 | - .span10 | |
3 | - -if @note.errors.any? | |
4 | - .alert-message.block-message.error | |
5 | - - @note.errors.full_messages.each do |msg| | |
6 | - %div= msg | |
7 | - | |
8 | - = f.hidden_field :noteable_id | |
9 | - = f.hidden_field :noteable_type | |
10 | - = f.hidden_field :line_code | |
11 | - = f.text_area :note, size: 255, class: 'js-note-text js-gfm-input' | |
12 | - .note_actions | |
13 | - .buttons | |
14 | - = f.submit 'Add Comment', class: "btn save-btn js-comment-button" | |
15 | - %button.btn.js-hide-diff-note-form Cancel | |
16 | - .options | |
17 | - %h6.left Notify via email: | |
18 | - .labels | |
19 | - = label_tag :notify do | |
20 | - = check_box_tag :notify, 1, @note.noteable_type != "Commit" | |
21 | - %span Project team | |
22 | - | |
23 | - - if @note.notify_only_author?(current_user) | |
24 | - = label_tag :notify_author do | |
25 | - = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" | |
26 | - %span Commit author |
app/views/notes/_diff_notes_with_reply.html.haml
1 | 1 | - note = notes.first # example note |
2 | -%tr.notes_holder{ data: { :'discussion-id' => note.discussion_id } } | |
2 | +%tr.notes_holder | |
3 | 3 | %td.notes_line{ colspan: 2 } |
4 | 4 | %span.btn.disabled |
5 | 5 | %i.icon-comment |
6 | 6 | = notes.count |
7 | 7 | %td.notes_content |
8 | - %ul.notes | |
8 | + %ul.notes{ rel: note.discussion_id } | |
9 | 9 | = render notes |
10 | 10 | |
11 | - -# reply button | |
12 | - = link_to "javascript:;", | |
13 | - class: "btn comment-btn js-diff-note-reply-button", | |
14 | - data: { noteable_type: note.noteable_type, | |
15 | - noteable_id: note.noteable_id, | |
16 | - line_code: note.line_code, | |
17 | - discussion_id: note.discussion_id }, | |
18 | - title: "Add a comment to this line" do | |
19 | - %i.icon-comment | |
20 | - Reply | |
11 | + = render "notes/discussion_reply_button", note: note | ... | ... |
app/views/notes/_discussion.html.haml
... | ... | @@ -30,11 +30,13 @@ |
30 | 30 | ago |
31 | 31 | .discussion-body |
32 | 32 | - if note.for_diff_line? |
33 | - .diff_file.content | |
34 | - = render "notes/discussion_diff", discussion_notes: discussion_notes, note: note | |
33 | + .content | |
34 | + .diff_file= render "notes/discussion_diff", discussion_notes: discussion_notes, note: note | |
35 | 35 | - else |
36 | - .notes.content | |
37 | - = render discussion_notes | |
36 | + .content | |
37 | + .notes{ rel: discussion_notes.first.discussion_id } | |
38 | + = render discussion_notes | |
39 | + = render "notes/discussion_reply_button", note: discussion_notes.first | |
38 | 40 | |
39 | 41 | -# will be shown when the other one is hidden |
40 | 42 | .discussion-hidden.content.hide | ... | ... |
app/views/notes/_discussion_diff.html.haml
1 | 1 | - diff = note.diff |
2 | 2 | .diff_file_header |
3 | - %i.icon-file | |
4 | 3 | - if diff.deleted_file |
5 | - %span{id: "#{diff.a_path}"}= diff.a_path | |
4 | + %span= diff.old_path | |
6 | 5 | - else |
7 | - %span{id: "#{diff.b_path}"}= diff.b_path | |
6 | + %span= diff.new_path | |
7 | + - if diff.a_mode && diff.b_mode && diff.a_mode != diff.b_mode | |
8 | + %span.file-mode= "#{diff.a_mode} → #{diff.b_mode}" | |
8 | 9 | %br/ |
9 | 10 | .diff_file_content |
10 | 11 | %table | ... | ... |
... | ... | @@ -0,0 +1,28 @@ |
1 | += form_for [@project, @note], remote: true, html: { multipart: true, class: "new_note new_discussion_note js-discussion-note-form" } do |f| | |
2 | + | |
3 | + = note_target_fields | |
4 | + = f.hidden_field :line_code | |
5 | + = f.hidden_field :noteable_id | |
6 | + = f.hidden_field :noteable_type | |
7 | + | |
8 | + -if @note.errors.any? | |
9 | + .alert-message.block-message.error | |
10 | + - @note.errors.full_messages.each do |msg| | |
11 | + %div= msg | |
12 | + | |
13 | + = f.text_area :note, size: 255, class: 'js-note-text js-gfm-input' | |
14 | + .note_actions | |
15 | + .buttons | |
16 | + = f.submit 'Add Comment', class: "btn comment-btn js-comment-button" | |
17 | + %button.btn.js-close-discussion-note-form Cancel | |
18 | + .options | |
19 | + %h6.left Notify via email: | |
20 | + .labels | |
21 | + = label_tag :notify do | |
22 | + = check_box_tag :notify, 1, @note.noteable_type != "Commit" | |
23 | + %span Project team | |
24 | + | |
25 | + - if @note.notify_only_author?(current_user) | |
26 | + = label_tag :notify_author do | |
27 | + = check_box_tag :notify_author, 1 , @note.noteable_type == "Commit" | |
28 | + %span Commit author | ... | ... |
... | ... | @@ -0,0 +1,9 @@ |
1 | += link_to "javascript:;", | |
2 | + class: "btn reply-btn js-discussion-reply-button", | |
3 | + data: { noteable_type: note.noteable_type, | |
4 | + noteable_id: note.noteable_id, | |
5 | + line_code: note.line_code, | |
6 | + discussion_id: note.discussion_id }, | |
7 | + title: "Add a reply" do | |
8 | + %i.icon-comment | |
9 | + Reply | ... | ... |
app/views/notes/_notes_with_form.html.haml
1 | 1 | %ul#notes-list.notes |
2 | -%ul#new-notes-list.notes | |
3 | -.notes-status | |
4 | 2 | |
5 | 3 | - if can? current_user, :write_note, @project |
6 | 4 | .note-forms.js-note-forms |
7 | 5 | = render "notes/common_form" |
8 | - = render "notes/diff_note_form" | |
6 | + = render "notes/discussion_note_form" | |
9 | 7 | |
10 | 8 | :javascript |
11 | 9 | $(function(){ |
12 | - NoteList.init("#{tid}", "#{tt}", "#{project_notes_path(@project)}"); | |
10 | + NoteList.init("#{@target_id}", "#{@target_type}", "#{project_notes_path(@project)}"); | |
13 | 11 | }); | ... | ... |
app/views/notes/_reversed_notes_with_form.html.haml
app/views/notes/create.js.haml
app/views/projects/wall.html.haml
app/views/snippets/show.html.haml