From 59b4f70a756ec161e295cba6a75e278b3985b8e8 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Tue, 15 Jan 2019 13:52:04 -0700 Subject: [PATCH] Improve note creation and deletion error handling and reliability --- www/js/NotePostNotes.class.js | 325 +++++++++++++++++----------------- www/js/Notes.class.js | 3 + www/js/editnote.js | 45 +++-- www/js/home.js | 1 + 4 files changed, 201 insertions(+), 173 deletions(-) diff --git a/www/js/NotePostNotes.class.js b/www/js/NotePostNotes.class.js index fcf95c1..b81c4e8 100644 --- a/www/js/NotePostNotes.class.js +++ b/www/js/NotePostNotes.class.js @@ -4,177 +4,184 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ class NotePostNotes extends Notes { - constructor(server, username, password) { - super(); - this.server = server; - this.username = username; - this.password = password; - } - - del(noteid, success, error) { - super.del(noteid); - var self = this; - return $.ajax({ - url: this.server + "/api/deletenote", - dataType: "json", - cache: false, - method: "POST", - data: { - id: noteid - }, - beforeSend: function (xhr) { - xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password)); - }, - success: function (val) { - if (val.status == "OK") { - self.notes = val.notes; - } - - if (typeof success == 'function') { - success(); - } - }, - error: function () { - if (typeof error == 'function') { - error(); - } - } - }); - } + constructor(server, username, password) { + super(); + this.server = server; + this.username = username; + this.password = password; + } - add(note, success, error) { - note.norealid = true; - this.saveNote(note, success, error); - } + del(noteid, success, error) { + super.del(noteid); + var self = this; + return $.ajax({ + url: this.server + "/api/deletenote", + dataType: "json", + cache: false, + method: "POST", + data: { + id: noteid + }, + beforeSend: function (xhr) { + xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password)); + }, + success: function (val) { + if (val.status == "OK") { + self.notes = val.notes; + } - getNote(noteid, success, error) { - return $.ajax({ - url: this.server + "/api/getnote", - dataType: "json", - method: "POST", - data: { - id: noteid - }, - beforeSend: function (xhr) { - xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password)); - }, - success: function (val) { - if (val.status == "OK") { - if (typeof success == 'function') { - success(val.note); - } - } else { - if (typeof error == 'function') { - error(val.msg); - } - } - }, - error: function () { - if (typeof error == 'function') { - error(); - } - } - }); - } + if (typeof success == 'function') { + success(); + } + }, + error: function () { + if (typeof error == 'function') { + error(); + } + } + }); + } - saveNote(note, success, error) { - var self = this; - var data = { - text: note.content, - color: note.color, - modified: note.modified, - favorite: note.favorite ? "1" : "0" - }; // Don't send ID if it's a locally-made note + add(note, success, error) { + note.norealid = true; + this.saveNote(note, success, error); + } - if (note.norealid != true) { - data.id = note.noteid; + getNote(noteid, success, error) { + return $.ajax({ + url: this.server + "/api/getnote", + dataType: "json", + method: "POST", + data: { + id: noteid + }, + beforeSend: function (xhr) { + xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password)); + }, + success: function (val) { + if (val.status == "OK") { + if (typeof success == 'function') { + success(val.note); + } + } else { + if (typeof error == 'function') { + error(val.msg); + } + } + }, + error: function () { + if (typeof error == 'function') { + error(); + } + } + }); } - return $.ajax({ - url: this.server + "/api/savenote", - dataType: "json", - method: "POST", - data: data, - beforeSend: function (xhr) { - xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password)); - }, - success: function (val) { - if (val.status == "OK") { - if (typeof success == 'function') { - success(val.note); - } - } else { - if (typeof error == 'function') { - error(); - } - } - }, - error: function () { - if (typeof error == 'function') { - error(); + saveNote(note, success, error) { + var self = this; + var data = { + text: note.content, + color: note.color, + modified: note.modified, + favorite: note.favorite ? "1" : "0" + }; // Don't send ID if it's a locally-made note + + if (note.norealid != true) { + data.id = note.noteid; } - } - }); - } - - /** - * Sync notes with the NotePost server, resolving conflicts in the process. - * - * @param {function} success(notes) called when everything's synced up. - * @param {function} error - * @returns {undefined} - */ - sync(success, error) { - super.sync(); - var self = this; - $.ajax({ - url: this.server + "/api/getnotes", - dataType: "json", - cache: false, - method: "POST", - beforeSend: function (xhr) { - xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password)); - }, - success: function (val) { - if (val.status == "OK") { - console.log("Comparing notes..."); - console.log("Local copy:", self.notes); - console.log("Remote copy:", val.notes); - var delta = getDelta(self.notes, val.notes); - console.log("Comparison: ", delta); - var notes = delta.noChange; - notes = notes.concat(delta.addedRemote); - notes = notes.concat(delta.changedRemote); // Sync locally-created or modified notes + return $.ajax({ + url: this.server + "/api/savenote", + dataType: "json", + method: "POST", + data: data, + beforeSend: function (xhr) { + xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password)); + }, + success: function (val) { + if (val.status == "OK") { + if (typeof success == 'function') { + success(val.note); + } + } else { + if (typeof error == 'function') { + error(val.msg); + } + } + }, + error: function () { + if (typeof error == 'function') { + error(); + } + } + }); + } - var notesToUpload = delta.addedLocal; - notesToUpload = notesToUpload.concat(delta.changedLocal); - var addedOrChangedLocallyAjax = []; + /** + * Sync notes with the NotePost server, resolving conflicts in the process. + * + * @param {function} success(notes) called when everything's synced up. + * @param {function} error + * @returns {undefined} + */ + sync(success, error) { + super.sync(); + var self = this; + $.ajax({ + url: this.server + "/api/getnotes", + dataType: "json", + cache: false, + method: "POST", + beforeSend: function (xhr) { + xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password)); + }, + success: function (val) { + if (val.status == "OK") { + console.log("Comparing notes..."); + console.log("Local copy:", self.notes); + console.log("Remote copy:", val.notes); + var delta = getDelta(self.notes, val.notes); + console.log("Comparison: ", delta); + var notes = delta.noChange; + notes = notes.concat(delta.addedRemote); + notes = notes.concat(delta.changedRemote); // Sync locally-created or modified notes - for (var i = 0; i < notesToUpload.length; i++) { - addedOrChangedLocallyAjax.push(self.saveNote(self.fix(notesToUpload[i]), function (n) { - notes.push(n); - })); - } + var notesToUpload = delta.addedLocal; + notesToUpload = notesToUpload.concat(delta.changedLocal); + var addedOrChangedLocallyAjax = []; - $.when(addedOrChangedLocallyAjax).then(function () { - self.notes = notes; - self.fixAll(); - localStorage.setItem("notes", JSON.stringify(notes)); - console.log(JSON.parse(localStorage.getItem("notes"))); + for (var i = 0; i < notesToUpload.length; i++) { + addedOrChangedLocallyAjax.push(self.saveNote(self.fix(notesToUpload[i]), function (n) { + notes.push(n); + }, function (err) { + if (typeof err === "string") { + app.dialog.alert(err, "Error"); + } + })); + } - if (typeof success == 'function') { - success(notes); + $.when(addedOrChangedLocallyAjax).always(function () { + self.notes = notes; + self.fixAll(); + localStorage.setItem("notes", JSON.stringify(notes)); + console.log(JSON.parse(localStorage.getItem("notes"))); + }).then(function () { + if (typeof success == 'function') { + success(notes); + } + }, function () { + if (typeof error == 'function') { + error(notes); + } + }); + } + }, + error: function () { + if (typeof error == 'function') { + error(); + } } - }); - } - }, - error: function () { - if (typeof error == 'function') { - error(); - } - } - }); - } + }); + } } \ No newline at end of file diff --git a/www/js/Notes.class.js b/www/js/Notes.class.js index db206b0..1d94155 100644 --- a/www/js/Notes.class.js +++ b/www/js/Notes.class.js @@ -137,6 +137,9 @@ class Notes { if (localStorage.getItem("notes") !== null) { // There is localstorage var storage = JSON.parse(localStorage.getItem("notes")); + if (typeof this.notes === 'undefined') { + this.notes = []; + } console.log("Memory copy:", this.notes); console.log("Storage copy:", storage); var delta = getDelta(this.notes, storage); diff --git a/www/js/editnote.js b/www/js/editnote.js index 16b9790..95205bf 100644 --- a/www/js/editnote.js +++ b/www/js/editnote.js @@ -13,10 +13,18 @@ function saveme(callback) { closeTimeout: 2000 }).open(); $("#orig_content").val(note.content); + if (typeof callback == "function") { + callback(); + } + }, function () { + app.toast.create({ + text: 'Something went wrong, your note might not be synced correctly.', + closeTimeout: 10000 + }).open(); + if (typeof callback == "function") { + callback(); + } }); - if (typeof callback == "function") { - callback(); - } } sync(); @@ -29,6 +37,15 @@ function saveme(callback) { NOTES.add(note, function (n) { $("#note_content").data("noteid", n.noteid); finishSave(n, callback); + }, function (err) { + if (typeof err == "string") { + app.dialog.alert(err, "Error"); + } else { + app.dialog.alert("An unknown error occurred.", "Error"); + } + if (typeof callback == "function") { + callback(); + } }); } else { var note = NOTES.get(noteid); @@ -39,17 +56,6 @@ function saveme(callback) { } } -function exiteditor() { - sync(); - if ($("#note_content").val() == "" || $("#note_content").val() === $("#orig_content").val()) { - router.back({force: true, ignoreCache: true, reload: true}); - } else { - saveme(function () { - router.back({force: true, ignoreCache: true, reload: true}); - }); - } -} - function init() { document.getElementById("noteframe").contentWindow.initEditor($("#note_content").val()); } @@ -62,6 +68,17 @@ function sync() { $("#note_content").val(document.getElementById("noteframe").contentWindow.getMarkdown()); } +function exiteditor() { + sync(); + if ($("#note_content").val() == "" || $("#note_content").val() === $("#orig_content").val()) { + router.back({force: true, ignoreCache: true, reload: true}); + } else { + saveme(function () { + router.back({force: true, ignoreCache: true, reload: true}); + }); + } +} + $("#noteframe").on("load", function () { init(); }); \ No newline at end of file diff --git a/www/js/home.js b/www/js/home.js index 2800b26..53bc858 100644 --- a/www/js/home.js +++ b/www/js/home.js @@ -70,6 +70,7 @@ function deleteNote(id) { app.dialog.confirm('Are you sure?', 'Delete Note', function () { NOTES.del(id, function () { window.shuffleInstance.remove(document.getElementById("notecard-" + id)); + loadCards(); }); }); }