| (function (root, factory) { |
| if (typeof module === 'object' && module.exports) { |
| module.exports = function (d3) { |
| d3.contextMenu = factory(d3); |
| return d3.contextMenu; |
| }; |
| } else if (typeof define === 'function' && define.amd) { |
| try { |
| var d3 = require('d3'); |
| } catch (e) { |
| d3 = root.d3; |
| } |
| |
| d3.contextMenu = factory(d3); |
| define([], function () { |
| return d3.contextMenu; |
| }); |
| } else if (root.d3) { |
| root.d3.contextMenu = factory(root.d3); |
| } |
| }(this, |
| function (d3) { |
| return function (menu, opts) { |
| var openCallback, |
| closeCallback; |
| |
| if (typeof opts === 'function') { |
| openCallback = opts; |
| } else { |
| opts = opts || {}; |
| openCallback = opts.onOpen; |
| closeCallback = opts.onClose; |
| } |
| |
| // create the div element that will hold the context menu |
| d3.selectAll('.d3-context-menu').data([1]) |
| .enter() |
| .append('div') |
| .attr('class', 'd3-context-menu'); |
| |
| // close menu |
| d3.select('body').on('click.d3-context-menu', function () { |
| d3.select('.d3-context-menu').style('display', 'none'); |
| if (closeCallback) { |
| closeCallback(); |
| } |
| }); |
| |
| // this gets executed when a contextmenu event occurs |
| return function (data, index) { |
| var elm = this; |
| d3.selectAll('.d3-context-menu').html(''); |
| var list = d3.selectAll('.d3-context-menu') |
| .on('contextmenu', function (d) { |
| d3.select('.d3-context-menu').style('display', 'none'); |
| d3.event.preventDefault(); |
| d3.event.stopPropagation(); |
| }) |
| .append('ul'); |
| list.selectAll('li').data(typeof menu === 'function' ? menu(data) : menu).enter() |
| .filter(function (d) { |
| if(opts.type_object == 'node'){ |
| if (opts.edit_mode || opts.edit_mode == d.edit_mode ) { |
| if ((d.nodes == undefined || d.nodes.length == 0) || |
| (d.nodes != undefined && d.nodes.length > 0 && d.nodes.indexOf(data.info.type) > -1)) |
| return true |
| } |
| } |
| if(opts.type_object == 'link'){ |
| if (opts.edit_mode == d.edit_mode) { |
| |
| return true |
| } |
| } |
| return false; |
| }) |
| .append('li') |
| .attr('class', function (d) { |
| var ret = ''; |
| if (d.divider) { |
| ret += ' is-divider'; |
| } |
| if (d.disabled) { |
| ret += ' is-disabled'; |
| } |
| if (!d.action) { |
| ret += ' is-header'; |
| } |
| //if() |
| return ret; |
| }) |
| .html(function (d) { |
| if (d.divider) { |
| return '<hr>'; |
| } |
| if (!d.title) { |
| console.error('No title attribute set. Check the spelling of your options.'); |
| } |
| return (typeof d.title === 'string') ? d.title : d.title(data); |
| }) |
| .on('click', function (d, i) { |
| if (d.disabled) return; // do nothing if disabled |
| if (!d.action) return; // headers have no "action" |
| d.action(elm, data, index); |
| d3.select('.d3-context-menu').style('display', 'none'); |
| |
| if (closeCallback) { |
| closeCallback(); |
| } |
| }); |
| |
| // the openCallback allows an action to fire before the menu is displayed |
| // an example usage would be closing a tooltip |
| if (openCallback) { |
| if (openCallback(data, index) === false) { |
| return; |
| } |
| } |
| |
| // display context menu |
| d3.select('.d3-context-menu') |
| .style('left', (d3.event.pageX - 2) + 'px') |
| .style('top', (d3.event.pageY - 2) + 'px') |
| .style('display', 'block'); |
| |
| d3.event.preventDefault(); |
| d3.event.stopPropagation(); |
| }; |
| }; |
| } |
| )); |