1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-25 15:00:58 +01:00
phorge-phorge/webroot/rsrc/js/application/trigger/TriggerRuleEditor.js
epriestley 567dea5449 Mostly make the editor UI for triggers work
Summary:
Ref T5474. This provides a Herald-like UI for editing workboard trigger rules.

This probably has some missing pieces and doesn't actually save anything to the database yet, but the basics at least roughly work.

Test Plan: {F6299886}

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T5474

Differential Revision: https://secure.phabricator.com/D20301
2019-03-25 13:25:14 -07:00

137 lines
3 KiB
JavaScript

/**
* @requires multirow-row-manager
* trigger-rule
* @provides trigger-rule-editor
* @javelin
*/
JX.install('TriggerRuleEditor', {
construct: function(form_node) {
this._formNode = form_node;
this._rules = [];
this._types = [];
},
members: {
_formNode: null,
_tableNode: null,
_createButtonNode: null,
_inputNode: null,
_rowManager: null,
_rules: null,
_types: null,
setTableNode: function(table) {
this._tableNode = table;
return this;
},
setCreateButtonNode: function(button) {
this._createButtonNode = button;
return this;
},
setInputNode: function(input) {
this._inputNode = input;
return this;
},
start: function() {
var on_submit = JX.bind(this, this._submitForm);
JX.DOM.listen(this._formNode, 'submit', null, on_submit);
var manager = new JX.MultirowRowManager(this._tableNode);
this._rowManager = manager;
var on_remove = JX.bind(this, this._rowRemoved);
manager.listen('row-removed', on_remove);
var create_button = this._createButtonNode;
var on_create = JX.bind(this, this._createRow);
JX.DOM.listen(create_button, 'click', null, on_create);
},
_submitForm: function() {
var values = [];
for (var ii = 0; ii < this._rules.length; ii++) {
var rule = this._rules[ii];
values.push(rule.getValueForSubmit());
}
this._inputNode.value = JX.JSON.stringify(values);
},
_createRow: function(e) {
var rule = this.newRule();
this.addRule(rule);
e.kill();
},
newRule: function() {
// Create new rules with the first valid rule type.
var types = this.getTypes();
var type;
for (var ii = 0; ii < types.length; ii++) {
type = types[ii];
if (!type.getIsSelectable()) {
continue;
}
// If we make it here: this type is valid, so use it.
break;
}
var default_value = type.getDefaultValue();
return new JX.TriggerRule()
.setType(type.getType())
.setValue(default_value);
},
addRule: function(rule) {
rule.setEditor(this);
this._rules.push(rule);
var manager = this._rowManager;
var row = manager.addRow([]);
var row_id = manager.getRowID(row);
rule.setRowID(row_id);
manager.updateRow(row_id, rule.newRowContent());
},
addType: function(type) {
this._types.push(type);
return this;
},
getTypes: function() {
return this._types;
},
getType: function(type) {
for (var ii = 0; ii < this._types.length; ii++) {
if (this._types[ii].getType() === type) {
return this._types[ii];
}
}
return null;
},
_rowRemoved: function(row_id) {
for (var ii = 0; ii < this._rules.length; ii++) {
var rule = this._rules[ii];
if (rule.getRowID() === row_id) {
this._rules.splice(ii, 1);
break;
}
}
}
}
});