11/**
2- * ng-context-menu - v1.0.0 - An AngularJS directive to display a context menu
2+ * ng-context-menu - v1.0.1 - An AngularJS directive to display a context menu
33 * when a right-click event is triggered
44 *
55 * @author Ian Kennington Walter (http://ianvonwalter.com)
66 */
7- angular
8- . module ( 'ng-context-menu' , [ ] )
9- . factory ( 'ContextMenuService' , function ( ) {
10- return {
11- element : null ,
12- menuElement : null
13- } ;
14- } )
15- . directive ( 'contextMenu' , [
16- '$document' ,
17- 'ContextMenuService' ,
18- function ( $document , ContextMenuService ) {
7+ ( function ( angular ) {
8+ 'use strict' ;
9+
10+ angular
11+ . module ( 'ng-context-menu' , [ ] )
12+ . factory ( 'ContextMenuService' , function ( ) {
1913 return {
20- restrict : 'A' ,
21- scope : {
22- 'callback' : '&contextMenu' ,
23- 'disabled' : '&contextMenuDisabled' ,
24- 'closeCallback' : '&contextMenuClose'
25- } ,
26- link : function ( $scope , $element , $attrs ) {
27- var opened = false ;
14+ element : null ,
15+ menuElement : null
16+ } ;
17+ } )
18+ . directive ( 'contextMenu' , [
19+ '$document' ,
20+ 'ContextMenuService' ,
21+ function ( $document , ContextMenuService ) {
22+ return {
23+ restrict : 'A' ,
24+ scope : {
25+ 'callback' : '&contextMenu' ,
26+ 'disabled' : '&contextMenuDisabled' ,
27+ 'closeCallback' : '&contextMenuClose'
28+ } ,
29+ link : function ( $scope , $element , $attrs ) {
30+ var opened = false ;
2831
29- function open ( event , menuElement ) {
30- menuElement . addClass ( 'open' ) ;
32+ function open ( event , menuElement ) {
33+ menuElement . addClass ( 'open' ) ;
3134
32- var doc = $document [ 0 ] . documentElement ;
33- var docLeft = ( window . pageXOffset || doc . scrollLeft ) -
34- ( doc . clientLeft || 0 ) ,
35+ var doc = $document [ 0 ] . documentElement ;
36+ var docLeft = ( window . pageXOffset || doc . scrollLeft ) -
37+ ( doc . clientLeft || 0 ) ,
3538 docTop = ( window . pageYOffset || doc . scrollTop ) -
36- ( doc . clientTop || 0 ) ,
39+ ( doc . clientTop || 0 ) ,
3740 elementWidth = menuElement [ 0 ] . scrollWidth ,
3841 elementHeight = menuElement [ 0 ] . scrollHeight ;
39- var docWidth = doc . clientWidth + docLeft ,
40- docHeight = doc . clientHeight + docTop ,
41- totalWidth = elementWidth + event . pageX ,
42- totalHeight = elementHeight + event . pageY ,
43- left = Math . max ( event . pageX - docLeft , 0 ) ,
44- top = Math . max ( event . pageY - docTop , 0 ) ;
42+ var docWidth = doc . clientWidth + docLeft ,
43+ docHeight = doc . clientHeight + docTop ,
44+ totalWidth = elementWidth + event . pageX ,
45+ totalHeight = elementHeight + event . pageY ,
46+ left = Math . max ( event . pageX - docLeft , 0 ) ,
47+ top = Math . max ( event . pageY - docTop , 0 ) ;
4548
46- if ( totalWidth > docWidth ) {
47- left = left - ( totalWidth - docWidth ) ;
48- }
49+ if ( totalWidth > docWidth ) {
50+ left = left - ( totalWidth - docWidth ) ;
51+ }
4952
50- if ( totalHeight > docHeight ) {
51- top = top - ( totalHeight - docHeight ) ;
53+ if ( totalHeight > docHeight ) {
54+ top = top - ( totalHeight - docHeight ) ;
55+ }
56+
57+ menuElement . css ( 'top' , top + 'px' ) ;
58+ menuElement . css ( 'left' , left + 'px' ) ;
59+ opened = true ;
5260 }
5361
54- menuElement . css ( 'top' , top + 'px' ) ;
55- menuElement . css ( 'left' , left + 'px' ) ;
56- opened = true ;
57- }
62+ function close ( menuElement ) {
63+ menuElement . removeClass ( 'open' ) ;
5864
59- function close ( menuElement ) {
60- menuElement . removeClass ( 'open' ) ;
65+ if ( opened ) {
66+ $scope . closeCallback ( ) ;
67+ }
6168
62- if ( opened ) {
63- $scope . closeCallback ( ) ;
69+ opened = false ;
6470 }
6571
66- opened = false ;
67- }
72+ $element . bind ( 'contextmenu' , function ( event ) {
73+ if ( ! $scope . disabled ( ) ) {
74+ if ( ContextMenuService . menuElement !== null ) {
75+ close ( ContextMenuService . menuElement ) ;
76+ }
77+ ContextMenuService . menuElement = angular . element (
78+ document . getElementById ( $attrs . target )
79+ ) ;
80+ ContextMenuService . element = event . target ;
81+ //console.log('set', ContextMenuService.element);
6882
69- $element . bind ( 'contextmenu' , function ( event ) {
70- if ( ! $scope . disabled ( ) ) {
71- if ( ContextMenuService . menuElement !== null ) {
72- close ( ContextMenuService . menuElement ) ;
83+ event . preventDefault ( ) ;
84+ event . stopPropagation ( ) ;
85+ $scope . $apply ( function ( ) {
86+ $scope . callback ( { $event : event } ) ;
87+ } ) ;
88+ $scope . $apply ( function ( ) {
89+ open ( event , ContextMenuService . menuElement ) ;
90+ } ) ;
7391 }
74- ContextMenuService . menuElement = angular . element (
75- document . getElementById ( $attrs . target )
76- ) ;
77- ContextMenuService . element = event . target ;
78- //console.log('set', ContextMenuService.element);
92+ } ) ;
7993
80- event . preventDefault ( ) ;
81- event . stopPropagation ( ) ;
82- $scope . $apply ( function ( ) {
83- $scope . callback ( { $event : event } ) ;
84- } ) ;
85- $scope . $apply ( function ( ) {
86- open ( event , ContextMenuService . menuElement ) ;
87- } ) ;
88- }
89- } ) ;
90-
91- function handleKeyUpEvent ( event ) {
92- //console.log('keyup');
93- if ( ! $scope . disabled ( ) && opened && event . keyCode === 27 ) {
94- $scope . $apply ( function ( ) {
95- close ( ContextMenuService . menuElement ) ;
96- } ) ;
94+ function handleKeyUpEvent ( event ) {
95+ //console.log('keyup');
96+ if ( ! $scope . disabled ( ) && opened && event . keyCode === 27 ) {
97+ $scope . $apply ( function ( ) {
98+ close ( ContextMenuService . menuElement ) ;
99+ } ) ;
100+ }
97101 }
98- }
99102
100- function handleClickEvent ( event ) {
101- if ( ! $scope . disabled ( ) &&
102- opened &&
103- ( event . button !== 2 ||
104- event . target !== ContextMenuService . element ) ) {
105- $scope . $apply ( function ( ) {
106- close ( ContextMenuService . menuElement ) ;
107- } ) ;
103+ function handleClickEvent ( event ) {
104+ if ( ! $scope . disabled ( ) &&
105+ opened &&
106+ ( event . button !== 2 ||
107+ event . target !== ContextMenuService . element ) ) {
108+ $scope . $apply ( function ( ) {
109+ close ( ContextMenuService . menuElement ) ;
110+ } ) ;
111+ }
108112 }
109- }
110113
111- $document . bind ( 'keyup' , handleKeyUpEvent ) ;
112- // Firefox treats a right-click as a click and a contextmenu event
113- // while other browsers just treat it as a contextmenu event
114- $document . bind ( 'click' , handleClickEvent ) ;
115- $document . bind ( 'contextmenu' , handleClickEvent ) ;
114+ $document . bind ( 'keyup' , handleKeyUpEvent ) ;
115+ // Firefox treats a right-click as a click and a contextmenu event
116+ // while other browsers just treat it as a contextmenu event
117+ $document . bind ( 'click' , handleClickEvent ) ;
118+ $document . bind ( 'contextmenu' , handleClickEvent ) ;
116119
117- $scope . $on ( '$destroy' , function ( ) {
118- //console.log('destroy');
119- $document . unbind ( 'keyup' , handleKeyUpEvent ) ;
120- $document . unbind ( 'click' , handleClickEvent ) ;
121- $document . unbind ( 'contextmenu' , handleClickEvent ) ;
122- } ) ;
123- }
124- } ;
125- }
126- ] ) ;
120+ $scope . $on ( '$destroy' , function ( ) {
121+ //console.log('destroy');
122+ $document . unbind ( 'keyup' , handleKeyUpEvent ) ;
123+ $document . unbind ( 'click' , handleClickEvent ) ;
124+ $document . unbind ( 'contextmenu' , handleClickEvent ) ;
125+ } ) ;
126+ }
127+ } ;
128+ }
129+ ] ) ;
130+ } ) ( angular ) ;
0 commit comments