11/**
2- * ng-context-menu - v0.1.6 - An AngularJS directive to display a context menu when a right-click event is triggered
2+ * ng-context-menu - v0.1.7 - An AngularJS directive to display a context menu
3+ * when a right-click event is triggered
34 *
45 * @author Ian Kennington Walter (http://ianvonwalter.com)
56 */
@@ -11,97 +12,107 @@ angular
1112 menuElement : null
1213 } ;
1314 } )
14- . directive ( 'contextMenu' , [ '$document' , 'ContextMenuService' , function ( $document , ContextMenuService ) {
15- return {
16- restrict : 'A' ,
17- scope : {
18- 'callback' : '&contextMenu' ,
19- 'disabled' : '&contextMenuDisabled'
20- } ,
21- link : function ( $scope , $element , $attrs ) {
22- var opened = false ;
15+ . directive ( 'contextMenu' , [
16+ '$document' ,
17+ 'ContextMenuService' ,
18+ function ( $document , ContextMenuService ) {
19+ return {
20+ restrict : 'A' ,
21+ scope : {
22+ 'callback' : '&contextMenu' ,
23+ 'disabled' : '&contextMenuDisabled'
24+ } ,
25+ link : function ( $scope , $element , $attrs ) {
26+ var opened = false ;
2327
24- function open ( event , menuElement ) {
25- menuElement . addClass ( 'open' ) ;
28+ function open ( event , menuElement ) {
29+ menuElement . addClass ( 'open' ) ;
2630
27- var doc = $document [ 0 ] . documentElement ;
28- var docLeft = ( window . pageXOffset || doc . scrollLeft ) - ( doc . clientLeft || 0 ) ,
29- docTop = ( window . pageYOffset || doc . scrollTop ) - ( doc . clientTop || 0 ) ,
30- elementWidth = menuElement [ 0 ] . scrollWidth ,
31- elementHeight = menuElement [ 0 ] . scrollHeight ;
32- var docWidth = doc . clientWidth + docLeft ,
33- docHeight = doc . clientHeight + docTop ,
34- totalWidth = elementWidth + event . pageX ,
35- totalHeight = elementHeight + event . pageY ,
36- left = Math . max ( event . pageX - docLeft , 0 ) ,
37- top = Math . max ( event . pageY - docTop , 0 ) ;
31+ var doc = $document [ 0 ] . documentElement ;
32+ var docLeft = ( window . pageXOffset || doc . scrollLeft ) -
33+ ( doc . clientLeft || 0 ) ,
34+ docTop = ( window . pageYOffset || doc . scrollTop ) -
35+ ( doc . clientTop || 0 ) ,
36+ elementWidth = menuElement [ 0 ] . scrollWidth ,
37+ elementHeight = menuElement [ 0 ] . scrollHeight ;
38+ var docWidth = doc . clientWidth + docLeft ,
39+ docHeight = doc . clientHeight + docTop ,
40+ totalWidth = elementWidth + event . pageX ,
41+ totalHeight = elementHeight + event . pageY ,
42+ left = Math . max ( event . pageX - docLeft , 0 ) ,
43+ top = Math . max ( event . pageY - docTop , 0 ) ;
3844
39- if ( totalWidth > docWidth ) {
40- left = left - ( totalWidth - docWidth ) ;
41- }
45+ if ( totalWidth > docWidth ) {
46+ left = left - ( totalWidth - docWidth ) ;
47+ }
48+
49+ if ( totalHeight > docHeight ) {
50+ top = top - ( totalHeight - docHeight ) ;
51+ }
4252
43- if ( totalHeight > docHeight ) {
44- top = top - ( totalHeight - docHeight ) ;
53+ menuElement . css ( 'top' , top + 'px' ) ;
54+ menuElement . css ( 'left' , left + 'px' ) ;
55+ opened = true ;
4556 }
4657
47- menuElement . css ( 'top' , top + 'px' ) ;
48- menuElement . css ( 'left' , left + 'px ') ;
49- opened = true ;
50- }
58+ function close ( menuElement ) {
59+ menuElement . removeClass ( 'open ') ;
60+ opened = false ;
61+ }
5162
52- function close ( menuElement ) {
53- menuElement . removeClass ( 'open' ) ;
54- opened = false ;
55- }
63+ $element . bind ( 'contextmenu' , function ( event ) {
64+ if ( ! $scope . disabled ( ) ) {
65+ if ( ContextMenuService . menuElement !== null ) {
66+ close ( ContextMenuService . menuElement ) ;
67+ }
68+ ContextMenuService . menuElement = angular . element (
69+ document . getElementById ( $attrs . target )
70+ ) ;
71+ ContextMenuService . element = event . target ;
72+ //console.log('set', ContextMenuService.element);
5673
57- $element . bind ( 'contextmenu' , function ( event ) {
58- if ( ! $scope . disabled ( ) ) {
59- if ( ContextMenuService . menuElement !== null ) {
60- close ( ContextMenuService . menuElement ) ;
74+ event . preventDefault ( ) ;
75+ event . stopPropagation ( ) ;
76+ $scope . $apply ( function ( ) {
77+ $scope . callback ( { $event : event } ) ;
78+ open ( event , ContextMenuService . menuElement ) ;
79+ } ) ;
6180 }
62- ContextMenuService . menuElement = angular . element ( document . getElementById ( $attrs . target ) ) ;
63- ContextMenuService . element = event . target ;
64- //console.log('set', ContextMenuService.element);
81+ } ) ;
6582
66- event . preventDefault ( ) ;
67- event . stopPropagation ( ) ;
68- $scope . $apply ( function ( ) {
69- $scope . callback ( { $event : event } ) ;
70- open ( event , ContextMenuService . menuElement ) ;
71- } ) ;
72- }
73- } ) ;
74-
75- function handleKeyUpEvent ( event ) {
76- //console.log('keyup');
77- if ( opened && event . keyCode === 27 ) {
78- $scope . $apply ( function ( ) {
79- close ( ContextMenuService . menuElement ) ;
80- } ) ;
83+ function handleKeyUpEvent ( event ) {
84+ //console.log('keyup');
85+ if ( ! $scope . disabled ( ) && opened && event . keyCode === 27 ) {
86+ $scope . $apply ( function ( ) {
87+ close ( ContextMenuService . menuElement ) ;
88+ } ) ;
89+ }
8190 }
82- }
8391
84- function handleClickEvent ( event ) {
85- if ( opened &&
86- ( event . button !== 2 || event . target !== ContextMenuService . element ) ) {
87- $scope . $apply ( function ( ) {
88- close ( ContextMenuService . menuElement ) ;
89- } ) ;
92+ function handleClickEvent ( event ) {
93+ if ( ! $scope . disabled ( ) &&
94+ opened &&
95+ ( event . button !== 2 ||
96+ event . target !== ContextMenuService . element ) ) {
97+ $scope . $apply ( function ( ) {
98+ close ( ContextMenuService . menuElement ) ;
99+ } ) ;
100+ }
90101 }
91- }
92102
93- $document . bind ( 'keyup' , handleKeyUpEvent ) ;
94- // Firefox treats a right-click as a click and a contextmenu event while other browsers
95- // just treat it as a contextmenu event
96- $document . bind ( 'click' , handleClickEvent ) ;
97- $document . bind ( 'contextmenu' , handleClickEvent ) ;
103+ $document . bind ( 'keyup' , handleKeyUpEvent ) ;
104+ // Firefox treats a right-click as a click and a contextmenu event
105+ // while other browsers just treat it as a contextmenu event
106+ $document . bind ( 'click' , handleClickEvent ) ;
107+ $document . bind ( 'contextmenu' , handleClickEvent ) ;
98108
99- $scope . $on ( '$destroy' , function ( ) {
100- //console.log('destroy');
101- $document . unbind ( 'keyup' , handleKeyUpEvent ) ;
102- $document . unbind ( 'click' , handleClickEvent ) ;
103- $document . unbind ( 'contextmenu' , handleClickEvent ) ;
104- } ) ;
105- }
106- } ;
107- } ] ) ;
109+ $scope . $on ( '$destroy' , function ( ) {
110+ //console.log('destroy');
111+ $document . unbind ( 'keyup' , handleKeyUpEvent ) ;
112+ $document . unbind ( 'click' , handleClickEvent ) ;
113+ $document . unbind ( 'contextmenu' , handleClickEvent ) ;
114+ } ) ;
115+ }
116+ } ;
117+ }
118+ ] ) ;
0 commit comments