From 655b977ed031f86ab4775e6d23ef299efed00f71 Mon Sep 17 00:00:00 2001
From: Jaap Jansma <jaap@edeveloper.nl>
Date: Tue, 13 Mar 2018 10:51:39 +0100
Subject: [PATCH] refactored action and added default data actions

---
 ang/form_processor.js                         |  31 ++++
 ang/form_processor/FormProcessorEditCtrl.html |  41 ++---
 ang/form_processor/FormProcessorEditCtrl.js   | 148 +++++-------------
 .../FormProcessorEditCtrl/ActionTable.html    |  48 +-----
 .../DefaultDataActionTable.html               |   6 +
 .../OutputHandlerDialogCtrl.html              |   2 +-
 ang/form_processor/OutputHandlerDialogCtrl.js |   1 +
 .../{ => actions}/ActionDialogCtrl.html       |   2 +-
 .../{ => actions}/ActionDialogCtrl.js         |   4 +-
 .../actions/crmFormProcessorActions.html      |  39 +++++
 .../actions/crmFormProcessorActions.js        |  87 ++++++++++
 .../FormatActionOutputCtrl.js                 |   2 -
 12 files changed, 232 insertions(+), 179 deletions(-)
 create mode 100644 ang/form_processor/FormProcessorEditCtrl/DefaultDataActionTable.html
 rename ang/form_processor/{ => actions}/ActionDialogCtrl.html (97%)
 rename ang/form_processor/{ => actions}/ActionDialogCtrl.js (88%)
 create mode 100644 ang/form_processor/actions/crmFormProcessorActions.html
 create mode 100644 ang/form_processor/actions/crmFormProcessorActions.js

diff --git a/ang/form_processor.js b/ang/form_processor.js
index 55c9cd1..777707c 100644
--- a/ang/form_processor.js
+++ b/ang/form_processor.js
@@ -3,4 +3,35 @@
   angular.module('form_processor', [
     'crmUi', 'crmUtil', 'ngRoute'
   ]);
+  angular.module('form_processor').factory('formProcessorFactory', function() {
+  	return {
+  		updateFields: function (inputs, actions, selectedAction) {
+	  		var fields = [];
+	  		angular.forEach(inputs, function(input, key) {
+	  				var field = {
+	  					'name': 'input.'+input.name,
+	  					'label': 'Input::'+input.name
+	  				};
+	  				fields.push(field);
+				});
+				
+				var skipAfter = false;
+				angular.forEach(actions, function(action, key) {
+					if (selectedAction == action) {
+						skipAfter = true;
+					}
+					if (!skipAfter) {
+						angular.forEach(action.type.output_spec, function(output_field, output_field_key) {
+							var field = {
+	  						'name': 'action.'+action.name+'.'+output_field.name,
+	  						'label': 'Action::'+action.title+'::'+output_field.title
+	  					};
+	  					fields.push(field);
+	  				});
+					}
+				});
+				return fields;
+  		}
+		};
+  });
 })(angular, CRM.$, CRM._);
diff --git a/ang/form_processor/FormProcessorEditCtrl.html b/ang/form_processor/FormProcessorEditCtrl.html
index 60f24a9..f93ab57 100644
--- a/ang/form_processor/FormProcessorEditCtrl.html
+++ b/ang/form_processor/FormProcessorEditCtrl.html
@@ -12,25 +12,28 @@ Required vars: formProcessor
 	<div class="status status-warning" ng-show="editFormProcessorForm.$dirty">
     {{ts('Form processor is not saved')}}
   </div>
-
-  <div ng-include="'~/form_processor/FormProcessorEditCtrl/Details.html'"></div>
-  
-  <div ng-include="'~/form_processor/FormProcessorEditCtrl/InputTable.html'"></div>
-  
-  <div ng-include="'~/form_processor/FormProcessorEditCtrl/ActionTable.html'"></div>
   
