all files / lib/features/connect/ Connect.js

96.97% Statements 32/33
90% Branches 9/10
100% Functions 6/6
96.97% Lines 32/33
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109                    14×                 15× 12× 12× 12×     12×     12×       12×     15× 16×   16× 16×     15×                                                     15×   14× 12× 12×     14×                                    
import {
  getMid
} from '../../layout/LayoutUtil';
 
 
export default function Connect(eventBus, dragging, modeling, rules) {
 
  // rules
 
  function canConnect(source, target) {
    return rules.allowed('connection.create', {
      source: source,
      target: target
    });
  }
 
 
  // event handlers
 
  eventBus.on('connect.hover', function(event) {
    var context = event.context,
        source = context.source,
        hover = event.hover,
        canExecute;
 
    canExecute = context.canExecute = canConnect(source, hover);
 
    // simply ignore hover
    Iif (canExecute === null) {
      return;
    }
 
    context.target = hover;
  });
 
  eventBus.on([ 'connect.out', 'connect.cleanup' ], function(event) {
    var context = event.context;
 
    context.target = null;
    context.canExecute = false;
  });
 
  eventBus.on('connect.end', function(event) {
 
    var context = event.context,
        source = context.source,
        sourcePosition = context.sourcePosition,
        target = context.target,
        targetPosition = {
          x: event.x,
          y: event.y
        },
        canExecute = context.canExecute || canConnect(source, target);
 
    if (!canExecute) {
      return false;
    }
 
    var attrs = null,
        hints = {
          connectionStart: sourcePosition,
          connectionEnd: targetPosition
        };
 
    if (typeof canExecute === 'object') {
      attrs = canExecute;
    }
 
    modeling.connect(source, target, attrs, hints);
  });
 
 
  // API
 
  /**
   * Start connect operation.
   *
   * @param {DOMEvent} event
   * @param {djs.model.Base} source
   * @param {Point} [sourcePosition]
   * @param {Boolean} [autoActivate=false]
   */
  this.start = function(event, source, sourcePosition, autoActivate) {
 
    if (typeof sourcePosition !== 'object') {
      autoActivate = sourcePosition;
      sourcePosition = getMid(source);
    }
 
    dragging.init(event, 'connect', {
      autoActivate: autoActivate,
      data: {
        shape: source,
        context: {
          source: source,
          sourcePosition: sourcePosition
        }
      }
    });
  };
}
 
Connect.$inject = [
  'eventBus',
  'dragging',
  'modeling',
  'rules'
];