diff --git a/css/interaction/export.css b/css/interaction/export.css index d54575954576d2049ff25d425cc8a7b9d21871b9..5fe2a1109fa2dd87edbeec36d69cdcd77bc9e4ca 100644 --- a/css/interaction/export.css +++ b/css/interaction/export.css @@ -1,6 +1,7 @@ -div.output { +.export-field { width: 100vw; max-width: 100%; word-break: break-all; white-space: normal; + height: 80vh; } diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index 920978bc9d64cd0d87b7009cfe35f20095660dbe..4dd106647c51a291caf6eb313b1e517ee14d5c1f 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -1663,7 +1663,7 @@ globalThis.DefaultRules = function(slave) { message(`${slave.slaveName} has been put on a muscle building exercise regime.`, sourceRecord.muscles.val); } } else if (!isAmputee(slave) && ["slimming", "muscle building"].includes(slave.diet)) { - message(`${slave.slaveName} is at the target musculature, so ${his} diet has been normalized.`, sourceRecord.muscles.val); + message(`${slave.slaveName} is at the target musculature, so ${his} diet has been normalized.`, sourceRecord.diet); dietRule(slave, rule); } else { dietRule(slave, rule); diff --git a/src/js/reminder.js b/src/js/reminder.js index 719581a6c7434f8bd0134a6c26d71c862349ad93..595923d3a6df429fb23bdf014ef99d61b21ca14f 100644 --- a/src/js/reminder.js +++ b/src/js/reminder.js @@ -1,6 +1,9 @@ App.Reminders = (function() { - const displayDiv = document.createElement("div"); - const addDiv = document.createElement("div"); + /** + * @type {Array<function():void>} + */ + let activeViewRefreshers = []; + return { add: add, list: list, @@ -8,6 +11,7 @@ App.Reminders = (function() { slaveDisplay: slaveDisplay, slaveLink: slaveLink, dialog: dialog, + clear: clearActive, }; /** @@ -15,10 +19,11 @@ App.Reminders = (function() { * @param {number} week * @param {string} [category] * @param {number} [slaveID] + * @returns {boolean} Whether a reminder was actually added or we aborted. */ function add(message, week, category = "manual", slaveID = 0) { if (message === "" || message === null) { - return; + return false; } const entry = {message: message, week: week, category: category}; if (slaveID) { @@ -32,6 +37,7 @@ App.Reminders = (function() { } else { V.reminders.splice(index, 0, entry); } + return true; } /** @@ -52,28 +58,23 @@ App.Reminders = (function() { const outerSpan = document.createElement("span"); - function replace() { - App.UI.DOM.replace(outerSpan, list({maxFuture, filter, link})); - App.Utils.scheduleSidebarRefresh(); - } - /** * @param {FC.ReminderEntry} entry */ function clearEntry(entry) { V.reminders.splice(V.reminders.indexOf(entry), 1); - replace(); + refreshActive(); } // We only want to remove visible entries function clearOverdue() { V.reminders = V.reminders.filter(e => e.week >= V.week || e.week > V.week + maxFuture || !filter(e)); - replace(); + refreshActive(); } function clearAll() { V.reminders = V.reminders.filter(e => e.week > V.week + maxFuture || !filter(e)); - replace(); + refreshActive(); } let overdue = 0; @@ -126,25 +127,27 @@ App.Reminders = (function() { } /** - * @param {function():void} refresh * @param {string} [category] * @param {number} [slaveID] * @returns {HTMLDivElement} */ - function addField(refresh, category, slaveID) { - jQuery(addDiv).empty(); + function addField(category, slaveID) { + const addDiv = document.createElement("div"); let entry = ""; let week = 0; addDiv.append( - App.UI.DOM.makeTextBox("", v => { entry = v; }), - " in ", App.UI.DOM.makeTextBox(0, v => { week = v; }, true), " weeks.", + App.UI.DOM.makeTextBox("", v => { + entry = v; + }), + " in ", App.UI.DOM.makeTextBox(0, v => { + week = v; + }, true), " weeks.", " ", App.UI.DOM.link("Add", () => { - add(entry, V.week + week, category, slaveID); - refresh(); - App.Utils.scheduleSidebarRefresh(); - jQuery(addDiv).append(addField(refresh, category, slaveID)); + if (add(entry, V.week + week, category, slaveID)) { + refreshActive(); + } }) ); @@ -153,10 +156,22 @@ App.Reminders = (function() { /** * @param {boolean} [link=false] show passage links + * @param {HTMLElement} [displayDiv] Only to be used by the refresh functionality * @returns {HTMLElement} */ - function fullDisplay(link) { - jQuery(displayDiv).empty(); + function fullDisplay(link, displayDiv) { + if (displayDiv) { + // If displayDiv is given, it either is currently being shown or the tree it belonged to was removed from + // the page. In that case we don't need to refresh it ever again. + if (!displayDiv.isConnected) { + return null; + } + jQuery(displayDiv).empty(); + } else { + displayDiv = document.createElement("div"); + } + activeViewRefreshers.push(() => fullDisplay(link, displayDiv)); + displayDiv.append(App.UI.DOM.makeElement("h2", "Reminders")); const listEl = list({link}); @@ -165,17 +180,27 @@ App.Reminders = (function() { } displayDiv.append(App.UI.DOM.makeElement("h3", "Add new")); - displayDiv.append(App.UI.DOM.makeElement("p", addField(() => fullDisplay(link)))); + displayDiv.append(App.UI.DOM.makeElement("p", addField())); return displayDiv; } /** * @param {number} slaveID + * @param {HTMLElement} [displayDiv] Only to be used by the refresh functionality * @returns {HTMLElement} */ - function slaveDisplay(slaveID) { - jQuery(displayDiv).empty(); + function slaveDisplay(slaveID, displayDiv) { + if (displayDiv) { + if (!displayDiv.isConnected) { + return null; + } + jQuery(displayDiv).empty(); + } else { + displayDiv = document.createElement("div"); + } + activeViewRefreshers.push(() => slaveDisplay(slaveID, displayDiv)); + displayDiv.append(App.UI.DOM.makeElement("h2", `Reminders for ${SlaveFullName(getSlave(slaveID))}`)); const listEl = list({filter: e => e.slaveID === slaveID}); @@ -184,7 +209,7 @@ App.Reminders = (function() { } displayDiv.append(App.UI.DOM.makeElement("h3", "Add new")); - displayDiv.append(App.UI.DOM.makeElement("p", addField(() => slaveDisplay(slaveID), "slave", slaveID))); + displayDiv.append(App.UI.DOM.makeElement("p", addField("slave", slaveID))); return displayDiv; } @@ -211,4 +236,18 @@ App.Reminders = (function() { $(Dialog.body()).empty().append(slaveID ? slaveDisplay(slaveID) : fullDisplay(showLinks)); Dialog.open(); } + + function refreshActive() { + console.log(activeViewRefreshers.length); + const ars = activeViewRefreshers; + activeViewRefreshers = []; + for (const refresher of ars) { + refresher(); + } + App.Utils.scheduleSidebarRefresh(); + } + + function clearActive() { + activeViewRefreshers = []; + } })(); diff --git a/src/npc/importSlave.js b/src/npc/importSlave.js index 857a98725c745601d9b322bef5626ed2904c1a6d..675d24968595a78d4dbcee11a0a569c9f692778e 100644 --- a/src/npc/importSlave.js +++ b/src/npc/importSlave.js @@ -26,6 +26,6 @@ App.UI.SlaveInteract.importSlave = function() { App.UI.SlaveInteract.exportSlave = function(slave) { const el = new DocumentFragment(); App.UI.DOM.appendNewElement("p", el, `Copy the following block of code for importing: `, "note"); - App.UI.DOM.appendNewElement("code", el, toJson(slave)); + App.UI.DOM.appendNewElement("textarea", el, toJson(slave), ["export-field"]); return el; }; diff --git a/src/zz1-last/setupEventHandlers.js b/src/zz1-last/setupEventHandlers.js index 44e3eb0ff12766cd4d9cd3e22cc761cfe6d0f20f..896ed386a423cbfecb38f5b1ab0d3a56fe463e76 100644 --- a/src/zz1-last/setupEventHandlers.js +++ b/src/zz1-last/setupEventHandlers.js @@ -14,6 +14,7 @@ $(document).on(":passageinit", () => { delete V.passageSwitchHandler; } App.UI.Tabs.clear(); + App.Reminders.clear(); profileEvents.passageinit(); });