From e9144cad4a8c55dcee4a694149f06588edd8595a Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Mon, 6 Jul 2026 21:56:32 -0400 Subject: fix: change one-way modifier on admin map from shift to ctrl for firefox support --- internal/admin/static/map.js | 51 ++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 21 deletions(-) (limited to 'internal/admin/static/map.js') diff --git a/internal/admin/static/map.js b/internal/admin/static/map.js index 47dcb27..ba68d80 100644 --- a/internal/admin/static/map.js +++ b/internal/admin/static/map.js @@ -3,9 +3,9 @@ var currentZ = 0, currentDir = '', selectedRoom = null, mapData = null; var panX = 0, panY = 0, scale = 1; var dragging = false, startX = 0, startY = 0, prevX = 0, prevY = 0; var dragRoom = false; -var linkDrag = false, linkFromId = null, linkTargetId = null, linkGhostDir = null; +var linkDrag = false, linkFromId = null, linkTargetId = null, linkTargetDir = null, linkGhostDir = null; var linkDragOneWay = false; -var shiftHeld = false; +var ctrlHeld = false; var delOneWay = false; var delDrag = false, delFromId = null, delTargetId = null; var roomMap = {}, occupied = {}; @@ -22,8 +22,8 @@ var upTarget = {}, downTarget = {}; var _mapMouseCleanup = false; -function isShiftKey(e) { - return e && (e.key === 'Shift' || e.code === 'ShiftLeft' || e.code === 'ShiftRight' || e.keyCode === 16); +function isCtrlKey(e) { + return e && (e.key === 'Control' || e.code === 'ControlLeft' || e.code === 'ControlRight' || e.keyCode === 17); } function onMapMouseMove(e) { @@ -32,7 +32,7 @@ function onMapMouseMove(e) { if (delFromId && moved && !delDrag) { delDrag = true; } if (delDrag && moved) { - delOneWay = e.shiftKey; + delOneWay = e.ctrlKey; updateDelDragTarget(e); showDelDragBadge(); return; @@ -47,7 +47,7 @@ function onMapMouseMove(e) { if (linkFromId && moved) { linkDrag = true; - linkDragOneWay = e.shiftKey; + linkDragOneWay = e.ctrlKey; showLinkDragBadge(); updateLinkDragTarget(e); } @@ -70,7 +70,7 @@ function onMapMouseUp(e) { } if (delDrag && delFromId && delTargetId) { - deleteLink(delFromId, delTargetId, (delOneWay || e.shiftKey) ? 'from' : ''); + deleteLink(delFromId, delTargetId, (delOneWay || e.ctrlKey) ? 'from' : ''); clearDelHighlight(); hideDragBadge(); dragging = false; dragRoom = false; delDrag = false; delFromId = null; delTargetId = null; delOneWay = false; @@ -79,14 +79,14 @@ function onMapMouseUp(e) { } if (linkDrag && linkFromId) { - var oneway = linkDragOneWay || e.shiftKey; - if (linkTargetId) { createLink(linkFromId, linkTargetId, oneway); } + var oneway = linkDragOneWay || e.ctrlKey; + if (linkTargetId) { createLink(linkFromId, linkTargetId, oneway, linkTargetDir); } else if (linkGhostDir) { createRoom(linkFromId, linkGhostDir, oneway); } } else if (!moved && !delDrag) { if (e.target.classList.contains('rm')) { selectRoom(parseInt(e.target.getAttribute('data-id'))); } else if (e.target.classList.contains('ghost')) { - createRoom(selectedRoom, e.target.getAttribute('data-dir'), e.shiftKey); + createRoom(selectedRoom, e.target.getAttribute('data-dir'), e.ctrlKey); } } @@ -94,7 +94,7 @@ function onMapMouseUp(e) { clearDelHighlight(); hideDragBadge(); dragging = false; dragRoom = false; - linkDrag = false; linkFromId = null; linkTargetId = null; linkGhostDir = null; linkDragOneWay = false; + linkDrag = false; linkFromId = null; linkTargetId = null; linkTargetDir = null; linkGhostDir = null; linkDragOneWay = false; delDrag = false; delFromId = null; delTargetId = null; delOneWay = false; if (document.activeElement && document.activeElement.blur) document.activeElement.blur(); } @@ -108,7 +108,7 @@ function cancelMapDrag() { clearDelHighlight(); hideDragBadge(); dragging = false; dragRoom = false; - linkDrag = false; linkFromId = null; linkTargetId = null; linkGhostDir = null; linkDragOneWay = false; + linkDrag = false; linkFromId = null; linkTargetId = null; linkTargetDir = null; linkGhostDir = null; linkDragOneWay = false; delDrag = false; delFromId = null; delTargetId = null; delOneWay = false; if (document.activeElement && document.activeElement.blur) document.activeElement.blur(); } @@ -139,9 +139,9 @@ function showDelDragBadge() { showDragBadge(label, delOneWay); } -function refreshDragMode(shiftDown) { - if (linkDrag && linkFromId) { linkDragOneWay = shiftDown; showLinkDragBadge(); } - if (delDrag && delFromId) { delOneWay = shiftDown; showDelDragBadge(); } +function refreshDragMode(ctrlDown) { + if (linkDrag && linkFromId) { linkDragOneWay = ctrlDown; showLinkDragBadge(); } + if (delDrag && delFromId) { delOneWay = ctrlDown; showDelDragBadge(); } } function changeZ(dz) { @@ -314,18 +314,24 @@ function renderMap(data) { svg.oncontextmenu = function(e) { e.preventDefault(); }; + if (!svg._ctxWired) { + svg.addEventListener('contextmenu', function(e) { e.preventDefault(); e.stopPropagation(); }); + svg._ctxWired = true; + } + if (!svg._mapKeysWired) { svg.setAttribute('tabindex', '0'); svg.addEventListener('keydown', function(e) { - if (isShiftKey(e)) { shiftHeld = true; if (dragging) refreshDragMode(true); } + if (isCtrlKey(e)) { ctrlHeld = true; if (dragging) refreshDragMode(true); } }); svg.addEventListener('keyup', function(e) { - if (isShiftKey(e)) { shiftHeld = false; if (dragging) refreshDragMode(false); } + if (isCtrlKey(e)) { ctrlHeld = false; if (dragging) refreshDragMode(false); } }); svg._mapKeysWired = true; } svg.onmousedown = function(e) { + if (e.button === 2) e.preventDefault(); var onRoom = e.target.classList.contains('rm'); var onGhost = e.target.classList.contains('ghost'); var onUdBtn = e.target.classList.contains('ud-btn'); @@ -373,7 +379,7 @@ function renderMap(data) { linkDrag = false; linkTargetId = null; linkGhostDir = null; - linkDragOneWay = onRoom ? (e.shiftKey || shiftHeld) : false; + linkDragOneWay = onRoom ? (e.ctrlKey || ctrlHeld) : false; delDrag = false; delFromId = null; delTargetId = null; clearLinkHighlight(); document.addEventListener('mousemove', onMapMouseMove); @@ -1989,6 +1995,7 @@ function gridDeltaToDir(dx, dy) { function updateLinkDragTarget(e) { clearLinkHighlight(); linkTargetId = null; + linkTargetDir = null; linkGhostDir = null; var fromRoom = mapData.rooms ? mapData.rooms.find(function(r){return r.id === linkFromId;}) : null; @@ -2007,6 +2014,7 @@ function updateLinkDragTarget(e) { if (neighbor && neighbor !== linkFromId) { linkTargetId = neighbor; + linkTargetDir = dir; linkGhostDir = null; applyLinkHighlight(linkFromId, linkTargetId); } else if (!neighbor) { @@ -2093,9 +2101,10 @@ function clearLinkHighlight() { } } -function createLink(fromId, toId, oneway) { +function createLink(fromId, toId, oneway, dir) { var body = {from: fromId, to: toId}; if (oneway) body.oneway = true; + if (dir) body.dir = dir; API.post('/api/rooms/link', body).then(function(res) { if (res && res.error) { notify('Link failed: ' + res.error, 'error'); return; } notify('Linked rooms #'+fromId+' '+toId + (oneway ? ' (one-way)' : ''), 'success'); @@ -2443,6 +2452,6 @@ function reloadRoomDirs(cb) { } document.addEventListener('DOMContentLoaded', function() { loadRoomDirs(function() { loadMap(); }); initPanelResize(); - window.addEventListener('keydown', function(e) { if (isShiftKey(e)) { shiftHeld = true; if (dragging) refreshDragMode(true); } }); - window.addEventListener('keyup', function(e) { if (isShiftKey(e)) { shiftHeld = false; if (dragging) refreshDragMode(false); } }); + window.addEventListener('keydown', function(e) { if (isCtrlKey(e)) { ctrlHeld = true; if (dragging) refreshDragMode(true); } }); + window.addEventListener('keyup', function(e) { if (isCtrlKey(e)) { ctrlHeld = false; if (dragging) refreshDragMode(false); } }); }); -- cgit v1.2.3