src/visual/VisualLink.js (50 lines of code) (raw):

import _ from 'lodash'; import joint from 'jointjs'; /** * Class that represents graphical link * @private */ export default class VisualLink extends joint.shapes.pn.Link { constructor(opts, readOnly) { const defaultLinkaAttr = readOnly ? { conn: null, attrs: { '.link-tools': { display: 'none', }, '.marker-arrowheads': { display: 'none', }, }, } : { conn: null, }; super(_.defaultsDeep(opts, defaultLinkaAttr)); /** Connection from model. */ this.conn = this.attributes.conn; } _check(name, port) { const data = this.get(name); if (port.name !== data.port) { data.port = port.name; } } _checkPorts() { const conn = this.conn; const source = this.getSourceElement(); const target = this.getTargetElement(); return source.isPortEnabled(conn.from.step.hasInputPort(conn.from), this.get('source').port) && target.isPortEnabled(conn.to.step.hasInputPort(conn.to), this.get('target').port); } /** * Updates visual link according to the model. */ refresh() { const conn = this.conn; if (!conn) { return; } const isValidConn = conn.isValid(); if (isValidConn && this._checkPorts()) { this._check('source', conn.from); this._check('target', conn.to); } else { this.remove({ silent: isValidConn }); } } }