From 463d9f76e449849be15926a7df0564fbc9a35452 Mon Sep 17 00:00:00 2001
From: Douwe Maan <douwe@gitlab.com>
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")
-- 
GitLab