From 463d9f76e449849be15926a7df0564fbc9a35452 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 6 Feb 2015 16:21:26 +0100 Subject: [PATCH] Autosave and autorestore unsaved comments. Closes #1738. --- CHANGELOG | 1 + app/assets/javascripts/application.js.coffee | 1 + app/assets/javascripts/autosave.js.coffee | 33 ++++++++++++++++++++ app/assets/javascripts/notes.js.coffee | 17 ++++++++-- 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 app/assets/javascripts/autosave.js.coffee diff --git a/CHANGELOG b/CHANGELOG index 7addfa7f356..7a2a1901fbf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -67,6 +67,7 @@ v 7.8.0 - When test web hook - show error message instead of 500 error page if connection to hook url was reset - Added support for firing system hooks on group create/destroy and adding/removing users to group (Boyan Tabakov) - Added persistent collapse button for left side nav bar (Jason Blanchard) + - Prevent losing unsaved comments by automatically restoring them when comment page is loaded again. v 7.7.2 - Update GitLab Shell to version 2.4.2 that fixes a bug when developers can push to protected branch diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 4912c534b0e..9c97582e6dd 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -17,6 +17,7 @@ #= require jquery.blockUI #= require jquery.turbolinks #= require turbolinks +#= require autosave #= require bootstrap #= require select2 #= require raphael diff --git a/app/assets/javascripts/autosave.js.coffee b/app/assets/javascripts/autosave.js.coffee new file mode 100644 index 00000000000..3450f4b55f7 --- /dev/null +++ b/app/assets/javascripts/autosave.js.coffee @@ -0,0 +1,33 @@ +class @Autosave + constructor: (field, key) -> + @field = field + + key = key.join("/") if key.join? + @key = "autosave/#{key}" + + @field.data "autosave", this + + @restore() + + @field.on "input", => @save() + + restore: -> + return unless window.localStorage? + + text = window.localStorage.getItem @key + @field.val text if text?.length > 0 + @field.trigger "input" + + save: -> + return unless window.localStorage? + + text = @field.val() + if text?.length > 0 + window.localStorage.setItem @key, text + else + @reset() + + reset: -> + return unless window.localStorage? + + window.localStorage.removeItem @key \ No newline at end of file diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index 15597060c6b..37a7b31d3c8 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -170,6 +170,8 @@ class @Notes form.find(".js-md-write-button").click() form.find(".js-note-text").val("").trigger "input" + form.find(".js-note-text").data("autosave").reset() + ### Called when clicking the "Choose File" button. @@ -220,12 +222,22 @@ class @Notes # setup preview buttons form.find(".js-md-write-button, .js-md-preview-button").tooltip placement: "left" previewButton = form.find(".js-md-preview-button") - form.find(".js-note-text").on "input", -> + + textarea = form.find(".js-note-text") + + textarea.on "input", -> if $(this).val().trim() isnt "" previewButton.removeClass("turn-off").addClass "turn-on" else previewButton.removeClass("turn-on").addClass "turn-off" + new Autosave textarea, [ + "Note" + form.find("#note_commit_id").val() + form.find("#note_line_code").val() + form.find("#note_noteable_type").val() + form.find("#note_noteable_id").val() + ] # remove notify commit author checkbox for non-commit notes form.find(".js-notify-commit-author").remove() if form.find("#note_noteable_type").val() isnt "Commit" @@ -233,7 +245,6 @@ class @Notes new DropzoneInput(form) form.show() - ### Called in response to the new note form being submitted @@ -407,6 +418,8 @@ class @Notes removeDiscussionNoteForm: (form)-> row = form.closest("tr") + form.find(".js-note-text").data("autosave").reset() + # show the reply button (will only work for replies) form.prev(".js-discussion-reply-button").show() if row.is(".js-temp-notes-holder")