-  <div ng-include="'~/form_processor/FormProcessorEditCtrl/OutputHandler.html'"></div>
-
-  <div class="crm-submit-buttons">
-    <button crm-icon="fa-check" ng-click="save(false);" ng-disabled="editFormProcessorForm.$invalid || !isNameValid">
-      {{ts('Save')}}
-    </button>
-    <button crm-icon="fa-check" ng-click="save(true);" ng-disabled="editFormProcessorForm.$invalid || !isNameValid">
-      {{ts('Save and go back')}}
-    </button>
-    <button crm-icon="fa-times" ng-click="editFormProcessorForm.$setPristine(); goto('formProcessors')">
-      {{ts('Cancel')}}
-    </button>
-  </div>
+  <div crm-ui-wizard class"crm-section">
+    <div crm-ui-wizard-step crm-title="ts('Define form processeror')" ng-form="defineForm">
+			<div ng-include="'~/form_processor/FormProcessorEditCtrl/Details.html'"></div>
+			<div ng-include="'~/form_processor/FormProcessorEditCtrl/InputTable.html'"></div>
+			<div ng-include="'~/form_processor/FormProcessorEditCtrl/ActionTable.html'"></div>
+			<div ng-include="'~/form_processor/FormProcessorEditCtrl/OutputHandler.html'"></div>
+		</div>
+		<div crm-ui-wizard-step crm-title="ts('Define default data')" ng-form="defaultDataForm">
+			<div ng-include="'~/form_processor/FormProcessorEditCtrl/DefaultDataActionTable.html'"></div>
+		</div>
+		<span crm-ui-wizard-buttons style="float:right;">
+	    <button crm-icon="fa-check" ng-click="save(false);" ng-disabled="editFormProcessorForm.$invalid || !isNameValid">
+	      {{ts('Save')}}
+	    </button>
+	    <button crm-icon="fa-check" ng-click="save(true);" ng-disabled="editFormProcessorForm.$invalid || !isNameValid">
+	      {{ts('Save and close')}}
+	    </button>
+	    <button crm-icon="fa-times" ng-click="editFormProcessorForm.$setPristine(); goto('formProcessors')">
+	      {{ts('Cancel')}}
+	    </button>
+  	</span>
+	</div>
 </div>
 </form>
diff --git a/ang/form_processor/FormProcessorEditCtrl.js b/ang/form_processor/FormProcessorEditCtrl.js
index 0d40165..1cda80a 100644
--- a/ang/form_processor/FormProcessorEditCtrl.js
+++ b/ang/form_processor/FormProcessorEditCtrl.js
@@ -15,6 +15,7 @@
           		actions: [],
           		output_handler: false,
           		output_handler_configuration: [],
+          		default_data_actions: [],
         		};
           	return reqs;
           }
@@ -61,6 +62,7 @@
     	}
     }
     $scope.deletedActions = [];
+    $scope.deletedDefaultDataActions = [];
     
     $scope.outputHandlers = CRM.form_processor.outputHandlers;
     if (!$scope.formProcessor.output_handler) {
@@ -88,8 +90,7 @@
     $timeout(function(){
     	// The select boxes for input type and action type do not count for the @pristine state of the
     	// form.
-  		$scope.editFormProcessorForm.formProcessorInputsForm.type.$pristine = false;
-  		$scope.editFormProcessorForm.formProcessorActionsForm.type.$pristine = false;
+  		$scope.editFormProcessorForm.defineForm.formProcessorInputsForm.type.$pristine = false;
 		});
     
     $scope.isValidName = function(name) {
@@ -105,11 +106,9 @@
         $scope.formProcessor.id = data.id;
         $scope.formProcessor.output_handler = output_handler;  
         
-        var apiCalls = [];
-        
         angular.forEach($scope.deletedInputs, function(input, key) {
         	if (input.id) {
-        		apiCalls.push(crmApi('FormProcessorInput', 'delete', {'id': input.id}, true));
+        		crmApi('FormProcessorInput', 'delete', {'id': input.id}, true);
         	}
         });
         
@@ -121,7 +120,7 @@
         	input.form_processor_instance_id = $scope.formProcessor.id;
         	input.configuration = input.type.configuration; 
         	input.type = input.type.name;
-        	apiCalls.push(crmApi('FormProcessorInput', 'create', input, true).then(function (input_result){
+        	crmApi('FormProcessorInput', 'create', input, true).then(function (input_result){
       			input.id = input_result['id'];
       			input.type = type;
       			angular.forEach(input.validators, function(validator, validator_index){
@@ -132,31 +131,11 @@
       					validator.validator = validator_type;
       				});
       			});
-      		}));
-        });
-        
-        angular.forEach($scope.deletedActions, function(action, key) {
-        	if (action.id) {          	
-        		apiCalls.push(crmApi('FormProcessorAction', 'delete', {'id': action.id}, true));
-        	}
+      		});
         });
         
