diff --git a/index.html b/index.html
index efb4058..ee806e0 100644
--- a/index.html
+++ b/index.html
@@ -36,7 +36,7 @@
diff --git a/main.js b/main.js
index e4d295f..80dcb53 100644
--- a/main.js
+++ b/main.js
@@ -27,7 +27,8 @@ var workerid = null;
var folds = [];
var backup = "";
var localdata = null;
-var savestate = "saved";
+var saved = true;
+var saveid = 0;
var settings = null;
var tags = null;
var currentvault = "";
@@ -203,16 +204,6 @@ var commands = [
hint: "Download local data",
action: downloadlocal,
shortcut: "ctrl+shift+S"
-}/*,
-{
- savedonly: true,
- hint: "Download all notes",
- action: downloadnotes
-}*/,
-{
- hint: "Force save",
- action: save,
- shortcut: "ctrl+s"
},
{
hint: "Search tags",
@@ -325,7 +316,7 @@ function showinfo()
"title: " + currentnote.title + "\n",
"vault: " + currentvault + "\n",
(tags ? "tags: " + tags + "\n" : ""),
- "state: " + savestate,
+ "saved: " + saved,
"word count: " + getwords()];
showtemporaryinfo(info);
@@ -380,7 +371,6 @@ function addtagfilter()
function switchvault()
{
- clearInterval(workerid);
window.localStorage.setItem("vault", othervault());
init();
}
@@ -593,27 +583,6 @@ function gettags(note)
return [];
}
-function marksaved()
-{
- savestate = "saved";
- mark.textContent = "\xa0";
-}
-
-function markunsaved(text)
-{
- savestate = "unsaved";
- if (text)
- {
- mark.textContent = text;
- }
-}
-
-function marksaving()
-{
- savestate = "saving";
- mark.textContent = "⇅";
-}
-
function share(html)
{
if (navigator.share)
@@ -669,51 +638,8 @@ function downloadnote()
download(currentnote.title + ".md", getnotecontent());
}
-function save()
-{
- var content = getnotecontent();
-
- if (savestate == "saved")
- {
- //console.warn("data is already saved.");
- }
- else if (savestate == "saving")
- {
- console.warn("data is already being saved.");
- }
- else if ((content == "" && backup != "") || content == "null" || content == "undefined")
- {
- console.warn("Invalid content '" + content + "', file '" + currentnote.title + "' not saved");
- }
- else
- {
- currentnote.pos = md.selectionStart;
- currentnote.content = content;
- window.localStorage.setItem(currentvault, JSON.stringify(localdata));
-
- if (currentnote.title == "settings.json")
- {
- settings = JSON.parse(content);
- savesettings();
- }
- console.log("data serialized in local storage")
-
- if (isremote())
- {
- marksaving();
- pushtoremote();
- }
- else
- {
- marksaved();
- }
- }
-
-}
-
function remotecallfailed(error)
{
- markunsaved("!");
if (error)
{
console.warn(error);
@@ -782,7 +708,7 @@ function loadsettings()
function checksaved()
{
- if (savestate != "saved")
+ if (!saved)
{
return "not saved";
}
@@ -831,11 +757,6 @@ function initvault()
currentvault = window.localStorage.getItem("vault") || "local";
}
-function startworker()
-{
- workerid = setInterval(save, settings.savedelay);
-}
-
function init()
{
loadsettings();
@@ -857,14 +778,12 @@ function init()
{
localdata = data;
loadlast();
- startworker();
})
.catch(remotecallfailed);
}
else
{
loadstorage();
- startworker();
}
if (issplit())
@@ -883,7 +802,6 @@ function init()
function togglepassword()
{
- clearInterval(workerid);
password.value = "";
authentpage.hidden = false;
notepage.style.display = "none";
@@ -891,34 +809,6 @@ function togglepassword()
password.focus();
}
-function pushtoremote()
-{
- console.log("sending data to php server");
-
- if (localdata)
- {
- var content = getnotecontent();
- queryremote({action: "push", data: JSON.stringify(localdata)})
- .then(() => {
- console.log("data saved on server");
- if (getnotecontent() == content)
- {
- marksaved();
- }
- else
- {
- console.warn("Content changed in the meantime, keep as unsaved");
- markunsaved("*");
- }
- })
- .catch(remotecallfailed);
- }
- else
- {
- console.warn("Cannot push empty data");
- }
-}
-
function queryremote(params)
{
return new Promise( (apply, failed) => {
@@ -1017,7 +907,7 @@ function sortselection()
var selection = content.substring(range.start, range.end);
var sorted = selection.split("\n").sort().join("\n");
md.value = content.substring(0, range.start) + sorted + content.substring(range.end);
- notecontentchanged();
+ datachanged();
}
function selectlines()
@@ -1334,7 +1224,7 @@ function insert(text, cursoroffset = 0, nbtodelete = 0)
+ text
+ content.substring(pos);
setpos(pos - nbtodelete + text.length + cursoroffset);
- notecontentchanged();
+ datachanged();
}
function searchinlist(list, customevent)
@@ -1441,13 +1331,73 @@ function putontop()
}
}
-function notecontentchanged()
+function postpone()
+{
+ return new Promise(function(resolve)
+ {
+ clearTimeout(workerid);
+ workerid = setTimeout(resolve, settings.savedelay);
+ });
+}
+
+function datachanged()
{
resize();
- if (savestate != "saving")
+
+ saved = false;
+
+ postpone()
+ .then(() =>
{
- markunsaved("*");
- }
+ var content = getnotecontent();
+
+ if ((content == "" && backup != "") || content == "null" || content == "undefined")
+ {
+ showtemporaryinfo("Invalid content '" + content + "', file '" + currentnote.title + "' not saved");
+ return;
+ }
+
+ currentnote.pos = md.selectionStart;
+ currentnote.content = content;
+
+ window.localStorage.setItem(currentvault, JSON.stringify(localdata));
+ if (currentnote.title == "settings.json")
+ {
+ settings = JSON.parse(content);
+ savesettings();
+ }
+ console.log("data serialized in local storage")
+
+ if (isremote())
+ {
+ console.log("sending data to php server...");
+
+ if (localdata)
+ {
+ queryremote({action: "push", data: JSON.stringify(localdata)})
+ .then(() => {
+
+ console.log("data saved on server.");
+ saved = true;
+
+ if (content != getnotecontent())
+ {
+ console.log("but data changed in the meantime: will try again after delay");
+ datachanged();
+ }
+ })
+ .catch(remotecallfailed);
+ }
+ else
+ {
+ showtemporaryinfo("Cannot push empty data");
+ }
+ }
+ else
+ {
+ saved = true;
+ }
+ });
}
function loadtodo()
@@ -1555,7 +1505,7 @@ function rename(newname)
currentnote.title = newname;
- markunsaved("*");
+ datachanged();
return "";
}
@@ -1580,7 +1530,7 @@ function restore()
if (confirm('restore "' + currentnote.title + '"?'))
{
setnotecontent(backup);
- notecontentchanged();
+ datachanged();
}
}
@@ -1608,7 +1558,12 @@ function splitshortcut(s)
function mainkeydownhandler()
{
- if (event.key == "Escape")
+ if (event.key == "s" && event.ctrlKey)
+ {
+ event.preventDefault();
+ console.log("ctrl+s is useless!");
+ }
+ else if (event.key == "Escape")
{
if (!searchdialog.hidden)
{
@@ -1625,8 +1580,7 @@ function mainkeydownhandler()
togglepreview();
}
}
-
- if (!searchdialog.hidden && (event.key == "Tab" || event.keyCode == "40" || event.keyCode == "38"))
+ else if (!searchdialog.hidden && (event.key == "Tab" || event.keyCode == "40" || event.keyCode == "38"))
{
event.preventDefault();
fileindex += (event.shiftKey || event.keyCode == "38") ? -1 : 1;
@@ -1634,24 +1588,26 @@ function mainkeydownhandler()
fileindex = Math.max(fileindex, 0);
applyfileindex();
}
-
- commands.filter(c => c.shortcut)
- .forEach(command =>
+ else
{
- var s = splitshortcut(command.shortcut);
- if (event.key == s.key && !(s.ctrl && !event.ctrlKey && !event.altKey) && !(s.shift && !event.shiftKey))
+ commands.filter(c => c.shortcut)
+ .forEach(command =>
{
- event.preventDefault();
- if (command.savedonly && savestate != "saved")
+ var s = splitshortcut(command.shortcut);
+ if (event.key == s.key && !(s.ctrl && !event.ctrlKey && !event.altKey) && !(s.shift && !event.shiftKey))
{
- console.log("Cannot perform '" + command.hint + "' because current note is not saved.");
+ event.preventDefault();
+ if (command.savedonly && !saved)
+ {
+ console.log("Cannot perform '" + command.hint + "' because current note is not saved.");
+ }
+ else if (command.action)
+ {
+ command.action();
+ }
}
- else if (command.action)
- {
- command.action();
- }
- }
- });
+ });
+ }
}
function setwindowtitle()
@@ -1697,7 +1653,7 @@ function backspace(nb)
var c = md.value;
md.value = c.substring(0, pos - nb) + c.substring(pos);
setpos(pos - nb);
- notecontentchanged();
+ datachanged();
}
function editorkeydown()