public function getAngularModules() {
$result = array();
- $result['crmMailing2'] = array(
+ $result['crmMailing'] = array(
'ext' => 'civicrm',
'js' => array('js/angular-crmMailing2.js', 'js/angular-crmMailing2-services.js', 'js/angular-crmMailing2-directives.js'),
'css' => array('css/angular-crmMailing2.css'),
-.crmMailing2 input[name=subject] {
+.crmMailing input[name=subject] {
width: 30em;
}
-.crmMailing2 select, .crmMailing2 input[type=text] {
+.crmMailing select, .crmMailing input[type=text] {
width: 40em;
}
-.crmMailing2 textarea {
+.crmMailing textarea {
margin: 0.5em;
width: 95%;
height: 20em;
}
-.crmMailing2-recip-est {
+.crmMailing-recip-est {
background: #ee8;
font-size: small;
padding: 0.33em;
text-align: center;
}
-span.crmMailing2-include {
+span.crmMailing-include {
color: #060;
}
-span.crmMailing2-exclude {
+span.crmMailing-exclude {
color: #600;
text-decoration: line-through;
}
-.crmMailing2 input[name=preview_test_email], .crmMailing2-preview select[name=preview_test_group] {
+.crmMailing input[name=preview_test_email], .crmMailing-preview select[name=preview_test_group] {
width: 80%;
}
-.crmMailing2 .preview-popup, .crmMailing2 .preview-contact, .crmMailing2 .preview-group {
+.crmMailing .preview-popup, .crmMailing .preview-contact, .crmMailing .preview-group {
width: 30%;
height: 4.5em;
margin: 0.5em;
vertical-align: middle;
float: left;
}
-.crmMailing2 .preview-popup, .crmMailing2 .preview-contact {
+.crmMailing .preview-popup, .crmMailing .preview-contact {
border-right: 1px solid black;
}
-.crmMailing2 .preview-group, .crmMailing2 .preview-contact {
+.crmMailing .preview-group, .crmMailing .preview-contact {
}
-.crmMailing2 .crmMailing2-schedule-outer {
+.crmMailing .crmMailing-schedule-outer {
width: 98%
}
-.crmMailing2 .crmMailing2-schedule-inner {
+.crmMailing .crmMailing-schedule-inner {
width: 40em;
text-align: left;
margin: auto;
input[name=preview_test_email]:-ms-input-placeholder {
text-align: center;
}
-.crmMailing2-active {
+.crmMailing-active {
}
-.crmMailing2-inactive {
+.crmMailing-inactive {
text-decoration: line-through;
}
-a.crmMailing2-submit-button div {
+a.crmMailing-submit-button div {
color: black;
background: #bfb;
border: 1px solid #8a8;
margin: 1em;
width: 15em;
}
-a.crmMailing2-submit-button div:hover {
+a.crmMailing-submit-button div:hover {
background: #afa;
border: 1px solid #7a7;
}
-a.crmMailing2-submit-button:hover {
+a.crmMailing-submit-button:hover {
text-decoration: none;
}
return CRM.resourceUrls['civicrm'] + '/partials/crmMailing2/' + relPath;
};
- var crmMailing2 = angular.module('crmMailing2');
-
// The following directives have the same simple implementation -- load
// a template and export a "mailing" object into scope.
var simpleBlocks = {
crmMailingBodyText: partialUrl('body_text.html')
};
_.each(simpleBlocks, function(templateUrl, directiveName){
- crmMailing2.directive(directiveName, function ($parse) {
+ angular.module('crmMailing').directive(directiveName, function ($parse) {
return {
scope: {
crmMailing: '@'
// example: <span crm-mailing-from-address="myPlaceholder" crm-mailing="myMailing"><select ng-model="myPlaceholder.label"></select></span>
// NOTE: This really doesn't belong in a directive. I've tried (and failed) to make this work with a getterSetter binding, eg
// <select ng-model="mailing.convertFromAddress" ng-model-options="{getterSetter: true}">
- crmMailing2.directive('crmMailingFromAddress', function ($parse, crmFromAddresses) {
+ angular.module('crmMailing').directive('crmMailingFromAddress', function ($parse, crmFromAddresses) {
return {
link: function (scope, element, attrs) {
var placeholder = attrs.crmMailingFromAddress;
// Represent a datetime field as if it were a radio ('schedule.mode') and a datetime ('schedule.datetime').
// example: <div crm-mailing-radio-date="mySchedule" crm-model="mailing.scheduled_date">...</div>
// FIXME: use ngModel instead of adhoc crmModel
- crmMailing2.directive('crmMailingRadioDate', function ($parse) {
+ angular.module('crmMailing').directive('crmMailingRadioDate', function ($parse) {
return {
link: function ($scope, element, attrs) {
var schedModel = $parse(attrs.crmModel);
};
});
- crmMailing2.directive('crmMailingReviewBool', function () {
+ angular.module('crmMailing').directive('crmMailingReviewBool', function () {
return {
scope: {
crmOn: '@',
link: function (scope, element, attrs) {
function refresh() {
if (scope.$parent.$eval(attrs.crmOn)) {
- scope.spanClasses = {'crmMailing2-active': true};
+ scope.spanClasses = {'crmMailing-active': true};
scope.iconClasses = {'ui-icon-check': true};
}
else {
- scope.spanClasses = {'crmMailing2-inactive': true};
+ scope.spanClasses = {'crmMailing-inactive': true};
scope.iconClasses = {'ui-icon-close': true};
}
scope.crmTitle = scope.$parent.$eval(attrs.crmTitle);
// example: <input name="subject" /> <input crm-mailing-token crm-for="subject"/>
// WISHLIST: Instead of global CRM.crmMailing.mailTokens, accept token list as an input
- crmMailing2.directive('crmMailingToken', function () {
+ angular.module('crmMailing').directive('crmMailingToken', function () {
return {
require: '^crmUiIdScope',
scope: {
// example: <select multiple crm-mailing-recipients crm-mailing="mymailing" crm-avail-groups="myGroups" crm-avail-mailings="myMailings"></select>
// FIXME: participate in ngModel's validation cycle
- crmMailing2.directive('crmMailingRecipients', function () {
+ angular.module('crmMailing').directive('crmMailingRecipients', function () {
return {
restrict: 'AE',
scope: {
}
var option = convertValueToObj(item.id);
var icon = (option.entity_type === 'civicrm_mailing') ? 'EnvelopeIn.gif' : 'group.png';
- var spanClass = (option.mode == 'exclude') ? 'crmMailing2-exclude' : 'crmMailing2-include';
+ var spanClass = (option.mode == 'exclude') ? 'crmMailing-exclude' : 'crmMailing-include';
return "<img src='../../sites/all/modules/civicrm/i/" + icon + "' height=12 width=12 /> <span class='" + spanClass + "'>" + item.text + "</span>";
}
return yyyy + "-" + mm + "-" + dd + " " + hh + ":" + min + ":" + sec;
};
- var crmMailing2 = angular.module('crmMailing2');
-
// The representation of from/reply-to addresses is inconsistent in the mailing data-model,
// so the UI must do some adaptation. The crmFromAddresses provides a richer way to slice/dice
// the available "From:" addrs. Records are like the underlying OptionValues -- but add "email"
// and "author".
- crmMailing2.factory('crmFromAddresses', function ($q, crmApi) {
+ angular.module('crmMailing').factory('crmFromAddresses', function ($q, crmApi) {
var emailRegex = /^"(.*)" \<([^@\>]*@[^@\>]*)\>$/;
var addrs = _.map(CRM.crmMailing.fromAddress, function (addr) {
var match = emailRegex.exec(addr.label);
};
});
- crmMailing2.factory('crmMsgTemplates', function ($q, crmApi) {
+ angular.module('crmMailing').factory('crmMsgTemplates', function ($q, crmApi) {
var tpls = _.map(CRM.crmMailing.mesTemplate, function (tpl) {
return _.extend({}, tpl, {
//id: tpl parseInt(tpl.id)
});
// The crmMailingMgr service provides business logic for loading, saving, previewing, etc
- crmMailing2.factory('crmMailingMgr', function ($q, crmApi, crmFromAddresses) {
+ angular.module('crmMailing').factory('crmMailingMgr', function ($q, crmApi, crmFromAddresses) {
var pickDefaultMailComponent = function pickDefaultMailComponent(type) {
var mcs = _.where(CRM.crmMailing.headerfooterList, {
component_type: type,
return CRM.resourceUrls['civicrm'] + '/partials/crmMailing2/' + relPath;
};
- var crmMailing2 = angular.module('crmMailing2', [
+ angular.module('crmMailing', [
'crmUtil', 'crmAttachment', 'ngRoute', 'ui.utils', 'crmUi', 'dialogService'
]); // TODO ngSanitize, unsavedChanges
var RECIPIENTS_DEBOUNCE_MS = 100;
var RECIPIENTS_PREVIEW_LIMIT = 10000;
- crmMailing2.config([
+ angular.module('crmMailing').config([
'$routeProvider',
function ($routeProvider) {
$routeProvider.when('/mailing2', {
}
]);
- crmMailing2.controller('ListMailingsCtrl', function ListMailingsCtrl() {
+ angular.module('crmMailing').controller('ListMailingsCtrl', function ListMailingsCtrl() {
// We haven't implemented this in Angular, but some users may get clever
// about typing URLs, so we'll provide a redirect.
window.location = CRM.url('civicrm/mailing/browse/unscheduled', {
});
});
- crmMailing2.controller('EditMailingCtrl', function EditMailingCtrl($scope, selectedMail, $location, crmMailingMgr, crmStatus, CrmAttachments) {
+ angular.module('crmMailing').controller('EditMailingCtrl', function EditMailingCtrl($scope, selectedMail, $location, crmMailingMgr, crmStatus, CrmAttachments) {
$scope.mailing = selectedMail;
$scope.attachments = new CrmAttachments(function () {
return {entity_table: 'civicrm_mailing', entity_id: $scope.mailing.id};
// Scope members:
// - [input] mailing: object
// - [output] recipients: array of recipient records
- crmMailing2.controller('EditRecipCtrl', function EditRecipCtrl($scope, dialogService, crmApi, crmMailingMgr) {
+ angular.module('crmMailing').controller('EditRecipCtrl', function EditRecipCtrl($scope, dialogService, crmApi, crmMailingMgr) {
var ts = $scope.ts = CRM.ts('CiviMail');
$scope.recipients = null;
$scope.getRecipientsEstimate = function () {
// Controller for the "Preview Recipients" dialog
// Note: Expects $scope.model to be an object with properties:
// - recipients: array of contacts
- crmMailing2.controller('PreviewRecipCtrl', function ($scope) {
+ angular.module('crmMailing').controller('PreviewRecipCtrl', function ($scope) {
$scope.ts = CRM.ts('CiviMail');
});
// Note: Expects $scope.model to be an object with properties:
// - mailing: object
// - attachments: object
- crmMailing2.controller('PreviewMailingCtrl', function ($scope, dialogService, crmMailingMgr, crmStatus) {
+ angular.module('crmMailing').controller('PreviewMailingCtrl', function ($scope, dialogService, crmMailingMgr, crmStatus) {
var ts = $scope.ts = CRM.ts('CiviMail');
$scope.testContact = {email: CRM.crmMailing.defaultTestEmail};
// - "subject"
// - "body_html"
// - "body_text"
- crmMailing2.controller('PreviewMailingDialogCtrl', function PreviewMailingDialogCtrl($scope, crmMailingMgr) {
+ angular.module('crmMailing').controller('PreviewMailingDialogCtrl', function PreviewMailingDialogCtrl($scope, crmMailingMgr) {
$scope.ts = CRM.ts('CiviMail');
});
// Controller for the "Preview Mailing Component" segment
// which displays header/footer/auto-responder
- crmMailing2.controller('PreviewComponentCtrl', function PreviewMailingDialogCtrl($scope, dialogService) {
+ angular.module('crmMailing').controller('PreviewComponentCtrl', function PreviewMailingDialogCtrl($scope, dialogService) {
var ts = $scope.ts = CRM.ts('CiviMail');
$scope.previewComponent = function previewComponent(title, componentId) {
// - "subject"
// - "body_html"
// - "body_text"
- crmMailing2.controller('PreviewComponentDialogCtrl', function PreviewMailingDialogCtrl($scope) {
+ angular.module('crmMailing').controller('PreviewComponentDialogCtrl', function PreviewMailingDialogCtrl($scope) {
$scope.ts = CRM.ts('CiviMail');
});
// Controller for the in-place msg-template management
- crmMailing2.controller('MsgTemplateCtrl', function MsgTemplateCtrl($scope, crmMsgTemplates, dialogService, $parse) {
+ angular.module('crmMailing').controller('MsgTemplateCtrl', function MsgTemplateCtrl($scope, crmMsgTemplates, dialogService, $parse) {
var ts = $scope.ts = CRM.ts('CiviMail');
$scope.crmMsgTemplates = crmMsgTemplates;
// - "msg_subject": string
// - "msg_text": string
// - "msg_html": string
- crmMailing2.controller('SaveMsgTemplateDialogCtrl', function SaveMsgTemplateDialogCtrl($scope, crmMsgTemplates, dialogService) {
+ angular.module('crmMailing').controller('SaveMsgTemplateDialogCtrl', function SaveMsgTemplateDialogCtrl($scope, crmMsgTemplates, dialogService) {
var ts = $scope.ts = CRM.ts('CiviMail');
$scope.saveOpt = {mode: '', newTitle: ''};
$scope.selected = null;
setTimeout(scopeApply(init), 0);
});
- crmMailing2.controller('EmailAddrCtrl', function EmailAddrCtrl($scope, crmFromAddresses){
+ angular.module('crmMailing').controller('EmailAddrCtrl', function EmailAddrCtrl($scope, crmFromAddresses){
$scope.crmFromAddresses = crmFromAddresses;
});
})(angular, CRM.$, CRM._);
return CRM.resourceUrls['civicrm'] + '/partials/' + module + '/' + relPath;
};
- angular.module('crmMailingAB2', ['ngRoute', 'ui.utils', 'ngSanitize', 'crmUi', 'crmAttachment', 'crmMailing2']);
+ angular.module('crmMailingAB2', ['ngRoute', 'ui.utils', 'ngSanitize', 'crmUi', 'crmAttachment', 'crmMailing']);
angular.module('crmMailingAB2').config([
'$routeProvider',
function ($routeProvider) {
<pre>{{mailing|json}}</pre>
</div>
-<form name="crmMailing2">
- <div class="crm-block crm-form-block crmMailing2">
+<form name="crmMailing">
+ <div class="crm-block crm-form-block crmMailing">
<div crm-mailing-block-summary crm-mailing="mailing"/>
<div crm-mailing-block-mailing crm-mailing="mailing"/>
<pre>{{mailing|json}}</pre>
</div>
-<form name="crmMailing2">
- <div class="crm-block crm-form-block crmMailing2">
+<form name="crmMailing">
+ <div class="crm-block crm-form-block crmMailing">
<div crm-mailing-block-summary crm-mailing="mailing"/>
<div crm-mailing-block-mailing crm-mailing="mailing"/>
<pre>{{mailing|json}}</pre>
</div>
-<form name="crmMailing2">
- <div class="crm-block crm-form-block crmMailing2">
+<form name="crmMailing">
+ <div class="crm-block crm-form-block crmMailing">
<div crm-ui-wizard>
<div crm-mailing-block-review crm-mailing="mailing"/>
</div>
<center>
- <a class="crmMailing2-submit-button" ng-click="submit().then(leave)">
+ <a class="crmMailing-submit-button" ng-click="submit().then(leave)">
<div>{{ts('Submit Mailing')}}</div>
</a>
</center>
<pre>{{mailing|json}}</pre>
</div>
-<form name="crmMailing2" novalidate>
- <div class="crm-block crm-form-block crmMailing2">
+<form name="crmMailing" novalidate>
+ <div class="crm-block crm-form-block crmMailing">
<div crm-ui-wizard>
<div crm-ui-wizard-step crm-title="ts('Define Mailing')">
<div crm-ui-accordion crm-title="ts('Summary')">
<div crm-mailing-block-schedule crm-mailing="mailing"/>
</div>
<center>
- <a class="crmMailing2-submit-button" ng-click="submit().then(leave)">
+ <a class="crmMailing-submit-button" ng-click="submit().then(leave)">
<div>{{ts('Submit Mailing')}}</div>
</a>
</center>
-<div ng-controller="PreviewMailingCtrl" class="crmMailing2-preview">
+<div ng-controller="PreviewMailingCtrl" class="crmMailing-preview">
<!-- Note:
In Firefox (at least), clicking the preview buttons causes the browser to display validation warnings
for unrelated fields *and* display preview. To avoid this weird UX, we disable preview buttons when the form is incomplete/invalid.
<em>({{ts('No content to preview')}})</em>
</div>
<div ng-hide="!mailing.body_html">
- <button ng-disabled="crmMailing2.$invalid" ng-click="previewHtml()">{{ts('Preview as HTML')}}</button>
+ <button ng-disabled="crmMailing.$invalid" ng-click="previewHtml()">{{ts('Preview as HTML')}}</button>
</div>
<div ng-hide="!mailing.body_text">
- <button ng-disabled="crmMailing2.$invalid" ng-click="previewText()">{{ts('Preview as Plain Text')}}</button>
+ <button ng-disabled="crmMailing.$invalid" ng-click="previewText()">{{ts('Preview as Plain Text')}}</button>
</div>
<!--
<div ng-hide="!mailing.body_html && !mailing.body_text">
- <button ng-disabled="crmMailing2.$invalid" ng-click="previewFull()">{{ts('Preview')}}</button>
+ <button ng-disabled="crmMailing.$invalid" ng-click="previewFull()">{{ts('Preview')}}</button>
</div>
-->
</div>
placeholder="example@example.org"
/>
</div>
- <button ng-disabled="crmMailing2.$invalid || !testContact.email" ng-click="sendTestToContact()">{{ts('Send test')}}</button>
+ <button ng-disabled="crmMailing.$invalid || !testContact.email" ng-click="sendTestToContact()">{{ts('Send test')}}</button>
</div>
<div class="preview-group" ng-form>
<div>
<option value=""></option>
</select>
</div>
- <button ng-disabled="crmMailing2.$invalid || !testGroup.gid" ng-click="sendTestToGroup()">{{ts('Send test')}}</button>
+ <button ng-disabled="crmMailing.$invalid || !testGroup.gid" ng-click="sendTestToGroup()">{{ts('Send test')}}</button>
</div>
<div class="clear"></div>
</div>
<div ng-controller="EditRecipCtrl">
<div style="float: right;">
- <div class='crmMailing2-recip-est'>
+ <div class='crmMailing-recip-est'>
<a href="" ng-click="previewRecipients()">{{getRecipientsEstimate()}}</a>
</div>
<div>
-<div class="crmMailing2-schedule-outer" crm-mailing-radio-date="schedule" crm-model="mailing.scheduled_date">
- <div class="crmMailing2-schedule-inner">
+<div class="crmMailing-schedule-outer" crm-mailing-radio-date="schedule" crm-model="mailing.scheduled_date">
+ <div class="crmMailing-schedule-inner">
<div>
<input ng-model="schedule.mode" type="radio" name="send" value="now" id="schedule-send-now"/>
<label for="schedule-send-now">{{ts('Send immediately')}}</label>
-->
<form name="crmMailingAB2" novalidate>
- <div class="crm-block crm-form-block crmMailing2">
+ <div class="crm-block crm-form-block crmMailing">
<div crm-ui-wizard>
<div crm-ui-wizard-step="10" crm-title="ts('Setup')">
<div
}"
crm-abtest="abtest"></div>
<center>
- <a class="crmMailing2-submit-button" ng-click="submit().then(leave)">
+ <a class="crmMailing-submit-button" ng-click="submit().then(leave)">
<div>{{ts('Submit Mailing')}}</div>
</a>
</center>