[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
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 });
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |