93 lines
3.5 KiB
JavaScript
93 lines
3.5 KiB
JavaScript
|
(function(angular, $, _) {
|
||
|
|
||
|
// Controller for the edit-recipients fields (
|
||
|
// WISHLIST: Move most of this to a (cache-enabled) service
|
||
|
// Scope members:
|
||
|
// - [input] mailing: object
|
||
|
// - [output] recipients: array of recipient records
|
||
|
angular.module('crmMailing').controller('EditRecipCtrl', function EditRecipCtrl($scope, dialogService, crmApi, crmMailingMgr, $q, crmMetadata, crmStatus) {
|
||
|
// Time to wait before triggering AJAX update to recipients list
|
||
|
var RECIPIENTS_DEBOUNCE_MS = 100;
|
||
|
var RECIPIENTS_PREVIEW_LIMIT = 50;
|
||
|
|
||
|
var ts = $scope.ts = CRM.ts(null);
|
||
|
|
||
|
$scope.isMailingList = function isMailingList(group) {
|
||
|
var GROUP_TYPE_MAILING_LIST = '2';
|
||
|
return _.contains(group.group_type, GROUP_TYPE_MAILING_LIST);
|
||
|
};
|
||
|
|
||
|
$scope.recipients = null;
|
||
|
$scope.getRecipientsEstimate = function() {
|
||
|
var ts = $scope.ts;
|
||
|
if ($scope.recipients === null) {
|
||
|
return ts('(Estimating)');
|
||
|
}
|
||
|
if ($scope.recipients === 0) {
|
||
|
return ts('No recipients');
|
||
|
}
|
||
|
if ($scope.recipients === 1) {
|
||
|
return ts('~1 recipient');
|
||
|
}
|
||
|
return ts('~%1 recipients', {1: $scope.recipients});
|
||
|
};
|
||
|
|
||
|
// We monitor four fields -- use debounce so that changes across the
|
||
|
// four fields can settle-down before AJAX.
|
||
|
var refreshRecipients = _.debounce(function() {
|
||
|
$scope.$apply(function() {
|
||
|
$scope.recipients = null;
|
||
|
if (!$scope.mailing) {
|
||
|
return;
|
||
|
}
|
||
|
crmMailingMgr.previewRecipientCount($scope.mailing).then(function(recipients) {
|
||
|
$scope.recipients = recipients;
|
||
|
});
|
||
|
});
|
||
|
}, RECIPIENTS_DEBOUNCE_MS);
|
||
|
$scope.$watchCollection("mailing.dedupe_email", refreshRecipients);
|
||
|
$scope.$watchCollection("mailing.location_type_id", refreshRecipients);
|
||
|
$scope.$watchCollection("mailing.email_selection_method", refreshRecipients);
|
||
|
$scope.$watchCollection("mailing.recipients.groups.include", refreshRecipients);
|
||
|
$scope.$watchCollection("mailing.recipients.groups.exclude", refreshRecipients);
|
||
|
$scope.$watchCollection("mailing.recipients.mailings.include", refreshRecipients);
|
||
|
$scope.$watchCollection("mailing.recipients.mailings.exclude", refreshRecipients);
|
||
|
|
||
|
$scope.previewRecipients = function previewRecipients() {
|
||
|
return crmStatus({start: ts('Previewing...'), success: ''}, crmMailingMgr.previewRecipients($scope.mailing, RECIPIENTS_PREVIEW_LIMIT).then(function(recipients) {
|
||
|
var model = {
|
||
|
count: $scope.recipients,
|
||
|
sample: recipients,
|
||
|
sampleLimit: RECIPIENTS_PREVIEW_LIMIT
|
||
|
};
|
||
|
var options = CRM.utils.adjustDialogDefaults({
|
||
|
width: '40%',
|
||
|
autoOpen: false,
|
||
|
title: ts('Preview (%1)', {
|
||
|
1: $scope.getRecipientsEstimate()
|
||
|
})
|
||
|
});
|
||
|
dialogService.open('recipDialog', '~/crmMailing/PreviewRecipCtrl.html', model, options);
|
||
|
}));
|
||
|
};
|
||
|
|
||
|
// Open a dialog for editing the advanced recipient options.
|
||
|
$scope.editOptions = function editOptions(mailing) {
|
||
|
var options = CRM.utils.adjustDialogDefaults({
|
||
|
autoOpen: false,
|
||
|
width: '40%',
|
||
|
height: 'auto',
|
||
|
title: ts('Edit Options')
|
||
|
});
|
||
|
$q.when(crmMetadata.getFields('Mailing')).then(function(fields) {
|
||
|
var model = {
|
||
|
fields: fields,
|
||
|
mailing: mailing
|
||
|
};
|
||
|
dialogService.open('previewComponentDialog', '~/crmMailing/EditRecipOptionsDialogCtrl.html', model, options);
|
||
|
});
|
||
|
};
|
||
|
});
|
||
|
|
||
|
})(angular, CRM.$, CRM._);
|