From 8dfd5110d5a17453fca9b927c94629429f883347 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Thu, 20 Nov 2014 19:26:38 -0800 Subject: [PATCH] CRM-15578 - crmMailing2 - Extract crmMailingMgr service --- CRM/Mailing/Info.php | 2 +- js/angular-crmMailing2-services.js | 88 ++++++++++++++++++++++++++++++ js/angular-crmMailing2.js | 73 +++---------------------- 3 files changed, 96 insertions(+), 67 deletions(-) create mode 100644 js/angular-crmMailing2-services.js diff --git a/CRM/Mailing/Info.php b/CRM/Mailing/Info.php index 35481af71e..21e6d36dcb 100644 --- a/CRM/Mailing/Info.php +++ b/CRM/Mailing/Info.php @@ -67,7 +67,7 @@ class CRM_Mailing_Info extends CRM_Core_Component_Info { ); $result['crmMailing2'] = array( 'ext' => 'civicrm', - 'js' => array('js/angular-crmMailing2.js', 'js/angular-crmMailing2-directives.js'), + 'js' => array('js/angular-crmMailing2.js', 'js/angular-crmMailing2-services.js', 'js/angular-crmMailing2-directives.js'), 'css' => array('css/angular-crmMailing2.css'), ); $result['crmMailingAB'] = array( diff --git a/js/angular-crmMailing2-services.js b/js/angular-crmMailing2-services.js new file mode 100644 index 0000000000..20f7c93a9c --- /dev/null +++ b/js/angular-crmMailing2-services.js @@ -0,0 +1,88 @@ +(function (angular, $, _) { + var partialUrl = function (relPath) { + return CRM.resourceUrls['civicrm'] + '/partials/crmMailing2/' + relPath; + }; + + var crmMailing2 = angular.module('crmMailing2'); + + crmMailing2.factory('crmMailingMgr', function($q, crmApi) { + var pickDefaultMailComponent = function(type) { + var mcs = _.where(CRM.crmMailing.headerfooterList, { + component_type:type, + is_default: "1" + }); + return (mcs.length >= 1) ? mcs[0].id : null; + }; + + return { + // @param scalar idExpr a number or the literal string 'new' + // @return Promise|Object Mailing (per APIv3) + getOrCreate: function (idExpr) { + return (idExpr == 'new') ? this.create() : this.get(idExpr); + }, + // @return Promise Mailing (per APIv3) + get: function (id) { + return crmApi('Mailing', 'getsingle', {id: id}).then(function(mailing){ + return crmApi('MailingGroup', 'get', {mailing_id: id}).then(function(groupResult){ + mailing.groups = {include: [], exclude: []}; + mailing.mailings = {include: [], exclude: []}; + _.each(groupResult.values, function(mailingGroup) { + var bucket = (mailingGroup.entity_table == 'civicrm_group') ? 'groups' : 'mailings'; + mailing[bucket][mailingGroup.group_type].push(mailingGroup.entity_id); + }); + return mailing; + }); + }); + }, + // @return Object Mailing (per APIv3) + create: function () { + return { + name: "revert this", // fixme + campaign_id: null, + from: _.where(CRM.crmMailing.fromAddress, {is_default: "1"})[0].label, + replyto_email: "", + subject: "For {contact.display_name}", // fixme + dedupe_email: "1", + groups: {include: [2], exclude: [4]}, // fixme + mailings: {include: [], exclude: []}, + body_html: "Hello {contact.display_name}", // fixme + body_text: "Hello {contact.display_name}", // fixme + footer_id: null, // pickDefaultMailComponent('Footer'), + header_id: null, // pickDefaultMailComponent('Header'), + visibility: "Public Pages", + url_tracking: "1", + dedupe_email: "1", + forward_replies: "0", + auto_responder: "0", + open_tracking: "1", + override_verp: "1", + optout_id: pickDefaultMailComponent('OptOut'), + reply_id: pickDefaultMailComponent('Reply'), + resubscribe_id: pickDefaultMailComponent('Resubscribe'), + unsubscribe_id: pickDefaultMailComponent('Unsubscribe') + }; + }, + + // @param mailing Object (per APIv3) + // @param int previewLimit + // @return Promise for a list of recipients (mailing_id, contact_id, api.contact.getvalue, api.email.getvalue) + previewRecipients: function(mailing, previewLimit) { + // To get list of recipients, we tentatively save the mailing and + // get the resulting recipients -- then rollback any changes. + var params = _.extend({}, mailing, { + options: {force_rollback: 1}, + 'api.MailingRecipients.get': { + mailing_id: '$value.id', + options: { limit: previewLimit }, + 'api.contact.getvalue': {'return': 'display_name'}, + 'api.email.getvalue': {'return': 'email'} + } + }); + return crmApi('Mailing', 'create', params).then(function(recipResult){ + return recipResult.values[recipResult.id]['api.MailingRecipients.get'].values; + }); + } + }; + }); + +})(angular, CRM.$, CRM._); diff --git a/js/angular-crmMailing2.js b/js/angular-crmMailing2.js index 542f3b9d01..b671137c9f 100644 --- a/js/angular-crmMailing2.js +++ b/js/angular-crmMailing2.js @@ -9,50 +9,6 @@ var RECIPIENTS_DEBOUNCE_MS = 100; var RECIPIENTS_PREVIEW_LIMIT = 10000; - /** - * Initialize a new mailing - * TODO Move to separate file or service - */ - var createMailing = function () { - var pickDefaultMailComponent = function(type) { - var mcs = _.where(CRM.crmMailing.headerfooterList, { - component_type:type, - is_default: "1" - }); - return (mcs.length >= 1) ? mcs[0].id : null; - }; - - return { - name: "", - campaign_id: null, - from: _.where(CRM.crmMailing.fromAddress, {is_default: "1"})[0].label, - replyto_email: "", - subject: "", - dedupe_email: "1", - groups: {include: [2], exclude: [4]}, // fixme - mailings: {include: [], exclude: []}, - body_html: "", - body_text: "", - footer_id: null, // pickDefaultMailComponent('Footer'), - header_id: null, // pickDefaultMailComponent('Header'), - visibility: "Public Pages", - url_tracking: "1", - dedupe_email: "1", - forward_replies: "0", - auto_responder: "0", - open_tracking: "1", - override_verp: "1", - optout_id: pickDefaultMailComponent('OptOut'), - reply_id: pickDefaultMailComponent('Reply'), - resubscribe_id: pickDefaultMailComponent('Resubscribe'), - unsubscribe_id: pickDefaultMailComponent('Unsubscribe') - }; - }; - - var getMailing = function ($route, crmApi) { - return ($route.current.params.id == 'new') ? createMailing() : crmApi('Mailing', 'getsingle', {id: $route.current.params.id}); - }; - crmMailing2.config(['$routeProvider', function ($routeProvider) { $routeProvider.when('/mailing2', { @@ -63,28 +19,28 @@ templateUrl: partialUrl('edit.html'), controller: 'EditMailingCtrl', resolve: { - selectedMail: getMailing + selectedMail: function($route, crmMailingMgr) { return crmMailingMgr.getOrCreate($route.current.params.id); } } }); $routeProvider.when('/mailing2/:id/unified', { templateUrl: partialUrl('edit-unified.html'), controller: 'EditMailingCtrl', resolve: { - selectedMail: getMailing + selectedMail: function($route, crmMailingMgr) { return crmMailingMgr.getOrCreate($route.current.params.id); } } }); $routeProvider.when('/mailing2/:id/unified2', { templateUrl: partialUrl('edit-unified2.html'), controller: 'EditMailingCtrl', resolve: { - selectedMail: getMailing + selectedMail: function($route, crmMailingMgr) { return crmMailingMgr.getOrCreate($route.current.params.id); } } }); $routeProvider.when('/mailing2/:id/wizard', { templateUrl: partialUrl('edit-wizard.html'), controller: 'EditMailingCtrl', resolve: { - selectedMail: getMailing + selectedMail: function($route, crmMailingMgr) { return crmMailingMgr.getOrCreate($route.current.params.id); } } }); } @@ -128,7 +84,7 @@ // Scope members: // - [input] mailing: object // - [output] recipients: array of recipient records - crmMailing2.controller('EditRecipCtrl', function ($scope, dialogService, crmApi) { + crmMailing2.controller('EditRecipCtrl', function ($scope, dialogService, crmApi, crmMailingMgr) { // TODO load & live update real recipients list $scope.recipients = null; $scope.getRecipientsEstimate = function () { @@ -148,24 +104,9 @@ var refreshRecipients = _.debounce(function () { $scope.$apply(function () { $scope.recipients = null; - // To get list of recipients, we tentatively save the mailing and - // get the resulting recipients -- then rollback any changes. - var params = _.extend({}, $scope.mailing, { - options: {force_rollback: 1}, - 'api.MailingRecipients.get': { - mailing_id: '$value.id', - options: {limit: RECIPIENTS_PREVIEW_LIMIT}, - 'api.contact.getvalue': {'return': 'display_name'}, - 'api.email.getvalue': {'return': 'email'} - } + crmMailingMgr.previewRecipients($scope.mailing, RECIPIENTS_PREVIEW_LIMIT).then(function (recipients) { + $scope.recipients = recipients; }); - - crmApi('Mailing', 'create', params) - .then(function (recipResult) { - $scope.$apply(function () { - $scope.recipients = recipResult.values[recipResult.id]['api.MailingRecipients.get'].values; - }); - }); }); }, RECIPIENTS_DEBOUNCE_MS); $scope.$watchCollection("mailing.groups.include", refreshRecipients); -- 2.25.1