-        var actionWeight = 0;
-        angular.forEach($scope.formProcessor.actions, function(action, key) {
-        	var old_id = action.id;
-        	if (action.id < 0) {
-        		delete action.id;
-        	}
-        	var action_type = angular.copy(action.type);
-        	action.form_processor_instance_id = $scope.formProcessor.id; 
-        	action.type = action.type.name;
-        	action.weight = actionWeight;
-        	apiCalls.push(crmApi('FormProcessorAction', 'create', action, true).then(function(action_result) {
-        		action.id = action_result.id;
-        		action.type = action_type;
-      		}));
-        	actionWeight++;
-        });
+        $scope.saveActions($scope.formProcessor.actions, $scope.deletedActions, 'FormProcessorAction', $scope.formProcessor);
+        $scope.saveActions($scope.formProcessor.default_data_actions, $scope.deletedDefaultDataActions, 'FormProcessorDefaultDataAction', $scope.formProcessor);
         
         $scope.editFormProcessorForm.$setPristine();
         
@@ -166,6 +145,31 @@
       });
     };
     
+    $scope.saveActions = function(actions, deletedActions, api, formProcessor) {
+    	angular.forEach(deletedActions, function(action, key) {
+      	if (action.id) {          	
+      		crmApi(api, 'delete', {'id': action.id}, true);
+      	}
+      });
+      
+      var actionWeight = 0;
+      angular.forEach(actions, function(action, key) {
+      	var old_id = action.id;
+      	if (action.id < 0) {
+      		delete action.id;
+      	}
+      	var action_type = angular.copy(action.type);
+      	action.form_processor_instance_id = formProcessor.id; 
+      	action.type = action.type.name;
+      	action.weight = actionWeight;
+      	crmApi(api, 'create', action, true).then(function(action_result) {
+      		action.id = action_result.id;
+      		action.type = action_type;
+    		});
+      	actionWeight++;
+      });
+    };
+    
     $scope.removeInput = function removeInput(input) {
     	var index = $scope.formProcessor.inputs.indexOf(input);
     	if (index >= 0) {
@@ -217,60 +221,6 @@
 			});
     };
     
