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
*/
};
},
+ // @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#)
});
});
- 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'
<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
<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
<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>
</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>