[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/webroot/rsrc/js/application/policy/ -> behavior-policy-control.js (source)

   1  /**
   2   * @provides javelin-behavior-policy-control
   3   * @requires javelin-behavior
   4   *           javelin-dom
   5   *           javelin-util
   6   *           phuix-dropdown-menu
   7   *           phuix-action-list-view
   8   *           phuix-action-view
   9   *           javelin-workflow
  10   * @javelin
  11   */
  12  JX.behavior('policy-control', function(config) {
  13    var control = JX.$(config.controlID);
  14    var input = JX.$(config.inputID);
  15    var value = config.value;
  16  
  17    var menu = new JX.PHUIXDropdownMenu(control)
  18      .setWidth(260)
  19      .setAlign('left');
  20  
  21    menu.listen('open', function() {
  22      var list = new JX.PHUIXActionListView();
  23  
  24      for (var ii = 0; ii < config.groups.length; ii++) {
  25        var group = config.groups[ii];
  26  
  27        list.addItem(
  28          new JX.PHUIXActionView()
  29            .setName(config.labels[group])
  30            .setDisabled(true));
  31  
  32        for (var jj = 0; jj < config.order[group].length; jj++) {
  33          var phid = config.order[group][jj];
  34  
  35          var onselect;
  36          if (group == 'custom') {
  37            onselect = JX.bind(null, function(phid) {
  38              var uri = get_custom_uri(phid);
  39  
  40              new JX.Workflow(uri)
  41                .setHandler(function(response) {
  42                  if (!response.phid) {
  43                    return;
  44                  }
  45  
  46                  replace_policy(phid, response.phid, response.info);
  47                  select_policy(response.phid);
  48                })
  49                .start();
  50  
  51            }, phid);
  52          } else {
  53            onselect = JX.bind(null, select_policy, phid);
  54          }
  55  
  56          var option = config.options[phid];
  57          var item = new JX.PHUIXActionView()
  58            .setName(option.name)
  59            .setIcon(option.icon + ' darkgreytext')
  60            .setHandler(JX.bind(null, function(fn, e) {
  61              e.prevent();
  62              menu.close();
  63              fn();
  64            }, onselect));
  65  
  66          if (phid == value) {
  67            item.setSelected(true);
  68          }
  69  
  70          list.addItem(item);
  71        }
  72      }
  73  
  74      menu.setContent(list.getNode());
  75    });
  76  
  77  
  78    var select_policy = function(phid) {
  79      JX.DOM.setContent(
  80        JX.DOM.find(control, 'span', 'policy-label'),
  81        render_option(phid));
  82  
  83      input.value = phid;
  84      value = phid;
  85    };
  86  
  87  
  88    var render_option = function(phid, with_title) {
  89      var option = config.options[phid];
  90  
  91      var name = option.name;
  92      if (with_title && (option.full != option.name)) {
  93        name = JX.$N('span', {title: option.full}, name);
  94      }
  95  
  96      return [JX.$H(config.icons[option.icon]), name];
  97    };
  98  
  99  
 100    /**
 101     * Get the workflow URI to create or edit a policy with a given PHID.
 102     */
 103    var get_custom_uri = function(phid) {
 104      var uri = '/policy/edit/';
 105      if (phid != config.customPlaceholder) {
 106        uri += phid + '/';
 107      }
 108      return uri;
 109    };
 110  
 111  
 112    /**
 113     * Replace an existing policy option with a new one. Used to swap out custom
 114     * policies after the user edits them.
 115     */
 116    var replace_policy = function(old_phid, new_phid, info) {
 117      config.options[new_phid] = info;
 118      for (var k in config.order) {
 119        for (var ii = 0; ii < config.order[k].length; ii++) {
 120          if (config.order[k][ii] == old_phid) {
 121            config.order[k][ii] = new_phid;
 122            return;
 123          }
 124        }
 125      }
 126    };
 127  
 128  
 129  });


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