mirror of
https://github.com/YunoHost/doc.git
synced 2024-09-03 20:06:26 +02:00
130 lines
3.7 KiB
JavaScript
130 lines
3.7 KiB
JavaScript
/**
|
|
* Format a date in ISO-format
|
|
* @param {Date} d Date-instance
|
|
*
|
|
* @see https://stackoverflow.com/a/12550320/603387
|
|
*/
|
|
function ISODateString(d) {
|
|
function pad(n) {
|
|
return n < 10 ? "0" + n : n;
|
|
}
|
|
return (
|
|
pad(d.getHours()) + ":" + pad(d.getMinutes()) + ":" + pad(d.getSeconds())
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Save raw Markdown via API
|
|
*/
|
|
function presentationSaveRawMarkdown() {
|
|
var now = new Date();
|
|
var autoSaveButton = document.querySelector("#presentation-save");
|
|
var autoSaveButtonContent = autoSaveButton.innerHTML;
|
|
var markdownContent = document.querySelector('textarea[name="data[content]"]')
|
|
.value;
|
|
var lastSaved = document.querySelector("#last-saved");
|
|
var lastSavedValue = document.querySelector("#last-saved-value");
|
|
autoSaveButton.style.background = presentationColors.update;
|
|
autoSaveButton.innerHTML =
|
|
'<i class="fa fa-circle-o-notch fa-spin fa-fw"></i> Saving';
|
|
autoSaveButton.disabled = true;
|
|
axios
|
|
.post(
|
|
presentationAPIRoute + "?action=save",
|
|
{
|
|
content: Base64.encode(markdownContent),
|
|
route: window.GravAdmin.config.route
|
|
},
|
|
{
|
|
headers: {
|
|
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
|
|
}
|
|
}
|
|
)
|
|
.then(function(response) {
|
|
if (response.status == 200) {
|
|
console.info("Saved at", now, response.status, "OK");
|
|
const forms = Grav.default.Forms;
|
|
forms.FormState.Instance = new forms.FormState.FormState();
|
|
autoSaveButton.style.background = presentationColors.notice;
|
|
autoSaveButton.innerHTML = '<i class="fa fa-check"></i> Saved';
|
|
lastSaved.style.display = "block";
|
|
lastSavedValue.innerHTML = ISODateString(now);
|
|
}
|
|
})
|
|
.catch(function(error) {
|
|
console.error(error);
|
|
autoSaveButton.style.background = presentationColors.critical;
|
|
autoSaveButton.innerHTML = '<i class="fa fa-close"></i> Failed';
|
|
autoSaveButton.disabled = false;
|
|
})
|
|
.then(function() {
|
|
setTimeout(function() {
|
|
autoSaveButton.style.background = presentationColors.button;
|
|
autoSaveButton.innerHTML = autoSaveButtonContent;
|
|
autoSaveButton.disabled = false;
|
|
}, 500);
|
|
});
|
|
}
|
|
|
|
var presentationPollingErrors = 0;
|
|
var presentationColors = {
|
|
button: "#0090D9",
|
|
notice: "#06A599",
|
|
update: "#77559D",
|
|
critical: "#F45857"
|
|
};
|
|
window.addEventListener(
|
|
"load",
|
|
function(event) {
|
|
var autoSaveButton = document.querySelector("#presentation-save");
|
|
if (autoSaveButton) {
|
|
autoSaveButton.addEventListener(
|
|
"click",
|
|
function(event) {
|
|
presentationSaveRawMarkdown();
|
|
event.preventDefault();
|
|
},
|
|
false
|
|
);
|
|
}
|
|
|
|
document.addEventListener("keydown", function(event) {
|
|
if (
|
|
(event.ctrlKey || event.metaKey) &&
|
|
event.shiftKey &&
|
|
event.code === "KeyS"
|
|
) {
|
|
presentationSaveRawMarkdown();
|
|
event.preventDefault();
|
|
}
|
|
});
|
|
|
|
if (presentationAdminAsyncSaveTyping === 1) {
|
|
var markdownContent = document.querySelector(
|
|
'textarea[name="data[content]"] + .CodeMirror'
|
|
);
|
|
|
|
/* Debounce and throttle */
|
|
/* @see https://codepen.io/dreit/pen/gedMez?editors=0010 */
|
|
var forLastExec = 100;
|
|
var delay = 500;
|
|
var throttled = false;
|
|
var calls = 0;
|
|
|
|
if (markdownContent) {
|
|
markdownContent.onkeyup = function() {
|
|
if (!throttled) {
|
|
throttled = true;
|
|
setTimeout(function() {
|
|
throttled = false;
|
|
}, delay);
|
|
}
|
|
clearTimeout(forLastExec);
|
|
forLastExec = setTimeout(presentationSaveRawMarkdown, delay);
|
|
};
|
|
}
|
|
}
|
|
},
|
|
false
|
|
);
|