diff --git app/helpers/application_helper.rb app/helpers/application_helper.rb index e2eebfa41..f37e60b03 100644 --- app/helpers/application_helper.rb +++ app/helpers/application_helper.rb @@ -1607,7 +1607,7 @@ module ApplicationHelper def context_menu unless @context_menu_included content_for :header_tags do - javascript_include_tag('context_menu') + + javascript_include_tag('context_menu', type: :module) + stylesheet_link_tag('context_menu') end if l(:direction) == 'rtl' diff --git public/javascripts/context_menu.js public/javascripts/context_menu.js index 0dd6ad6b9..2c5886364 100644 --- public/javascripts/context_menu.js +++ public/javascripts/context_menu.js @@ -1,23 +1,23 @@ /* Redmine - project management software Copyright (C) 2006-2022 Jean-Philippe Lang */ -var contextMenuObserving; +var observing; -function contextMenuRightClick(event) { +function rightClick(event) { var target = $(event.target); if (target.is('a:not(.js-contextmenu)')) {return;} var tr = target.closest('.hascontextmenu').first(); if (tr.length < 1) {return;} event.preventDefault(); - if (!contextMenuIsSelected(tr)) { - contextMenuUnselectAll(); - contextMenuAddSelection(tr); - contextMenuSetLastSelected(tr); + if (!isSelected(tr)) { + unselectAll(); + addSelection(tr); + setLastSelected(tr); } - contextMenuShow(event); + show(event); } -function contextMenuClick(event) { +function click(event) { var target = $(event.target); var lastSelected; @@ -25,7 +25,7 @@ function contextMenuClick(event) { event.preventDefault(); return; } - contextMenuHide(); + hide(); if (target.is('a') || target.is('img')) { return; } if (event.which == 1 || (navigator.appVersion.match(/\bMSIE\b/))) { var tr = target.closest('.hascontextmenu').first(); @@ -45,29 +45,29 @@ function contextMenuClick(event) { } } else { if (event.ctrlKey || event.metaKey) { - contextMenuToggleSelection(tr); - contextMenuClearDocumentSelection(); + toggleSelection(tr); + clearDocumentSelection(); } else if (event.shiftKey) { - lastSelected = contextMenuLastSelected(); + lastSelected = getLastSelected(); if (lastSelected.length) { var toggling = false; $('.hascontextmenu').each(function(){ if (toggling || $(this).is(tr)) { - contextMenuAddSelection($(this)); - contextMenuClearDocumentSelection(); + addSelection($(this)); + clearDocumentSelection(); } if ($(this).is(tr) || $(this).is(lastSelected)) { toggling = !toggling; } }); } else { - contextMenuAddSelection(tr); + addSelection(tr); } } else { - contextMenuUnselectAll(); - contextMenuAddSelection(tr); + unselectAll(); + addSelection(tr); } - contextMenuSetLastSelected(tr); + setLastSelected(tr); } } else { // click is outside the rows @@ -76,13 +76,13 @@ function contextMenuClick(event) { } else if (target.is('.toggle-selection') || target.is('.ui-dialog *') || $('#ajax-modal').is(':visible')) { // nop } else { - contextMenuUnselectAll(); + unselectAll(); } } } } -function contextMenuCreate() { +function create() { if ($('#context-menu').length < 1) { var menu = document.createElement("div"); menu.setAttribute("id", "context-menu"); @@ -91,7 +91,7 @@ function contextMenuCreate() { } } -function contextMenuShow(event) { +function show(event) { var mouse_x = event.pageX; var mouse_y = event.pageY; var mouse_y_c = event.clientY; @@ -161,54 +161,54 @@ function contextMenuShow(event) { }); } -function contextMenuSetLastSelected(tr) { +function setLastSelected(tr) { $('.cm-last').removeClass('cm-last'); tr.addClass('cm-last'); } -function contextMenuLastSelected() { +function getLastSelected() { return $('.cm-last').first(); } -function contextMenuUnselectAll() { +function unselectAll() { $('input[type=checkbox].toggle-selection').prop('checked', false); $('.hascontextmenu').each(function(){ - contextMenuRemoveSelection($(this)); + removeSelection($(this)); }); $('.cm-last').removeClass('cm-last'); } -function contextMenuHide() { +function hide() { $('#context-menu').hide(); } -function contextMenuToggleSelection(tr) { - if (contextMenuIsSelected(tr)) { - contextMenuRemoveSelection(tr); +function toggleSelection(tr) { + if (isSelected(tr)) { + removeSelection(tr); } else { - contextMenuAddSelection(tr); + addSelection(tr); } } -function contextMenuAddSelection(tr) { +function addSelection(tr) { tr.addClass('context-menu-selection'); - contextMenuCheckSelectionBox(tr, true); + checkSelectionBox(tr, true); } -function contextMenuRemoveSelection(tr) { +function removeSelection(tr) { tr.removeClass('context-menu-selection'); - contextMenuCheckSelectionBox(tr, false); + checkSelectionBox(tr, false); } -function contextMenuIsSelected(tr) { +function isSelected(tr) { return tr.hasClass('context-menu-selection'); } -function contextMenuCheckSelectionBox(tr, checked) { +function checkSelectionBox(tr, checked) { tr.find('input[type=checkbox]').prop('checked', checked); } -function contextMenuClearDocumentSelection() { +function clearDocumentSelection() { // TODO if (document.selection) { document.selection.empty(); // IE @@ -217,15 +217,15 @@ function contextMenuClearDocumentSelection() { } } -function contextMenuInit() { - contextMenuCreate(); - contextMenuUnselectAll(); +function init() { + create(); + unselectAll(); - if (!contextMenuObserving) { - $(document).click(contextMenuClick); - $(document).contextmenu(contextMenuRightClick); - $(document).on('click', '.js-contextmenu', contextMenuRightClick); - contextMenuObserving = true; + if (!observing) { + $(document).click(click); + $(document).contextmenu(rightClick); + $(document).on('click', '.js-contextmenu', rightClick); + observing = true; } } @@ -252,6 +252,6 @@ function window_size() { } $(document).ready(function(){ - contextMenuInit(); + init(); $('input[type=checkbox].toggle-selection').on('change', toggleIssuesSelection); });