[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/webroot/rsrc/js/application/differential/ -> behavior-edit-inline-comments.js (source)

   1  /**
   2   * @provides javelin-behavior-differential-edit-inline-comments
   3   * @requires javelin-behavior
   4   *           javelin-stratcom
   5   *           javelin-dom
   6   *           javelin-util
   7   *           javelin-vector
   8   *           differential-inline-comment-editor
   9   */
  10  
  11  JX.behavior('differential-edit-inline-comments', function(config) {
  12  
  13    var selecting = false;
  14    var reticle = JX.$N('div', {className: 'differential-reticle'});
  15    JX.DOM.hide(reticle);
  16    document.body.appendChild(reticle);
  17  
  18    var origin = null;
  19    var target = null;
  20    var root   = null;
  21    var changeset = null;
  22  
  23    var editor = null;
  24  
  25    function updateReticle() {
  26      var top = origin;
  27      var bot = target;
  28      if (JX.$V(top).y > JX.$V(bot).y) {
  29        var tmp = top;
  30        top = bot;
  31        bot = tmp;
  32      }
  33      var code = target.nextSibling;
  34  
  35      var pos = JX.$V(top).add(1 + JX.Vector.getDim(target).x, 0);
  36      var dim = JX.Vector.getDim(code).add(-4, 0);
  37      if (isOnRight(target)) {
  38        dim.x += JX.Vector.getDim(code.nextSibling).x;
  39      }
  40      dim.y = (JX.$V(bot).y - pos.y) + JX.Vector.getDim(bot).y;
  41  
  42      pos.setPos(reticle);
  43      dim.setDim(reticle);
  44  
  45      JX.DOM.show(reticle);
  46    }
  47  
  48    function hideReticle() {
  49      JX.DOM.hide(reticle);
  50    }
  51  
  52    JX.DifferentialInlineCommentEditor.listen('done', function() {
  53      selecting = false;
  54      editor = false;
  55      hideReticle();
  56      set_link_state(false);
  57    });
  58  
  59    function isOnRight(node) {
  60      return node.parentNode.firstChild != node;
  61    }
  62  
  63    function isNewFile(node) {
  64      var data = JX.Stratcom.getData(root);
  65      return isOnRight(node) || (data.left != data.right);
  66    }
  67  
  68    function getRowNumber(th_node) {
  69      try {
  70        return parseInt(th_node.id.match(/^C\d+[ON]L(\d+)$/)[1], 10);
  71      } catch (x) {
  72        return undefined;
  73      }
  74    }
  75  
  76    var set_link_state = function(active) {
  77      JX.DOM.alterClass(JX.$(config.stage), 'inline-editor-active', active);
  78    };
  79  
  80    JX.Stratcom.listen(
  81      'mousedown',
  82      ['differential-changeset', 'tag:th'],
  83      function(e) {
  84        if (editor  ||
  85            selecting ||
  86            e.isRightButton() ||
  87            getRowNumber(e.getTarget()) === undefined) {
  88          return;
  89        }
  90  
  91        selecting = true;
  92        root = e.getNode('differential-changeset');
  93  
  94        origin = target = e.getTarget();
  95  
  96        var data = e.getNodeData('differential-changeset');
  97        if (isOnRight(target)) {
  98          changeset = data.right;
  99        } else {
 100          changeset = data.left;
 101        }
 102  
 103        updateReticle();
 104  
 105        e.kill();
 106      });
 107  
 108    JX.Stratcom.listen(
 109      'mouseover',
 110      ['differential-changeset', 'tag:th'],
 111      function(e) {
 112        if (!selecting ||
 113            editor ||
 114            (getRowNumber(e.getTarget()) === undefined) ||
 115            (isOnRight(e.getTarget()) != isOnRight(origin)) ||
 116            (e.getNode('differential-changeset') !== root)) {
 117          return;
 118        }
 119  
 120        target = e.getTarget();
 121  
 122        updateReticle();
 123      });
 124  
 125    JX.Stratcom.listen(
 126      'mouseup',
 127      null,
 128      function(e) {
 129        if (editor || !selecting) {
 130          return;
 131        }
 132  
 133        var o = getRowNumber(origin);
 134        var t = getRowNumber(target);
 135  
 136        var insert;
 137        var len;
 138        if (t < o) {
 139          len = (o - t);
 140          o = t;
 141          insert = origin.parentNode;
 142        } else {
 143          len = (t - o);
 144          insert = target.parentNode;
 145        }
 146  
 147        editor = new JX.DifferentialInlineCommentEditor(config.uri)
 148          .setTemplates(config.undo_templates)
 149          .setOperation('new')
 150          .setChangeset(changeset)
 151          .setLineNumber(o)
 152          .setLength(len)
 153          .setIsNew(isNewFile(target) ? 1 : 0)
 154          .setOnRight(isOnRight(target) ? 1 : 0)
 155          .setRow(insert.nextSibling)
 156          .setTable(insert.parentNode)
 157          .start();
 158  
 159        set_link_state(true);
 160  
 161        e.kill();
 162      });
 163  
 164    JX.Stratcom.listen(
 165      ['mouseover', 'mouseout'],
 166      'differential-inline-comment',
 167      function(e) {
 168        if (e.getType() == 'mouseout') {
 169          hideReticle();
 170        } else {
 171          root = e.getNode('differential-changeset');
 172          if (root) {
 173  
 174            var data = e.getNodeData('differential-inline-comment');
 175            var change = e.getNodeData('differential-changeset');
 176  
 177            var id_part  = data.on_right ? change.right : change.left;
 178  
 179            // NOTE: We can't just look for 'tag:td' because the event might be
 180            // inside a table which is inside an inline comment.
 181            var comment = e.getNode('differential-inline-comment');
 182            var td = JX.DOM.findAbove(comment, 'td');
 183            var th = td.previousSibling;
 184  
 185            var new_part = isNewFile(th) ? 'N' : 'O';
 186            var prefix = 'C' + id_part + new_part + 'L';
 187  
 188            origin = JX.$(prefix + data.number);
 189            target = JX.$(prefix + (parseInt(data.number, 10) +
 190                                    parseInt(data.length, 10)));
 191  
 192            updateReticle();
 193          }
 194        }
 195      });
 196  
 197    var action_handler = function(op, e) {
 198      e.kill();
 199  
 200      if (editor) {
 201        return;
 202      }
 203  
 204      var node = e.getNode('differential-inline-comment');
 205      handle_inline_action(node, op);
 206    };
 207  
 208    var handle_inline_action = function(node, op) {
 209      var data = JX.Stratcom.getData(node);
 210      var row  = node.parentNode.parentNode;
 211      var other_rows = [];
 212      if (JX.Stratcom.hasSigil(node, 'differential-inline-comment-preview')) {
 213        // The DOM structure around the comment is different if it's part of the
 214        // preview, so make sure not to pass the wrong container.
 215        row = node;
 216        if (op === 'delete') {
 217          // Furthermore, deleting a comment in the preview does not automatically
 218          // delete other occurrences of the same comment, so do that manually.
 219          var nodes = JX.DOM.scry(
 220            document.body,
 221            'div',
 222            'differential-inline-comment');
 223          for (var i = 0; i < nodes.length; ++i) {
 224            if (JX.Stratcom.getData(nodes[i]).id === data.id) {
 225              other_rows.push(nodes[i]);
 226            }
 227          }
 228        }
 229      }
 230  
 231      var original = data.original;
 232      if (op == 'reply') {
 233        // If the user hit "reply", the original text is empty (a new reply), not
 234        // the text of the comment they're replying to.
 235        original = '';
 236      }
 237  
 238      editor = new JX.DifferentialInlineCommentEditor(config.uri)
 239        .setTemplates(config.undo_templates)
 240        .setOperation(op)
 241        .setID(data.id)
 242        .setLineNumber(data.number)
 243        .setLength(data.length)
 244        .setOnRight(data.on_right)
 245        .setOriginalText(original)
 246        .setRow(row)
 247        .setOtherRows(other_rows)
 248        .setTable(row.parentNode)
 249        .start();
 250  
 251      set_link_state(true);
 252    };
 253  
 254    for (var op in {'edit' : 1, 'delete' : 1, 'reply' : 1}) {
 255      JX.Stratcom.listen(
 256        'click',
 257        ['differential-inline-comment', 'differential-inline-' + op],
 258        JX.bind(null, action_handler, op));
 259    }
 260  
 261    JX.Stratcom.listen(
 262      'differential-inline-action',
 263      null,
 264      function(e) {
 265        var data = e.getData();
 266        handle_inline_action(data.node, data.op);
 267      });
 268  
 269  });


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1