[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/webroot/rsrc/js/application/differential/ -> behavior-toggle-files.js (source)

   1  /**
   2   * @provides javelin-behavior-differential-toggle-files
   3   * @requires javelin-behavior
   4   *           javelin-dom
   5   *           javelin-stratcom
   6   *           phabricator-phtize
   7   */
   8  
   9  JX.behavior('differential-toggle-files', function(config) {
  10    var pht = JX.phtize(config.pht);
  11  
  12    JX.Stratcom.listen(
  13      'differential-toggle-file',
  14      null,
  15      function(e) {
  16        if (e.getData().diff.length != 1) {
  17          return;
  18        }
  19  
  20        var diff = e.getData().diff[0],
  21            data = JX.Stratcom.getData(diff);
  22        if (data.hidden) {
  23          data.hidden = false;
  24          JX.DOM.show(diff);
  25          JX.DOM.remove(data.undo);
  26          data.undo = null;
  27        } else {
  28          data.hidden = true;
  29          data.undo = render_collapse_undo();
  30          JX.DOM.hide(diff);
  31          JX.DOM.listen(
  32            data.undo,
  33            'click',
  34            'differential-collapse-undo',
  35            function(e) {
  36              e.kill();
  37              data.hidden = false;
  38              JX.DOM.show(diff);
  39              JX.DOM.remove(data.undo);
  40              data.undo = null;
  41            });
  42          JX.DOM.appendContent(diff.parentNode, data.undo);
  43        }
  44        JX.Stratcom.invoke('differential-toggle-file-toggled');
  45      });
  46  
  47    JX.Stratcom.listen(
  48      'differential-toggle-file-request',
  49      null,
  50      function(e) {
  51        var elt = e.getData().element;
  52        while (elt !== document.body) {
  53          if (JX.Stratcom.hasSigil(elt, 'differential-changeset')) {
  54            var diffs = JX.DOM.scry(elt, 'table', 'differential-diff');
  55            var invoked = false;
  56            for (var i = 0; i < diffs.length; ++i) {
  57              if (JX.Stratcom.getData(diffs[i]).hidden) {
  58                JX.Stratcom.invoke('differential-toggle-file', null, {
  59                  diff: [ diffs[i] ]
  60                });
  61                invoked = true;
  62              }
  63            }
  64            if (!invoked) {
  65              e.prevent();
  66            }
  67            return;
  68          }
  69          elt = elt.parentNode;
  70        }
  71        e.prevent();
  72      });
  73  
  74    JX.Stratcom.listen(
  75      'click',
  76      'tag:a',
  77      function(e) {
  78        var link = e.getNode('tag:a');
  79        var id = link.getAttribute('href');
  80        if (!id || !id.match(/^#.+/)) {
  81          return;
  82        }
  83        var raw = e.getRawEvent();
  84        if (raw.altKey || raw.ctrlKey || raw.metaKey || raw.shiftKey) {
  85          return;
  86        }
  87        // The target may have either a matching name or a matching id.
  88        var target;
  89        try {
  90          target = JX.$(id.substr(1));
  91        } catch(err) {
  92          var named = document.getElementsByName(id.substr(1));
  93          for (var i = 0; i < named.length; ++i) {
  94            if (named[i].tagName.toLowerCase() == 'a') {
  95              if (target) {
  96                return;
  97              }
  98              target = named[i];
  99            }
 100          }
 101          if (!target) {
 102            return;
 103          }
 104        }
 105        var event = JX.Stratcom.invoke('differential-toggle-file-request', null, {
 106          element: target
 107        });
 108        if (!event.getPrevented()) {
 109          // This event is processed after the hash has changed, so it doesn't
 110          // automatically jump there like we want.
 111          JX.DOM.scrollTo(target);
 112        }
 113    });
 114  
 115    var render_collapse_undo = function() {
 116      var link = JX.$N(
 117        'a',
 118        {href: '#', sigil: 'differential-collapse-undo'},
 119        pht('undo'));
 120  
 121      return JX.$N(
 122        'div',
 123        {className: 'differential-collapse-undo',
 124         sigil: 'differential-collapse-undo-div'},
 125        [pht('collapsed'), ' ', link]);
 126    };
 127  
 128  });


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