(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("dagre")); else if(typeof define === 'function' && define.amd) define(["dagre"], factory); else if(typeof exports === 'object') exports["cytoscapeDagre"] = factory(require("dagre")); else root["cytoscapeDagre"] = factory(root["dagre"]); })(this, function(__WEBPACK_EXTERNAL_MODULE__4__) { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { var impl = __webpack_require__(1); // registers the extension on a cytoscape lib ref var register = function register(cytoscape) { if (!cytoscape) { return; } // can't register if cytoscape unspecified cytoscape('layout', 'dagre', impl); // register with cytoscape.js }; if (typeof cytoscape !== 'undefined') { // expose to global cytoscape (i.e. window.cytoscape) register(cytoscape); } module.exports = register; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var isFunction = function isFunction(o) { return typeof o === 'function'; }; var defaults = __webpack_require__(2); var assign = __webpack_require__(3); var dagre = __webpack_require__(4); // constructor // options : object containing layout options function DagreLayout(options) { this.options = assign({}, defaults, options); } // runs the layout DagreLayout.prototype.run = function () { var options = this.options; var layout = this; var cy = options.cy; // cy is automatically populated for us in the constructor var eles = options.eles; var getVal = function getVal(ele, val) { return isFunction(val) ? val.apply(ele, [ele]) : val; }; var bb = options.boundingBox || { x1: 0, y1: 0, w: cy.width(), h: cy.height() }; if (bb.x2 === undefined) { bb.x2 = bb.x1 + bb.w; } if (bb.w === undefined) { bb.w = bb.x2 - bb.x1; } if (bb.y2 === undefined) { bb.y2 = bb.y1 + bb.h; } if (bb.h === undefined) { bb.h = bb.y2 - bb.y1; } var g = new dagre.graphlib.Graph({ multigraph: true, compound: true }); var gObj = {}; var setGObj = function setGObj(name, val) { if (val != null) { gObj[name] = val; } }; setGObj('nodesep', options.nodeSep); setGObj('edgesep', options.edgeSep); setGObj('ranksep', options.rankSep); setGObj('rankdir', options.rankDir); setGObj('align', options.align); setGObj('ranker', options.ranker); setGObj('acyclicer', options.acyclicer); g.setGraph(gObj); g.setDefaultEdgeLabel(function () { return {}; }); g.setDefaultNodeLabel(function () { return {}; }); // add nodes to dagre var nodes = eles.nodes(); if (isFunction(options.sort)) { nodes = nodes.sort(options.sort); } for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; var nbb = node.layoutDimensions(options); g.setNode(node.id(), { width: nbb.w, height: nbb.h, name: node.id() }); // console.log( g.node(node.id()) ); } // set compound parents for (var _i = 0; _i < nodes.length; _i++) { var _node = nodes[_i]; if (_node.isChild()) { g.setParent(_node.id(), _node.parent().id()); } } // add edges to dagre var edges = eles.edges().stdFilter(function (edge) { return !edge.source().isParent() && !edge.target().isParent(); // dagre can't handle edges on compound nodes }); if (isFunction(options.sort)) { edges = edges.sort(options.sort); } for (var _i2 = 0; _i2 < edges.length; _i2++) { var edge = edges[_i2]; g.setEdge(edge.source().id(), edge.target().id(), { minlen: getVal(edge, options.minLen), weight: getVal(edge, options.edgeWeight), name: edge.id() }, edge.id()); // console.log( g.edge(edge.source().id(), edge.target().id(), edge.id()) ); } dagre.layout(g); var gNodeIds = g.nodes(); for (var _i3 = 0; _i3 < gNodeIds.length; _i3++) { var id = gNodeIds[_i3]; var n = g.node(id); cy.getElementById(id).scratch().dagre = n; } var dagreBB; if (options.boundingBox) { dagreBB = { x1: Infinity, x2: -Infinity, y1: Infinity, y2: -Infinity }; nodes.forEach(function (node) { var dModel = node.scratch().dagre; dagreBB.x1 = Math.min(dagreBB.x1, dModel.x); dagreBB.x2 = Math.max(dagreBB.x2, dModel.x); dagreBB.y1 = Math.min(dagreBB.y1, dModel.y); dagreBB.y2 = Math.max(dagreBB.y2, dModel.y); }); dagreBB.w = dagreBB.x2 - dagreBB.x1; dagreBB.h = dagreBB.y2 - dagreBB.y1; } else { dagreBB = bb; } var constrainPos = function constrainPos(p) { if (options.boundingBox) { var xPct = dagreBB.w === 0 ? 0 : (p.x - dagreBB.x1) / dagreBB.w; var yPct = dagreBB.h === 0 ? 0 : (p.y - dagreBB.y1) / dagreBB.h; return { x: bb.x1 + xPct * bb.w, y: bb.y1 + yPct * bb.h }; } else { return p; } }; nodes.layoutPositions(layout, options, function (ele) { ele = _typeof(ele) === "object" ? ele : this; var dModel = ele.scratch().dagre; return constrainPos({ x: dModel.x, y: dModel.y }); }); return this; // chaining }; module.exports = DagreLayout; /***/ }), /* 2 */ /***/ (function(module, exports) { var defaults = { // dagre algo options, uses default value on undefined nodeSep: undefined, // the separation between adjacent nodes in the same rank edgeSep: undefined, // the separation between adjacent edges in the same rank rankSep: undefined, // the separation between adjacent nodes in the same rank rankDir: undefined, // 'TB' for top to bottom flow, 'LR' for left to right, align: undefined, // alignment for rank nodes. Can be 'UL', 'UR', 'DL', or 'DR', where U = up, D = down, L = left, and R = right acyclicer: undefined, // If set to 'greedy', uses a greedy heuristic for finding a feedback arc set for a graph. // A feedback arc set is a set of edges that can be removed to make a graph acyclic. ranker: undefined, // Type of algorithm to assigns a rank to each node in the input graph. // Possible values: network-simplex, tight-tree or longest-path minLen: function minLen(edge) { return 1; }, // number of ranks to keep between the source and target of the edge edgeWeight: function edgeWeight(edge) { return 1; }, // higher weight edges are generally made shorter and straighter than lower weight edges // general layout options fit: true, // whether to fit to viewport padding: 30, // fit padding spacingFactor: undefined, // Applies a multiplicative factor (>0) to expand or compress the overall area that the nodes take up nodeDimensionsIncludeLabels: false, // whether labels should be included in determining the space used by a node animate: false, // whether to transition the node positions animateFilter: function animateFilter(node, i) { return true; }, // whether to animate specific nodes when animation is on; non-animated nodes immediately go to their final positions animationDuration: 500, // duration of animation in ms if enabled animationEasing: undefined, // easing of animation if enabled boundingBox: undefined, // constrain layout bounds; { x1, y1, x2, y2 } or { x1, y1, w, h } transform: function transform(node, pos) { return pos; }, // a function that applies a transform to the final node position ready: function ready() {}, // on layoutready sort: undefined, // a sorting function to order the nodes and edges; e.g. function(a, b){ return a.data('weight') - b.data('weight') } // because cytoscape dagre creates a directed graph, and directed graphs use the node order as a tie breaker when // defining the topology of a graph, this sort function can help ensure the correct order of the nodes/edges. // this feature is most useful when adding and removing the same nodes and edges multiple times in a graph. stop: function stop() {} // on layoutstop }; module.exports = defaults; /***/ }), /* 3 */ /***/ (function(module, exports) { // Simple, internal Object.assign() polyfill for options objects etc. module.exports = Object.assign != null ? Object.assign.bind(Object) : function (tgt) { for (var _len = arguments.length, srcs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { srcs[_key - 1] = arguments[_key]; } srcs.forEach(function (src) { Object.keys(src).forEach(function (k) { return tgt[k] = src[k]; }); }); return tgt; }; /***/ }), /* 4 */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE__4__; /***/ }) /******/ ]); });