# all files / Github/diagram-js/lib/features/connect/ Connect.js

96.97% Statements 32/33
80% Branches 8/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

    17×

    108×
    16×
    16×
    16×

    16×

    16×

    16×

    108×
    16×

    16×
    16×

    108×

    16×
    16×
    16×
    16×
    16×

    16×

    16×
    1×

    15×
    15×

    15×
    15×

    15×

    108×

    16×
    14×
    14×

    16×

    1×

     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
            };

        Eif (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'
    ];