CRM-15578 - crmMailing2 - Implement "Save Draft" and "Delete "Draft"
authorTim Otten <totten@civicrm.org>
Mon, 24 Nov 2014 06:52:39 +0000 (22:52 -0800)
committerTim Otten <totten@civicrm.org>
Mon, 24 Nov 2014 06:52:39 +0000 (22:52 -0800)
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
js/angular-crmMailing2-services.js
js/angular-crmMailing2.js
partials/crmMailing2/edit-unified.html
partials/crmMailing2/edit-unified2.html
partials/crmMailing2/edit-wizard.html
partials/crmMailing2/edit.html

index a1af2f459c54ca0f4bccef4ba1c5df4267d68b00..ff597b115b5e6f5e644a775d174e2b3f1838f82c 100644 (file)
@@ -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
    */
index d13ab41dbd1b4dd39d9275a3e15a5d5a63f36d97..9b97271cfd2a13f268e27082595e67ce9c467a57 100644 (file)
         };
       },
 
+      // @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) {
         });
       },
 
+      // @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#)
index 185a281e00fe4c18048fb1b83af9555043056b7e..afc2a4270560ddb025ed083fe7e5e92906d4eff0 100644 (file)
@@ -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;
     $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'
index 565fbbbe6674f85d8166bd1dbe7e6be027a89c30..c236c168c32ef11f3a7887f3b48f222a88fc9cd0 100644 (file)
       <div ng-include="partialUrl('preview.html')" />
     </div>
 
-    <button ng-click="send();
-          leave();">{{ts('Submit Mailing')}}</button>
-    <button ng-click="save();
-          leave();">{{ts('Save Draft')}}</button>
-    <button ng-click="cancel();
-          leave();">{{ts('Delete Draft')}}</button>
+    <button ng-click="submit().then(leave)">{{ts('Submit Mailing')}}</button>
+    <button ng-click="save().then(leave)">{{ts('Save Draft')}}</button>
+    <button crm-confirm="{title:ts('Delete Draft?'), message:ts('Are you sure you want to delete the draft mailing?')}" on-yes="delete().then(leave)">{{ts('Delete Draft')}}</button>
   </div>
 </form>
\ No newline at end of file
index a7eba60c4ef64ef4d1936d0984abbf719b13881e..ca45e37db11a509be6e1f6dacb5888304dfec4d0 100644 (file)
       <div ng-include="partialUrl('schedule.html')" />
     </div>
 
-    <button ng-click="send();
-      leave();">{{ts('Submit Mailing')}}</button>
-    <button ng-click="save();
-      leave();">{{ts('Save Draft')}}</button>
-    <button ng-click="cancel();
-      leave();">{{ts('Delete Draft')}}</button>
+    <button ng-click="submit().then(leave)">{{ts('Submit Mailing')}}</button>
+    <button ng-click="save().then(leave);">{{ts('Save Draft')}}</button>
+    <button crm-confirm="{title:ts('Delete Draft?'), message:ts('Are you sure you want to delete the draft mailing?')}" on-yes="delete().then(leave)">{{ts('Delete Draft')}}</button>
   </div>
 </form>
\ No newline at end of file
index 34e545954946038964de655547df3bc632f61f85..720292e2f41b70909fe79a37946e85319e22f7bf 100644 (file)
       <div crm-ui-wizard-step crm-title="ts('Review')">
         <div crm-ui-accordion crm-title="ts('Review')">
           <div ng-include="partialUrl('review.html')" />
-          <button ng-click="send();
-                leave();">{{ts('Submit Mailing')}}</button>
+          <button ng-click="submit().then(leave)">{{ts('Submit Mailing')}}</button>
         </div>
       </div>
 
       <span crm-ui-wizard-buttons style="float:right;">
-        <button ng-click="cancel();
-              leave();">{{ts('Delete Draft')}}</button>
-        <button ng-click="save();
-              leave();">{{ts('Save Draft')}}</button>
+        <button crm-confirm="{title:ts('Delete Draft?'), message:ts('Are you sure you want to delete the draft mailing?')}" on-yes="delete().then(leave)">{{ts('Delete Draft')}}</button>
+        <button ng-click="save().then(leave);">{{ts('Save Draft')}}</button>
       </span>
     </div>
   </div>
index 0f7bbfc5b91edcc430b95c061a47b33f085b9d24..1fef91ea483ffecf97036553a614a476f9244e34 100644 (file)
         </div>
         <div crm-ui-accordion crm-title="ts('Schedule')">
           <div ng-include="partialUrl('schedule.html')" />
-          <button ng-click="send();
-                    leave();">{{ts('Schedule')}}</button>
+          <button ng-click="submit().then(leave)">{{ts('Schedule')}}</button>
         </div>
       </div>
 
       <span crm-ui-wizard-buttons style="float:right;">
-        <button ng-click="cancel();
-                  leave();">{{ts('Delete Draft')}}</button>
-        <button ng-click="save();
-                  leave();">{{ts('Save Draft')}}</button>
+        <button crm-confirm="{title:ts('Delete Draft?'), message:ts('Are you sure you want to delete the draft mailing?')}" on-yes="delete().then(leave)">{{ts('Delete Draft')}}</button>
+        <button ng-click="save().then(leave)">{{ts('Save Draft')}}</button>
       </span>
     </div>
   </div>