-    $scope.removeAction = function removeAction(action) {
-    	var index = $scope.formProcessor.actions.indexOf(action);
-    	if (index >= 0) {
-    		$scope.formProcessor.actions.splice(index, 1);
-    		$scope.deletedActions.push(action);
-    	}
-    	
-    	$scope.editFormProcessorForm.$setDirty();
-    };
-  
-   // Open a dialog for adding an action
-    $scope.addAction = function addAction(actionType) {
-    	if (!actionType) {
-    		return;
-    	}    
-      var action = {
-    		id: $scope.new_id,
-    		type: angular.copy(actionType),
-      	'title': '',
-      	'name': '',
-  			'configuration': angular.copy(actionType.default_configuration),
-  			'mapping': {}
-      };
-      $scope.editAction(action);
-    };
-    
-    // Open a dialog for editting an action
-    $scope.editAction = function editAction(action) {    	    	
-      var options = CRM.utils.adjustDialogDefaults({
-        autoOpen: false,
-        width: '40%',
-        height: 'auto',
-        title: ts('Edit action')
-      });
-      
-      $scope.updateFields($scope.formProcessor, action);
-      index = $scope.formProcessor.actions.indexOf(action);
-      var model = {
-      	formProcessor: $scope.formProcessor,
-      	action: action
-      };
-      dialogService.open('ActionDialog', '~/form_processor/ActionDialogCtrl.html', model, options)
-      .then(function(data) {
-      	$scope.editFormProcessorForm.$setDirty();
-      	
-      	if (index >= 0) {
-      		$scope.formProcessor.actions[index] = data.action;
-      	} else if ($scope.new_id == data.action.id) {
-					$scope.formProcessor.actions.push(data.action);
-					$scope.new_id --;
-				}
-			});
-    };
-    
     $scope.editOutputHandler = function editOutputHandler() {
     	var options = CRM.utils.adjustDialogDefaults({
         autoOpen: false,
@@ -279,11 +229,12 @@
         title: ts('Edit output handler')
       });
       
-      $scope.updateFields($scope.formProcessor);
+      var fields = formProcessorFactory.updateFields($scope.formProcessor.inputs, $scope.actions); 
       var model = {
       	formProcessor: $scope.formProcessor,
       	outputHandler: $scope.formProcessor.output_handler,
-      	outputHandlers: $scope.outputHandlers
+      	outputHandlers: $scope.outputHandlers,
+      	fields: fields
       };
       dialogService.open('OutputHandlerDialog', '~/form_processor/OutputHandlerDialogCtrl.html', model, options)
       .then(function(data) {
@@ -291,33 +242,6 @@
       	$scope.formProcessor.output_handler = data.outputHandler;
 			});
     };
-  
-  	$scope.updateFields = function updateFields(formProcessor, selectedAction) {
-  		formProcessor.fields = [];
-  		angular.forEach(formProcessor.inputs, function(input, key) {
-  				var field = {
-  					'name': 'input.'+input.name,
-  					'label': 'Input::'+input.name
-  				};
-  				formProcessor.fields.push(field);
-			});
-			
-			var skipAfter = false;
-			angular.forEach(formProcessor.actions, function(action, key) {
-				if (selectedAction == action) {
-					skipAfter = true;
-				}
-				if (!skipAfter) {
-					angular.forEach(action.type.output_spec, function(output_field, output_field_key) {
-						var field = {
-  						'name': 'action.'+action.name+'.'+output_field.name,
-  						'label': 'Action::'+action.title+'::'+output_field.title
-  					};
-  					formProcessor.fields.push(field);
-  				});
-				}
-			});
-  	};
   	
   });
 
