+++ /dev/null
-(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();
- };
- };
- }
-));
\ No newline at end of file