Built motion from commit 1038d87.|0.0.141
[motion.git] / public / bower_components / angular-bootstrap-contextmenu / contextMenu.js
1 angular.module('ui.bootstrap.contextMenu', [])
2
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');
9         var $ul = $('<ul>');
10         $ul.addClass('dropdown-menu');
11         $ul.attr({ 'role': 'menu' });
12         $ul.css({
13             display: 'block',
14             position: 'absolute',
15             left: event.pageX + 'px',
16             top: event.pageY + 'px'
17         });
18         angular.forEach(options, function (item, i) {
19             var $li = $('<li>');
20             if (item === null) {
21                 $li.addClass('divider');
22             } else {
23                 var $a = $('<a>');
24                 $a.attr({ tabindex: '-1', href: '#' });
25                 var text = typeof item[0] == 'string' ? item[0] : item[0].call($scope, $scope, event, model);
26                 $a.text(text);
27                 $li.append($a);
28                 var enabled = angular.isDefined(item[2]) ? item[2].call($scope, $scope, event, text, model) : true;
29                 if (enabled) {
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);
36                         });
37                     });
38                 } else {
39                     $li.on('click', function ($event) {
40                         $event.preventDefault();
41                     });
42                     $li.addClass('disabled');
43                 }
44             }
45             $ul.append($li);
46         });
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
52         );
53         $contextMenu.css({
54             width: '100%',
55             height: height + 'px',
56             position: 'absolute',
57             top: 0,
58             left: 0,
59             zIndex: 9999
60         });
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();
66             }
67         }).on('contextmenu', function (event) {
68             $(event.currentTarget).removeClass('context');
69             event.preventDefault();
70             $contextMenu.remove();
71         });
72     };
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);
83                 } else {
84                     throw '"' + attrs.contextMenu + '" not an array';
85                 }
86             });
87         });
88     };
89 }]);