const $contextMenuContainer = $("#context-menu-container"); function initContextMenu(event, itemContainer, selectContextMenuItem) { event.stopPropagation(); $contextMenuContainer.empty(); for (const item of itemContainer.getItems()) { if (item.title === '----') { $contextMenuContainer.append($("
").addClass("dropdown-divider")); } else { const $icon = $(""); if (item.uiIcon) { $icon.addClass("jam jam-" + item.uiIcon); } else { $icon.append(" "); } const $item = $("") .append($icon) .append("   ") // some space between icon and text .addClass("dropdown-item") .prop("data-cmd", item.cmd) .append(item.title); if (item.enabled !== undefined && !item.enabled) { $item.addClass("disabled"); } $item.click(async function (e) { const cmd = $(e.target).prop("data-cmd"); e.originalTarget = event.target; await selectContextMenuItem(e, cmd); }); $contextMenuContainer.append($item); } } // code below tries to detect when dropdown would overflow from page // in such case we'll position it above click coordinates so it will fit into client const clickPosition = event.pageY; const clientHeight = document.documentElement.clientHeight; const contextMenuHeight = $contextMenuContainer.height(); let top; if (clickPosition + contextMenuHeight > clientHeight) { top = clientHeight - contextMenuHeight - 10; } else { top = event.pageY - 10; } $contextMenuContainer.css({ display: "block", top: top, left: event.pageX - 20 }).addClass("show"); } $(document).click(() => $contextMenuContainer.hide()); export default { initContextMenu }