CRM-15578 - Rename crmMailing2 to crmMailing
authorTim Otten <totten@civicrm.org>
Thu, 18 Dec 2014 06:31:34 +0000 (22:31 -0800)
committerTim Otten <totten@civicrm.org>
Thu, 18 Dec 2014 06:31:34 +0000 (22:31 -0800)
14 files changed:
CRM/Mailing/Info.php
css/angular-crmMailing2.css
js/angular-crmMailing2-directives.js
js/angular-crmMailing2-services.js
js/angular-crmMailing2.js
js/angular-crmMailingAB2.js
partials/crmMailing2/edit-unified.html
partials/crmMailing2/edit-unified2.html
partials/crmMailing2/edit-wizard.html
partials/crmMailing2/edit.html
partials/crmMailing2/preview.html
partials/crmMailing2/recipients.html
partials/crmMailing2/schedule.html
partials/crmMailingAB2/edit.html

index c9720d193712cbd2dff45aa0dbcc8f575726a465..1d47a7fefd2e4d93ed027925c9dc3f2c892aa354 100644 (file)
@@ -57,7 +57,7 @@ class CRM_Mailing_Info extends CRM_Core_Component_Info {
 
   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'),
index fa2822b750ce69a1ae5057932a1648af2672cc40..56235253df03321d3e14231a3a9ab29c8eeae716 100644 (file)
@@ -1,16 +1,16 @@
-.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;
@@ -39,16 +39,16 @@ span.crmMailing2-exclude {
   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;
@@ -67,12 +67,12 @@ input[name=preview_test_email]::-webkit-input-placeholder  {
 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;
@@ -80,10 +80,10 @@ a.crmMailing2-submit-button div {
   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;
 }
index 3f47dda6dd4e1e8087b90d9a6d8b965d05fa4df6..5270579c3e3cb7b05978df16429f0cfe4add026e 100644 (file)
@@ -3,8 +3,6 @@
     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 = {
@@ -22,7 +20,7 @@
     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: '@'
@@ -43,7 +41,7 @@
   // 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;
@@ -65,7 +63,7 @@
   // 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>";
         }
 
index b4e75979a640b8bfce35bc2b474c8027f9f5239b..3d602c2a9c067ed375ad5f42a6fd42eb0aefe754 100644 (file)
     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);
@@ -74,7 +72,7 @@
     };
   });
 
-  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,
index 70d4419cc8255e66f16d6f8cef2103fa333b857e..7ef4f0b85e945285e7bc4caad77df3ec5d16faef 100644 (file)
@@ -3,7 +3,7 @@
     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
 
@@ -11,7 +11,7 @@
   var RECIPIENTS_DEBOUNCE_MS = 100;
   var RECIPIENTS_PREVIEW_LIMIT = 10000;
 
-  crmMailing2.config([
+  angular.module('crmMailing').config([
     '$routeProvider',
     function ($routeProvider) {
       $routeProvider.when('/mailing2', {
@@ -57,7 +57,7 @@
     }
   ]);
 
-  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', {
@@ -66,7 +66,7 @@
     });
   });
 
-  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._);
index 687bd240c7f843473dbda5303e14a1d3990bf4c9..b391c222f83ef756b1602ec525b4255c5c6a12c8 100644 (file)
@@ -7,7 +7,7 @@
     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) {
index 3018792931b47f86f6cc0bfc4bf84484560ac1f1..548e6c46cfb19d42030a50ada9e08bee90bbc7cd 100644 (file)
@@ -2,8 +2,8 @@
   <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"/>
index 43c574f71f6ed27d394b7636b58a5856929254d6..4f2905254cd97b0f62a2b1f7449509223194890b 100644 (file)
@@ -2,8 +2,8 @@
   <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"/>
index 17d5bc6c3e1d6eb803d2575f953cd6a764332917..472577ce7239030c40256667337b2f02dc205483 100644 (file)
@@ -2,8 +2,8 @@
   <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>
 
@@ -51,7 +51,7 @@
           <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>
index 3ca24588698263c082b25d750867fa6399f88e37..39db68f60604381288d5503c8b5d00a5cd2303ea 100644 (file)
@@ -2,8 +2,8 @@
   <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')">
@@ -47,7 +47,7 @@
           <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>
index 61e2b59e961fcb5156328bfc1e5fc56cc6781085..65111542f7c755e5988ccda57e867dbe3383d5ba 100644 (file)
@@ -1,4 +1,4 @@
-<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.
@@ -8,14 +8,14 @@
       <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>
@@ -32,7 +32,7 @@
         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>
@@ -49,7 +49,7 @@
         <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>
index 370f3d7aa087dbc35cb7fc3f2793bc6c12192e6d..f8f38847151066eaa3a67d596120ecad714b0a70 100644 (file)
@@ -1,6 +1,6 @@
 <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>
index 92c90398227a0ce23ef03a5105993889f4ce44ed..a68afcd6fd3ea8bddf8087d0357feee81094369e 100644 (file)
@@ -1,5 +1,5 @@
-<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>
index a9c031a3607c5d62f42ed238cf576873143860fc..560a4c9565c2ec2ac4a02a6a488a76db37676047 100644 (file)
@@ -11,7 +11,7 @@
 -->
 
 <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>