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