diff --git a/ang/form_processor/FormProcessorEditCtrl/ActionTable.html b/ang/form_processor/FormProcessorEditCtrl/ActionTable.html
index 9cabd55..1cbf901 100644
--- a/ang/form_processor/FormProcessorEditCtrl/ActionTable.html
+++ b/ang/form_processor/FormProcessorEditCtrl/ActionTable.html
@@ -1,42 +1,6 @@
-<!--
-Controller: FormProcessorCtrl
-Required vars: formProcessor
--->
-<div class="crm-block" ng-form="formProcessorActionsForm" crm-ui-id-scope>
-	<h3>{{ts('Actions')}}</h3>
-<table>
-  <thead>
-	  <tr>
-	    <th>{{ts('Title')}}</th>
-	    <th>{{ts('Type')}}</th>
-	    <th></th>
-	  </tr>
-  </thead>
-  <tbody>
-	  <tr ng-repeat="action in formProcessor.actions " ng-class-even="'crm-entity even-row even'" ng-class-odd="'crm-entity odd-row odd'">
-	    <td>{{action.title}}</td>
-	    <td>{{action.type.title}}</td>
-	    <td>
-	      <a crm-icon="fa-edit" class="crm-hover-button" ng-click="editAction(action)" title="{{ts('Edit')}}">{{ts('Edit')}}</a>
-	      <a crm-icon="fa-trash" class="crm-hover-button" ng-click="removeAction(action)" title="{{ts('Remove')}}">{{ts('Remove')}}</a>
-	    </td>
-	  </tr>
-  </tbody>
-
-  <tfoot>
-	  <tr class="addRow">
-	    <td colspan="4">
-	    	<select
-        crm-ui-id="formProcessorActionForm.type"
-        name="type"
-        ui-jq="select2"
-        ui-options="{dropdownAutoWidth : true, allowClear: true}"
-        ng-model="actionType"
-        ng-options="actionType.title for actionType in actionTypes">
-        <option value="">{{ts('- Select action type -')}}</option>
-      </select>
-      <button crm-icon="fa-check" ng-click="addAction(actionType)">{{ts('Add action')}}</button>	    	
-	    </td>
-	  </tr>
-  </tfoot>
-</table>
\ No newline at end of file
+<crm-form-processor-actions
+	form-processor="formProcessor"
+	actions="formProcessor.actions"
+	deletedActions="deletedActions"
+	entity="FormProcessorAction">
+</crm-form-processor-actions>
\ No newline at end of file
diff --git a/ang/form_processor/FormProcessorEditCtrl/DefaultDataActionTable.html b/ang/form_processor/FormProcessorEditCtrl/DefaultDataActionTable.html
new file mode 100644
index 0000000..a09850b
--- /dev/null
+++ b/ang/form_processor/FormProcessorEditCtrl/DefaultDataActionTable.html
@@ -0,0 +1,6 @@
+<crm-form-processor-actions
+	form-processor="formProcessor"
+	actions="formProcessor.default_data_actions"
+	deletedActions="deletedDefaultDataActions"
+	entity="FormProcessorDefaultDataAction">
+</crm-form-processor-actions>
\ No newline at end of file
diff --git a/ang/form_processor/OutputHandlerDialogCtrl.html b/ang/form_processor/OutputHandlerDialogCtrl.html
index 4c04bfb..51f61f2 100644
--- a/ang/form_processor/OutputHandlerDialogCtrl.html
+++ b/ang/form_processor/OutputHandlerDialogCtrl.html
@@ -16,7 +16,7 @@
     	<crm-form-processor-specification-bag
     		specification-bag="outputHandler.configuration_spec"
     		configuration="outputHandler.configuration"
-    		fields="formProcessor.fields"
+    		fields="fields"
     	>
     	</crm-form-processor-specification-bag>
     </div>
diff --git a/ang/form_processor/OutputHandlerDialogCtrl.js b/ang/form_processor/OutputHandlerDialogCtrl.js
index 89b0568..e55adf9 100644
--- a/ang/form_processor/OutputHandlerDialogCtrl.js
+++ b/ang/form_processor/OutputHandlerDialogCtrl.js
@@ -6,6 +6,7 @@
     $scope.outputHandler = angular.copy($scope.model.outputHandler);
     $scope.outputHandlers = $scope.model.outputHandlers;
     $scope.formProcessor = $scope.model.formProcessor;
