(js) Create new message when opening a mailto link

Fixes #3588
pull/207/head
Francis Lachapelle 2016-05-10 21:29:18 -04:00
parent 42bdfbcf7b
commit 68381b31d8
4 changed files with 53 additions and 20 deletions

1
NEWS
View File

@ -51,6 +51,7 @@ Bug fixes
- [web] fixed messages archiving as zip file
- [web] adapted time picker to match changes of md calendar picker
- [web] fixed sender addresses of draft when using multiple IMAP accounts (#3577)
- [web] create a new message when clicking on a "mailto" link (#3588)
- [dav] we now handle the default classifications for tasks (#3541)
- [eas] properly unfold long mail headers (#3152)
- [eas] correctly set EAS message class for S/MIME messages (#3576)

View File

@ -127,7 +127,7 @@
<span>{{ viewer.message.from[0].name }}</span><br/>
<a href="#" class="md-caption"
ng-bind="viewer.message.from[0].email"
ng-click="viewer.newMessage($event, viewer.message.from[0])"><!-- from --></a>
ng-click="viewer.newMessage($event, { to: [viewer.message.from[0].full] })"><!-- from --></a>
</div>
</div>
</div>
@ -143,7 +143,7 @@
<div class="pseudo-input-field" ng-show="viewer.$showDetailedRecipients">
<span ng-repeat="recipient in viewer.message.to">
<a href="#" ng-bind="recipient.full"
ng-click="viewer.newMessage($event, recipient)"><!-- recipient --></a>
ng-click="viewer.newMessage($event, { to: [recipient.full] })"><!-- recipient --></a>
</span>
</div>
</div>
@ -154,7 +154,7 @@
<div class="pseudo-input-field">
<span ng-repeat="recipient in viewer.message.cc">
<a href="#" ng-bind="recipient.full"
ng-click="viewer.newMessage($event, recipient)"><!-- recipient --></a>
ng-click="viewer.newMessage($event, { to: [recipient.full] })"><!-- recipient --></a>
</span>
<md-button style="float: right"
label:aria-label="Hide"
@ -246,8 +246,14 @@
<div class="mailer_mailcontent" layout="row" layout-wrap="layout-wrap"
ng-repeat="part in viewer.message.$content()"
ng-class="part.msgclass">
<div class="md-flex" ng-if="part.html" ng-bind-html="part.content | ensureTarget"><!-- msg --></div>
<div ng-if="part.compile" class="md-flex" sg-compile="part.content" sg-zoomable-image="sg-zoomable-image"><!-- msg --></div>
<div class="md-flex"
ng-if="part.html"
ng-click="viewer.filterMailtoLinks($event)"
ng-bind-html="part.content | ensureTarget"><!-- html msg --></div>
<div class="md-flex"
ng-if="part.compile"
sg-compile="part.content"
sg-zoomable-image="sg-zoomable-image"><!-- angular-friendly msg --></div>
</div>
</div>
</div>

View File

@ -23,6 +23,7 @@
vm.showFlags = stateMessage.flags && stateMessage.flags.length > 0;
vm.$showDetailedRecipients = false;
vm.toggleDetailedRecipients = toggleDetailedRecipients;
vm.filterMailtoLinks = filterMailtoLinks;
vm.doDelete = doDelete;
vm.close = close;
vm.reply = reply;
@ -120,6 +121,37 @@
$event.preventDefault();
}
function filterMailtoLinks($event) {
var href, match, to, cc, bcc, subject, body, data;
if ($event.target.tagName == 'A' && 'href' in $event.target.attributes) {
href = $event.target.attributes.href.value;
match = /^mailto:([^\?]+)/.exec(href);
if (match) {
// Recipients
to = _.map(decodeURIComponent(match[1]).split(','), function(email) {
return '<' + email + '>';
});
data = { to: to };
// Subject & body
_.forEach(['subject', 'body'], function(param) {
var re = new RegExp(param + '=([^&]+)');
param = (param == 'body')? 'text' : param;
match = re.exec(href);
if (match)
data[param] = [decodeURIComponent(match[1])];
});
// Recipients
_.forEach(['cc', 'bcc'], function(param) {
var re = new RegExp(param + '=([^&]+)');
match = re.exec(href);
if (match)
data[param] = [decodeURIComponent(match[1])];
});
newMessage($event, data); // will stop event propagation
}
}
}
function doDelete() {
var mailbox, message, state, nextMessage, previousMessage,
parentCtrls = $parentControllers();
@ -177,11 +209,8 @@
});
}
function showMailEditor($event, message, recipients) {
function showMailEditor($event, message) {
if (messageDialog === null) {
if (!angular.isDefined(recipients))
recipients = [];
messageDialog = $mdDialog
.show({
parent: angular.element(document.body),
@ -194,8 +223,7 @@
locals: {
stateAccounts: vm.accounts,
stateAccount: vm.account,
stateMessage: message,
stateRecipients: recipients
stateMessage: message
}
})
.finally(function() {
@ -261,9 +289,11 @@
$window.close();
}
function newMessage($event, recipient) {
var message = vm.account.$newMessage();
showMailEditor($event, message, [recipient]);
function newMessage($event, editableContent) {
vm.account.$newMessage().then(function(message) {
angular.extend(message.editable, editableContent);
showMailEditor($event, message);
});
$event.stopPropagation();
$event.preventDefault();
}

View File

@ -6,8 +6,8 @@
/**
* @ngInject
*/
MessageEditorController.$inject = ['$window', '$stateParams', '$mdConstant', '$mdDialog', '$mdToast', 'FileUploader', 'stateAccount', 'stateMessage', 'stateRecipients', 'encodeUriFilter', '$timeout', 'Dialog', 'AddressBook', 'Card', 'Preferences'];
function MessageEditorController($window, $stateParams, $mdConstant, $mdDialog, $mdToast, FileUploader, stateAccount, stateMessage, stateRecipients, encodeUriFilter, $timeout, Dialog, AddressBook, Card, Preferences) {
MessageEditorController.$inject = ['$window', '$stateParams', '$mdConstant', '$mdDialog', '$mdToast', 'FileUploader', 'stateAccount', 'stateMessage', 'encodeUriFilter', '$timeout', 'Dialog', 'AddressBook', 'Card', 'Preferences'];
function MessageEditorController($window, $stateParams, $mdConstant, $mdDialog, $mdToast, FileUploader, stateAccount, stateMessage, encodeUriFilter, $timeout, Dialog, AddressBook, Card, Preferences) {
var vm = this, semicolon = 186;
vm.addRecipient = addRecipient;
@ -79,10 +79,6 @@
addAttachments();
}
if (angular.isDefined(stateRecipients)) {
vm.message.editable.to = _.union(vm.message.editable.to, _.map(stateRecipients, 'full'));
}
/**
* If this is a popup window, retrieve the mailbox controller of the parent window.
*/