diff options
| author | historia <[not public]> | 2026-07-11 18:30:58 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-07-11 18:30:58 -0400 |
| commit | 2bacbb08d1ac67c4f63ee535728cd4e8760e3211 (patch) | |
| tree | d8ee366b3d32b486eb05c5e10bc65cf194ae4c23 /internal/admin/static/ctxmenu.js | |
| parent | 131cbbe586463a7232f332650af5f0b2c13dc7e9 (diff) | |
| download | thehouseoficarus-2bacbb08d1ac67c4f63ee535728cd4e8760e3211.tar.gz | |
feat(admin): unify context menu, add context menu to files tab
Diffstat (limited to 'internal/admin/static/ctxmenu.js')
| -rw-r--r-- | internal/admin/static/ctxmenu.js | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/internal/admin/static/ctxmenu.js b/internal/admin/static/ctxmenu.js new file mode 100644 index 0000000..96e92a9 --- /dev/null +++ b/internal/admin/static/ctxmenu.js @@ -0,0 +1,47 @@ +function openContextMenu(e, items) { + e.preventDefault(); + e.stopPropagation(); + closeContextMenu(); + + var overlay = document.createElement('div'); + overlay.className = 'cm-overlay'; + overlay.id = '_ctxMenuOverlay'; + overlay.onclick = function() { closeContextMenu(); }; + overlay.addEventListener('contextmenu', function(ev) { + ev.preventDefault(); + ev.stopPropagation(); + var cx = ev.clientX, cy = ev.clientY; + closeContextMenu(); + var el = document.elementFromPoint(cx, cy); + if (el) el.dispatchEvent(new MouseEvent('contextmenu', {bubbles:true, cancelable:true, clientX:cx, clientY:cy, button:2})); + }); + + var menu = document.createElement('div'); + menu.className = 'cm-menu'; + menu.id = '_ctxMenu'; + menu.style.left = e.clientX + 'px'; + menu.style.top = e.clientY + 'px'; + menu.oncontextmenu = function(ev) { ev.preventDefault(); }; + + function addBtn(label, cls, handler) { + var btn = document.createElement('button'); + btn.textContent = label; + if (cls) btn.className = cls; + btn.onclick = function() { closeContextMenu(); handler(); }; + menu.appendChild(btn); + } + + for (var i = 0; i < items.length; i++) { + addBtn(items[i].label, items[i].cls || '', items[i].handler); + } + + document.body.appendChild(overlay); + document.body.appendChild(menu); +} + +function closeContextMenu() { + var o = document.getElementById('_ctxMenuOverlay'); + var m = document.getElementById('_ctxMenu'); + if (o) o.remove(); + if (m) m.remove(); +} |