+    $scope.fields = $scope.model.fields;
     
     angular.forEach($scope.outputHandlers, function (outputHandler, key) {
     	outputHandler.configuration = outputHandler.default_configuration;
diff --git a/ang/form_processor/ActionDialogCtrl.html b/ang/form_processor/actions/ActionDialogCtrl.html
similarity index 97%
rename from ang/form_processor/ActionDialogCtrl.html
rename to ang/form_processor/actions/ActionDialogCtrl.html
index d7ec64d..d06941a 100644
--- a/ang/form_processor/ActionDialogCtrl.html
+++ b/ang/form_processor/actions/ActionDialogCtrl.html
@@ -38,7 +38,7 @@
 	    <crm-ap-action-configuration 
 	    	configuration="action.configuration" 
 	    	action="action.type"
-	    	fields="model.formProcessor.fields"
+	    	fields="model.fields"
 	    	mapping="action.mapping"
     	></crm-ap-action-configuration>
 
diff --git a/ang/form_processor/ActionDialogCtrl.js b/ang/form_processor/actions/ActionDialogCtrl.js
similarity index 88%
rename from ang/form_processor/ActionDialogCtrl.js
rename to ang/form_processor/actions/ActionDialogCtrl.js
index d10527d..d05805c 100644
--- a/ang/form_processor/ActionDialogCtrl.js
+++ b/ang/form_processor/actions/ActionDialogCtrl.js
@@ -12,7 +12,7 @@
     	// Watch for changes in the name field
     	$scope.isNameValid = false;
     	if (newName) {
-	      crmApi('FormProcessorAction', 'validatename', {'name': newName,'id': $scope.action.id})
+	      crmApi($scope.model.entity, 'validatename', {'name': newName,'id': $scope.action.id})
 	      .then(function(data) {
 	      	if (data.is_valid) {
 	      		$scope.isNameValid = true;
@@ -24,7 +24,7 @@
     $scope.$watch('action.title', function(newTitle, oldTitle) {
     	// Watch for changes in the name field
     	if ($scope.locks.name && $scope.action.id <= 0) {
-    		crmApi('FormProcessorAction', 'converttitletoname', {'title': newTitle})
+    		crmApi($scope.model.entity, 'converttitletoname', {'title': newTitle})
       	.then(function(data) {
       		if (data.name) {
       			$scope.action.name = data.name;		
diff --git a/ang/form_processor/actions/crmFormProcessorActions.html b/ang/form_processor/actions/crmFormProcessorActions.html
new file mode 100644
index 0000000..0dce21f
--- /dev/null
+++ b/ang/form_processor/actions/crmFormProcessorActions.html
@@ -0,0 +1,39 @@
+<div class="crm-block" ng-form="formProcessorActionsForm" crm-ui-id-scope>
+<h3>{{ts('Actions')}}</h3>
+<table>
+  <thead>
+	  <tr>
+	    <th>{{ts('Title')}}</th>
+	    <th>{{ts('Type')}}</th>
+	    <th></th>
+	  </tr>
+  </thead>
+  <tbody>
+	  <tr ng-repeat="action in actions " ng-class-even="'crm-entity even-row even'" ng-class-odd="'crm-entity odd-row odd'">
+	    <td>{{action.title}}</td>
+	    <td>{{action.type.title}}</td>
+	    <td>
+	      <a crm-icon="fa-edit" class="crm-hover-button" ng-click="editAction(action)" title="{{ts('Edit')}}">{{ts('Edit')}}</a>
+	      <a crm-icon="fa-trash" class="crm-hover-button" ng-click="removeAction(action)" title="{{ts('Remove')}}">{{ts('Remove')}}</a>
+	    </td>
+	  </tr>
+  </tbody>
+
+  <tfoot>
+	  <tr class="addRow">
+	    <td colspan="4">
+	    	<select
+        crm-ui-id="formProcessorActionsForm.type"
+        name="type"
+        ui-jq="select2"
+        ui-options="{dropdownAutoWidth : true, allowClear: true}"
+        ng-model="actionType"
+        ng-options="actionType.title for actionType in actionTypes">
+        <option value="">{{ts('- Select action type -')}}</option>
+      </select>
+      <button crm-icon="fa-check" ng-click="addAction(actionType)">{{ts('Add action')}}</button>	    	
+	    </td>
+	  </tr>
+  </tfoot>
+</table>
+</div>
\ No newline at end of file
diff --git a/ang/form_processor/actions/crmFormProcessorActions.js b/ang/form_processor/actions/crmFormProcessorActions.js
new file mode 100644
index 0000000..c165644
--- /dev/null
+++ b/ang/form_processor/actions/crmFormProcessorActions.js
@@ -0,0 +1,87 @@
+(function(angular, $, _) {
+	
+	angular.module('form_processor').directive('crmFormProcessorActions', function(formProcessorFactory, dialogService, $timeout) {
+	  return {
+	    restrict: 'E',
+	    scope: {
+	      actions: '=',
+	      formProcessor: '=',
+	      deletedActions: '=',
+	      entity: '@',
+	    },
+	    templateUrl: '~/form_processor/actions/crmFormProcessorActions.html',
+	    link: function($scope, element, attrs){
+	    	$scope.ts = CRM.ts(null);
+	    	
+	    	$scope.actionTypes = angular.copy(CRM.form_processor.actionTypes);
+		    for(var i=0; i<$scope.actionTypes.length; i++) {
+		    	if ($scope.actionTypes[i].description) {
+		    		$scope.actionTypes[i].description = $sce.trustAsHtml($scope.actionTypes[i].description);
+		    	}
+		    }
+	    	
+	    	$scope.new_id = -1;
+	    	
+	    	$timeout(function(){
+		    	// The select boxes for input type and action type do not count for the @pristine state of the
+		    	// form.
+		  		$scope.formProcessorActionsForm.type.$pristine = false;
+				});
+	    	
+	    	$scope.removeAction = function removeAction(action) {
+		    	var index = $scope.actions.indexOf(action);
+		    	if (index >= 0) {
+		    		$scope.actions.splice(index, 1);
+		    		$scope.deletedActions.push(action);
+		    	}
+		    };
+		  
+		   	// Open a dialog for adding an action
+		    $scope.addAction = function addAction(actionType) {
+		    	if (!actionType) {
+		    		return;
+		    	}    
+		      var action = {
+		    		id: $scope.new_id,
+		    		type: angular.copy(actionType),
+		      	'title': '',
+		      	'name': '',
+		  			'configuration': angular.copy(actionType.default_configuration),
+		  			'mapping': {}
+		      };
+		      $scope.editAction(action);
+		    };
+		    
+		    // Open a dialog for editting an action
+		    $scope.editAction = function editAction(action) {    	    	
+		      var options = CRM.utils.adjustDialogDefaults({
+		        autoOpen: false,
+		        width: '40%',
+		        height: 'auto',
+		        title: ts('Edit action')
+		      });
+		      
+		      var fields = formProcessorFactory.updateFields($scope.formProcessor.inputs, $scope.actions, action);
+		      index = $scope.actions.indexOf(action);
+		      var model = {
+		      	formProcessor: $scope.formProcessor,
+		      	action: action,
+		      	fields: fields,
+		      	entity: $scope.entity
+		      };
+		      dialogService.open('ActionDialog', '~/form_processor/actions/ActionDialogCtrl.html', model, options)
+		      .then(function(data) {
+		      	$scope.formProcessorActionsForm.$setDirty();		      	
+		      	if (index >= 0) {
+		      		$scope.actions[index] = data.action;
+		      	} else if ($scope.new_id == data.action.id) {
+							$scope.actions.push(data.action);
+							$scope.new_id --;
+						}
+					});
+		    };
+	    }
+	  };
+	});
+	
+})(angular, CRM.$, CRM._);
\ No newline at end of file
diff --git a/ang/form_processor/crmFormProcessorOutputHandler/FormatActionOutputCtrl.js b/ang/form_processor/crmFormProcessorOutputHandler/FormatActionOutputCtrl.js
index 6775e79..1477ef1 100644
--- a/ang/form_processor/crmFormProcessorOutputHandler/FormatActionOutputCtrl.js
+++ b/ang/form_processor/crmFormProcessorOutputHandler/FormatActionOutputCtrl.js
@@ -5,8 +5,6 @@
     
     $scope.configuration = outputHandler.configuration;
     
-    //$scope.watchCollection('configuration')
-    
     $scope.addField = function(field) {
     	var splitted_field = field.name.split('.');
     	var output_name = splitted_field[splitted_field.length - 1];
-- 
GitLab