1 angular.module('ui.bootstrap.contextMenu', [])
3 .directive('contextMenu', ["$parse", function ($parse) {
4 var renderContextMenu = function ($scope, event, options, model) {
5 if (!$) { var $ = angular.element; }
6 $(event.currentTarget).addClass('context');
7 var $contextMenu = $('<div>');
8 $contextMenu.addClass('dropdown clearfix');
10 $ul.addClass('dropdown-menu');
11 $ul.attr({ 'role': 'menu' });
15 left: event.pageX + 'px',
16 top: event.pageY + 'px'
18 angular.forEach(options, function (item, i) {
21 $li.addClass('divider');
24 $a.attr({ tabindex: '-1', href: '#' });
25 var text = typeof item[0] == 'string' ? item[0] : item[0].call($scope, $scope, event, model);
28 var enabled = angular.isDefined(item[2]) ? item[2].call($scope, $scope, event, text, model) : true;
30 $li.on('click', function ($event) {
31 $event.preventDefault();
32 $scope.$apply(function () {
33 $(event.currentTarget).removeClass('context');
34 $contextMenu.remove();
35 item[1].call($scope, $scope, event, model);
39 $li.on('click', function ($event) {
40 $event.preventDefault();
42 $li.addClass('disabled');
47 $contextMenu.append($ul);
48 var height = Math.max(
49 document.body.scrollHeight, document.documentElement.scrollHeight,
50 document.body.offsetHeight, document.documentElement.offsetHeight,
51 document.body.clientHeight, document.documentElement.clientHeight
55 height: height + 'px',
61 $(document).find('body').append($contextMenu);
62 $contextMenu.on("mousedown", function (e) {
63 if ($(e.target).hasClass('dropdown')) {
64 $(event.currentTarget).removeClass('context');
65 $contextMenu.remove();
67 }).on('contextmenu', function (event) {
68 $(event.currentTarget).removeClass('context');
69 event.preventDefault();
70 $contextMenu.remove();
73 return function ($scope, element, attrs) {
74 element.on('contextmenu', function (event) {
75 event.stopPropagation();
76 $scope.$apply(function () {
77 event.preventDefault();
78 var options = $scope.$eval(attrs.contextMenu);
79 var model = $scope.$eval(attrs.model);
80 if (options instanceof Array) {
81 if (options.length === 0) { return; }
82 renderContextMenu($scope, event, options, model);
84 throw '"' + attrs.contextMenu + '" not an array';