changed: save strategy. again.
This commit is contained in:
parent
9d1f54059a
commit
56195ee48f
|
@ -36,7 +36,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="notecontent">
|
<div id="notecontent">
|
||||||
<textarea id="md" spellcheck="false" oninput="notecontentchanged()" onkeydown="editorkeydown()" onclick="clickeditor()"></textarea>
|
<textarea id="md" spellcheck="false" oninput="datachanged()" onkeydown="editorkeydown()" onclick="clickeditor()"></textarea>
|
||||||
<div hidden id="preview"></div>
|
<div hidden id="preview"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
236
main.js
236
main.js
|
@ -27,7 +27,8 @@ var workerid = null;
|
||||||
var folds = [];
|
var folds = [];
|
||||||
var backup = "";
|
var backup = "";
|
||||||
var localdata = null;
|
var localdata = null;
|
||||||
var savestate = "saved";
|
var saved = true;
|
||||||
|
var saveid = 0;
|
||||||
var settings = null;
|
var settings = null;
|
||||||
var tags = null;
|
var tags = null;
|
||||||
var currentvault = "";
|
var currentvault = "";
|
||||||
|
@ -203,16 +204,6 @@ var commands = [
|
||||||
hint: "Download local data",
|
hint: "Download local data",
|
||||||
action: downloadlocal,
|
action: downloadlocal,
|
||||||
shortcut: "ctrl+shift+S"
|
shortcut: "ctrl+shift+S"
|
||||||
}/*,
|
|
||||||
{
|
|
||||||
savedonly: true,
|
|
||||||
hint: "Download all notes",
|
|
||||||
action: downloadnotes
|
|
||||||
}*/,
|
|
||||||
{
|
|
||||||
hint: "Force save",
|
|
||||||
action: save,
|
|
||||||
shortcut: "ctrl+s"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
hint: "Search tags",
|
hint: "Search tags",
|
||||||
|
@ -325,7 +316,7 @@ function showinfo()
|
||||||
"title: " + currentnote.title + "\n",
|
"title: " + currentnote.title + "\n",
|
||||||
"vault: " + currentvault + "\n",
|
"vault: " + currentvault + "\n",
|
||||||
(tags ? "tags: " + tags + "\n" : ""),
|
(tags ? "tags: " + tags + "\n" : ""),
|
||||||
"state: " + savestate,
|
"saved: " + saved,
|
||||||
"word count: " + getwords()];
|
"word count: " + getwords()];
|
||||||
|
|
||||||
showtemporaryinfo(info);
|
showtemporaryinfo(info);
|
||||||
|
@ -380,7 +371,6 @@ function addtagfilter()
|
||||||
|
|
||||||
function switchvault()
|
function switchvault()
|
||||||
{
|
{
|
||||||
clearInterval(workerid);
|
|
||||||
window.localStorage.setItem("vault", othervault());
|
window.localStorage.setItem("vault", othervault());
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
@ -593,27 +583,6 @@ function gettags(note)
|
||||||
return [];
|
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)
|
function share(html)
|
||||||
{
|
{
|
||||||
if (navigator.share)
|
if (navigator.share)
|
||||||
|
@ -669,51 +638,8 @@ function downloadnote()
|
||||||
download(currentnote.title + ".md", getnotecontent());
|
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)
|
function remotecallfailed(error)
|
||||||
{
|
{
|
||||||
markunsaved("!");
|
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
console.warn(error);
|
console.warn(error);
|
||||||
|
@ -782,7 +708,7 @@ function loadsettings()
|
||||||
|
|
||||||
function checksaved()
|
function checksaved()
|
||||||
{
|
{
|
||||||
if (savestate != "saved")
|
if (!saved)
|
||||||
{
|
{
|
||||||
return "not saved";
|
return "not saved";
|
||||||
}
|
}
|
||||||
|
@ -831,11 +757,6 @@ function initvault()
|
||||||
currentvault = window.localStorage.getItem("vault") || "local";
|
currentvault = window.localStorage.getItem("vault") || "local";
|
||||||
}
|
}
|
||||||
|
|
||||||
function startworker()
|
|
||||||
{
|
|
||||||
workerid = setInterval(save, settings.savedelay);
|
|
||||||
}
|
|
||||||
|
|
||||||
function init()
|
function init()
|
||||||
{
|
{
|
||||||
loadsettings();
|
loadsettings();
|
||||||
|
@ -857,14 +778,12 @@ function init()
|
||||||
{
|
{
|
||||||
localdata = data;
|
localdata = data;
|
||||||
loadlast();
|
loadlast();
|
||||||
startworker();
|
|
||||||
})
|
})
|
||||||
.catch(remotecallfailed);
|
.catch(remotecallfailed);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loadstorage();
|
loadstorage();
|
||||||
startworker();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (issplit())
|
if (issplit())
|
||||||
|
@ -883,7 +802,6 @@ function init()
|
||||||
|
|
||||||
function togglepassword()
|
function togglepassword()
|
||||||
{
|
{
|
||||||
clearInterval(workerid);
|
|
||||||
password.value = "";
|
password.value = "";
|
||||||
authentpage.hidden = false;
|
authentpage.hidden = false;
|
||||||
notepage.style.display = "none";
|
notepage.style.display = "none";
|
||||||
|
@ -891,34 +809,6 @@ function togglepassword()
|
||||||
password.focus();
|
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)
|
function queryremote(params)
|
||||||
{
|
{
|
||||||
return new Promise( (apply, failed) => {
|
return new Promise( (apply, failed) => {
|
||||||
|
@ -1017,7 +907,7 @@ function sortselection()
|
||||||
var selection = content.substring(range.start, range.end);
|
var selection = content.substring(range.start, range.end);
|
||||||
var sorted = selection.split("\n").sort().join("\n");
|
var sorted = selection.split("\n").sort().join("\n");
|
||||||
md.value = content.substring(0, range.start) + sorted + content.substring(range.end);
|
md.value = content.substring(0, range.start) + sorted + content.substring(range.end);
|
||||||
notecontentchanged();
|
datachanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
function selectlines()
|
function selectlines()
|
||||||
|
@ -1334,7 +1224,7 @@ function insert(text, cursoroffset = 0, nbtodelete = 0)
|
||||||
+ text
|
+ text
|
||||||
+ content.substring(pos);
|
+ content.substring(pos);
|
||||||
setpos(pos - nbtodelete + text.length + cursoroffset);
|
setpos(pos - nbtodelete + text.length + cursoroffset);
|
||||||
notecontentchanged();
|
datachanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
function searchinlist(list, customevent)
|
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();
|
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()
|
function loadtodo()
|
||||||
|
@ -1555,7 +1505,7 @@ function rename(newname)
|
||||||
|
|
||||||
currentnote.title = newname;
|
currentnote.title = newname;
|
||||||
|
|
||||||
markunsaved("*");
|
datachanged();
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1580,7 +1530,7 @@ function restore()
|
||||||
if (confirm('restore "' + currentnote.title + '"?'))
|
if (confirm('restore "' + currentnote.title + '"?'))
|
||||||
{
|
{
|
||||||
setnotecontent(backup);
|
setnotecontent(backup);
|
||||||
notecontentchanged();
|
datachanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1608,7 +1558,12 @@ function splitshortcut(s)
|
||||||
|
|
||||||
function mainkeydownhandler()
|
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)
|
if (!searchdialog.hidden)
|
||||||
{
|
{
|
||||||
|
@ -1625,8 +1580,7 @@ function mainkeydownhandler()
|
||||||
togglepreview();
|
togglepreview();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (!searchdialog.hidden && (event.key == "Tab" || event.keyCode == "40" || event.keyCode == "38"))
|
||||||
if (!searchdialog.hidden && (event.key == "Tab" || event.keyCode == "40" || event.keyCode == "38"))
|
|
||||||
{
|
{
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
fileindex += (event.shiftKey || event.keyCode == "38") ? -1 : 1;
|
fileindex += (event.shiftKey || event.keyCode == "38") ? -1 : 1;
|
||||||
|
@ -1634,24 +1588,26 @@ function mainkeydownhandler()
|
||||||
fileindex = Math.max(fileindex, 0);
|
fileindex = Math.max(fileindex, 0);
|
||||||
applyfileindex();
|
applyfileindex();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
commands.filter(c => c.shortcut)
|
|
||||||
.forEach(command =>
|
|
||||||
{
|
{
|
||||||
var s = splitshortcut(command.shortcut);
|
commands.filter(c => c.shortcut)
|
||||||
if (event.key == s.key && !(s.ctrl && !event.ctrlKey && !event.altKey) && !(s.shift && !event.shiftKey))
|
.forEach(command =>
|
||||||
{
|
{
|
||||||
event.preventDefault();
|
var s = splitshortcut(command.shortcut);
|
||||||
if (command.savedonly && savestate != "saved")
|
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()
|
function setwindowtitle()
|
||||||
|
@ -1697,7 +1653,7 @@ function backspace(nb)
|
||||||
var c = md.value;
|
var c = md.value;
|
||||||
md.value = c.substring(0, pos - nb) + c.substring(pos);
|
md.value = c.substring(0, pos - nb) + c.substring(pos);
|
||||||
setpos(pos - nb);
|
setpos(pos - nb);
|
||||||
notecontentchanged();
|
datachanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
function editorkeydown()
|
function editorkeydown()
|
||||||
|
|
Loading…
Reference in New Issue