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