Commit 9305ef8940988fc9baad7c5196819f272445dd9b
1 parent
f554aa38
Exists in
spb-stable
and in
3 other branches
Remove old methods and classes
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Showing
3 changed files
with
10 additions
and
594 deletions
Show diff stats
app/assets/javascripts/notes.js
| @@ -1,584 +0,0 @@ | @@ -1,584 +0,0 @@ | ||
| 1 | -var NoteList = { | ||
| 2 | - id: null, | ||
| 3 | - notes_path: null, | ||
| 4 | - target_params: null, | ||
| 5 | - target_id: 0, | ||
| 6 | - target_type: null, | ||
| 7 | - | ||
| 8 | - init: function(tid, tt, path) { | ||
| 9 | - NoteList.notes_path = path + ".json"; | ||
| 10 | - NoteList.target_id = tid; | ||
| 11 | - NoteList.target_type = tt; | ||
| 12 | - NoteList.target_params = "target_type=" + NoteList.target_type + "&target_id=" + NoteList.target_id; | ||
| 13 | - | ||
| 14 | - NoteList.setupMainTargetNoteForm(); | ||
| 15 | - | ||
| 16 | - // Unbind events to prevent firing twice | ||
| 17 | - $(document).off("click", ".js-add-diff-note-button"); | ||
| 18 | - $(document).off("click", ".js-discussion-reply-button"); | ||
| 19 | - $(document).off("click", ".js-note-preview-button"); | ||
| 20 | - $(document).off("click", ".js-note-attachment-input"); | ||
| 21 | - $(document).off("click", ".js-close-discussion-note-form"); | ||
| 22 | - $(document).off("click", ".js-note-delete"); | ||
| 23 | - $(document).off("click", ".js-note-edit"); | ||
| 24 | - $(document).off("click", ".js-note-edit-cancel"); | ||
| 25 | - $(document).off("click", ".js-note-attachment-delete"); | ||
| 26 | - $(document).off("click", ".js-choose-note-attachment-button"); | ||
| 27 | - $(document).off("click", ".js-show-outdated-discussion"); | ||
| 28 | - | ||
| 29 | - $(document).off("ajax:complete", ".js-main-target-form"); | ||
| 30 | - | ||
| 31 | - | ||
| 32 | - // add a new diff note | ||
| 33 | - $(document).on("click", | ||
| 34 | - ".js-add-diff-note-button", | ||
| 35 | - NoteList.addDiffNote); | ||
| 36 | - | ||
| 37 | - // reply to diff/discussion notes | ||
| 38 | - $(document).on("click", | ||
| 39 | - ".js-discussion-reply-button", | ||
| 40 | - NoteList.replyToDiscussionNote); | ||
| 41 | - | ||
| 42 | - // setup note preview | ||
| 43 | - $(document).on("click", | ||
| 44 | - ".js-note-preview-button", | ||
| 45 | - NoteList.previewNote); | ||
| 46 | - | ||
| 47 | - // update the file name when an attachment is selected | ||
| 48 | - $(document).on("change", | ||
| 49 | - ".js-note-attachment-input", | ||
| 50 | - NoteList.updateFormAttachment); | ||
| 51 | - | ||
| 52 | - // hide diff note form | ||
| 53 | - $(document).on("click", | ||
| 54 | - ".js-close-discussion-note-form", | ||
| 55 | - NoteList.removeDiscussionNoteForm); | ||
| 56 | - | ||
| 57 | - // remove a note (in general) | ||
| 58 | - $(document).on("click", | ||
| 59 | - ".js-note-delete", | ||
| 60 | - NoteList.removeNote); | ||
| 61 | - | ||
| 62 | - // show the edit note form | ||
| 63 | - $(document).on("click", | ||
| 64 | - ".js-note-edit", | ||
| 65 | - NoteList.showEditNoteForm); | ||
| 66 | - | ||
| 67 | - // cancel note editing | ||
| 68 | - $(document).on("click", | ||
| 69 | - ".note-edit-cancel", | ||
| 70 | - NoteList.cancelNoteEdit); | ||
| 71 | - | ||
| 72 | - // delete note attachment | ||
| 73 | - $(document).on("click", | ||
| 74 | - ".js-note-attachment-delete", | ||
| 75 | - NoteList.deleteNoteAttachment); | ||
| 76 | - | ||
| 77 | - // update the note after editing | ||
| 78 | - $(document).on("ajax:complete", | ||
| 79 | - "form.edit_note", | ||
| 80 | - NoteList.updateNote); | ||
| 81 | - | ||
| 82 | - // reset main target form after submit | ||
| 83 | - $(document).on("ajax:complete", | ||
| 84 | - ".js-main-target-form", | ||
| 85 | - NoteList.resetMainTargetForm); | ||
| 86 | - | ||
| 87 | - | ||
| 88 | - $(document).on("click", | ||
| 89 | - ".js-choose-note-attachment-button", | ||
| 90 | - NoteList.chooseNoteAttachment); | ||
| 91 | - | ||
| 92 | - $(document).on("click", | ||
| 93 | - ".js-show-outdated-discussion", | ||
| 94 | - function(e) { $(this).next('.outdated-discussion').show(); e.preventDefault() }); | ||
| 95 | - }, | ||
| 96 | - | ||
| 97 | - | ||
| 98 | - /** | ||
| 99 | - * When clicking on buttons | ||
| 100 | - */ | ||
| 101 | - | ||
| 102 | - /** | ||
| 103 | - * Called when clicking on the "add a comment" button on the side of a diff line. | ||
| 104 | - * | ||
| 105 | - * Inserts a temporary row for the form below the line. | ||
| 106 | - * Sets up the form and shows it. | ||
| 107 | - */ | ||
| 108 | - addDiffNote: function(e) { | ||
| 109 | - e.preventDefault(); | ||
| 110 | - | ||
| 111 | - // find the form | ||
| 112 | - var form = $(".js-new-note-form"); | ||
| 113 | - var row = $(this).closest("tr"); | ||
| 114 | - var nextRow = row.next(); | ||
| 115 | - | ||
| 116 | - // does it already have notes? | ||
| 117 | - if (nextRow.is(".notes_holder")) { | ||
| 118 | - $.proxy(NoteList.replyToDiscussionNote, | ||
| 119 | - nextRow.find(".js-discussion-reply-button") | ||
| 120 | - ).call(); | ||
| 121 | - } else { | ||
| 122 | - // add a notes row and insert the form | ||
| 123 | - row.after('<tr class="notes_holder js-temp-notes-holder"><td class="notes_line" colspan="2"></td><td class="notes_content"></td></tr>'); | ||
| 124 | - form.clone().appendTo(row.next().find(".notes_content")); | ||
| 125 | - | ||
| 126 | - // show the form | ||
| 127 | - NoteList.setupDiscussionNoteForm($(this), row.next().find("form")); | ||
| 128 | - } | ||
| 129 | - }, | ||
| 130 | - | ||
| 131 | - /** | ||
| 132 | - * Called when clicking the "Choose File" button. | ||
| 133 | - * | ||
| 134 | - * Opens the file selection dialog. | ||
| 135 | - */ | ||
| 136 | - chooseNoteAttachment: function() { | ||
| 137 | - var form = $(this).closest("form"); | ||
| 138 | - | ||
| 139 | - form.find(".js-note-attachment-input").click(); | ||
| 140 | - }, | ||
| 141 | - | ||
| 142 | - /** | ||
| 143 | - * Shows the note preview. | ||
| 144 | - * | ||
| 145 | - * Lets the server render GFM into Html and displays it. | ||
| 146 | - * | ||
| 147 | - * Note: uses the Toggler behavior to toggle preview/edit views/buttons | ||
| 148 | - */ | ||
| 149 | - previewNote: function(e) { | ||
| 150 | - e.preventDefault(); | ||
| 151 | - | ||
| 152 | - var form = $(this).closest("form"); | ||
| 153 | - var preview = form.find('.js-note-preview'); | ||
| 154 | - var noteText = form.find('.js-note-text').val(); | ||
| 155 | - | ||
| 156 | - if(noteText.trim().length === 0) { | ||
| 157 | - preview.text('Nothing to preview.'); | ||
| 158 | - } else { | ||
| 159 | - preview.text('Loading...'); | ||
| 160 | - $.post($(this).data('url'), {note: noteText}) | ||
| 161 | - .success(function(previewData) { | ||
| 162 | - preview.html(previewData); | ||
| 163 | - }); | ||
| 164 | - } | ||
| 165 | - }, | ||
| 166 | - | ||
| 167 | - /** | ||
| 168 | - * Called in response to "cancel" on a diff note form. | ||
| 169 | - * | ||
| 170 | - * Shows the reply button again. | ||
| 171 | - * Removes the form and if necessary it's temporary row. | ||
| 172 | - */ | ||
| 173 | - removeDiscussionNoteForm: function() { | ||
| 174 | - var form = $(this).closest("form"); | ||
| 175 | - var row = form.closest("tr"); | ||
| 176 | - | ||
| 177 | - // show the reply button (will only work for replies) | ||
| 178 | - form.prev(".js-discussion-reply-button").show(); | ||
| 179 | - | ||
| 180 | - if (row.is(".js-temp-notes-holder")) { | ||
| 181 | - // remove temporary row for diff lines | ||
| 182 | - row.remove(); | ||
| 183 | - } else { | ||
| 184 | - // only remove the form | ||
| 185 | - form.remove(); | ||
| 186 | - } | ||
| 187 | - }, | ||
| 188 | - | ||
| 189 | - /** | ||
| 190 | - * Called in response to deleting a note of any kind. | ||
| 191 | - * | ||
| 192 | - * Removes the actual note from view. | ||
| 193 | - * Removes the whole discussion if the last note is being removed. | ||
| 194 | - */ | ||
| 195 | - removeNote: function() { | ||
| 196 | - var note = $(this).closest(".note"); | ||
| 197 | - var notes = note.closest(".notes"); | ||
| 198 | - | ||
| 199 | - // check if this is the last note for this line | ||
| 200 | - if (notes.find(".note").length === 1) { | ||
| 201 | - // for discussions | ||
| 202 | - notes.closest(".discussion").remove(); | ||
| 203 | - | ||
| 204 | - // for diff lines | ||
| 205 | - notes.closest("tr").remove(); | ||
| 206 | - } | ||
| 207 | - | ||
| 208 | - note.remove(); | ||
| 209 | - NoteList.updateVotes(); | ||
| 210 | - }, | ||
| 211 | - | ||
| 212 | - /** | ||
| 213 | - * Called in response to clicking the edit note link | ||
| 214 | - * | ||
| 215 | - * Replaces the note text with the note edit form | ||
| 216 | - * Adds a hidden div with the original content of the note to fill the edit note form with | ||
| 217 | - * if the user cancels | ||
| 218 | - */ | ||
| 219 | - showEditNoteForm: function(e) { | ||
| 220 | - e.preventDefault(); | ||
| 221 | - var note = $(this).closest(".note"); | ||
| 222 | - note.find(".note-text").hide(); | ||
| 223 | - | ||
| 224 | - // Show the attachment delete link | ||
| 225 | - note.find(".js-note-attachment-delete").show(); | ||
| 226 | - | ||
| 227 | - GitLab.GfmAutoComplete.setup(); | ||
| 228 | - | ||
| 229 | - var form = note.find(".note-edit-form"); | ||
| 230 | - form.show(); | ||
| 231 | - | ||
| 232 | - var textarea = form.find("textarea"); | ||
| 233 | - if (form.find(".note-original-content").length === 0) { | ||
| 234 | - var p = $("<p></p>").text(textarea.val()); | ||
| 235 | - var hidden_div = $('<div class="note-original-content"></div>').append(p); | ||
| 236 | - form.append(hidden_div); | ||
| 237 | - hidden_div.hide(); | ||
| 238 | - } | ||
| 239 | - textarea.focus(); | ||
| 240 | - }, | ||
| 241 | - | ||
| 242 | - /** | ||
| 243 | - * Called in response to clicking the cancel button when editing a note | ||
| 244 | - * | ||
| 245 | - * Resets and hides the note editing form | ||
| 246 | - */ | ||
| 247 | - cancelNoteEdit: function(e) { | ||
| 248 | - e.preventDefault(); | ||
| 249 | - var note = $(this).closest(".note"); | ||
| 250 | - NoteList.resetNoteEditing(note); | ||
| 251 | - }, | ||
| 252 | - | ||
| 253 | - | ||
| 254 | - /** | ||
| 255 | - * Called in response to clicking the delete attachment link | ||
| 256 | - * | ||
| 257 | - * Removes the attachment wrapper view, including image tag if it exists | ||
| 258 | - * Resets the note editing form | ||
| 259 | - */ | ||
| 260 | - deleteNoteAttachment: function() { | ||
| 261 | - var note = $(this).closest(".note"); | ||
| 262 | - note.find(".note-attachment").remove(); | ||
| 263 | - NoteList.resetNoteEditing(note); | ||
| 264 | - NoteList.rewriteTimestamp(note.find(".note-last-update")); | ||
| 265 | - }, | ||
| 266 | - | ||
| 267 | - | ||
| 268 | - /** | ||
| 269 | - * Called when clicking on the "reply" button for a diff line. | ||
| 270 | - * | ||
| 271 | - * Shows the note form below the notes. | ||
| 272 | - */ | ||
| 273 | - replyToDiscussionNote: function() { | ||
| 274 | - // find the form | ||
| 275 | - var form = $(".js-new-note-form"); | ||
| 276 | - | ||
| 277 | - // hide reply button | ||
| 278 | - $(this).hide(); | ||
| 279 | - // insert the form after the button | ||
| 280 | - form.clone().insertAfter($(this)); | ||
| 281 | - | ||
| 282 | - // show the form | ||
| 283 | - NoteList.setupDiscussionNoteForm($(this), $(this).next("form")); | ||
| 284 | - }, | ||
| 285 | - | ||
| 286 | - | ||
| 287 | - /** | ||
| 288 | - * Helper for inserting and setting up note forms. | ||
| 289 | - */ | ||
| 290 | - | ||
| 291 | - | ||
| 292 | - /** | ||
| 293 | - * Called in response to creating a note failing validation. | ||
| 294 | - * | ||
| 295 | - * Adds the rendered errors to the respective form. | ||
| 296 | - * If "discussionId" is null or undefined, the main target form is assumed. | ||
| 297 | - */ | ||
| 298 | - errorsOnForm: function(errorsHtml, discussionId) { | ||
| 299 | - // find the form | ||
| 300 | - if (discussionId) { | ||
| 301 | - var form = $("form[rel='"+discussionId+"']"); | ||
| 302 | - } else { | ||
| 303 | - var form = $(".js-main-target-form"); | ||
| 304 | - } | ||
| 305 | - | ||
| 306 | - form.find(".js-errors").remove(); | ||
| 307 | - form.prepend(errorsHtml); | ||
| 308 | - | ||
| 309 | - form.find(".js-note-text").focus(); | ||
| 310 | - }, | ||
| 311 | - | ||
| 312 | - | ||
| 313 | - /** | ||
| 314 | - * Shows the diff/discussion form and does some setup on it. | ||
| 315 | - * | ||
| 316 | - * Sets some hidden fields in the form. | ||
| 317 | - * | ||
| 318 | - * Note: dataHolder must have the "discussionId", "lineCode", "noteableType" | ||
| 319 | - * and "noteableId" data attributes set. | ||
| 320 | - */ | ||
| 321 | - setupDiscussionNoteForm: function(dataHolder, form) { | ||
| 322 | - // setup note target | ||
| 323 | - form.attr("rel", dataHolder.data("discussionId")); | ||
| 324 | - form.find("#note_commit_id").val(dataHolder.data("commitId")); | ||
| 325 | - form.find("#note_line_code").val(dataHolder.data("lineCode")); | ||
| 326 | - form.find("#note_noteable_type").val(dataHolder.data("noteableType")); | ||
| 327 | - form.find("#note_noteable_id").val(dataHolder.data("noteableId")); | ||
| 328 | - | ||
| 329 | - NoteList.setupNoteForm(form); | ||
| 330 | - | ||
| 331 | - form.find(".js-note-text").focus(); | ||
| 332 | - }, | ||
| 333 | - | ||
| 334 | - /** | ||
| 335 | - * Shows the main form and does some setup on it. | ||
| 336 | - * | ||
| 337 | - * Sets some hidden fields in the form. | ||
| 338 | - */ | ||
| 339 | - setupMainTargetNoteForm: function() { | ||
| 340 | - // find the form | ||
| 341 | - var form = $(".js-new-note-form"); | ||
| 342 | - // insert the form after the button | ||
| 343 | - form.clone().replaceAll($(".js-main-target-form")); | ||
| 344 | - | ||
| 345 | - form = form.prev("form"); | ||
| 346 | - | ||
| 347 | - // show the form | ||
| 348 | - NoteList.setupNoteForm(form); | ||
| 349 | - | ||
| 350 | - // fix classes | ||
| 351 | - form.removeClass("js-new-note-form"); | ||
| 352 | - form.addClass("js-main-target-form"); | ||
| 353 | - | ||
| 354 | - // remove unnecessary fields and buttons | ||
| 355 | - form.find("#note_line_code").remove(); | ||
| 356 | - form.find(".js-close-discussion-note-form").remove(); | ||
| 357 | - }, | ||
| 358 | - | ||
| 359 | - /** | ||
| 360 | - * General note form setup. | ||
| 361 | - * | ||
| 362 | - * * deactivates the submit button when text is empty | ||
| 363 | - * * hides the preview button when text is empty | ||
| 364 | - * * setup GFM auto complete | ||
| 365 | - * * show the form | ||
| 366 | - */ | ||
| 367 | - setupNoteForm: function(form) { | ||
| 368 | - disableButtonIfEmptyField(form.find(".js-note-text"), form.find(".js-comment-button")); | ||
| 369 | - | ||
| 370 | - form.removeClass("js-new-note-form"); | ||
| 371 | - | ||
| 372 | - // setup preview buttons | ||
| 373 | - form.find(".js-note-edit-button, .js-note-preview-button") | ||
| 374 | - .tooltip({ placement: 'left' }); | ||
| 375 | - | ||
| 376 | - previewButton = form.find(".js-note-preview-button"); | ||
| 377 | - form.find(".js-note-text").on("input", function() { | ||
| 378 | - if ($(this).val().trim() !== "") { | ||
| 379 | - previewButton.removeClass("turn-off").addClass("turn-on"); | ||
| 380 | - } else { | ||
| 381 | - previewButton.removeClass("turn-on").addClass("turn-off"); | ||
| 382 | - } | ||
| 383 | - }); | ||
| 384 | - | ||
| 385 | - // remove notify commit author checkbox for non-commit notes | ||
| 386 | - if (form.find("#note_noteable_type").val() !== "Commit") { | ||
| 387 | - form.find(".js-notify-commit-author").remove(); | ||
| 388 | - } | ||
| 389 | - | ||
| 390 | - GitLab.GfmAutoComplete.setup(); | ||
| 391 | - | ||
| 392 | - form.show(); | ||
| 393 | - }, | ||
| 394 | - | ||
| 395 | - | ||
| 396 | - /** | ||
| 397 | - * Handle loading the initial set of notes. | ||
| 398 | - * And set up loading more notes when scrolling to the bottom of the page. | ||
| 399 | - */ | ||
| 400 | - | ||
| 401 | - | ||
| 402 | - /** | ||
| 403 | - * Gets an initial set of notes. | ||
| 404 | - */ | ||
| 405 | - getContent: function() { | ||
| 406 | - $.ajax({ | ||
| 407 | - url: NoteList.notes_path, | ||
| 408 | - data: NoteList.target_params, | ||
| 409 | - complete: function(){ $('.js-notes-busy').removeClass("loading")}, | ||
| 410 | - beforeSend: function() { $('.js-notes-busy').addClass("loading") }, | ||
| 411 | - success: function(data) { | ||
| 412 | - NoteList.setContent(data.html); | ||
| 413 | - }, | ||
| 414 | - dataType: "json" | ||
| 415 | - }); | ||
| 416 | - }, | ||
| 417 | - | ||
| 418 | - /** | ||
| 419 | - * Called in response to getContent(). | ||
| 420 | - * Replaces the content of #notes-list with the given html. | ||
| 421 | - */ | ||
| 422 | - setContent: function(html) { | ||
| 423 | - $("#notes-list").html(html); | ||
| 424 | - }, | ||
| 425 | - | ||
| 426 | - | ||
| 427 | - /** | ||
| 428 | - * Adds a single common note to #notes-list. | ||
| 429 | - */ | ||
| 430 | - appendNewNote: function(id, html) { | ||
| 431 | - $("#notes-list").append(html); | ||
| 432 | - NoteList.updateVotes(); | ||
| 433 | - }, | ||
| 434 | - | ||
| 435 | - /** | ||
| 436 | - * Adds a single discussion note to #notes-list. | ||
| 437 | - * | ||
| 438 | - * Also removes the corresponding form. | ||
| 439 | - */ | ||
| 440 | - appendNewDiscussionNote: function(discussionId, diffRowHtml, noteHtml) { | ||
| 441 | - var form = $("form[rel='"+discussionId+"']"); | ||
| 442 | - var row = form.closest("tr"); | ||
| 443 | - | ||
| 444 | - // is this the first note of discussion? | ||
| 445 | - if (row.is(".js-temp-notes-holder")) { | ||
| 446 | - // insert the note and the reply button after the temp row | ||
| 447 | - row.after(diffRowHtml); | ||
| 448 | - // remove the note (will be added again below) | ||
| 449 | - row.next().find(".note").remove(); | ||
| 450 | - } | ||
| 451 | - | ||
| 452 | - // append new note to all matching discussions | ||
| 453 | - $(".notes[rel='"+discussionId+"']").append(noteHtml); | ||
| 454 | - | ||
| 455 | - // cleanup after successfully creating a diff/discussion note | ||
| 456 | - $.proxy(NoteList.removeDiscussionNoteForm, form).call(); | ||
| 457 | - }, | ||
| 458 | - | ||
| 459 | - /** | ||
| 460 | - * Called in response the main target form has been successfully submitted. | ||
| 461 | - * | ||
| 462 | - * Removes any errors. | ||
| 463 | - * Resets text and preview. | ||
| 464 | - * Resets buttons. | ||
| 465 | - */ | ||
| 466 | - resetMainTargetForm: function(){ | ||
| 467 | - var form = $(this); | ||
| 468 | - | ||
| 469 | - // remove validation errors | ||
| 470 | - form.find(".js-errors").remove(); | ||
| 471 | - | ||
| 472 | - // reset text and preview | ||
| 473 | - var previewContainer = form.find(".js-toggler-container.note_text_and_preview"); | ||
| 474 | - if (previewContainer.is(".on")) { | ||
| 475 | - previewContainer.removeClass("on"); | ||
| 476 | - } | ||
| 477 | - form.find(".js-note-text").val("").trigger("input"); | ||
| 478 | - }, | ||
| 479 | - | ||
| 480 | - /** | ||
| 481 | - * Called after an attachment file has been selected. | ||
| 482 | - * | ||
| 483 | - * Updates the file name for the selected attachment. | ||
| 484 | - */ | ||
| 485 | - updateFormAttachment: function() { | ||
| 486 | - var form = $(this).closest("form"); | ||
| 487 | - | ||
| 488 | - // get only the basename | ||
| 489 | - var filename = $(this).val().replace(/^.*[\\\/]/, ''); | ||
| 490 | - | ||
| 491 | - form.find(".js-attachment-filename").text(filename); | ||
| 492 | - }, | ||
| 493 | - | ||
| 494 | - /** | ||
| 495 | - * Recalculates the votes and updates them (if they are displayed at all). | ||
| 496 | - * | ||
| 497 | - * Assumes all relevant notes are displayed (i.e. there are no more notes to | ||
| 498 | - * load via getMore()). | ||
| 499 | - * Might produce inaccurate results when not all notes have been loaded and a | ||
| 500 | - * recalculation is triggered (e.g. when deleting a note). | ||
| 501 | - */ | ||
| 502 | - updateVotes: function() { | ||
| 503 | - var votes = $("#votes .votes"); | ||
| 504 | - var notes = $("#notes-list .note .vote"); | ||
| 505 | - | ||
| 506 | - // only update if there is a vote display | ||
| 507 | - if (votes.size()) { | ||
| 508 | - var upvotes = notes.filter(".upvote").size(); | ||
| 509 | - var downvotes = notes.filter(".downvote").size(); | ||
| 510 | - var votesCount = upvotes + downvotes; | ||
| 511 | - var upvotesPercent = votesCount ? (100.0 / votesCount * upvotes) : 0; | ||
| 512 | - var downvotesPercent = votesCount ? (100.0 - upvotesPercent) : 0; | ||
| 513 | - | ||
| 514 | - // change vote bar lengths | ||
| 515 | - votes.find(".bar-success").css("width", upvotesPercent+"%"); | ||
| 516 | - votes.find(".bar-danger").css("width", downvotesPercent+"%"); | ||
| 517 | - // replace vote numbers | ||
| 518 | - votes.find(".upvotes").text(votes.find(".upvotes").text().replace(/\d+/, upvotes)); | ||
| 519 | - votes.find(".downvotes").text(votes.find(".downvotes").text().replace(/\d+/, downvotes)); | ||
| 520 | - } | ||
| 521 | - }, | ||
| 522 | - | ||
| 523 | - /** | ||
| 524 | - * Called in response to the edit note form being submitted | ||
| 525 | - * | ||
| 526 | - * Updates the current note field. | ||
| 527 | - * Hides the edit note form | ||
| 528 | - */ | ||
| 529 | - updateNote: function(e, xhr, settings) { | ||
| 530 | - response = JSON.parse(xhr.responseText); | ||
| 531 | - if (response.success) { | ||
| 532 | - var note_li = $("#note_" + response.id); | ||
| 533 | - var note_text = note_li.find(".note-text"); | ||
| 534 | - note_text.html(response.note).show(); | ||
| 535 | - | ||
| 536 | - var note_form = note_li.find(".note-edit-form"); | ||
| 537 | - var original_content = note_form.find(".note-original-content"); | ||
| 538 | - original_content.remove(); | ||
| 539 | - note_form.hide(); | ||
| 540 | - note_form.find(".btn-save").enableButton(); | ||
| 541 | - | ||
| 542 | - // Update the "Edited at xxx label" on the note to show it's just been updated | ||
| 543 | - NoteList.rewriteTimestamp(note_li.find(".note-last-update")); | ||
| 544 | - } | ||
| 545 | - }, | ||
| 546 | - | ||
| 547 | - /** | ||
| 548 | - * Called in response to the 'cancel note' link clicked, or after deleting a note attachment | ||
| 549 | - * | ||
| 550 | - * Hides the edit note form and shows the note | ||
| 551 | - * Resets the edit note form textarea with the original content of the note | ||
| 552 | - */ | ||
| 553 | - resetNoteEditing: function(note) { | ||
| 554 | - note.find(".note-text").show(); | ||
| 555 | - | ||
| 556 | - // Hide the attachment delete link | ||
| 557 | - note.find(".js-note-attachment-delete").hide(); | ||
| 558 | - | ||
| 559 | - // Put the original content of the note back into the edit form textarea | ||
| 560 | - var form = note.find(".note-edit-form"); | ||
| 561 | - var original_content = form.find(".note-original-content"); | ||
| 562 | - form.find("textarea").val(original_content.text()); | ||
| 563 | - original_content.remove(); | ||
| 564 | - | ||
| 565 | - note.find(".note-edit-form").hide(); | ||
| 566 | - }, | ||
| 567 | - | ||
| 568 | - /** | ||
| 569 | - * Utility function to generate new timestamp text for a note | ||
| 570 | - * | ||
| 571 | - */ | ||
| 572 | - rewriteTimestamp: function(element) { | ||
| 573 | - // Strip all newlines from the existing timestamp | ||
| 574 | - var ts = element.text().replace(/\n/g, ' ').trim(); | ||
| 575 | - | ||
| 576 | - // If the timestamp already has '(Edited xxx ago)' text, remove it | ||
| 577 | - ts = ts.replace(new RegExp("\\(Edited [A-Za-z0-9 ]+\\)$", "gi"), ""); | ||
| 578 | - | ||
| 579 | - // Append "(Edited just now)" | ||
| 580 | - ts = (ts + " <small>(Edited just now)</small>"); | ||
| 581 | - | ||
| 582 | - element.html(ts); | ||
| 583 | - } | ||
| 584 | -}; |
app/assets/stylesheets/sections/notes.scss
app/helpers/notes_helper.rb
| 1 | module NotesHelper | 1 | module NotesHelper |
| 2 | # Helps to distinguish e.g. commit notes in mr notes list | 2 | # Helps to distinguish e.g. commit notes in mr notes list |
| 3 | def note_for_main_target?(note) | 3 | def note_for_main_target?(note) |
| 4 | - (@target_type.camelize == note.noteable_type && !note.for_diff_line?) | 4 | + (@noteable.class.name == note.noteable_type && !note.for_diff_line?) |
| 5 | end | 5 | end |
| 6 | 6 | ||
| 7 | def note_target_fields | 7 | def note_target_fields |
| @@ -21,14 +21,6 @@ module NotesHelper | @@ -21,14 +21,6 @@ module NotesHelper | ||
| 21 | end | 21 | end |
| 22 | end | 22 | end |
| 23 | 23 | ||
| 24 | - def loading_more_notes? | ||
| 25 | - params[:loading_more].present? | ||
| 26 | - end | ||
| 27 | - | ||
| 28 | - def loading_new_notes? | ||
| 29 | - params[:loading_new].present? | ||
| 30 | - end | ||
| 31 | - | ||
| 32 | def note_timestamp(note) | 24 | def note_timestamp(note) |
| 33 | # Shows the created at time and the updated at time if different | 25 | # Shows the created at time and the updated at time if different |
| 34 | ts = "#{time_ago_with_tooltip(note.created_at, 'bottom', 'note_created_ago')} ago" | 26 | ts = "#{time_ago_with_tooltip(note.created_at, 'bottom', 'note_created_ago')} ago" |
| @@ -41,4 +33,13 @@ module NotesHelper | @@ -41,4 +33,13 @@ module NotesHelper | ||
| 41 | end | 33 | end |
| 42 | ts.html_safe | 34 | ts.html_safe |
| 43 | end | 35 | end |
| 36 | + | ||
| 37 | + def noteable_json(noteable) | ||
| 38 | + { | ||
| 39 | + id: noteable.id, | ||
| 40 | + class: noteable.class.name, | ||
| 41 | + resources: noteable.class.table_name, | ||
| 42 | + project_id: noteable.project.id, | ||
| 43 | + }.to_json | ||
| 44 | + end | ||
| 44 | end | 45 | end |