mirror of
				https://github.com/telekom-security/tpotce.git
				synced 2025-10-31 20:42:53 +00:00 
			
		
		
		
	
		
			
	
	
		
			251 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			251 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
|   | /* Redmine - project management software | ||
|  |    Copyright (C) 2006-2017  Jean-Philippe Lang */ | ||
|  | 
 | ||
|  | var contextMenuObserving; | ||
|  | 
 | ||
|  | function contextMenuRightClick(event) { | ||
|  |   var target = $(event.target); | ||
|  |   if (target.is('a')) {return;} | ||
|  |   var tr = target.closest('.hascontextmenu').first(); | ||
|  |   if (tr.length < 1) {return;} | ||
|  |   event.preventDefault(); | ||
|  |   if (!contextMenuIsSelected(tr)) { | ||
|  |     contextMenuUnselectAll(); | ||
|  |     contextMenuAddSelection(tr); | ||
|  |     contextMenuSetLastSelected(tr); | ||
|  |   } | ||
|  |   contextMenuShow(event); | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuClick(event) { | ||
|  |   var target = $(event.target); | ||
|  |   var lastSelected; | ||
|  | 
 | ||
|  |   if (target.is('a') && target.hasClass('submenu')) { | ||
|  |     event.preventDefault(); | ||
|  |     return; | ||
|  |   } | ||
|  |   contextMenuHide(); | ||
|  |   if (target.is('a') || target.is('img')) { return; } | ||
|  |   if (event.which == 1 || (navigator.appVersion.match(/\bMSIE\b/))) { | ||
|  |     var tr = target.closest('.hascontextmenu').first(); | ||
|  |     if (tr.length > 0) { | ||
|  |       // a row was clicked, check if the click was on checkbox | ||
|  |       if (target.is('input')) { | ||
|  |         // a checkbox may be clicked | ||
|  |         if (target.prop('checked')) { | ||
|  |           tr.addClass('context-menu-selection'); | ||
|  |         } else { | ||
|  |           tr.removeClass('context-menu-selection'); | ||
|  |         } | ||
|  |       } else { | ||
|  |         if (event.ctrlKey || event.metaKey) { | ||
|  |           contextMenuToggleSelection(tr); | ||
|  |         } else if (event.shiftKey) { | ||
|  |           lastSelected = contextMenuLastSelected(); | ||
|  |           if (lastSelected.length) { | ||
|  |             var toggling = false; | ||
|  |             $('.hascontextmenu').each(function(){ | ||
|  |               if (toggling || $(this).is(tr)) { | ||
|  |                 contextMenuAddSelection($(this)); | ||
|  |               } | ||
|  |               if ($(this).is(tr) || $(this).is(lastSelected)) { | ||
|  |                 toggling = !toggling; | ||
|  |               } | ||
|  |             }); | ||
|  |           } else { | ||
|  |             contextMenuAddSelection(tr); | ||
|  |           } | ||
|  |         } else { | ||
|  |           contextMenuUnselectAll(); | ||
|  |           contextMenuAddSelection(tr); | ||
|  |         } | ||
|  |         contextMenuSetLastSelected(tr); | ||
|  |       } | ||
|  |     } else { | ||
|  |       // click is outside the rows | ||
|  |       if (target.is('a') && (target.hasClass('disabled') || target.hasClass('submenu'))) { | ||
|  |         event.preventDefault(); | ||
|  |       } else if (target.is('.toggle-selection') || target.is('.ui-dialog *') || $('#ajax-modal').is(':visible')) { | ||
|  |         // nop | ||
|  |       } else { | ||
|  |         contextMenuUnselectAll(); | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuCreate() { | ||
|  |   if ($('#context-menu').length < 1) { | ||
|  |     var menu = document.createElement("div"); | ||
|  |     menu.setAttribute("id", "context-menu"); | ||
|  |     menu.setAttribute("style", "display:none;"); | ||
|  |     document.getElementById("content").appendChild(menu); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuShow(event) { | ||
|  |   var mouse_x = event.pageX; | ||
|  |   var mouse_y = event.pageY;   | ||
|  |   var mouse_y_c = event.clientY;   | ||
|  |   var render_x = mouse_x; | ||
|  |   var render_y = mouse_y; | ||
|  |   var dims; | ||
|  |   var menu_width; | ||
|  |   var menu_height; | ||
|  |   var window_width; | ||
|  |   var window_height; | ||
|  |   var max_width; | ||
|  |   var max_height; | ||
|  |   var url; | ||
|  | 
 | ||
|  |   $('#context-menu').css('left', (render_x + 'px')); | ||
|  |   $('#context-menu').css('top', (render_y + 'px')); | ||
|  |   $('#context-menu').html(''); | ||
|  | 
 | ||
|  |   url = $(event.target).parents('form').first().data('cm-url'); | ||
|  |   if (url == null) {alert('no url'); return;} | ||
|  | 
 | ||
|  |   $.ajax({ | ||
|  |     url: url, | ||
|  |     data: $(event.target).parents('form').first().serialize(), | ||
|  |     success: function(data, textStatus, jqXHR) { | ||
|  |       $('#context-menu').html(data); | ||
|  |       menu_width = $('#context-menu').width(); | ||
|  |       menu_height = $('#context-menu').height(); | ||
|  |       max_width = mouse_x + 2*menu_width; | ||
|  |       max_height = mouse_y_c + menu_height; | ||
|  | 
 | ||
|  |       var ws = window_size(); | ||
|  |       window_width = ws.width; | ||
|  |       window_height = ws.height; | ||
|  | 
 | ||
|  |       /* display the menu above and/or to the left of the click if needed */ | ||
|  |       if (max_width > window_width) { | ||
|  |        render_x -= menu_width; | ||
|  |        $('#context-menu').addClass('reverse-x'); | ||
|  |       } else { | ||
|  |        $('#context-menu').removeClass('reverse-x'); | ||
|  |       } | ||
|  | 
 | ||
|  |       if (max_height > window_height) { | ||
|  |        render_y -= menu_height; | ||
|  |        $('#context-menu').addClass('reverse-y'); | ||
|  |         // adding class for submenu | ||
|  |         if (mouse_y_c < 325) { | ||
|  |           $('#context-menu .folder').addClass('down'); | ||
|  |         } | ||
|  |       } else { | ||
|  |         // adding class for submenu | ||
|  |         if (window_height - mouse_y_c < 345) { | ||
|  |           $('#context-menu .folder').addClass('up'); | ||
|  |         }  | ||
|  |         $('#context-menu').removeClass('reverse-y'); | ||
|  |       } | ||
|  | 
 | ||
|  |       if (render_x <= 0) render_x = 1; | ||
|  |       if (render_y <= 0) render_y = 1; | ||
|  |       $('#context-menu').css('left', (render_x + 'px')); | ||
|  |       $('#context-menu').css('top', (render_y + 'px')); | ||
|  |       $('#context-menu').show(); | ||
|  | 
 | ||
|  |       //if (window.parseStylesheets) { window.parseStylesheets(); } // IE | ||
|  |     } | ||
|  |   }); | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuSetLastSelected(tr) { | ||
|  |   $('.cm-last').removeClass('cm-last'); | ||
|  |   tr.addClass('cm-last'); | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuLastSelected() { | ||
|  |   return $('.cm-last').first(); | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuUnselectAll() { | ||
|  |   $('input[type=checkbox].toggle-selection').prop('checked', false); | ||
|  |   $('.hascontextmenu').each(function(){ | ||
|  |     contextMenuRemoveSelection($(this)); | ||
|  |   }); | ||
|  |   $('.cm-last').removeClass('cm-last'); | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuHide() { | ||
|  |   $('#context-menu').hide(); | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuToggleSelection(tr) { | ||
|  |   if (contextMenuIsSelected(tr)) { | ||
|  |     contextMenuRemoveSelection(tr); | ||
|  |   } else { | ||
|  |     contextMenuAddSelection(tr); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuAddSelection(tr) { | ||
|  |   tr.addClass('context-menu-selection'); | ||
|  |   contextMenuCheckSelectionBox(tr, true); | ||
|  |   contextMenuClearDocumentSelection(); | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuRemoveSelection(tr) { | ||
|  |   tr.removeClass('context-menu-selection'); | ||
|  |   contextMenuCheckSelectionBox(tr, false); | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuIsSelected(tr) { | ||
|  |   return tr.hasClass('context-menu-selection'); | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuCheckSelectionBox(tr, checked) { | ||
|  |   tr.find('input[type=checkbox]').prop('checked', checked); | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuClearDocumentSelection() { | ||
|  |   // TODO | ||
|  |   if (document.selection) { | ||
|  |     document.selection.empty(); // IE | ||
|  |   } else { | ||
|  |     window.getSelection().removeAllRanges(); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function contextMenuInit() { | ||
|  |   contextMenuCreate(); | ||
|  |   contextMenuUnselectAll(); | ||
|  |    | ||
|  |   if (!contextMenuObserving) { | ||
|  |     $(document).click(contextMenuClick); | ||
|  |     $(document).contextmenu(contextMenuRightClick); | ||
|  |     contextMenuObserving = true; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function toggleIssuesSelection(el) { | ||
|  |   var checked = $(this).prop('checked'); | ||
|  |   var boxes = $(this).parents('table').find('input[name=ids\\[\\]]'); | ||
|  |   boxes.prop('checked', checked).parents('.hascontextmenu').toggleClass('context-menu-selection', checked); | ||
|  | } | ||
|  | 
 | ||
|  | function window_size() { | ||
|  |   var w; | ||
|  |   var h; | ||
|  |   if (window.innerWidth) { | ||
|  |     w = window.innerWidth; | ||
|  |     h = window.innerHeight; | ||
|  |   } else if (document.documentElement) { | ||
|  |     w = document.documentElement.clientWidth; | ||
|  |     h = document.documentElement.clientHeight; | ||
|  |   } else { | ||
|  |     w = document.body.clientWidth; | ||
|  |     h = document.body.clientHeight; | ||
|  |   } | ||
|  |   return {width: w, height: h}; | ||
|  | } | ||
|  | 
 | ||
|  | $(document).ready(function(){ | ||
|  |   contextMenuInit(); | ||
|  |   $('input[type=checkbox].toggle-selection').on('change', toggleIssuesSelection); | ||
|  | }); |