[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/webroot/rsrc/js/application/differential/ -> behavior-dropdown-menus.js (source)

   1  /**
   2   * @provides javelin-behavior-differential-dropdown-menus
   3   * @requires javelin-behavior
   4   *           javelin-dom
   5   *           javelin-util
   6   *           javelin-stratcom
   7   *           javelin-workflow
   8   *           phuix-dropdown-menu
   9   *           phuix-action-list-view
  10   *           phuix-action-view
  11   *           phabricator-phtize
  12   *           changeset-view-manager
  13   */
  14  
  15  JX.behavior('differential-dropdown-menus', function(config) {
  16    var pht = JX.phtize(config.pht);
  17  
  18    function show_more(container) {
  19      var nodes = JX.DOM.scry(container, 'tr', 'context-target');
  20      for (var ii = 0; ii < nodes.length; ii++) {
  21        var show = JX.DOM.scry(nodes[ii], 'a', 'show-more');
  22        for (var jj = 0; jj < show.length; jj++) {
  23          if (JX.Stratcom.getData(show[jj]).type != 'all') {
  24            continue;
  25          }
  26          var event_data = {
  27            context : nodes[ii],
  28            show : show[jj]
  29          };
  30          JX.Stratcom.invoke('differential-reveal-context', null, event_data);
  31        }
  32      }
  33    }
  34  
  35    JX.Stratcom.listen(
  36      'click',
  37      'differential-reveal-all',
  38      function(e) {
  39        var containers = JX.DOM.scry(
  40          JX.$('differential-review-stage'),
  41          'div',
  42          'differential-changeset');
  43        for (var i=0; i < containers.length; i++) {
  44          show_more(containers[i]);
  45        }
  46        e.kill();
  47      });
  48  
  49    var buildmenu = function(e) {
  50      var button = e.getNode('differential-view-options');
  51      var data = JX.Stratcom.getData(button);
  52      if (data.menu) {
  53        return;
  54      }
  55  
  56      e.prevent();
  57  
  58      var changeset = JX.DOM.findAbove(
  59        button,
  60        'div',
  61        'differential-changeset');
  62  
  63      var view = JX.ChangesetViewManager.getForNode(changeset);
  64      var menu = new JX.PHUIXDropdownMenu(button);
  65      var list = new JX.PHUIXActionListView();
  66  
  67      var add_link = function(icon, name, href, local) {
  68        if (!href) {
  69          return;
  70        }
  71  
  72        var link = new JX.PHUIXActionView()
  73          .setIcon(icon)
  74          .setName(name)
  75          .setHref(href)
  76          .setHandler(function(e) {
  77            if (local) {
  78              window.location.assign(href);
  79            } else {
  80              window.open(href);
  81            }
  82            menu.close();
  83            e.prevent();
  84          });
  85  
  86        list.addItem(link);
  87        return link;
  88      };
  89  
  90      var reveal_item = new JX.PHUIXActionView()
  91        .setIcon('fa-eye');
  92      list.addItem(reveal_item);
  93  
  94      var visible_item = new JX.PHUIXActionView()
  95        .setHandler(function(e) {
  96          var diff = JX.DOM.scry(
  97            JX.$(data.containerID),
  98            'table',
  99            'differential-diff');
 100  
 101          JX.Stratcom.invoke('differential-toggle-file', null, {diff: diff});
 102          e.prevent();
 103          menu.close();
 104        });
 105      list.addItem(visible_item);
 106  
 107      add_link('fa-file-text', pht('Browse in Diffusion'), data.diffusionURI);
 108      add_link('fa-file-o', pht('View Standalone'), data.standaloneURI);
 109  
 110      var up_item = new JX.PHUIXActionView()
 111        .setHandler(function(e) {
 112          if (view.isLoaded()) {
 113            var renderer = view.getRenderer();
 114            if (renderer == '1up') {
 115              renderer = '2up';
 116            } else {
 117              renderer = '1up';
 118            }
 119            view.setRenderer(renderer);
 120          }
 121          view.reload();
 122  
 123          e.prevent();
 124          menu.close();
 125        });
 126      list.addItem(up_item);
 127  
 128      var encoding_item = new JX.PHUIXActionView()
 129        .setIcon('fa-font')
 130        .setName(pht('Change Text Encoding...'))
 131        .setHandler(function(e) {
 132          var params = {
 133            encoding: view.getEncoding()
 134          };
 135  
 136          new JX.Workflow('/services/encoding/', params)
 137            .setHandler(function(r) {
 138              view.setEncoding(r.encoding);
 139              view.reload();
 140            })
 141            .start();
 142  
 143          e.prevent();
 144          menu.close();
 145        });
 146      list.addItem(encoding_item);
 147  
 148      var highlight_item = new JX.PHUIXActionView()
 149        .setIcon('fa-sun-o')
 150        .setName(pht('Highlight As...'))
 151        .setHandler(function(e) {
 152          var params = {
 153            highlight: view.getHighlight()
 154          };
 155  
 156          new JX.Workflow('/services/highlight/', params)
 157            .setHandler(function(r) {
 158              view.setHighlight(r.highlight);
 159              view.reload();
 160            })
 161            .start();
 162  
 163          e.prevent();
 164          menu.close();
 165        });
 166      list.addItem(highlight_item);
 167  
 168      add_link('fa-arrow-left', pht('Show Raw File (Left)'), data.leftURI);
 169      add_link('fa-arrow-right', pht('Show Raw File (Right)'), data.rightURI);
 170      add_link('fa-pencil', pht('Open in Editor'), data.editor, true);
 171      add_link('fa-wrench', pht('Configure Editor'), data.editorConfigure);
 172  
 173      menu.setContent(list.getNode());
 174  
 175      menu.listen('open', function() {
 176        // When the user opens the menu, check if there are any "Show More"
 177        // links in the changeset body. If there aren't, disable the "Show
 178        // Entire File" menu item since it won't change anything.
 179  
 180        var nodes = JX.DOM.scry(JX.$(data.containerID), 'a', 'show-more');
 181        if (nodes.length) {
 182          reveal_item
 183            .setDisabled(false)
 184            .setName(pht('Show Entire File'))
 185            .setIcon('fa-file-o')
 186            .setHandler(function(e) {
 187              show_more(JX.$(data.containerID));
 188              e.prevent();
 189              menu.close();
 190            });
 191        } else {
 192          reveal_item
 193            .setDisabled(true)
 194            .setIcon('fa-file')
 195            .setName(pht('Entire File Shown'))
 196            .setHandler(function(e) { e.prevent(); });
 197        }
 198  
 199        encoding_item.setDisabled(!view.isLoaded());
 200        highlight_item.setDisabled(!view.isLoaded());
 201  
 202        if (view.isLoaded()) {
 203          if (view.getRenderer() == '2up') {
 204            up_item
 205              .setIcon('fa-list-alt')
 206              .setName(pht('View Unified'));
 207          } else {
 208            up_item
 209              .setIcon('fa-files-o')
 210              .setName(pht('View Side-by-Side'));
 211          }
 212        } else {
 213          up_item
 214            .setIcon('fa-refresh')
 215            .setName(pht('Load Changes'));
 216        }
 217  
 218        visible_item
 219          .setDisabled(true)
 220          .setIcon('fa-expand')
 221          .setName(pht("Can't Toggle Unloaded File"));
 222        var diffs = JX.DOM.scry(
 223          JX.$(data.containerID),
 224          'table',
 225          'differential-diff');
 226  
 227        if (diffs.length > 1) {
 228          JX.$E(
 229            'More than one node with sigil "differential-diff" was found in "'+
 230            data.containerID+'."');
 231        } else if (diffs.length == 1) {
 232          diff = diffs[0];
 233          visible_item.setDisabled(false);
 234          if (JX.Stratcom.getData(diff).hidden) {
 235            visible_item
 236              .setName(pht('Expand File'))
 237              .setIcon('fa-expand');
 238          } else {
 239            visible_item
 240              .setName(pht('Collapse File'))
 241              .setIcon('fa-compress');
 242          }
 243        } else {
 244          // Do nothing when there is no diff shown in the table. For example,
 245          // the file is binary.
 246        }
 247  
 248      });
 249  
 250      data.menu = menu;
 251      menu.open();
 252    };
 253  
 254    JX.Stratcom.listen('click', 'differential-view-options', buildmenu);
 255  });


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