Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
beefproject
GitHub Repository: beefproject/beef
Path: blob/master/extensions/admin_ui/media/javascript/ui/panel/AutoRunRuleForm.js
1154 views
1
const areNotificationUpdateTest = {
2
"name": "Display an alert-----",
3
"author": "mgeeky",
4
"modules": [
5
{
6
"name": "alert_dialog",
7
"condition": null,
8
"options": {
9
"text":"You've been BeEFed ;>"
10
}
11
}
12
],
13
"execution_order": [0],
14
"execution_delay": [0],
15
"chain_mode": "nested-forward"
16
};
17
/**
18
* Form for the user to read, update and delete a specific Auto Run rule.
19
*
20
* rule: The object definition of this rule from the Auto Run Engine.
21
* modules: The list of all commands/modules that the user can choose from.
22
* deleteFn: callback function to delete this rule.
23
* updateFn: callback function to update this rule.
24
*/
25
AutoRunRuleForm = function(rule, modules, deleteFn, updateFn) {
26
const self = this;
27
const ruleTextFieldId = `rule-name-${rule.id}`;
28
const chainModeComboId = `rule-chain-mode-${rule.id}`;
29
const newRule = JSON.parse(JSON.stringify(rule));
30
newRule.modules = JSON.parse(newRule['modules']);
31
newRule.execution_delay = JSON.parse(newRule['execution_delay']);
32
newRule.execution_order = JSON.parse(newRule['execution_order']);
33
const moduleContainer = new Ext.Container({
34
style: {
35
padding: '10 10 10 10',
36
},
37
listeners: {
38
afterrender: setupModuleForms
39
}
40
});
41
42
function reorderModule(index, direction) {
43
// Rearrange modules into new order.
44
const currentModule = newRule.modules[index];
45
const newIndex = direction === 'back' ? index + 1 : index - 1;
46
newRule.modules.splice(index, 1);
47
newRule.modules.splice(newIndex, 0, currentModule);
48
49
// Update DOM.
50
setupModuleForms();
51
moduleContainer.doLayout();
52
}
53
54
function removeModule(index) {
55
// Remove element from execution_order and execution_delay arrays.
56
newRule.modules.splice(index, 1);
57
newRule.execution_delay.splice(index, 1);
58
59
// Update DOM.
60
setupModuleForms();
61
moduleContainer.doLayout();
62
}
63
64
function addModule() {
65
// New module is a copy of the last module.
66
newRule.modules.push(newRule.modules[newRule.modules.length - 1]);
67
newRule.execution_delay.push(newRule.execution_delay[newRule.execution_delay.length - 1]);
68
69
// Update DOM.
70
setupModuleForms();
71
moduleContainer.doLayout();
72
}
73
74
function setupModuleForms() {
75
76
moduleContainer.removeAll(true);
77
78
// I think execution order should always be sequential.
79
// The actual order comes from the modules array.
80
for (let i = 0; i < newRule.modules.length; ++i) {
81
const isFirstModule = i === 0;
82
const isLastModule = i >= newRule.modules.length - 1;
83
moduleContainer.add(new AutoRunModuleForm(
84
newRule.modules[i],
85
function() {removeModule(i)},
86
isFirstModule ? undefined : function() {reorderModule(i, 'forward')},
87
isLastModule ? undefined : function() {reorderModule(i, 'back')},
88
rule.id,
89
i,
90
modules
91
));
92
}
93
}
94
95
function handleUpdateRule() {
96
// TODO: Need to overwrite module order.
97
const form = self.getForm();
98
const formValues = form.getValues();
99
const updatedRule = {
100
...newRule,
101
name: formValues[ruleTextFieldId],
102
chain_mode: formValues[chainModeComboId],
103
execution_order: [...Array(newRule.modules.length).keys()],
104
};
105
updateFn(updatedRule);
106
}
107
108
109
AutoRunRuleForm.superclass.constructor.call(this, {
110
padding:'10 10 10 10',
111
title: `Rule ${rule.id}`,
112
items: [{
113
xtype: 'textfield',
114
id: ruleTextFieldId,
115
value: rule.name ? rule.name : '',
116
fieldLabel: 'Name',
117
},
118
{
119
xtype: 'displayfield',
120
fieldLabel: 'Author',
121
value: rule.author ? rule.author : 'anonymous',
122
},{
123
xtype: 'displayfield',
124
fieldLabel: 'Browser(s)',
125
value: rule.browser ? rule.browser : 'All',
126
},{
127
xtype: 'displayfield',
128
fieldLabel: 'Browser version(s)',
129
value: rule.browser_version ? rule.browser_version : 'All',
130
},{
131
xtype: 'displayfield',
132
fieldLabel: 'OS(s)',
133
value: rule.os ? rule.os : 'All',
134
},{
135
xtype: 'displayfield',
136
fieldLabel: 'OS version(s)',
137
value: rule.os_version ? rule.os_version : 'All',
138
},
139
moduleContainer,
140
{
141
xtype: 'button',
142
text: 'Add Module',
143
handler: addModule
144
},
145
{
146
xtype: 'combo',
147
id: chainModeComboId,
148
fieldLabel: 'Chain Mode',
149
store: ['sequential', 'nested-forward'],
150
queryMode: 'local', // Use local data.
151
triggerAction: 'all', // Show both options instead of just the default.
152
editable: false, // Disable manual text input.
153
forceSelection: true,
154
value: rule.chain_mode ? rule.chain_mode : 'sequential'
155
},{
156
xtype: 'displayfield',
157
fieldLabel: 'Execution Order',
158
value: newRule.execution_order ?
159
JSON.stringify(newRule.execution_order)
160
: 'undefined',
161
},{
162
xtype: 'displayfield',
163
fieldLabel: 'Execution Delay',
164
value: newRule.execution_delay ?
165
JSON.stringify(newRule.execution_delay)
166
: 'undefined',
167
}
168
],
169
buttons: [{
170
text: 'Delete',
171
handler: deleteFn
172
}, {
173
text: 'Save',
174
handler: handleUpdateRule
175
}],
176
border: false,
177
closable: false
178
});
179
};
180
181
Ext.extend(AutoRunRuleForm, Ext.FormPanel, {});
182