From c9e9a71e45c718f2e3f83c1aeb1640d5b318c4b4 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Fri, 19 Dec 2014 22:00:39 -0800 Subject: [PATCH] CRM-15578 - crmMailingAB - Submit UI --- js/angular-crmMailingAB.js | 29 ++++++++++++---- js/angular-crmMailingAB/services.js | 51 +++++++++++++++++++++++++---- 2 files changed, 67 insertions(+), 13 deletions(-) diff --git a/js/angular-crmMailingAB.js b/js/angular-crmMailingAB.js index 861bf381fe..c9c5030929 100644 --- a/js/angular-crmMailingAB.js +++ b/js/angular-crmMailingAB.js @@ -48,6 +48,7 @@ $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}); @@ -58,14 +59,27 @@ // TODO review fields exposed in UI and make sure the sync rules match switch (criteria.name) { case 'Subject lines': - crmMailingMgr.mergeInto(abtest.mailings.b, abtest.mailings.a, ['name', 'subject']); + crmMailingMgr.mergeInto(abtest.mailings.b, abtest.mailings.a, [ + 'name', + 'groups', + 'mailings', + 'subject' + ]); break; case 'From names': - crmMailingMgr.mergeInto(abtest.mailings.b, abtest.mailings.a, ['name', 'from_name', 'from_email']); + crmMailingMgr.mergeInto(abtest.mailings.b, abtest.mailings.a, [ + 'name', + 'groups', + 'mailings', + 'from_name', + 'from_email' + ]); break; case 'Two different emails': crmMailingMgr.mergeInto(abtest.mailings.b, abtest.mailings.a, [ 'name', + 'groups', + 'mailings', 'subject', 'from_name', 'from_email', @@ -78,6 +92,7 @@ } } crmMailingMgr.mergeInto(abtest.mailings.c, abtest.mailings.a, ['name']); + return $q.when(true); }; // @return Promise @@ -88,11 +103,13 @@ // @return Promise $scope.previewMailing = function previewMailing(mailingName, mode) { + $scope.sync(); return crmMailingPreviewMgr.preview(abtest.mailings[mailingName], mode); }; // @return Promise $scope.sendTest = function sendTest(mailingName, recipient) { + $scope.sync(); return crmStatus({start: ts('Saving...'), success: ''}, abtest.save().then(updateUrl)) .then(function () { crmMailingPreviewMgr.sendTest(abtest.mailings[mailingName], recipient); @@ -106,12 +123,12 @@ // @return Promise $scope.submit = function submit() { + $scope.sync(); return crmStatus({start: ts('Saving...'), success: ''}, abtest.save()) .then(function () { - return crmStatus({start: ts('Submitting...'), success: ts('Submitted')}, $q.all([ - crmMailingMgr.submit(abtest.mailings.a), - crmMailingMgr.submit(abtest.mailings.b) - ])); + return crmStatus({start: ts('Submitting...'), success: ts('Submitted')}, abtest.submit('Testing')); + // 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.submit().then(abtest.load) }) .then(leave); }; diff --git a/js/angular-crmMailingAB/services.js b/js/angular-crmMailingAB/services.js index becabe19fa..fd656bf346 100644 --- a/js/angular-crmMailingAB/services.js +++ b/js/angular-crmMailingAB/services.js @@ -1,5 +1,23 @@ (function (angular, $, _) { + // FIXME: surely there's already some helper which can do this in one line? + // @return string "YYYY-MM-DD hh:mm:ss" + var createNow = function () { + var currentdate = new Date(); + var yyyy = currentdate.getFullYear(); + var mm = currentdate.getMonth() + 1; + mm = mm < 10 ? '0' + mm : mm; + var dd = currentdate.getDate(); + dd = dd < 10 ? '0' + dd : dd; + var hh = currentdate.getHours(); + hh = hh < 10 ? '0' + hh : hh; + var min = currentdate.getMinutes(); + min = min < 10 ? '0' + min : min; + var sec = currentdate.getSeconds(); + sec = sec < 10 ? '0' + sec : sec; + return yyyy + "-" + mm + "-" + dd + " " + hh + ":" + min + ":" + sec; + }; + angular.module('crmMailingAB').factory('crmMailingABCriteria', function () { // TODO Get data from server var values = { @@ -40,6 +58,7 @@ if (!crmMailingAB.id) { crmMailingAB.ab = { name: 'Example', // FIXME + status: 'Draft', mailing_id_a: null, mailing_id_b: null, mailing_id_c: null, @@ -81,7 +100,6 @@ // @return Promise CrmMailingAB save: function save() { var crmMailingAB = this; - return crmMailingAB._saveMailings() .then(function () { return crmApi('MailingAB', 'create', crmMailingAB.ab) @@ -93,6 +111,22 @@ return crmMailingAB; }); }, + // Schedule the test + // @return Promise CrmMailingAB + // Note: Submission may cause the server state to change. Consider abtest.submit().then(abtest.load) + submit: function submit(newStatus) { + var crmMailingAB = this; + var params = { + id: this.id, + status: newStatus, + approval_date: createNow(), + scheduled_date: this.mailings.a.scheduled_date ? this.mailings.a.scheduled_date : createNow() + }; + return crmApi('MailingAB', 'submit', params) + .then(function () { + return crmMailingAB; + }); + }, // @param mailing Object (per APIv3) // @return Promise 'delete': function () { @@ -137,6 +171,7 @@ _saveMailings: function _saveMailings() { var crmMailingAB = this; var todos = {}; + var p = $q.when(true); _.each(['a', 'b', 'c'], function (mkey) { if (!crmMailingAB.mailings[mkey]) { return; @@ -145,13 +180,15 @@ // paranoia: in case caller forgot to manage id on mailing crmMailingAB.mailings[mkey].id = crmMailingAB.ab['mailing_id_' + mkey]; } - todos[mkey] = crmMailingMgr.save(crmMailingAB.mailings[mkey]) - .then(function () { - crmMailingAB.ab['mailing_id_' + mkey] = crmMailingAB.mailings[mkey].id; - return crmMailingAB.attachments[mkey].save(); - }); + p = p.then(function(){ + return crmMailingMgr.save(crmMailingAB.mailings[mkey]) + .then(function () { + crmMailingAB.ab['mailing_id_' + mkey] = crmMailingAB.mailings[mkey].id; + return crmMailingAB.attachments[mkey].save(); + }); + }); }); - return $q.all(todos).then(function () { + return p.then(function () { return crmMailingAB; }); } -- 2.25.1