[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

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

   1  /**
   2   * @provides javelin-behavior-policy-rule-editor
   3   * @requires javelin-behavior
   4   *           multirow-row-manager
   5   *           javelin-dom
   6   *           javelin-util
   7   *           phabricator-prefab
   8   *           javelin-json
   9   */
  10  JX.behavior('policy-rule-editor', function(config) {
  11    var root = JX.$(config.rootID);
  12    var rows = [];
  13    var data = {};
  14  
  15    JX.DOM.listen(
  16      root,
  17      'click',
  18      'create-rule',
  19      function(e) {
  20        e.kill();
  21        new_rule(config.defaultRule);
  22      });
  23  
  24    JX.DOM.listen(
  25      root,
  26      'change',
  27      'rule-select',
  28      function(e) {
  29        e.kill();
  30  
  31        var row = e.getNode(JX.MultirowRowManager.getRowSigil());
  32        var row_id = rules_manager.getRowID(row);
  33  
  34        data[row_id].rule = data[row_id].ruleNode.value;
  35        data[row_id].value = null;
  36  
  37        redraw(row_id);
  38      });
  39  
  40    JX.DOM.listen(
  41      JX.DOM.findAbove(root, 'form'),
  42      ['submit', 'didWorkflowSubmit'],
  43      null,
  44      function(e) {
  45        var rules = JX.DOM.find(e.getNode('tag:form'), 'input', 'rules');
  46  
  47        var value = [];
  48        for (var ii = 0; ii < rows.length; ii++) {
  49          var row_data = data[rows[ii]];
  50  
  51          var row_dict = {
  52            action: row_data.actionNode.value,
  53            rule: row_data.rule,
  54            value: row_data.getValue()
  55          };
  56  
  57          value.push(row_dict);
  58        }
  59  
  60        rules.value = JX.JSON.stringify(value);
  61      });
  62  
  63  
  64    var rules_table = JX.DOM.find(root, 'table', 'rules');
  65    var rules_manager = new JX.MultirowRowManager(rules_table);
  66    rules_manager.listen(
  67      'row-removed',
  68      function(row_id) {
  69        delete data[row_id];
  70        for (var ii = 0; ii < rows.length; ii++) {
  71          if (rows[ii] == row_id) {
  72            rows.splice(ii, 1);
  73            break;
  74          }
  75        }
  76      });
  77  
  78  
  79    function new_rule(spec) {
  80      var row = rules_manager.addRow([]);
  81      var row_id = rules_manager.getRowID(row);
  82  
  83      rows.push(row_id);
  84      data[row_id] = JX.copy({}, spec);
  85  
  86      redraw(row_id);
  87    }
  88  
  89    function redraw(row_id) {
  90      var action_content = JX.Prefab.renderSelect(
  91        config.actions,
  92        data[row_id].action);
  93      data[row_id].actionNode = action_content;
  94      var action_cell = JX.$N('td', {className: 'action-cell'}, action_content);
  95  
  96      var rule_content = JX.Prefab.renderSelect(
  97        config.rules,
  98        data[row_id].rule,
  99        {sigil: 'rule-select'});
 100      data[row_id].ruleNode = rule_content;
 101      var rule_cell = JX.$N('td', {className: 'rule-cell'}, rule_content);
 102  
 103      var input = render_input(data[row_id].rule, null);
 104  
 105      var value_content = input.node;
 106      data[row_id].getValue = input.get;
 107      input.set(data[row_id].value);
 108  
 109      var value_cell = JX.$N('td', {className: 'value-cell'}, value_content);
 110  
 111      rules_manager.updateRow(row_id, [action_cell, rule_cell, value_cell]);
 112    }
 113  
 114    function render_input(rule, value) {
 115      var node, get_fn, set_fn;
 116      var type = config.types[rule];
 117      var template = config.templates[rule];
 118  
 119      switch (type) {
 120        case 'tokenizer':
 121          node = JX.$H(template.markup).getNode();
 122          node.id = '';
 123  
 124          var options = {
 125            root: node,
 126            src: template.uri,
 127            placeholder: template.placeholder,
 128            limit: template.limit
 129          };
 130  
 131          var tokenizer = JX.Prefab.buildTokenizer(options).tokenizer;
 132          tokenizer.start();
 133  
 134          get_fn = function() { return JX.keys(tokenizer.getTokens()); };
 135          set_fn = function(map) {
 136            if (!map) {
 137              return;
 138            }
 139            for (var k in map) {
 140              tokenizer.addToken(k, map[k]);
 141            }
 142          };
 143          break;
 144        case 'none':
 145          node = null;
 146          get_fn = JX.bag;
 147          set_fn = JX.bag;
 148          break;
 149        case 'select':
 150          node = JX.Prefab.renderSelect(
 151            config.templates[rule].options,
 152            value);
 153          get_fn = function() { return node.value; };
 154          set_fn = function(v) { node.value = v; };
 155          break;
 156        default:
 157        case 'text':
 158          node = JX.$N('input', {type: 'text'});
 159          get_fn = function() { return node.value; };
 160          set_fn = function(v) { node.value = v; };
 161          break;
 162      }
 163  
 164      return {
 165        node: node,
 166        get: get_fn,
 167        set: set_fn
 168      };
 169    }
 170  
 171    for (var ii = 0; ii < config.data.length; ii++) {
 172      new_rule(config.data[ii]);
 173    }
 174  
 175  });


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