mirror of
				https://github.com/telekom-security/tpotce.git
				synced 2025-11-04 06:22:54 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			250 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			250 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);
 | 
						|
});
 |