From 8a31ffa45e912d00c480efe738aa3452e9e567cb Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Fri, 10 Jul 2026 12:52:00 -0400 Subject: fix(admin): auto-save map triggers on blur --- internal/admin/static/map.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'internal/admin') 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 = '

Exit: ' + esc(dir) + ' → #' + exit.room + '

'; h += '
'; h += '
'; - h += '
'; + h += '
'; h += '
'; - h += ''; + h += ''; h += '
'; h += ''; h += '
'; @@ -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 = '
'; - h += '

On-Enter Triggers

'; + var h = '

On-Enter Triggers

'; h += '

Fires when a player enters this room. First matching entry wins.

'; h += renderTriggerListHTML(r.on_enter, 'on_enter', 'on_enter', false); h += '
'; -- cgit v1.2.3