mourningdove/htdocs/js/pages/entry/drafts.js
2026-05-24 01:03:05 +00:00

141 lines
4.7 KiB
JavaScript

/* ******************** DRAFT SUPPORT ******************** */
/* RULES:
-- don't save if they have typed in last 3 seconds, unless it's been
15 seconds.
*/
var LJDraft = {};
LJDraft.saveInProg = false;
LJDraft.maxTimeout = 15000; // Maximum length of time to go between saves, even if user is still typing
LJDraft.inputDelay = 3000; // Input debounce delay, so we're not saving on each individual keypress
LJDraft.savedMsg = "Autosaved at [[time]]";
LJDraft.handleInput = function (evt) {
const date = Date.now();
if (LJDraft.saveTimeout == null) {
LJDraft.saveTimeout = date;
} else if (date - LJDraft.saveTimeout > LJDraft.maxTimeout) {
// Clear any existing delayed fuction call and save now
if (LJDraft.timer) {
clearTimeout(LJDraft.timer);
}
LJDraft.saveBody();
return;
}
clearTimeout(LJDraft.timer);
LJDraft.timer = setTimeout(function () {
LJDraft.saveBody();
}, LJDraft.inputDelay);
}
LJDraft.handleChange = function (evt) {
if (evt.target.id == "entry-body") {
LJDraft.saveBody();
} else {
LJDraft.saveProperties();
}
}
LJDraft.saveProperties = function () {
let newProps = {
saveEditor: $("#editor").val(),
saveSubject: $("#id-subject-0").val(),
saveTaglist: $("#js-taglist").val(),
saveMoodID: $("#js-current-mood").val(),
saveMood: $("#js-current-mood-other").val(),
saveLocation: $("#current-location").val(),
saveMusic: $("#current-music").val(),
saveAdultReason: $("#age_restriction_reason").val(),
saveCommentSet: $("#comment_settings").val(),
saveCommentScr: $("#opt_screening").val(),
saveAdultCnt: $("#age_restriction").val(),
};
if ( $("#prop_picture_keyword") ) { //In case the user has no userpics
newProps.saveUserpic = $("#prop_picture_keyword").val();
};
$.post("/__rpc_draft", newProps);
};
LJDraft.saveBody = function () {
// Clear our global save timeout
LJDraft.saveTimeout = null;
LJDraft.saveInProg = true;
let curBody;
if ($("#entry-body").css('display') == 'none') { // Need to check this to deal with hitting the back button
// Since they may start using the RTE in the middle of writing their
// entry, we should just get the editor each time.
if (! FCKeditorAPI) return;
var oEditor = FCKeditorAPI.GetInstance('entry-body');
if (oEditor.GetXHTML) {
curBody = oEditor.GetXHTML(true);
curBody = curBody.replace(/\n/g, '');
}
} else {
curBody = $("#entry-body").val();
}
$.post("/__rpc_draft", {"saveDraft": curBody}, function () {
let date = new Date();
let msg = LJDraft.savedMsg.replace(/\[\[time\]\]/, date.toLocaleTimeString('en-US', {timeStyle: "medium"}));
$("#draftstatus").text(msg + ' ');
LJDraft.saveInProg = false;
});
};
function initDraft(askToRestore) {
if (askToRestore && restoredDraft) {
if (confirm(confirmMsg)) {
// If the user wants to restore the draft, we place the
// values of their saved draft into the form.
$("#entry-body").val(restoredDraft);
$("#editor").val(restoredEditor);
$("#draftstatus").text(restoredMsg);
$("#id-subject-0").val(restoredSubject);
$("#js-taglist").val(restoredTaglist);
$("#js-current-mood").val(restoredMoodID);
$("#js-current-mood-other").val(restoredMood);
$("#current-location").val(restoredLocation);
$("#current-music").val(restoredMusic);
$("#age_restriction_reason").val(restoredAdultReason);
$("#comment_settings").val(restoredCommentSet);
$("#opt_screening").val(restoredCommentScr);
$("#age_restriction").val(restoredAdultCnt);
if ( $("#prop_picture_keyword") ) {
$("#prop_picture_keyword").val(restoredUserpic);
$("#prop_picture_keyword").trigger("change");
}
} else {
// Clear out their current draft
$.post("/__rpc_draft", {clearProperties: 1, clearDraft: 1});
}
}
// set up event handlers
$("#content").on('change', '.draft-autosave', null, LJDraft.handleChange);
$("#content").on('input', '#entry-body', null, LJDraft.handleInput);
}
//LJDraft.maxTimeout = autoSaveInterval;
LJDraft.savedMsg = savedMsg;
if (should_init != null) {
initDraft(should_init);
// Hook into the RTE iframe once it's loaded, if we have draft support.
function FCKeditor_OnComplete( editor ){
editor.EditorDocument.addEventListener('input', LJDraft.handleInput);
};
}