diff options
author | Yaco <franco@reevo.org> | 2020-06-04 11:01:00 -0300 |
---|---|---|
committer | Yaco <franco@reevo.org> | 2020-06-04 11:01:00 -0300 |
commit | fc7369835258467bf97eb64f184b93691f9a9fd5 (patch) | |
tree | daabd60089d2dd76d9f5fb416b005fbe159c799d /www/crm/wp-content/plugins/civicrm/civicrm/ang/crmMailingAB/EditCtrl.js |
first commit
Diffstat (limited to 'www/crm/wp-content/plugins/civicrm/civicrm/ang/crmMailingAB/EditCtrl.js')
-rw-r--r-- | www/crm/wp-content/plugins/civicrm/civicrm/ang/crmMailingAB/EditCtrl.js | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/www/crm/wp-content/plugins/civicrm/civicrm/ang/crmMailingAB/EditCtrl.js b/www/crm/wp-content/plugins/civicrm/civicrm/ang/crmMailingAB/EditCtrl.js new file mode 100644 index 00000000..b189bafc --- /dev/null +++ b/www/crm/wp-content/plugins/civicrm/civicrm/ang/crmMailingAB/EditCtrl.js @@ -0,0 +1,149 @@ +(function(angular, $, _) { + + angular.module('crmMailingAB').controller('CrmMailingABEditCtrl', function($scope, abtest, crmMailingABCriteria, crmMailingMgr, crmMailingPreviewMgr, crmStatus, $q, $location, crmBlocker, $interval, $timeout, CrmAutosaveCtrl, dialogService) { + $scope.abtest = abtest; + var ts = $scope.ts = CRM.ts(null); + var block = $scope.block = crmBlocker(); + $scope.crmUrl = CRM.url; + var myAutosave = null; + $scope.crmMailingABCriteria = crmMailingABCriteria; + $scope.crmMailingConst = CRM.crmMailing; + $scope.checkPerm = CRM.checkPerm; + + $scope.isSubmitted = function isSubmitted() { + return _.size(abtest.mailings.a.jobs) > 0 || _.size(abtest.mailings.b.jobs) > 0; + }; + + $scope.sync = function sync() { + abtest.mailings.a.name = ts('Test A (%1)', {1: abtest.ab.name}); + abtest.mailings.b.name = ts('Test B (%1)', {1: abtest.ab.name}); + abtest.mailings.c.name = ts('Final (%1)', {1: abtest.ab.name}); + + if (abtest.ab.testing_criteria) { + // TODO review fields exposed in UI and make sure the sync rules match + switch (abtest.ab.testing_criteria) { + case 'subject': + var exclude_subject = [ + 'name', + 'recipients', + 'subject' + ]; + crmMailingMgr.mergeInto(abtest.mailings.b, abtest.mailings.a, exclude_subject); + crmMailingMgr.mergeInto(abtest.mailings.c, abtest.mailings.a, exclude_subject); + break; + case 'from': + var exclude_from = [ + 'name', + 'recipients', + 'from_name', + 'from_email' + ]; + crmMailingMgr.mergeInto(abtest.mailings.b, abtest.mailings.a, exclude_from); + crmMailingMgr.mergeInto(abtest.mailings.c, abtest.mailings.a, exclude_from); + break; + case 'full_email': + var exclude_full_email = [ + 'name', + 'recipients', + 'subject', + 'from_name', + 'from_email', + 'replyto_email', + 'override_verp', // keep override_verp and replyto_Email linked + 'body_html', + 'body_text' + ]; + crmMailingMgr.mergeInto(abtest.mailings.b, abtest.mailings.a, exclude_full_email); + crmMailingMgr.mergeInto(abtest.mailings.c, abtest.mailings.a, exclude_full_email); + break; + default: + throw "Unrecognized testing_criteria"; + } + } + return true; + }; + + // @return Promise + $scope.save = function save() { + return block(crmStatus({start: ts('Saving...'), success: ts('Saved')}, abtest.save())); + }; + + // @return Promise + $scope.previewMailing = function previewMailing(mailingName, mode) { + return crmMailingPreviewMgr.preview(abtest.mailings[mailingName], mode); + }; + + // @return Promise + $scope.sendTest = function sendTest(mailingName, recipient) { + return block(crmStatus({start: ts('Saving...'), success: ''}, abtest.save()) + .then(function() { + crmMailingPreviewMgr.sendTest(abtest.mailings[mailingName], recipient); + })); + }; + + // @return Promise + $scope.delete = function() { + return block(crmStatus({start: ts('Deleting...'), success: ts('Deleted')}, abtest.delete().then($scope.leave))); + }; + + // @return Promise + $scope.submit = function submit() { + if (block.check() || $scope.crmMailingAB.$invalid) { + return; + } + return block(crmStatus({start: ts('Saving...'), success: ''}, abtest.save()) + .then(function() { + return crmStatus({ + start: ts('Submitting...'), + success: ts('Submitted') + }, myAutosave.suspend(abtest.submitTest())); + // Note: We're going to leave, so we don't care that submit() modifies several server-side records. + // If we stayed on this page, then we'd care about updating and call: abtest.submitTest().then(...abtest.load()...) + }) + ); + }; + + $scope.leave = function leave() { + $location.path('abtest'); + $location.replace(); + }; + + $scope.selectWinner = function selectWinner(mailingName) { + var model = { + abtest: $scope.abtest, + mailingName: mailingName + }; + var options = CRM.utils.adjustDialogDefaults({ + autoOpen: false, + height: 'auto', + width: '40%', + title: ts('Select Final Mailing (Test %1)', { + 1: mailingName.toUpperCase() + }) + }); + return myAutosave.suspend(dialogService.open('selectWinnerDialog', '~/crmMailingAB/WinnerDialogCtrl.html', model, options)); + }; + + // initialize + var syncJob = $interval($scope.sync, 333); + $scope.$on('$destroy', function() { + $interval.cancel(syncJob); + }); + + myAutosave = new CrmAutosaveCtrl({ + save: $scope.save, + saveIf: function() { + return abtest.ab.status == 'Draft' && $scope.sync(); + }, + model: function() { + return abtest.getAutosaveSignature(); + }, + form: function() { + return $scope.crmMailingAB; + } + }); + $timeout(myAutosave.start); + $scope.$on('$destroy', myAutosave.stop); + }); + +})(angular, CRM.$, CRM._); |