Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/webroot/rsrc/js/application/trigger/TriggerRuleEditor.js
12242 views
1
/**
2
* @requires multirow-row-manager
3
* trigger-rule
4
* @provides trigger-rule-editor
5
* @javelin
6
*/
7
8
JX.install('TriggerRuleEditor', {
9
10
construct: function(form_node) {
11
this._formNode = form_node;
12
this._rules = [];
13
this._types = [];
14
},
15
16
members: {
17
_formNode: null,
18
_tableNode: null,
19
_createButtonNode: null,
20
_inputNode: null,
21
_rowManager: null,
22
_rules: null,
23
_types: null,
24
25
setTableNode: function(table) {
26
this._tableNode = table;
27
return this;
28
},
29
30
setCreateButtonNode: function(button) {
31
this._createButtonNode = button;
32
return this;
33
},
34
35
setInputNode: function(input) {
36
this._inputNode = input;
37
return this;
38
},
39
40
start: function() {
41
var on_submit = JX.bind(this, this._submitForm);
42
JX.DOM.listen(this._formNode, 'submit', null, on_submit);
43
44
var manager = new JX.MultirowRowManager(this._tableNode);
45
this._rowManager = manager;
46
47
var on_remove = JX.bind(this, this._rowRemoved);
48
manager.listen('row-removed', on_remove);
49
50
var create_button = this._createButtonNode;
51
var on_create = JX.bind(this, this._createRow);
52
JX.DOM.listen(create_button, 'click', null, on_create);
53
},
54
55
_submitForm: function() {
56
var values = [];
57
for (var ii = 0; ii < this._rules.length; ii++) {
58
var rule = this._rules[ii];
59
values.push(rule.getValueForSubmit());
60
}
61
62
this._inputNode.value = JX.JSON.stringify(values);
63
},
64
65
_createRow: function(e) {
66
var rule = this.newRule();
67
this.addRule(rule);
68
e.kill();
69
},
70
71
newRule: function() {
72
// Create new rules with the first valid rule type.
73
var types = this.getTypes();
74
var type;
75
for (var ii = 0; ii < types.length; ii++) {
76
type = types[ii];
77
if (!type.getIsSelectable()) {
78
continue;
79
}
80
81
// If we make it here: this type is valid, so use it.
82
break;
83
}
84
85
var default_value = type.getDefaultValue();
86
87
return new JX.TriggerRule()
88
.setType(type.getType())
89
.setValue(default_value);
90
},
91
92
addRule: function(rule) {
93
rule.setEditor(this);
94
this._rules.push(rule);
95
96
var manager = this._rowManager;
97
98
var row = manager.addRow([]);
99
var row_id = manager.getRowID(row);
100
rule.setRowID(row_id);
101
102
manager.updateRow(row_id, rule.newRowContent());
103
},
104
105
addType: function(type) {
106
this._types.push(type);
107
return this;
108
},
109
110
getTypes: function() {
111
return this._types;
112
},
113
114
getType: function(type) {
115
for (var ii = 0; ii < this._types.length; ii++) {
116
if (this._types[ii].getType() === type) {
117
return this._types[ii];
118
}
119
}
120
121
return null;
122
},
123
124
_rowRemoved: function(row_id) {
125
for (var ii = 0; ii < this._rules.length; ii++) {
126
var rule = this._rules[ii];
127
128
if (rule.getRowID() === row_id) {
129
this._rules.splice(ii, 1);
130
break;
131
}
132
}
133
}
134
135
}
136
137
});
138
139