aboutsummaryrefslogtreecommitdiff
path: root/internal/admin
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-07-10 12:52:00 -0400
committerhistoria <[not public]>2026-07-10 12:52:00 -0400
commit8a31ffa45e912d00c480efe738aa3452e9e567cb (patch)
tree7d4fcb80255d6d52e588234352b5bfbc058ba663 /internal/admin
parent6e7c0b3ec4253bb58a815979b1f4574d08cb1f53 (diff)
downloadthehouseoficarus-8a31ffa45e912d00c480efe738aa3452e9e567cb.tar.gz
fix(admin): auto-save map triggers on blur
Diffstat (limited to 'internal/admin')
-rw-r--r--internal/admin/static/map.js24
1 files changed, 17 insertions, 7 deletions
diff --git a/internal/admin/static/map.js b/internal/admin/static/map.js
index 7c47b4e..8bd0e2d 100644
--- a/internal/admin/static/map.js
+++ b/internal/admin/static/map.js
@@ -1581,10 +1581,10 @@ function editExitCondition(dir) {
var h = '<h3 style="margin-bottom:8px;font-size:13px">Exit: ' + esc(dir) + ' &rarr; #' + exit.room + '</h3>';
h += '<div class="form-group"><label>Blocked Message</label><textarea id="exitBmsg" rows="2">' + esc(bmsg) + '</textarea></div>';
h += '<div class="form-group"><label><input type="checkbox" id="exitHidden"' + (hidden ? ' checked' : '') + '> Hidden</label></div>';
- h += '<div class="form-group"><label><input type="checkbox" id="exitAlwaysBlocked"' + (alwaysBlocked ? ' checked' : '') + '> Always Blocked (blocked, shown on map)</label></div>';
+ h += '<div class="form-group"><label><input type="checkbox" id="exitAlwaysBlocked"' + (alwaysBlocked ? ' checked' : '') + '> Always Blocked</label></div>';
h += '<div style="margin-top:10px;border-top:1px solid var(--border);padding-top:8px">';
- h += '<label style="font-size:11px;color:#aaa;text-transform:uppercase;letter-spacing:.5px">Conditions</label>';
+ h += '<label style="font-size:11px;color:#aaa;text-transform:uppercase;letter-spacing:.5px">Conditions (Blocked unless these are met)</label>';
h += '<div id="condClauses" style="margin-top:4px"></div>';
h += '<button class="btn btn-sm section-add-btn" onclick="addConditionClause()">+ Add Condition</button>';
h += '<div class="btn-row" style="margin-top:10px">';
@@ -2085,6 +2085,8 @@ function bindTriggerInputSave(container) {
inputs.forEach(function(el) {
el.removeEventListener('input', _triggerInputHandler);
el.addEventListener('input', _triggerInputHandler);
+ el.removeEventListener('blur', _triggerBlurHandler);
+ el.addEventListener('blur', _triggerBlurHandler);
});
var checks = container.querySelectorAll('input[type="checkbox"], input[type="radio"]');
checks.forEach(function(el) {
@@ -2109,11 +2111,12 @@ function _syncTriggersToData() {
function _triggerInputHandler() {
_syncTriggersToData();
_triggersDirty = true;
+ autoSave();
}
-function saveTriggers() {
+function _triggerBlurHandler() {
_syncTriggersToData();
- _triggersDirty = false;
+ _triggersDirty = true;
saveNow();
}
@@ -2154,21 +2157,28 @@ async function doSavePanel() {
var newDir = dirEl ? dirEl.value : null;
var currentDir = (data.file || '').replace(/^data\/rooms\/?/, '').split('/')[0] || '';
+ var idChanged = false;
+ var dirChanged = false;
if (dirEl && newDir !== currentDir) {
await API.post('/api/rooms/move', {id: id, dir: newDir});
+ dirChanged = true;
}
if (newID !== id) {
await API.post('/api/rooms/rename', {id: id, new_id: newID});
selectedRoom = newID;
id = newID;
+ idChanged = true;
}
await API.put('/api/rooms/' + id, r);
notify('Room #' + id + ' saved', 'success');
_triggersDirty = false;
+ saveTimer = null;
updateUndoBar();
await loadMap();
- selectRoom(id);
+ if (idChanged || dirChanged) {
+ selectRoom(id);
+ }
} catch (e) {
notify('Save failed: ' + extractError(e), 'error');
}
@@ -3423,6 +3433,7 @@ function renderEnterExitTab(r) {
}
switchPanelTab(8);
_triggersDirty = true;
+ autoSave();
};
window._ieRenderOnly = window._ieRenderCurrent;
window._ieSyncAll = ie_syncAllInteractions;
@@ -3431,8 +3442,7 @@ function renderEnterExitTab(r) {
{id: 'on_exit', path: 'on_exit', isArray: true, interactionStyle: true, itemIDAllowed: false, label: 'Trigger'}
];
- var h = '<div style="margin:8px 0"><button class="btn btn-primary" onclick="saveTriggers()">Save Triggers</button></div>';
- h += '<h3 style="margin:8px 0 4px">On-Enter Triggers</h3>';
+ var h = '<h3 style="margin:8px 0 4px">On-Enter Triggers</h3>';
h += '<p style="color:#888;font-size:11px;margin:0 0 6px">Fires when a player enters this room. First matching entry wins.</p>';
h += renderTriggerListHTML(r.on_enter, 'on_enter', 'on_enter', false);
h += '<hr style="border:none;border-top:1px solid var(--border);margin:12px 0">';