From 705c61e96e025082fd1a8a5460ac075607481b70 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Sun, 23 Nov 2014 22:52:39 -0800 Subject: [PATCH] CRM-15578 - crmMailing2 - Implement "Save Draft" and "Delete "Draft" Use promises to chain actions in edit*.html. Compared to the old code, this fits better with async operations and handles errors more gracefully. --- js/Common.js | 10 +++++++ js/angular-crmMailing2-services.js | 35 +++++++++++++++++++++++++ js/angular-crmMailing2.js | 28 ++++++++++++++------ partials/crmMailing2/edit-unified.html | 9 +++---- partials/crmMailing2/edit-unified2.html | 9 +++---- partials/crmMailing2/edit-wizard.html | 9 +++---- partials/crmMailing2/edit.html | 9 +++---- 7 files changed, 77 insertions(+), 32 deletions(-) diff --git a/js/Common.js b/js/Common.js index a1af2f459c..ff597b115b 100644 --- a/js/Common.js +++ b/js/Common.js @@ -732,6 +732,16 @@ CRM.strings = CRM.strings || {}; return jqDeferred.promise(); }; + CRM.toAPromise = function($q, jqPromise) { + var aDeferred = $q.defer(); + jqPromise.then( + function(data) { aDeferred.resolve(data); }, + function(data) { aDeferred.reject(data); } + // should we also handle progress events? + ); + return aDeferred.promise; + }; + /** * @see https://wiki.civicrm.org/confluence/display/CRMDOC/Notification+Reference */ diff --git a/js/angular-crmMailing2-services.js b/js/angular-crmMailing2-services.js index d13ab41dbd..9b97271cfd 100644 --- a/js/angular-crmMailing2-services.js +++ b/js/angular-crmMailing2-services.js @@ -117,6 +117,18 @@ }; }, + // @param mailing Object (per APIv3) + // @return Promise + 'delete': function(mailing) { + if (mailing.id) { + return crmApi('Mailing', 'delete', {id: mailing.id}); + } else { + var d = $q.defer(); + d.resolve(); + return d.promise; + } + }, + // @param mailing Object (per APIv3) // @return Promise an object with "subject", "body_text", "body_html" preview: function preview(mailing) { @@ -153,6 +165,29 @@ }); }, + // @param mailing Object (per APIv3) + // @return Promise + save: function(mailing) { + var params = _.extend({}, mailing); + return crmApi('Mailing', 'create', params).then(function(result){ + if (result.id && !mailing.id) mailing.id = result.id; // no rollback, so update mailing.id + return result.values[result.id]; + }); + }, + + // Schedule/send the mailing + // @param mailing Object (per APIv3) + // @return Promise + submit: function(mailing) { + throw 'Not implemented: crmMailingMgr.submit'; +// var params = _.extend({}, mailing); +// return crmApi('Mailing', 'create', params).then(function(result){ +// if (result.id && !mailing.id) mailing.id = result.id; // no rollback, so update mailing.id +// return result.values[result.id]; +// }); + }, + + // Immediately send a test message // @param mailing Object (per APIv3) // @param testEmail string // @param testGroup int (id#) diff --git a/js/angular-crmMailing2.js b/js/angular-crmMailing2.js index 185a281e00..afc2a42705 100644 --- a/js/angular-crmMailing2.js +++ b/js/angular-crmMailing2.js @@ -55,7 +55,7 @@ }); }); - crmMailing2.controller('EditMailingCtrl', function EditMailingCtrl($scope, selectedMail, $location, crmFromAddresses) { + crmMailing2.controller('EditMailingCtrl', function EditMailingCtrl($scope, selectedMail, $location, crmMailingMgr, crmFromAddresses, $q) { $scope.mailing = selectedMail; $scope.crmMailingConst = CRM.crmMailing; $scope.crmFromAddresses = crmFromAddresses; @@ -63,16 +63,28 @@ $scope.partialUrl = partialUrl; $scope.ts = CRM.ts('CiviMail'); - $scope.send = function() { - CRM.alert('Send!'); + // @return Promise + $scope.submit = function submit() { + // CRM.status doesn't work with Angular promises, so do backflips + var p = crmMailingMgr.submit($scope.mailing); + var p2 = CRM.status(null, CRM.toJqPromise(p)); + return CRM.toAPromise($q, p2); }; - $scope.save = function() { - CRM.alert('Save!'); + // @return Promise + $scope.save = function save() { + // CRM.status doesn't work with Angular promises, so do backflips + var p = crmMailingMgr.save($scope.mailing); + var p2 = CRM.status(null, CRM.toJqPromise(p)); + return CRM.toAPromise($q, p2); }; - $scope.cancel = function() { - CRM.alert('Cancel!'); + // @return Promise + $scope.delete = function cancel() { + // CRM.status doesn't work with Angular promises, so do backflips + var p = crmMailingMgr.delete($scope.mailing); + var p2 = CRM.status({start: $scope.ts('Deleting...'), success: $scope.ts('Deleted')}, CRM.toJqPromise(p)); + return CRM.toAPromise($q, p2); }; - $scope.leave = function() { + $scope.leave = function leave() { window.location = CRM.url('civicrm/mailing/browse/unscheduled', { reset: 1, scheduled: 'false' diff --git a/partials/crmMailing2/edit-unified.html b/partials/crmMailing2/edit-unified.html index 565fbbbe66..c236c168c3 100644 --- a/partials/crmMailing2/edit-unified.html +++ b/partials/crmMailing2/edit-unified.html @@ -36,11 +36,8 @@
- - - + + + \ No newline at end of file diff --git a/partials/crmMailing2/edit-unified2.html b/partials/crmMailing2/edit-unified2.html index a7eba60c4e..ca45e37db1 100644 --- a/partials/crmMailing2/edit-unified2.html +++ b/partials/crmMailing2/edit-unified2.html @@ -32,11 +32,8 @@
- - - + + + \ No newline at end of file diff --git a/partials/crmMailing2/edit-wizard.html b/partials/crmMailing2/edit-wizard.html index 34e5459549..720292e2f4 100644 --- a/partials/crmMailing2/edit-wizard.html +++ b/partials/crmMailing2/edit-wizard.html @@ -45,16 +45,13 @@
- +
- - + +
diff --git a/partials/crmMailing2/edit.html b/partials/crmMailing2/edit.html index 0f7bbfc5b9..1fef91ea48 100644 --- a/partials/crmMailing2/edit.html +++ b/partials/crmMailing2/edit.html @@ -45,16 +45,13 @@
- +
- - + + -- 2.25.1