1 (function (root
, factory
) {
2 if (typeof module
=== 'object' && module
.exports
) {
3 module
.exports = function (d3
) {
4 d3
.contextMenu
= factory(d3
);
7 } else if (typeof define
=== 'function' && define
.amd
) {
9 var d3
= require('d3');
14 d3
.contextMenu
= factory(d3
);
15 define([], function () {
16 return d3
.contextMenu
;
19 root
.d3
.contextMenu
= factory(root
.d3
);
23 return function (menu
, opts
) {
27 if (typeof opts
=== 'function') {
31 openCallback
= opts
.onOpen
;
32 closeCallback
= opts
.onClose
;
35 // create the div element that will hold the context menu
36 d3
.selectAll('.d3-context-menu').data([1])
39 .attr('class', 'd3-context-menu');
42 d3
.select('body').on('click.d3-context-menu', function () {
43 d3
.select('.d3-context-menu').style('display', 'none');
49 // this gets executed when a contextmenu event occurs
50 return function (data
, index
) {
52 d3
.selectAll('.d3-context-menu').html('');
53 var list
= d3
.selectAll('.d3-context-menu')
54 .on('contextmenu', function (d
) {
55 d3
.select('.d3-context-menu').style('display', 'none');
56 d3
.event
.preventDefault();
57 d3
.event
.stopPropagation();
60 list
.selectAll('li').data(typeof menu
=== 'function' ? menu(data
) : menu
).enter()
61 .filter(function (d
) {
62 if(opts
.type_object
== 'node'){
63 if (opts
.edit_mode
|| opts
.edit_mode
== d
.edit_mode
) {
64 if ((d
.nodes
== undefined || d
.nodes
.length
== 0) ||
65 (d
.nodes
!= undefined && d
.nodes
.length
> 0 && d
.nodes
.indexOf(data
.info
.type
) > -1))
69 if(opts
.type_object
== 'link'){
70 if (opts
.edit_mode
== d
.edit_mode
) {
78 .attr('class', function (d
) {
84 ret
+= ' is-disabled';
97 console
.error('No title attribute set. Check the spelling of your options.');
99 return (typeof d
.title
=== 'string') ? d
.title
: d
.title(data
);
101 .on('click', function (d
, i
) {
102 if (d
.disabled
) return; // do nothing if disabled
103 if (!d
.action
) return; // headers have no "action"
104 d
.action(elm
, data
, index
);
105 d3
.select('.d3-context-menu').style('display', 'none');
112 // the openCallback allows an action to fire before the menu is displayed
113 // an example usage would be closing a tooltip
115 if (openCallback(data
, index
) === false) {
120 // display context menu
121 d3
.select('.d3-context-menu')
122 .style('left', (d3
.event
.pageX
- 2) + 'px')
123 .style('top', (d3
.event
.pageY
- 2) + 'px')
124 .style('display', 'block');
126 d3
.event
.preventDefault();
127 d3
.event
.stopPropagation();