Summary: Ref T4420. Modernize users. Test Plan: - Edited "Commit Authors" on Audit search. - Edited "Created By" on calendar search. - Edited "invited" on calendar search. - Edited "To" on "New conpherence message". - Edited user on "Add user to conpherence thread". - Edited "Authors" on countdown search. - Edited "Author" on differential search. - Edited "Responsible users" on differential search. - Edited "Owner" on Diffusion lint search. - Edited "include users" on Feed search. - Edited "Authors" on file search. - Edited "Authors" on Herald rule search. - Edited a couple of user-selecting Herald fields on rules. - Edited "user" on legalpad signature exemption. - Edited "creator" on legalpad search. - Edited "contributors" on legalpad search. - Edited "signers" on legalpad signature search. - Edited "Authors" on macro search. - Edited "Reassign/claim" on task detail. - Edited "assigned to" on task edit. - Edited "assigned to", "users projects", "authors" on task search. - Edited "creators" on oauthserver. - Edited "authors" on paste search. - Edited "actors" and "users" on activity log search. - Edited "authors" on pholio search. - Edited "users" on phrequent search. - Edited "authors", "answered by" on Ponder search. - Edited "add members" on project membership editor. - Edited "members" on project search. - Edited "pushers" on releeph product edit. - Edited "requestors" on releeph request search. - Edited "pushers" on diffusion push log. - Edited "authors", "owners", "subscribers" on global search. - Edited "authors" on slowvote search. - Edited users in custom policy. - Grepped for "common/authors", no hits. - Grepped for "common/users", no (relevant) hits. - Grepped for "common/accounts", no (relevant) hits. Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T4420 Differential Revision: https://secure.phabricator.com/D9885
180 lines
4.4 KiB
JavaScript
180 lines
4.4 KiB
JavaScript
/**
|
|
* @provides javelin-behavior-policy-rule-editor
|
|
* @requires javelin-behavior
|
|
* multirow-row-manager
|
|
* javelin-dom
|
|
* javelin-util
|
|
* phabricator-prefab
|
|
* javelin-tokenizer
|
|
* javelin-typeahead
|
|
* javelin-typeahead-ondemand-source
|
|
* javelin-json
|
|
*/
|
|
JX.behavior('policy-rule-editor', function(config) {
|
|
var root = JX.$(config.rootID);
|
|
var rows = [];
|
|
var data = {};
|
|
|
|
JX.DOM.listen(
|
|
root,
|
|
'click',
|
|
'create-rule',
|
|
function(e) {
|
|
e.kill();
|
|
new_rule(config.defaultRule);
|
|
});
|
|
|
|
JX.DOM.listen(
|
|
root,
|
|
'change',
|
|
'rule-select',
|
|
function(e) {
|
|
e.kill();
|
|
|
|
var row = e.getNode(JX.MultirowRowManager.getRowSigil());
|
|
var row_id = rules_manager.getRowID(row);
|
|
|
|
data[row_id].rule = data[row_id].ruleNode.value;
|
|
data[row_id].value = null;
|
|
|
|
redraw(row_id);
|
|
});
|
|
|
|
JX.DOM.listen(
|
|
JX.DOM.findAbove(root, 'form'),
|
|
['submit', 'didWorkflowSubmit'],
|
|
null,
|
|
function(e) {
|
|
var rules = JX.DOM.find(e.getNode('tag:form'), 'input', 'rules');
|
|
|
|
var value = [];
|
|
for (var ii = 0; ii < rows.length; ii++) {
|
|
var row_data = data[rows[ii]];
|
|
|
|
var row_dict = {
|
|
action: row_data.actionNode.value,
|
|
rule: row_data.rule,
|
|
value: row_data.getValue()
|
|
};
|
|
|
|
value.push(row_dict);
|
|
}
|
|
|
|
rules.value = JX.JSON.stringify(value);
|
|
});
|
|
|
|
|
|
var rules_table = JX.DOM.find(root, 'table', 'rules');
|
|
var rules_manager = new JX.MultirowRowManager(rules_table);
|
|
rules_manager.listen(
|
|
'row-removed',
|
|
function(row_id) {
|
|
delete data[row_id];
|
|
for (var ii = 0; ii < rows.length; ii++) {
|
|
if (rows[ii] == row_id) {
|
|
rows.splice(ii, 1);
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
|
|
|
|
function new_rule(spec) {
|
|
var row = rules_manager.addRow([]);
|
|
var row_id = rules_manager.getRowID(row);
|
|
|
|
rows.push(row_id);
|
|
data[row_id] = JX.copy({}, spec);
|
|
|
|
redraw(row_id);
|
|
}
|
|
|
|
function redraw(row_id) {
|
|
var action_content = JX.Prefab.renderSelect(
|
|
config.actions,
|
|
data[row_id].action);
|
|
data[row_id].actionNode = action_content;
|
|
var action_cell = JX.$N('td', {className: 'action-cell'}, action_content);
|
|
|
|
var rule_content = JX.Prefab.renderSelect(
|
|
config.rules,
|
|
data[row_id].rule,
|
|
{sigil: 'rule-select'});
|
|
data[row_id].ruleNode = rule_content;
|
|
var rule_cell = JX.$N('td', {className: 'rule-cell'}, rule_content);
|
|
|
|
var input = render_input(data[row_id].rule, null);
|
|
|
|
var value_content = input.node;
|
|
data[row_id].getValue = input.get;
|
|
input.set(data[row_id].value);
|
|
|
|
var value_cell = JX.$N('td', {className: 'value-cell'}, value_content);
|
|
|
|
rules_manager.updateRow(row_id, [action_cell, rule_cell, value_cell]);
|
|
}
|
|
|
|
function render_input(rule, value) {
|
|
var node, get_fn, set_fn;
|
|
var type = config.types[rule];
|
|
var template = config.templates[rule];
|
|
|
|
switch (type) {
|
|
case 'tokenizer':
|
|
node = JX.$H(template.markup).getNode();
|
|
node.id = '';
|
|
|
|
var datasource = new JX.TypeaheadOnDemandSource(template.uri);
|
|
|
|
var typeahead = new JX.Typeahead(node);
|
|
typeahead.setDatasource(datasource);
|
|
|
|
var tokenizer = new JX.Tokenizer(node);
|
|
tokenizer.setLimit(template.limit);
|
|
tokenizer.setTypeahead(typeahead);
|
|
tokenizer.setPlaceholder(template.placeholder);
|
|
tokenizer.start();
|
|
|
|
get_fn = function() { return JX.keys(tokenizer.getTokens()); };
|
|
set_fn = function(map) {
|
|
if (!map) {
|
|
return;
|
|
}
|
|
for (var k in map) {
|
|
tokenizer.addToken(k, map[k]);
|
|
}
|
|
};
|
|
break;
|
|
case 'none':
|
|
node = null;
|
|
get_fn = JX.bag;
|
|
set_fn = JX.bag;
|
|
break;
|
|
case 'select':
|
|
node = JX.Prefab.renderSelect(
|
|
config.templates[rule].options,
|
|
value);
|
|
get_fn = function() { return node.value; };
|
|
set_fn = function(v) { node.value = v; };
|
|
break;
|
|
default:
|
|
case 'text':
|
|
node = JX.$N('input', {type: 'text'});
|
|
get_fn = function() { return node.value; };
|
|
set_fn = function(v) { node.value = v; };
|
|
break;
|
|
}
|
|
|
|
return {
|
|
node: node,
|
|
get: get_fn,
|
|
set: set_fn
|
|
};
|
|
}
|
|
|
|
for (var ii = 0; ii < config.data.length; ii++) {
|
|
new_rule(config.data[ii]);
|
|
}
|
|
|
|
});
|