Improve note creation and deletion error handling and reliability

master
Skylar Ittner 5 years ago
parent 47d0a48e4f
commit 59b4f70a75

@ -4,177 +4,184 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
class NotePostNotes extends Notes { class NotePostNotes extends Notes {
constructor(server, username, password) { constructor(server, username, password) {
super(); super();
this.server = server; this.server = server;
this.username = username; this.username = username;
this.password = password; 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();
}
}
});
}
add(note, success, error) { del(noteid, success, error) {
note.norealid = true; super.del(noteid);
this.saveNote(note, success, error); 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) { if (typeof success == 'function') {
return $.ajax({ success();
url: this.server + "/api/getnote", }
dataType: "json", },
method: "POST", error: function () {
data: { if (typeof error == 'function') {
id: noteid error();
}, }
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();
}
}
});
}
saveNote(note, success, error) { add(note, success, error) {
var self = this; note.norealid = true;
var data = { this.saveNote(note, success, error);
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) { getNote(noteid, success, error) {
data.id = note.noteid; 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({ saveNote(note, success, error) {
url: this.server + "/api/savenote", var self = this;
dataType: "json", var data = {
method: "POST", text: note.content,
data: data, color: note.color,
beforeSend: function (xhr) { modified: note.modified,
xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password)); favorite: note.favorite ? "1" : "0"
}, }; // Don't send ID if it's a locally-made note
success: function (val) {
if (val.status == "OK") { if (note.norealid != true) {
if (typeof success == 'function') { data.id = note.noteid;
success(val.note);
}
} else {
if (typeof error == 'function') {
error();
}
}
},
error: function () {
if (typeof error == 'function') {
error();
} }
}
});
}
return $.ajax({
/** url: this.server + "/api/savenote",
* Sync notes with the NotePost server, resolving conflicts in the process. dataType: "json",
* method: "POST",
* @param {function} success(notes) called when everything's synced up. data: data,
* @param {function} error beforeSend: function (xhr) {
* @returns {undefined} xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password));
*/ },
sync(success, error) { success: function (val) {
super.sync(); if (val.status == "OK") {
var self = this; if (typeof success == 'function') {
$.ajax({ success(val.note);
url: this.server + "/api/getnotes", }
dataType: "json", } else {
cache: false, if (typeof error == 'function') {
method: "POST", error(val.msg);
beforeSend: function (xhr) { }
xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password)); }
}, },
success: function (val) { error: function () {
if (val.status == "OK") { if (typeof error == 'function') {
console.log("Comparing notes..."); error();
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
var notesToUpload = delta.addedLocal; /**
notesToUpload = notesToUpload.concat(delta.changedLocal); * Sync notes with the NotePost server, resolving conflicts in the process.
var addedOrChangedLocallyAjax = []; *
* @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++) { var notesToUpload = delta.addedLocal;
addedOrChangedLocallyAjax.push(self.saveNote(self.fix(notesToUpload[i]), function (n) { notesToUpload = notesToUpload.concat(delta.changedLocal);
notes.push(n); var addedOrChangedLocallyAjax = [];
}));
}
$.when(addedOrChangedLocallyAjax).then(function () { for (var i = 0; i < notesToUpload.length; i++) {
self.notes = notes; addedOrChangedLocallyAjax.push(self.saveNote(self.fix(notesToUpload[i]), function (n) {
self.fixAll(); notes.push(n);
localStorage.setItem("notes", JSON.stringify(notes)); }, function (err) {
console.log(JSON.parse(localStorage.getItem("notes"))); if (typeof err === "string") {
app.dialog.alert(err, "Error");
}
}));
}
if (typeof success == 'function') { $.when(addedOrChangedLocallyAjax).always(function () {
success(notes); 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();
}
}
});
}
} }

@ -137,6 +137,9 @@ class Notes {
if (localStorage.getItem("notes") !== null) { if (localStorage.getItem("notes") !== null) {
// There is localstorage // There is localstorage
var storage = JSON.parse(localStorage.getItem("notes")); var storage = JSON.parse(localStorage.getItem("notes"));
if (typeof this.notes === 'undefined') {
this.notes = [];
}
console.log("Memory copy:", this.notes); console.log("Memory copy:", this.notes);
console.log("Storage copy:", storage); console.log("Storage copy:", storage);
var delta = getDelta(this.notes, storage); var delta = getDelta(this.notes, storage);

@ -13,10 +13,18 @@ function saveme(callback) {
closeTimeout: 2000 closeTimeout: 2000
}).open(); }).open();
$("#orig_content").val(note.content); $("#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(); sync();
@ -29,6 +37,15 @@ function saveme(callback) {
NOTES.add(note, function (n) { NOTES.add(note, function (n) {
$("#note_content").data("noteid", n.noteid); $("#note_content").data("noteid", n.noteid);
finishSave(n, callback); 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 { } else {
var note = NOTES.get(noteid); 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() { function init() {
document.getElementById("noteframe").contentWindow.initEditor($("#note_content").val()); document.getElementById("noteframe").contentWindow.initEditor($("#note_content").val());
} }
@ -62,6 +68,17 @@ function sync() {
$("#note_content").val(document.getElementById("noteframe").contentWindow.getMarkdown()); $("#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 () { $("#noteframe").on("load", function () {
init(); init();
}); });

@ -70,6 +70,7 @@ function deleteNote(id) {
app.dialog.confirm('Are you sure?', 'Delete Note', function () { app.dialog.confirm('Are you sure?', 'Delete Note', function () {
NOTES.del(id, function () { NOTES.del(id, function () {
window.shuffleInstance.remove(document.getElementById("notecard-" + id)); window.shuffleInstance.remove(document.getElementById("notecard-" + id));
loadCards();
}); });
}); });
} }

Loading…
Cancel
Save