Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/webroot/rsrc/js/application/policy/behavior-policy-rule-editor.js
12242 views
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
var options = {
122
src: template.uri,
123
placeholder: template.placeholder,
124
browseURI: template.browseURI,
125
limit: template.limit
126
};
127
128
var build = JX.Prefab.newTokenizerFromTemplate(
129
template.markup,
130
options);
131
132
node = build.node;
133
134
var tokenizer = build.tokenizer;
135
tokenizer.start();
136
137
get_fn = function() { return JX.keys(tokenizer.getTokens()); };
138
set_fn = function(map) {
139
if (!map) {
140
return;
141
}
142
for (var k in map) {
143
tokenizer.addToken(k, map[k]);
144
}
145
};
146
break;
147
case 'none':
148
node = null;
149
get_fn = JX.bag;
150
set_fn = JX.bag;
151
break;
152
case 'select':
153
node = JX.Prefab.renderSelect(
154
config.templates[rule].options,
155
value);
156
get_fn = function() { return node.value; };
157
set_fn = function(v) { node.value = v; };
158
break;
159
default:
160
case 'text':
161
node = JX.$N('input', {type: 'text'});
162
get_fn = function() { return node.value; };
163
set_fn = function(v) { node.value = v; };
164
break;
165
}
166
167
return {
168
node: node,
169
get: get_fn,
170
set: set_fn
171
};
172
}
173
174
for (var ii = 0; ii < config.data.length; ii++) {
175
new_rule(config.data[ii]);
176
}
177
178
});
179
180