Path: blob/master/webroot/rsrc/js/application/policy/behavior-policy-rule-editor.js
12242 views
/**1* @provides javelin-behavior-policy-rule-editor2* @requires javelin-behavior3* multirow-row-manager4* javelin-dom5* javelin-util6* phabricator-prefab7* javelin-json8*/9JX.behavior('policy-rule-editor', function(config) {10var root = JX.$(config.rootID);11var rows = [];12var data = {};1314JX.DOM.listen(15root,16'click',17'create-rule',18function(e) {19e.kill();20new_rule(config.defaultRule);21});2223JX.DOM.listen(24root,25'change',26'rule-select',27function(e) {28e.kill();2930var row = e.getNode(JX.MultirowRowManager.getRowSigil());31var row_id = rules_manager.getRowID(row);3233data[row_id].rule = data[row_id].ruleNode.value;34data[row_id].value = null;3536redraw(row_id);37});3839JX.DOM.listen(40JX.DOM.findAbove(root, 'form'),41['submit', 'didWorkflowSubmit'],42null,43function(e) {44var rules = JX.DOM.find(e.getNode('tag:form'), 'input', 'rules');4546var value = [];47for (var ii = 0; ii < rows.length; ii++) {48var row_data = data[rows[ii]];4950var row_dict = {51action: row_data.actionNode.value,52rule: row_data.rule,53value: row_data.getValue()54};5556value.push(row_dict);57}5859rules.value = JX.JSON.stringify(value);60});616263var rules_table = JX.DOM.find(root, 'table', 'rules');64var rules_manager = new JX.MultirowRowManager(rules_table);65rules_manager.listen(66'row-removed',67function(row_id) {68delete data[row_id];69for (var ii = 0; ii < rows.length; ii++) {70if (rows[ii] == row_id) {71rows.splice(ii, 1);72break;73}74}75});767778function new_rule(spec) {79var row = rules_manager.addRow([]);80var row_id = rules_manager.getRowID(row);8182rows.push(row_id);83data[row_id] = JX.copy({}, spec);8485redraw(row_id);86}8788function redraw(row_id) {89var action_content = JX.Prefab.renderSelect(90config.actions,91data[row_id].action);92data[row_id].actionNode = action_content;93var action_cell = JX.$N('td', {className: 'action-cell'}, action_content);9495var rule_content = JX.Prefab.renderSelect(96config.rules,97data[row_id].rule,98{sigil: 'rule-select'});99data[row_id].ruleNode = rule_content;100var rule_cell = JX.$N('td', {className: 'rule-cell'}, rule_content);101102var input = render_input(data[row_id].rule, null);103104var value_content = input.node;105data[row_id].getValue = input.get;106input.set(data[row_id].value);107108var value_cell = JX.$N('td', {className: 'value-cell'}, value_content);109110rules_manager.updateRow(row_id, [action_cell, rule_cell, value_cell]);111}112113function render_input(rule, value) {114var node, get_fn, set_fn;115var type = config.types[rule];116var template = config.templates[rule];117118switch (type) {119case 'tokenizer':120var options = {121src: template.uri,122placeholder: template.placeholder,123browseURI: template.browseURI,124limit: template.limit125};126127var build = JX.Prefab.newTokenizerFromTemplate(128template.markup,129options);130131node = build.node;132133var tokenizer = build.tokenizer;134tokenizer.start();135136get_fn = function() { return JX.keys(tokenizer.getTokens()); };137set_fn = function(map) {138if (!map) {139return;140}141for (var k in map) {142tokenizer.addToken(k, map[k]);143}144};145break;146case 'none':147node = null;148get_fn = JX.bag;149set_fn = JX.bag;150break;151case 'select':152node = JX.Prefab.renderSelect(153config.templates[rule].options,154value);155get_fn = function() { return node.value; };156set_fn = function(v) { node.value = v; };157break;158default:159case 'text':160node = JX.$N('input', {type: 'text'});161get_fn = function() { return node.value; };162set_fn = function(v) { node.value = v; };163break;164}165166return {167node: node,168get: get_fn,169set: set_fn170};171}172173for (var ii = 0; ii < config.data.length; ii++) {174new_rule(config.data[ii]);175}176177});178179180