mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-10-11 23:07:12 +00:00
fix(js): Fix display of body message when 'to' field is not filled in. Closes #5721
This commit is contained in:
1 parent
6338ca19c2
commit
6acb245fec
3 files changed
+223
-215
No files matched your search
@@ -1,2 +1,2 @@
|
|||||||
!function(){"use strict";function c(e){var t=this;"function"!=typeof e.then&&(angular.extend(this,e),_.forEach(this.identities,function(e){var t;e.fullName&&e.email?e.full=e.fullName+" <"+e.email+">":e.email?e.full="<"+e.email+">":e.full="",e.signature&&(t=angular.element("<div>"+e.signature+"</div>"),e.textSignature=_.map(t.contents(),"textContent").join(" ").trim())}),this.$mailboxes)&&c.$Mailbox.$unwrapCollection(this,c.$q.when({mailboxes:this.$mailboxes})).then(function(e){t.$mailboxes=e})}c.$factory=["$q","$timeout","$log","sgSettings","Resource","Preferences","Mailbox","Message",function(e,t,s,n,i,o,a,r){return angular.extend(c,{$q:e,$timeout:t,$log:s,$$resource:new i(n.activeUser("folderURL")+"Mail",n.activeUser()),$Preferences:o,$Mailbox:a,$Message:r}),c}];try{angular.module("SOGo.MailerUI")}catch(e){angular.module("SOGo.MailerUI",["SOGo.Common"])}angular.module("SOGo.MailerUI").factory("Account",c.$factory),c.$findAll=function(e){return e?c.$unwrapCollection(e):c.$accounts?c.$q.when(c.$accounts):c.$$resource.fetch("","mailAccounts").then(function(e){return c.$unwrapCollection(e)})},c.$unwrapCollection=function(e){var s=[];return angular.forEach(e,function(e,t){e.id=t,s[t]=new c(e)}),c.$accounts=s},c.refreshUnseenCount=function(e){var t,s=1===c.$Preferences.defaults.SOGoMailFetchAllUnseenCountFolders,n=c.$Preferences.defaults.SOGoRefreshViewCheck;if(s)t=[];else{if(!e)throw Error("SOGoMailFetchAllUnseenCountFolders is disabled and no folders list provided");t=e}_.forEach(c.$accounts,function(e){s?_.forEach(e.$$flattenMailboxes,function(e){t.push(e.id)}):(_.includes(t,e.id+"/folderINBOX")||t.push(e.id+"/folderINBOX"),_.forEach(e.$$flattenMailboxes,function(e){angular.isDefined(e.unseenCount)&&!_.includes(t,e.id)&&t.push(e.id)}))}),c.$$resource.post("","unseenCount",{mailboxes:t}).then(function(t){_.forEach(c.$accounts,function(e){_.forEach(e.$$flattenMailboxes,function(e){angular.isDefined(t[e.id])&&(e.unseenCount=t[e.id])})})}),n&&"manually"!=n&&(c.$refreshUnseenCount&&c.$timeout.cancel(c.$refreshUnseenCount),c.$refreshUnseenCount=c.$timeout(angular.bind(this,c.refreshUnseenCount,e),1e3*n.timeInterval()))},c.prototype.getLength=function(){return this.$expanded?this.$flattenMailboxes().length:0},c.prototype.getItemAtIndex=function(e){var t=this.$flattenMailboxes();return 0<=e&&e<t.length?t[e]:null},c.prototype.$getMailboxes=function(e){var o=this,t=e&&e.reload;return this.$mailboxes&&!t?c.$q.when(this.$mailboxes):(!t&&this.$futureMailboxesData||(this.$futureMailboxesData=c.$Mailbox.$find(this,e).then(function(e){function s(e){_.forEach(e,function(e){var t=_.find(n,["id",e.id]);t&&(e.unseenCount=t.unseenCount),e.children&&0<e.children.length&&s(e.children)})}var n=o.$flattenMailboxes({all:!0});o.$mailboxes=e,o.$expanded=!1;s(o.$mailboxes);function t(e){_.forEach(e,function(e){e.$expanded=0<=i.indexOf("/"+e.id),e.children&&0<e.children.length&&t(e.children)})}var i;if(c.$Preferences.settings.Mail.ExpandedFolders){if(angular.isString(c.$Preferences.settings.Mail.ExpandedFolders))try{i=angular.fromJson(c.$Preferences.settings.Mail.ExpandedFolders)}catch(e){c.$log.warn("Can't parse list of expanded folders. String was: "+c.$Preferences.settings.Mail.ExpandedFolders),i=[]}else i=c.$Preferences.settings.Mail.ExpandedFolders;o.$expanded=0<=i.indexOf("/"+o.id),0<i.length&&t(o.$mailboxes)}return c.$accounts&&(o.$expanded|=1==c.$accounts.length),o.$flattenMailboxes({reload:!0}),o.$mailboxes})),this.$futureMailboxesData)},c.prototype.$flattenMailboxes=function(t){function s(e){_.forEach(e,function(e){n.push(e),(t&&t.all||e.$expanded)&&e.children&&0<e.children.length&&s(e.children)})}var n=[],i=[];return!this.$$flattenMailboxes||t&&(t.reload||t.all)?(s(this.$mailboxes),t&&t.all||(this.$$flattenMailboxes=n,t&&t.saveState&&(_.forEach(c.$accounts,function(e){e.$expanded&&i.push("/"+e.id),_.reduce(e.$$flattenMailboxes,function(e,t){return t.$expanded&&e.push("/"+t.id),e},i)}),c.$$resource.post(null,"saveFoldersState",i)))):n=this.$$flattenMailboxes,n},c.prototype.$getMailboxByType=function(s){function n(e){var t=_.find(e,function(e){return e.type==s});return t||angular.forEach(e,function(e){!t&&e.children&&0<e.children.length&&(t=n(e.children))}),t}return n(this.$mailboxes)},c.prototype.$getMailboxByPath=function(s){function n(e){var t=_.find(e,function(e){return e.path==s});return t||angular.forEach(e,function(e){!t&&e.children&&0<e.children.length&&(t=n(e.children))}),t}var e;if(null==(e=n(this.$mailboxes)))throw Error("No mailbox found matching path "+s);return e},c.prototype.$newMailbox=function(e,t){var s=this;return c.$$resource.post(e.toString(),"createFolder",{name:t}).then(function(){s.$getMailboxes({reload:!0})})},c.prototype.getTextSignature=function(e){var t;return e.signature?(t=angular.element("<div>"+e.signature+"</div>"),e.textSignature=_.map(t.contents(),"textContent").join(" ").trim()):e.textSignature="",e.textSignature},c.prototype.$hasCertificate=function(){return this.security&&this.security.hasCLine truncated
|
!function(){"use strict";function c(e){var t=this;"function"!=typeof e.then&&(angular.extend(this,e),_.forEach(this.identities,function(e){var t;e.fullName&&e.email?e.full=e.fullName+" <"+e.email+">":e.email?e.full="<"+e.email+">":e.full="",e.signature&&(t=angular.element("<div>"+e.signature+"</div>"),e.textSignature=_.map(t.contents(),"textContent").join(" ").trim())}),this.$mailboxes)&&c.$Mailbox.$unwrapCollection(this,c.$q.when({mailboxes:this.$mailboxes})).then(function(e){t.$mailboxes=e})}c.$factory=["$q","$timeout","$log","sgSettings","Resource","Preferences","Mailbox","Message",function(e,t,s,n,i,o,a,r){return angular.extend(c,{$q:e,$timeout:t,$log:s,$$resource:new i(n.activeUser("folderURL")+"Mail",n.activeUser()),$Preferences:o,$Mailbox:a,$Message:r}),c}];try{angular.module("SOGo.MailerUI")}catch(e){angular.module("SOGo.MailerUI",["SOGo.Common"])}angular.module("SOGo.MailerUI").factory("Account",c.$factory),c.$findAll=function(e){return e?c.$unwrapCollection(e):c.$accounts?c.$q.when(c.$accounts):c.$$resource.fetch("","mailAccounts").then(function(e){return c.$unwrapCollection(e)})},c.$unwrapCollection=function(e){var s=[];return angular.forEach(e,function(e,t){e.id=t,s[t]=new c(e)}),c.$accounts=s},c.refreshUnseenCount=function(e){var t,s=1===c.$Preferences.defaults.SOGoMailFetchAllUnseenCountFolders,n=c.$Preferences.defaults.SOGoRefreshViewCheck;if(s)t=[];else{if(!e)throw Error("SOGoMailFetchAllUnseenCountFolders is disabled and no folders list provided");t=e}_.forEach(c.$accounts,function(e){s?_.forEach(e.$$flattenMailboxes,function(e){t.push(e.id)}):(_.includes(t,e.id+"/folderINBOX")||t.push(e.id+"/folderINBOX"),_.forEach(e.$$flattenMailboxes,function(e){angular.isDefined(e.unseenCount)&&!_.includes(t,e.id)&&t.push(e.id)}))}),c.$$resource.post("","unseenCount",{mailboxes:t}).then(function(t){_.forEach(c.$accounts,function(e){_.forEach(e.$$flattenMailboxes,function(e){angular.isDefined(t[e.id])&&(e.unseenCount=t[e.id])})})}),n&&"manually"!=n&&(c.$refreshUnseenCount&&c.$timeout.cancel(c.$refreshUnseenCount),c.$refreshUnseenCount=c.$timeout(angular.bind(this,c.refreshUnseenCount,e),1e3*n.timeInterval()))},c.prototype.getLength=function(){return this.$expanded?this.$flattenMailboxes().length:0},c.prototype.getItemAtIndex=function(e){var t=this.$flattenMailboxes();return 0<=e&&e<t.length?t[e]:null},c.prototype.$getMailboxes=function(e){var o=this,t=e&&e.reload;return this.$mailboxes&&!t?c.$q.when(this.$mailboxes):(!t&&this.$futureMailboxesData||(this.$futureMailboxesData=c.$Mailbox.$find(this,e).then(function(e){function s(e){_.forEach(e,function(e){var t=_.find(n,["id",e.id]);t&&(e.unseenCount=t.unseenCount),e.children&&0<e.children.length&&s(e.children)})}var n=o.$flattenMailboxes({all:!0});o.$mailboxes=e,o.$expanded=!1;s(o.$mailboxes);function t(e){_.forEach(e,function(e){e.$expanded=0<=i.indexOf("/"+e.id),e.children&&0<e.children.length&&t(e.children)})}var i;if(c.$Preferences.settings.Mail.ExpandedFolders){if(angular.isString(c.$Preferences.settings.Mail.ExpandedFolders))try{i=angular.fromJson(c.$Preferences.settings.Mail.ExpandedFolders)}catch(e){c.$log.warn("Can't parse list of expanded folders. String was: "+c.$Preferences.settings.Mail.ExpandedFolders),i=[]}else i=c.$Preferences.settings.Mail.ExpandedFolders;o.$expanded=0<=i.indexOf("/"+o.id),0<i.length&&t(o.$mailboxes)}return c.$accounts&&(o.$expanded|=1==c.$accounts.length),o.$flattenMailboxes({reload:!0}),o.$mailboxes})),this.$futureMailboxesData)},c.prototype.$flattenMailboxes=function(t){function s(e){_.forEach(e,function(e){n.push(e),(t&&t.all||e.$expanded)&&e.children&&0<e.children.length&&s(e.children)})}var n=[],i=[];return!this.$$flattenMailboxes||t&&(t.reload||t.all)?(s(this.$mailboxes),t&&t.all||(this.$$flattenMailboxes=n,t&&t.saveState&&(_.forEach(c.$accounts,function(e){e.$expanded&&i.push("/"+e.id),_.reduce(e.$$flattenMailboxes,function(e,t){return t.$expanded&&e.push("/"+t.id),e},i)}),c.$$resource.post(null,"saveFoldersState",i)))):n=this.$$flattenMailboxes,n},c.prototype.$getMailboxByType=function(s){function n(e){var t=_.find(e,function(e){return e.type==s});return t||angular.forEach(e,function(e){!t&&e.children&&0<e.children.length&&(t=n(e.children))}),t}return n(this.$mailboxes)},c.prototype.$getMailboxByPath=function(s){function n(e){var t=_.find(e,function(e){return e.path==s});return t||angular.forEach(e,function(e){!t&&e.children&&0<e.children.length&&(t=n(e.children))}),t}var e;if(null==(e=n(this.$mailboxes)))throw Error("No mailbox found matching path "+s);return e},c.prototype.$newMailbox=function(e,t){var s=this;return c.$$resource.post(e.toString(),"createFolder",{name:t}).then(function(){s.$getMailboxes({reload:!0})})},c.prototype.getTextSignature=function(e){var t;return e.signature?(t=angular.element("<div>"+e.signature+"</div>"),e.textSignature=_.map(t.contents(),"textContent").join(" ").trim()):e.textSignature="",e.textSignature},c.prototype.$hasCertificate=function(){return this.security&&this.security.hasCLine truncated
|
||||||
//# sourceMappingURL=Mailer.services.js.map
|
//# sourceMappingURL=Mailer.services.js.map
|
||||||
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"Mailer.services.js","sources":["Mailer/Account.service.js","Mailer/Mailbox.service.js","Mailer/Message.service.js","Mailer/sgImageGallery.service.js","Mailer/VirtualMailbox.service.js","Mailer/MailboxController.js","Mailer/MailboxesController.js","Mailer/MessageController.js","Mailer/MessageEditorController.js","Mailer/sgAccountSection.directive.js","Mailer/sgIMIP.directive.js","Mailer/sgMailboxListItem.directive.js","Mailer/sgMessageListItem.directive.js","Mailer/sgMessageListItemMain.directive.js","Mailer/sgZoomableImage.directive.js"],"names":["Account","futureAccountData","_this","this","then","angular","extend","_","forEach","identities","identity","element","fullName","email","full","signature","textSignature","map","contents","join","trim","$mailboxes","$Mailbox","$unwrapCollection","$q","when","mailboxes","collection","$factory","$timeout","$log","Settings","Resource","Preferences","Mailbox","Message","$$resource","activeUser","$Preferences","$Message","module","e","factory","$findAll","data","$accounts","fetch","o","i","id","refreshUnseenCount","folders","unseenCountFolders","fetchAllUnseenCountFolders","defaults","SOGoMailFetchAllUnseenCountFolders","refreshViewCheck","SOGoRefreshViewCheck","Error","account","$$flattenMailboxes","mailbox","push","includes","isDefined","unseenCount","post","$refreshUnseenCount","cancel","bind","timeInterval","prototype","getLength","$expanded","$flattenMailboxes","length","getItemAtIndex","index","expandedMailboxes","$getMailboxes","options","reload","$futureMailboxesData","$find","_visitForUnseencount","previousMailbox","find","previousMailboxes","children","all","_visitForExpanded","expandedFolders","indexOf","settings","Mail","ExpandedFolders","isString","fromJson","warn","_visit","allMailboxes","saveState","reduce","$getMailboxByType","type","_find","$getMailboxByPath","path","$newMailbox","name","toString","getTextSignature","$hasCertificate","security","hasCertificate","$certificate","$$certificate","reject","$removeCertificate","updateQuota","percent","description","maxQuota","Math","round","usedSpace","l","formatted","maxMessages","messagesCount","$quota","$newMessage","debug","JSON","stringify","undefined","accountId","mailboxPath","message","$absolutePath","asDraft","accountDefaults","AuxiliaryMailAccounts","alwaysSign","sign","alwaysEncrypt","encrypt","editable","isNew","mailto","isObject","$parseMailto","$addDelegate","user","deferred","defer","param","uid","delegates","resolve","users","status","promise","$removeDelegate","splice","$omit","deep","defaultIdentity","value","key","copy","isReadOnly","pick","isDefault","forceDefaultIdentity","futureMailboxData","$account","init","newMailboxData","create","$unwrap","Acl","PRELOAD","BATCH_DELETE_LIMIT","$$Acl","$query","sort","asc","selectedFolder","$refreshTimeout","$virtualMode","$virtualPath","SortingState","parseInt","constant","LOOKAHEAD","SIZE","createMailboxes","level","isSentFolder","isDraftsFolder","quotas","split","component","asCSSIdentifier","isUndefined","uidsMap","headers","$isLoading","$messages","$visibleMessages","$selectedMessages","$id","$acl","threaded","$collapsedThreads","threadsCollapsed","$displayName","$isEditable","isEditable","$isSpecial","$icon","$isNoInferiors","isNoInferiors","$shadowData","selectFolder","$lastVisibleIndex","max","$loadMessage","selectedMessages","updateCache","filter","selected","selectedCount","$unselectMessages","isSelectedMessage","messageId","$selectedMessage","selectedMessage","$selectedMessageIndex","hasSelectedMessage","$filter","sortingAttributes","filters","action","labels","searchInput","match","searchBy","secondFilter","$flaggedOnly","$unseenOnly","$syncToken","syncToken","unseenOnly","flaggedOnly","keys","$filteredLabels","k","f","endIndex","uids","startIndex","loaded","subject","min","loading","futureHeadersData","$unwrapHeaders","flags","isNoSelect","isWritable","getClassName","base","$rename","findParent","parent","parentMailbox","$save","_updateChildren","child","replace","pathRE","oldPath","sibling","localeCompare","RegExp","$compact","$canFolderAs","$setFolderAs","$empty","capitalize","substring","$markAsRead","isread","getLabels","$labels","filteredByLabel","$flagMessages","messages","operation","msgUIDs","forwardMessages","saveSelectedMessages","selectedUIDs","download","exportFolder","filename","open","$delete","$_deleteMessages","firstIndex","forEachRight","selectedIndex","findIndex","updateVisibleMessages","$deleteMessages","batchSize","_deleteMessages","start","end","currentUids","slice","$markOrUnMarkMessagesAsJunk","method","$copyMessages","folder","$moveMessages","$move","parentPath","finally","save","response","error","$reset","childrenArray","collapsedThread","msg","first","collapsed","$futureMailboxData","headersFields","msgObject","hasNewMessages","$topIndex","deleted","j","changed","msgs","zipObject","count","isNaN","threadMember","invokeMap","isError","messageHeaders","$updateSubscribe","subscribed","futureLine truncated
|
{"version":3,"file":"Mailer.services.js","sources":["Mailer/Account.service.js","Mailer/Mailbox.service.js","Mailer/Message.service.js","Mailer/sgImageGallery.service.js","Mailer/VirtualMailbox.service.js","Mailer/MailboxController.js","Mailer/MailboxesController.js","Mailer/MessageController.js","Mailer/MessageEditorController.js","Mailer/sgAccountSection.directive.js","Mailer/sgIMIP.directive.js","Mailer/sgMailboxListItem.directive.js","Mailer/sgMessageListItem.directive.js","Mailer/sgMessageListItemMain.directive.js","Mailer/sgZoomableImage.directive.js"],"names":["Account","futureAccountData","_this","this","then","angular","extend","_","forEach","identities","identity","element","fullName","email","full","signature","textSignature","map","contents","join","trim","$mailboxes","$Mailbox","$unwrapCollection","$q","when","mailboxes","collection","$factory","$timeout","$log","Settings","Resource","Preferences","Mailbox","Message","$$resource","activeUser","$Preferences","$Message","module","e","factory","$findAll","data","$accounts","fetch","o","i","id","refreshUnseenCount","folders","unseenCountFolders","fetchAllUnseenCountFolders","defaults","SOGoMailFetchAllUnseenCountFolders","refreshViewCheck","SOGoRefreshViewCheck","Error","account","$$flattenMailboxes","mailbox","push","includes","isDefined","unseenCount","post","$refreshUnseenCount","cancel","bind","timeInterval","prototype","getLength","$expanded","$flattenMailboxes","length","getItemAtIndex","index","expandedMailboxes","$getMailboxes","options","reload","$futureMailboxesData","$find","_visitForUnseencount","previousMailbox","find","previousMailboxes","children","all","_visitForExpanded","expandedFolders","indexOf","settings","Mail","ExpandedFolders","isString","fromJson","warn","_visit","allMailboxes","saveState","reduce","$getMailboxByType","type","_find","$getMailboxByPath","path","$newMailbox","name","toString","getTextSignature","$hasCertificate","security","hasCertificate","$certificate","$$certificate","reject","$removeCertificate","updateQuota","percent","description","maxQuota","Math","round","usedSpace","l","formatted","maxMessages","messagesCount","$quota","$newMessage","debug","JSON","stringify","undefined","accountId","mailboxPath","message","$absolutePath","asDraft","accountDefaults","AuxiliaryMailAccounts","alwaysSign","sign","alwaysEncrypt","encrypt","editable","isNew","mailto","isObject","$parseMailto","$addDelegate","user","deferred","defer","param","uid","delegates","resolve","users","status","promise","$removeDelegate","splice","$omit","deep","defaultIdentity","value","key","copy","isReadOnly","pick","isDefault","forceDefaultIdentity","futureMailboxData","$account","init","newMailboxData","create","$unwrap","Acl","PRELOAD","BATCH_DELETE_LIMIT","$$Acl","$query","sort","asc","selectedFolder","$refreshTimeout","$virtualMode","$virtualPath","SortingState","parseInt","constant","LOOKAHEAD","SIZE","createMailboxes","level","isSentFolder","isDraftsFolder","quotas","split","component","asCSSIdentifier","isUndefined","uidsMap","headers","$isLoading","$messages","$visibleMessages","$selectedMessages","$id","$acl","threaded","$collapsedThreads","threadsCollapsed","$displayName","$isEditable","isEditable","$isSpecial","$icon","$isNoInferiors","isNoInferiors","$shadowData","selectFolder","$lastVisibleIndex","max","$loadMessage","selectedMessages","updateCache","filter","selected","selectedCount","$unselectMessages","isSelectedMessage","messageId","$selectedMessage","selectedMessage","$selectedMessageIndex","hasSelectedMessage","$filter","sortingAttributes","filters","action","labels","searchInput","match","searchBy","secondFilter","$flaggedOnly","$unseenOnly","$syncToken","syncToken","unseenOnly","flaggedOnly","keys","$filteredLabels","k","f","endIndex","uids","startIndex","loaded","subject","min","loading","futureHeadersData","$unwrapHeaders","flags","isNoSelect","isWritable","getClassName","base","$rename","findParent","parent","parentMailbox","$save","_updateChildren","child","replace","pathRE","oldPath","sibling","localeCompare","RegExp","$compact","$canFolderAs","$setFolderAs","$empty","capitalize","substring","$markAsRead","isread","getLabels","$labels","filteredByLabel","$flagMessages","messages","operation","msgUIDs","forwardMessages","saveSelectedMessages","selectedUIDs","download","exportFolder","filename","open","$delete","$_deleteMessages","firstIndex","forEachRight","selectedIndex","findIndex","updateVisibleMessages","$deleteMessages","batchSize","_deleteMessages","start","end","currentUids","slice","$markOrUnMarkMessagesAsJunk","method","$copyMessages","folder","$moveMessages","$move","parentPath","finally","save","response","error","$reset","childrenArray","collapsedThread","msg","first","collapsed","$futureMailboxData","headersFields","msgObject","hasNewMessages","$topIndex","deleted","j","changed","msgs","zipObject","count","isNaN","threadMember","invokeMap","isError","messageHeaders","$updateSubscribe","subscribed","futureLine truncated
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
|
||||||
(function() {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
this.$mailbox = mailbox;
|
this.$mailbox = mailbox;
|
||||||
this.$hasUnsafeContent = false;
|
this.$hasUnsafeContent = false;
|
||||||
this.$loadUnsafeContent = false;
|
this.$loadUnsafeContent = false;
|
||||||
this.editable = {to: [], cc: [], bcc: []};
|
this.editable = { to: [], cc: [], bcc: [] };
|
||||||
this.selected = false;
|
this.selected = false;
|
||||||
|
|
||||||
// Data is immediately available
|
// Data is immediately available
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
* @desc The factory we'll use to register with Angular
|
* @desc The factory we'll use to register with Angular
|
||||||
* @returns the Message constructor
|
* @returns the Message constructor
|
||||||
*/
|
*/
|
||||||
Message.$factory = ['$q', '$timeout', '$log', 'sgSettings', 'sgMessage_STATUS', 'Resource', 'Preferences', function($q, $timeout, $log, Settings, Message_STATUS, Resource, Preferences) {
|
Message.$factory = ['$q', '$timeout', '$log', 'sgSettings', 'sgMessage_STATUS', 'Resource', 'Preferences', function ($q, $timeout, $log, Settings, Message_STATUS, Resource, Preferences) {
|
||||||
angular.extend(Message, {
|
angular.extend(Message, {
|
||||||
STATUS: Message_STATUS,
|
STATUS: Message_STATUS,
|
||||||
$q: $q,
|
$q: $q,
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
Message.$tags = {};
|
Message.$tags = {};
|
||||||
}
|
}
|
||||||
if (Preferences.defaults.SOGoMailDisplayRemoteInlineImages &&
|
if (Preferences.defaults.SOGoMailDisplayRemoteInlineImages &&
|
||||||
Preferences.defaults.SOGoMailDisplayRemoteInlineImages == 'always') {
|
Preferences.defaults.SOGoMailDisplayRemoteInlineImages == 'always') {
|
||||||
Message.$displayRemoteInlineImages = true;
|
Message.$displayRemoteInlineImages = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,16 +81,16 @@
|
|||||||
try {
|
try {
|
||||||
angular.module('SOGo.MailerUI');
|
angular.module('SOGo.MailerUI');
|
||||||
}
|
}
|
||||||
catch(e) {
|
catch (e) {
|
||||||
angular.module('SOGo.MailerUI', ['SOGo.Common']);
|
angular.module('SOGo.MailerUI', ['SOGo.Common']);
|
||||||
}
|
}
|
||||||
angular.module('SOGo.MailerUI')
|
angular.module('SOGo.MailerUI')
|
||||||
.constant('sgMessage_STATUS', {
|
.constant('sgMessage_STATUS', {
|
||||||
NOT_LOADED: 0,
|
NOT_LOADED: 0,
|
||||||
DELAYED_LOADING: 1,
|
DELAYED_LOADING: 1,
|
||||||
LOADING: 2,
|
LOADING: 2,
|
||||||
LOADED: 3,
|
LOADED: 3,
|
||||||
DELAYED_MS: 300
|
DELAYED_MS: 300
|
||||||
})
|
})
|
||||||
.factory('Message', Message.$factory);
|
.factory('Message', Message.$factory);
|
||||||
|
|
||||||
@@ -101,11 +101,11 @@
|
|||||||
* @param {string} search - the search string to match
|
* @param {string} search - the search string to match
|
||||||
* @returns a collection of strings
|
* @returns a collection of strings
|
||||||
*/
|
*/
|
||||||
Message.filterTags = function(query, excludedTags) {
|
Message.filterTags = function (query, excludedTags) {
|
||||||
var re = new RegExp(query, 'i'),
|
var re = new RegExp(query, 'i'),
|
||||||
results = [];
|
results = [];
|
||||||
|
|
||||||
_.forEach(_.keys(Message.$tags), function(tag) {
|
_.forEach(_.keys(Message.$tags), function (tag) {
|
||||||
var pair = Message.$tags[tag];
|
var pair = Message.$tags[tag];
|
||||||
if (pair[0].search(re) != -1) {
|
if (pair[0].search(re) != -1) {
|
||||||
if (!_.includes(excludedTags, tag))
|
if (!_.includes(excludedTags, tag))
|
||||||
@@ -122,14 +122,14 @@
|
|||||||
* @desc Extend instance with new data and massage some attributes.
|
* @desc Extend instance with new data and massage some attributes.
|
||||||
* @param {object} data - attributes of message
|
* @param {object} data - attributes of message
|
||||||
*/
|
*/
|
||||||
Message.prototype.init = function(data) {
|
Message.prototype.init = function (data) {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
angular.extend(this, data);
|
angular.extend(this, data);
|
||||||
this.$formatFullAddresses();
|
this.$formatFullAddresses();
|
||||||
this.$loadUnsafeContent = false;
|
this.$loadUnsafeContent = false;
|
||||||
_.forEach(this.flags, function(flag, i) {
|
_.forEach(this.flags, function (flag, i) {
|
||||||
if (flag.charAt(0) == '$') {
|
if (flag.charAt(0) == '$') {
|
||||||
_this.flags.splice(i, 1,'_' + flag);
|
_this.flags.splice(i, 1, '_' + flag);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// isread will be undefined when composing a new message -- assume unseen flag is not set.
|
// isread will be undefined when composing a new message -- assume unseen flag is not set.
|
||||||
@@ -142,12 +142,12 @@
|
|||||||
* @desc Build the path of the message
|
* @desc Build the path of the message
|
||||||
* @returns a string representing the path relative to the mail module
|
* @returns a string representing the path relative to the mail module
|
||||||
*/
|
*/
|
||||||
Message.prototype.$absolutePath = function(options) {
|
Message.prototype.$absolutePath = function (options) {
|
||||||
var _this = this, id = this.id;
|
var _this = this, id = this.id;
|
||||||
|
|
||||||
function buildPath() {
|
function buildPath() {
|
||||||
var path;
|
var path;
|
||||||
path = _.map(_this.$mailbox.path.split('/'), function(component) {
|
path = _.map(_this.$mailbox.path.split('/'), function (component) {
|
||||||
return 'folder' + component.asCSSIdentifier();
|
return 'folder' + component.asCSSIdentifier();
|
||||||
});
|
});
|
||||||
path.splice(0, 0, _this.accountId); // insert account ID
|
path.splice(0, 0, _this.accountId); // insert account ID
|
||||||
@@ -174,12 +174,12 @@
|
|||||||
* @desc Change the UID of the message. This happens when saving a draft.
|
* @desc Change the UID of the message. This happens when saving a draft.
|
||||||
* @param {number} uid - the new message UID
|
* @param {number} uid - the new message UID
|
||||||
*/
|
*/
|
||||||
Message.prototype.$setUID = function(uid) {
|
Message.prototype.$setUID = function (uid) {
|
||||||
var oldUID = (this.uid || -1), _this = this, index;
|
var oldUID = (this.uid || -1), _this = this, index;
|
||||||
|
|
||||||
if (oldUID != parseInt(uid)) {
|
if (oldUID != parseInt(uid)) {
|
||||||
this.uid = parseInt(uid);
|
this.uid = parseInt(uid);
|
||||||
this.$absolutePath({nocache: true});
|
this.$absolutePath({ nocache: true });
|
||||||
if (oldUID > -1) {
|
if (oldUID > -1) {
|
||||||
oldUID = oldUID.toString();
|
oldUID = oldUID.toString();
|
||||||
if (angular.isDefined(this.$mailbox.uidsMap[oldUID])) {
|
if (angular.isDefined(this.$mailbox.uidsMap[oldUID])) {
|
||||||
@@ -189,7 +189,7 @@
|
|||||||
this.$mailbox.$messages[index].uid = this.uid;
|
this.$mailbox.$messages[index].uid = this.uid;
|
||||||
|
|
||||||
// Update messages list of mailbox
|
// Update messages list of mailbox
|
||||||
_.forEach(['from', 'to', 'subject'], function(attr) {
|
_.forEach(['from', 'to', 'subject'], function (attr) {
|
||||||
_this.$mailbox.$messages[index][attr] = _this.editable[attr];
|
_this.$mailbox.$messages[index][attr] = _this.editable[attr];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -197,7 +197,7 @@
|
|||||||
else {
|
else {
|
||||||
// Refresh selected folder if it's the drafts mailbox
|
// Refresh selected folder if it's the drafts mailbox
|
||||||
if (this.$mailbox.constructor.selectedFolder &&
|
if (this.$mailbox.constructor.selectedFolder &&
|
||||||
this.$mailbox.constructor.selectedFolder.type == 'draft') {
|
this.$mailbox.constructor.selectedFolder.type == 'draft') {
|
||||||
this.$mailbox.constructor.selectedFolder.$filter();
|
this.$mailbox.constructor.selectedFolder.$filter();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -210,13 +210,13 @@
|
|||||||
* @desc Format all sender and recipients addresses with a complete description (name <email>).
|
* @desc Format all sender and recipients addresses with a complete description (name <email>).
|
||||||
* This function also generates the avatar URL for each email address and a short name
|
* This function also generates the avatar URL for each email address and a short name
|
||||||
*/
|
*/
|
||||||
Message.prototype.$formatFullAddresses = function() {
|
Message.prototype.$formatFullAddresses = function () {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
var identities = _.map(_this.$mailbox.$account.identities, 'email');
|
var identities = _.map(_this.$mailbox.$account.identities, 'email');
|
||||||
|
|
||||||
// Build long representation of email addresses
|
// Build long representation of email addresses
|
||||||
_.forEach(['from', 'to', 'cc', 'bcc', 'reply-to'], function(type) {
|
_.forEach(['from', 'to', 'cc', 'bcc', 'reply-to'], function (type) {
|
||||||
_.forEach(_this[type], function(data) {
|
_.forEach(_this[type], function (data) {
|
||||||
if (data.name && data.name != data.email) {
|
if (data.name && data.name != data.email) {
|
||||||
data.full = data.name + ' <' + data.email + '>';
|
data.full = data.name + ' <' + data.email + '>';
|
||||||
|
|
||||||
@@ -225,7 +225,7 @@
|
|||||||
data.shortname = data.name;
|
data.shortname = data.name;
|
||||||
else if (data.name.split(' ').length)
|
else if (data.name.split(' ').length)
|
||||||
// If we have "Alice Foo" or "Foo, Alice" as name, we grab "Alice"
|
// If we have "Alice Foo" or "Foo, Alice" as name, we grab "Alice"
|
||||||
data.shortname = _.first(_.last(data.name.split(/, */)).split(/ +/)).replace('\'','');
|
data.shortname = _.first(_.last(data.name.split(/, */)).split(/ +/)).replace('\'', '');
|
||||||
}
|
}
|
||||||
else if (data.email) {
|
else if (data.email) {
|
||||||
data.full = '<' + data.email + '>';
|
data.full = '<' + data.email + '>';
|
||||||
@@ -248,13 +248,13 @@
|
|||||||
* @desc Format all recipients into a very compact string
|
* @desc Format all recipients into a very compact string
|
||||||
* @returns a compacted string of all recipients
|
* @returns a compacted string of all recipients
|
||||||
*/
|
*/
|
||||||
Message.prototype.$shortRecipients = function(max) {
|
Message.prototype.$shortRecipients = function (max) {
|
||||||
var _this = this, result = [], count = 0, total = 0;
|
var _this = this, result = [], count = 0, total = 0;
|
||||||
|
|
||||||
// Build short representation of email addresses
|
// Build short representation of email addresses
|
||||||
_.forEach(['to', 'cc', 'bcc'], function(type) {
|
_.forEach(['to', 'cc', 'bcc'], function (type) {
|
||||||
total += _this[type]? _this[type].length : 0;
|
total += _this[type] ? _this[type].length : 0;
|
||||||
_.forEach(_this[type], function(data, i) {
|
_.forEach(_this[type], function (data, i) {
|
||||||
if (count < max)
|
if (count < max)
|
||||||
result.push(data.shortname);
|
result.push(data.shortname);
|
||||||
count++;
|
count++;
|
||||||
@@ -273,7 +273,7 @@
|
|||||||
* @desc Format the first address of a specific type with a short description.
|
* @desc Format the first address of a specific type with a short description.
|
||||||
* @returns a string of the name or the email of the envelope address type
|
* @returns a string of the name or the email of the envelope address type
|
||||||
*/
|
*/
|
||||||
Message.prototype.$shortAddress = function(type) {
|
Message.prototype.$shortAddress = function (type) {
|
||||||
var address = '';
|
var address = '';
|
||||||
if (this[type]) {
|
if (this[type]) {
|
||||||
if (angular.isString(this[type])) {
|
if (angular.isString(this[type])) {
|
||||||
@@ -302,14 +302,14 @@
|
|||||||
* @desc Check if 'Reply to All' is an appropriate action on the message.
|
* @desc Check if 'Reply to All' is an appropriate action on the message.
|
||||||
* @returns true if the message is not a draft and has more than one recipient
|
* @returns true if the message is not a draft and has more than one recipient
|
||||||
*/
|
*/
|
||||||
Message.prototype.allowReplyAll = function() {
|
Message.prototype.allowReplyAll = function () {
|
||||||
var identities = _.map(this.$mailbox.$account.identities, 'email');
|
var identities = _.map(this.$mailbox.$account.identities, 'email');
|
||||||
var recipientsCount = 0;
|
var recipientsCount = 0;
|
||||||
recipientsCount = _.reduce(['to', 'cc', 'bcc', 'reply-to'], _.bind(function(count, type) {
|
recipientsCount = _.reduce(['to', 'cc', 'bcc', 'reply-to'], _.bind(function (count, type) {
|
||||||
var typeCount = 0;
|
var typeCount = 0;
|
||||||
if (this[type]) {
|
if (this[type]) {
|
||||||
typeCount = this[type].length;
|
typeCount = this[type].length;
|
||||||
_.forEach(this[type], function(recipient) {
|
_.forEach(this[type], function (recipient) {
|
||||||
if (_.indexOf(identities, recipient.email) >= 0) {
|
if (_.indexOf(identities, recipient.email) >= 0) {
|
||||||
typeCount--;
|
typeCount--;
|
||||||
}
|
}
|
||||||
@@ -329,7 +329,7 @@
|
|||||||
* @memberof Message.prototype
|
* @memberof Message.prototype
|
||||||
* @desc Mark the message to load unsafe resources when calling $content().
|
* @desc Mark the message to load unsafe resources when calling $content().
|
||||||
*/
|
*/
|
||||||
Message.prototype.loadUnsafeContent = function() {
|
Message.prototype.loadUnsafeContent = function () {
|
||||||
this.$loadUnsafeContent = true;
|
this.$loadUnsafeContent = true;
|
||||||
delete this.$parts;
|
delete this.$parts;
|
||||||
};
|
};
|
||||||
@@ -340,125 +340,127 @@
|
|||||||
* @desc Get the message body as accepted by SCE (Angular Strict Contextual Escaping).
|
* @desc Get the message body as accepted by SCE (Angular Strict Contextual Escaping).
|
||||||
* @returns the HTML representation of the body
|
* @returns the HTML representation of the body
|
||||||
*/
|
*/
|
||||||
Message.prototype.$content = function() {
|
Message.prototype.$content = function () {
|
||||||
// Punycode
|
// Punycode
|
||||||
this.to.forEach(function (element, i, arr) {
|
if (this.to && this.to.length > 0) {
|
||||||
if (element.email && element.email.indexOf('@') > 0)
|
this.to.forEach(function (element, i, arr) {
|
||||||
arr[i].email = punycode.toUnicode(element.email);
|
if (element.email && element.email.indexOf('@') > 0)
|
||||||
});
|
arr[i].email = punycode.toUnicode(element.email);
|
||||||
|
});
|
||||||
|
}
|
||||||
if (this.from && this.from.indexOf('@') > 0)
|
if (this.from && this.from.indexOf('@') > 0)
|
||||||
this.from = punycode.toUnicode(this.from);
|
this.from = punycode.toUnicode(this.from);
|
||||||
|
|
||||||
var _this = this,
|
var _this = this,
|
||||||
parts = [],
|
parts = [],
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_visit = function(part) {
|
|
||||||
part.msgclass = 'msg-attachment-other';
|
|
||||||
if (part.type == 'UIxMailPartAlternativeViewer') {
|
_visit = function (part) {
|
||||||
_visit(_.find(part.content, function(alternatePart) {
|
part.msgclass = 'msg-attachment-other';
|
||||||
return part.preferredPart == alternatePart.contentType;
|
if (part.type == 'UIxMailPartAlternativeViewer') {
|
||||||
}));
|
_visit(_.find(part.content, function (alternatePart) {
|
||||||
|
return part.preferredPart == alternatePart.contentType;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
// Can be used for UIxMailPartMixedViewer, UIxMailPartMessageViewer, and UIxMailPartSignedViewer
|
||||||
|
else if (angular.isArray(part.content)) {
|
||||||
|
if (part.type == 'UIxMailPartSignedViewer' && part['supports-smime'] === 1) {
|
||||||
|
_this.signed = {
|
||||||
|
valid: part.valid,
|
||||||
|
certificate: part.certificates[part.certificates.length - 1],
|
||||||
|
message: part.message
|
||||||
|
};
|
||||||
}
|
}
|
||||||
// Can be used for UIxMailPartMixedViewer, UIxMailPartMessageViewer, and UIxMailPartSignedViewer
|
else if (part.type == 'UIxMailPartEncryptedViewer') {
|
||||||
else if (angular.isArray(part.content)) {
|
if (part.encrypted) {
|
||||||
if (part.type == 'UIxMailPartSignedViewer' && part['supports-smime'] === 1) {
|
_this.encrypted = {
|
||||||
|
valid: part.decrypted
|
||||||
|
};
|
||||||
|
if (part.decrypted)
|
||||||
|
_this.encrypted.message = l("This message is encrypted");
|
||||||
|
else
|
||||||
|
_this.encrypted.message = l("This message can't be decrypted. Please make sure you have uploaded your S/MIME certificate from the mail preferences module.");
|
||||||
|
}
|
||||||
|
if (part.opaqueSigned) {
|
||||||
_this.signed = {
|
_this.signed = {
|
||||||
valid: part.valid,
|
valid: part.valid,
|
||||||
certificate: part.certificates[part.certificates.length - 1],
|
certificate: part.certificates[part.certificates.length - 1],
|
||||||
message: part.message
|
message: part.message
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
else if (part.type == 'UIxMailPartEncryptedViewer') {
|
}
|
||||||
if (part.encrypted) {
|
var winmail = _.find(part.content, function (mixedPart) {
|
||||||
_this.encrypted = {
|
// Ignore empty content -- that could mean a decoding error server-side.
|
||||||
valid: part.decrypted
|
return mixedPart.type == 'UIxMailPartTnefViewer' && mixedPart.content.length > 0;
|
||||||
};
|
});
|
||||||
if (part.decrypted)
|
|
||||||
_this.encrypted.message = l("This message is encrypted");
|
|
||||||
else
|
|
||||||
_this.encrypted.message = l("This message can't be decrypted. Please make sure you have uploaded your S/MIME certificate from the mail preferences module.");
|
|
||||||
}
|
|
||||||
if (part.opaqueSigned) {
|
|
||||||
_this.signed = {
|
|
||||||
valid: part.valid,
|
|
||||||
certificate: part.certificates[part.certificates.length - 1],
|
|
||||||
message: part.message
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var winmail = _.find(part.content, function(mixedPart) {
|
|
||||||
// Ignore empty content -- that could mean a decoding error server-side.
|
|
||||||
return mixedPart.type == 'UIxMailPartTnefViewer' && mixedPart.content.length > 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (winmail && !_.find(part.content, function(mixedPart) {
|
if (winmail && !_.find(part.content, function (mixedPart) {
|
||||||
return mixedPart.type == 'UIxMailPartAlternativeViewer';
|
return mixedPart.type == 'UIxMailPartAlternativeViewer';
|
||||||
})) {
|
})) {
|
||||||
// If there's no alternate part in the message, show the winmail.dat attachment only.
|
// If there's no alternate part in the message, show the winmail.dat attachment only.
|
||||||
// Otherwise, show all parts.
|
// Otherwise, show all parts.
|
||||||
_visit(winmail);
|
_visit(winmail);
|
||||||
}
|
|
||||||
else {
|
|
||||||
_.forEach(part.content, function(mixedPart) {
|
|
||||||
_visit(mixedPart);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (angular.isUndefined(part.safeContent)) {
|
_.forEach(part.content, function (mixedPart) {
|
||||||
// Keep a copy of the original content
|
_visit(mixedPart);
|
||||||
part.safeContent = part.content;
|
});
|
||||||
_this.$hasUnsafeContent |= (part.safeContent.indexOf(' unsafe-') > -1);
|
}
|
||||||
}
|
}
|
||||||
if (part.type == 'UIxMailPartHTMLViewer') {
|
else {
|
||||||
part.html = true;
|
if (angular.isUndefined(part.safeContent)) {
|
||||||
if (_this.$loadUnsafeContent || Message.$displayRemoteInlineImages) {
|
// Keep a copy of the original content
|
||||||
if (angular.isUndefined(part.unsafeContent)) {
|
part.safeContent = part.content;
|
||||||
part.unsafeContent = document.createElement('div');
|
_this.$hasUnsafeContent |= (part.safeContent.indexOf(' unsafe-') > -1);
|
||||||
part.unsafeContent.innerHTML = part.safeContent;
|
}
|
||||||
angular.forEach(['src', 'data', 'classid', 'background', 'style'], function(suffix) {
|
if (part.type == 'UIxMailPartHTMLViewer') {
|
||||||
var elements = part.unsafeContent.querySelectorAll('[unsafe-' + suffix + ']'),
|
part.html = true;
|
||||||
element,
|
if (_this.$loadUnsafeContent || Message.$displayRemoteInlineImages) {
|
||||||
value,
|
if (angular.isUndefined(part.unsafeContent)) {
|
||||||
i;
|
part.unsafeContent = document.createElement('div');
|
||||||
for (i = 0; i < elements.length; i++) {
|
part.unsafeContent.innerHTML = part.safeContent;
|
||||||
element = angular.element(elements[i]);
|
angular.forEach(['src', 'data', 'classid', 'background', 'style'], function (suffix) {
|
||||||
value = element.attr('unsafe-' + suffix);
|
var elements = part.unsafeContent.querySelectorAll('[unsafe-' + suffix + ']'),
|
||||||
element.attr(suffix, value);
|
element,
|
||||||
element.removeAttr('unsafe-' + suffix);
|
value,
|
||||||
}
|
i;
|
||||||
});
|
for (i = 0; i < elements.length; i++) {
|
||||||
_this.$hasUnsafeContent = false;
|
element = angular.element(elements[i]);
|
||||||
}
|
value = element.attr('unsafe-' + suffix);
|
||||||
part.content = part.unsafeContent.innerHTML;
|
element.attr(suffix, value);
|
||||||
|
element.removeAttr('unsafe-' + suffix);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
_this.$hasUnsafeContent = false;
|
||||||
}
|
}
|
||||||
else {
|
part.content = part.unsafeContent.innerHTML;
|
||||||
part.content = part.safeContent;
|
|
||||||
}
|
|
||||||
parts.push(part);
|
|
||||||
}
|
|
||||||
else if (part.type == 'UIxMailPartICalViewer' ||
|
|
||||||
part.type == 'UIxMailPartImageViewer' ||
|
|
||||||
part.type == 'UIxMailPartLinkViewer') {
|
|
||||||
|
|
||||||
if (part.type == 'UIxMailPartImageViewer')
|
|
||||||
part.msgclass = 'msg-attachment-image';
|
|
||||||
else if (part.type == 'UIxMailPartLinkViewer')
|
|
||||||
part.msgclass = 'msg-attachment-link';
|
|
||||||
|
|
||||||
// Trusted content that can be compiled (Angularly-speaking)
|
|
||||||
part.compile = true;
|
|
||||||
parts.push(part);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
part.html = true;
|
|
||||||
part.content = part.safeContent;
|
part.content = part.safeContent;
|
||||||
parts.push(part);
|
|
||||||
}
|
}
|
||||||
|
parts.push(part);
|
||||||
}
|
}
|
||||||
};
|
else if (part.type == 'UIxMailPartICalViewer' ||
|
||||||
|
part.type == 'UIxMailPartImageViewer' ||
|
||||||
|
part.type == 'UIxMailPartLinkViewer') {
|
||||||
|
|
||||||
|
if (part.type == 'UIxMailPartImageViewer')
|
||||||
|
part.msgclass = 'msg-attachment-image';
|
||||||
|
else if (part.type == 'UIxMailPartLinkViewer')
|
||||||
|
part.msgclass = 'msg-attachment-link';
|
||||||
|
|
||||||
|
// Trusted content that can be compiled (Angularly-speaking)
|
||||||
|
part.compile = true;
|
||||||
|
parts.push(part);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
part.html = true;
|
||||||
|
part.content = part.safeContent;
|
||||||
|
parts.push(part);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if (this.$parts)
|
if (this.$parts)
|
||||||
// Use the cache
|
// Use the cache
|
||||||
@@ -480,14 +482,14 @@
|
|||||||
* Secondly, fetch the editable message body along with other metadata such as the recipients.
|
* Secondly, fetch the editable message body along with other metadata such as the recipients.
|
||||||
* @returns the HTML representation of the body
|
* @returns the HTML representation of the body
|
||||||
*/
|
*/
|
||||||
Message.prototype.$editableContent = function() {
|
Message.prototype.$editableContent = function () {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
|
|
||||||
return Message.$$resource.fetch(this.$absolutePath(), 'edit').then(function(data) {
|
return Message.$$resource.fetch(this.$absolutePath(), 'edit').then(function (data) {
|
||||||
angular.extend(_this, data);
|
angular.extend(_this, data);
|
||||||
return Message.$$resource.fetch(_this.$absolutePath({asDraft: true}), 'edit').then(function(data) {
|
return Message.$$resource.fetch(_this.$absolutePath({ asDraft: true }), 'edit').then(function (data) {
|
||||||
// Try to match a known account identity from the specified "from" address
|
// Try to match a known account identity from the specified "from" address
|
||||||
var identity = _.find(_this.$mailbox.$account.identities, function(identity) {
|
var identity = _.find(_this.$mailbox.$account.identities, function (identity) {
|
||||||
return data.from && data.from.toLowerCase().indexOf(identity.email) !== -1;
|
return data.from && data.from.toLowerCase().indexOf(identity.email) !== -1;
|
||||||
});
|
});
|
||||||
if (identity)
|
if (identity)
|
||||||
@@ -511,7 +513,7 @@
|
|||||||
* @memberof Message.prototype
|
* @memberof Message.prototype
|
||||||
* @returns the a plain text representation of the subject and body
|
* @returns the a plain text representation of the subject and body
|
||||||
*/
|
*/
|
||||||
Message.prototype.$plainContent = function() {
|
Message.prototype.$plainContent = function () {
|
||||||
return Message.$$resource.fetch(this.$absolutePath(), 'viewplain');
|
return Message.$$resource.fetch(this.$absolutePath(), 'viewplain');
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -522,17 +524,17 @@
|
|||||||
* @param {string} tag - the tag name
|
* @param {string} tag - the tag name
|
||||||
* @returns a promise of the HTTP operation
|
* @returns a promise of the HTTP operation
|
||||||
*/
|
*/
|
||||||
Message.prototype.addTag = function(tag) {
|
Message.prototype.addTag = function (tag) {
|
||||||
var _this = this,
|
var _this = this,
|
||||||
_tag = tag.replace(/^_\$/, '$');
|
_tag = tag.replace(/^_\$/, '$');
|
||||||
return this.$mailbox.getLabels().then(function(labels) {
|
return this.$mailbox.getLabels().then(function (labels) {
|
||||||
var reload = !_.find(labels, function(label) {
|
var reload = !_.find(labels, function (label) {
|
||||||
return label.imapName == _tag;
|
return label.imapName == _tag;
|
||||||
});
|
});
|
||||||
return _this.$addOrRemoveTag('add', tag).then(function() {
|
return _this.$addOrRemoveTag('add', tag).then(function () {
|
||||||
if (reload)
|
if (reload)
|
||||||
// Update the list of labels for the mailbox
|
// Update the list of labels for the mailbox
|
||||||
_this.$mailbox.getLabels({reload: true});
|
_this.$mailbox.getLabels({ reload: true });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -544,7 +546,7 @@
|
|||||||
* @param {string} tag - the tag name
|
* @param {string} tag - the tag name
|
||||||
* @returns a promise of the HTTP operation
|
* @returns a promise of the HTTP operation
|
||||||
*/
|
*/
|
||||||
Message.prototype.removeTag = function(tag) {
|
Message.prototype.removeTag = function (tag) {
|
||||||
return this.$addOrRemoveTag('remove', tag);
|
return this.$addOrRemoveTag('remove', tag);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -556,7 +558,7 @@
|
|||||||
* @param {string} tag - the tag name
|
* @param {string} tag - the tag name
|
||||||
* @returns a promise of the HTTP operation
|
* @returns a promise of the HTTP operation
|
||||||
*/
|
*/
|
||||||
Message.prototype.$addOrRemoveTag = function(operation, tag) {
|
Message.prototype.$addOrRemoveTag = function (operation, tag) {
|
||||||
var data = {
|
var data = {
|
||||||
operation: operation,
|
operation: operation,
|
||||||
msgUIDs: [this.uid],
|
msgUIDs: [this.uid],
|
||||||
@@ -573,19 +575,19 @@
|
|||||||
* @desc Toggle message unseen status
|
* @desc Toggle message unseen status
|
||||||
* @returns a promise of the HTTP operation
|
* @returns a promise of the HTTP operation
|
||||||
*/
|
*/
|
||||||
Message.prototype.toggleRead = function() {
|
Message.prototype.toggleRead = function () {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
|
|
||||||
if (this.isread)
|
if (this.isread)
|
||||||
return Message.$$resource.fetch(this.$absolutePath(), 'markMessageUnread').then(function() {
|
return Message.$$resource.fetch(this.$absolutePath(), 'markMessageUnread').then(function () {
|
||||||
Message.$timeout(function() {
|
Message.$timeout(function () {
|
||||||
_this.isread = false;
|
_this.isread = false;
|
||||||
_this.$mailbox.unseenCount++;
|
_this.$mailbox.unseenCount++;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
else
|
else
|
||||||
return Message.$$resource.fetch(this.$absolutePath(), 'markMessageRead').then(function() {
|
return Message.$$resource.fetch(this.$absolutePath(), 'markMessageRead').then(function () {
|
||||||
Message.$timeout(function() {
|
Message.$timeout(function () {
|
||||||
_this.isread = true;
|
_this.isread = true;
|
||||||
_this.$mailbox.unseenCount--;
|
_this.$mailbox.unseenCount--;
|
||||||
});
|
});
|
||||||
@@ -600,10 +602,10 @@
|
|||||||
* @param {string} action - the the IMIP action to perform
|
* @param {string} action - the the IMIP action to perform
|
||||||
* @param {object} data - the delegation info
|
* @param {object} data - the delegation info
|
||||||
*/
|
*/
|
||||||
Message.prototype.$imipAction = function(path, action, data) {
|
Message.prototype.$imipAction = function (path, action, data) {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
Message.$$resource.post([this.$absolutePath(), path].join('/'), action, data).then(function(data) {
|
Message.$$resource.post([this.$absolutePath(), path].join('/'), action, data).then(function (data) {
|
||||||
Message.$timeout(function() {
|
Message.$timeout(function () {
|
||||||
_this.$reload();
|
_this.$reload();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -614,7 +616,7 @@
|
|||||||
* @memberof Message.prototype
|
* @memberof Message.prototype
|
||||||
* @desc Send MDN response for current email message
|
* @desc Send MDN response for current email message
|
||||||
*/
|
*/
|
||||||
Message.prototype.$sendMDN = function() {
|
Message.prototype.$sendMDN = function () {
|
||||||
this.shouldAskReceipt = 0;
|
this.shouldAskReceipt = 0;
|
||||||
return Message.$$resource.post(this.$absolutePath(), 'sendMDN');
|
return Message.$$resource.post(this.$absolutePath(), 'sendMDN');
|
||||||
};
|
};
|
||||||
@@ -624,10 +626,10 @@
|
|||||||
* @memberof Message.prototype
|
* @memberof Message.prototype
|
||||||
* @returns true if there's one ore more attached files
|
* @returns true if there's one ore more attached files
|
||||||
*/
|
*/
|
||||||
Message.prototype.hasAttachments = function(content) {
|
Message.prototype.hasAttachments = function (content) {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
|
|
||||||
return !!_.find(content || this.parts.content, function(part) {
|
return !!_.find(content || this.parts.content, function (part) {
|
||||||
if (angular.isArray(part.content)) {
|
if (angular.isArray(part.content)) {
|
||||||
return _this.hasAttachments(part.content);
|
return _this.hasAttachments(part.content);
|
||||||
}
|
}
|
||||||
@@ -641,12 +643,12 @@
|
|||||||
* @desc Delete an attachment from a message being composed
|
* @desc Delete an attachment from a message being composed
|
||||||
* @param {string} filename - the filename of the attachment to delete
|
* @param {string} filename - the filename of the attachment to delete
|
||||||
*/
|
*/
|
||||||
Message.prototype.$deleteAttachment = function(filename) {
|
Message.prototype.$deleteAttachment = function (filename) {
|
||||||
var data = { 'filename': filename };
|
var data = { 'filename': filename };
|
||||||
var _this = this;
|
var _this = this;
|
||||||
return Message.$$resource.fetch(this.$absolutePath({asDraft: true}), 'deleteAttachment', data).then(function() {
|
return Message.$$resource.fetch(this.$absolutePath({ asDraft: true }), 'deleteAttachment', data).then(function () {
|
||||||
Message.$timeout(function() {
|
Message.$timeout(function () {
|
||||||
_this.editable.attachmentAttrs = _.filter(_this.editable.attachmentAttrs, function(attachment) {
|
_this.editable.attachmentAttrs = _.filter(_this.editable.attachmentAttrs, function (attachment) {
|
||||||
return attachment.filename != filename;
|
return attachment.filename != filename;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -659,15 +661,15 @@
|
|||||||
* @desc Add or remove a the \\Flagged flag on the current message.
|
* @desc Add or remove a the \\Flagged flag on the current message.
|
||||||
* @returns a promise of the HTTP operation
|
* @returns a promise of the HTTP operation
|
||||||
*/
|
*/
|
||||||
Message.prototype.toggleFlag = function() {
|
Message.prototype.toggleFlag = function () {
|
||||||
var _this = this,
|
var _this = this,
|
||||||
action = 'markMessageFlagged';
|
action = 'markMessageFlagged';
|
||||||
|
|
||||||
if (this.isflagged)
|
if (this.isflagged)
|
||||||
action = 'markMessageUnflagged';
|
action = 'markMessageUnflagged';
|
||||||
|
|
||||||
return Message.$$resource.post(this.$absolutePath(), action).then(function(data) {
|
return Message.$$resource.post(this.$absolutePath(), action).then(function (data) {
|
||||||
Message.$timeout(function() {
|
Message.$timeout(function () {
|
||||||
_this.isflagged = !_this.isflagged;
|
_this.isflagged = !_this.isflagged;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -679,9 +681,9 @@
|
|||||||
* @desc Collapse or expand mail thread
|
* @desc Collapse or expand mail thread
|
||||||
* @returns a promise of the HTTP operation
|
* @returns a promise of the HTTP operation
|
||||||
*/
|
*/
|
||||||
Message.prototype.toggleThread = function() {
|
Message.prototype.toggleThread = function () {
|
||||||
var _this = this,
|
var _this = this,
|
||||||
action = 'markMessageCollapse';
|
action = 'markMessageCollapse';
|
||||||
|
|
||||||
if (this.collapsed)
|
if (this.collapsed)
|
||||||
action = 'markMessageUncollapse';
|
action = 'markMessageUncollapse';
|
||||||
@@ -689,7 +691,7 @@
|
|||||||
this.collapsed = !this.collapsed;
|
this.collapsed = !this.collapsed;
|
||||||
this.$mailbox.updateVisibleMessages();
|
this.$mailbox.updateVisibleMessages();
|
||||||
|
|
||||||
return Message.$$resource.post(this.$absolutePath(), action).catch(function() {
|
return Message.$$resource.post(this.$absolutePath(), action).catch(function () {
|
||||||
this.collapsed = !this.collapsed;
|
this.collapsed = !this.collapsed;
|
||||||
_this.$mailbox.updateVisibleMessages();
|
_this.$mailbox.updateVisibleMessages();
|
||||||
});
|
});
|
||||||
@@ -701,7 +703,7 @@
|
|||||||
* @returns true if the Message content is still being retrieved from server after a specific delay
|
* @returns true if the Message content is still being retrieved from server after a specific delay
|
||||||
* @see sgMessage_STATUS
|
* @see sgMessage_STATUS
|
||||||
*/
|
*/
|
||||||
Message.prototype.$isLoading = function() {
|
Message.prototype.$isLoading = function () {
|
||||||
return this.$loaded == Message.STATUS.LOADING;
|
return this.$loaded == Message.STATUS.LOADING;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -712,7 +714,7 @@
|
|||||||
* @param {object} [options] - set {useCache: true} to use already fetched data
|
* @param {object} [options] - set {useCache: true} to use already fetched data
|
||||||
* @returns a promise of the HTTP operation
|
* @returns a promise of the HTTP operation
|
||||||
*/
|
*/
|
||||||
Message.prototype.$reload = function(options) {
|
Message.prototype.$reload = function (options) {
|
||||||
var _this = this, futureMessageData;
|
var _this = this, futureMessageData;
|
||||||
|
|
||||||
if (options && options.useCache && this.$futureMessageData) {
|
if (options && options.useCache && this.$futureMessageData) {
|
||||||
@@ -720,8 +722,8 @@
|
|||||||
if (!this.isread) {
|
if (!this.isread) {
|
||||||
if (Message.$Preferences.defaults.SOGoMailAutoMarkAsReadDelay > -1)
|
if (Message.$Preferences.defaults.SOGoMailAutoMarkAsReadDelay > -1)
|
||||||
// Automatically mark message as read
|
// Automatically mark message as read
|
||||||
_this.$markAsReadPromise = Message.$timeout(function() {
|
_this.$markAsReadPromise = Message.$timeout(function () {
|
||||||
Message.$$resource.fetch(_this.$absolutePath(), 'markMessageRead').then(function() {
|
Message.$$resource.fetch(_this.$absolutePath(), 'markMessageRead').then(function () {
|
||||||
_this.isread = true;
|
_this.isread = true;
|
||||||
_this.$mailbox.unseenCount--;
|
_this.$mailbox.unseenCount--;
|
||||||
});
|
});
|
||||||
@@ -741,29 +743,29 @@
|
|||||||
* @desc Extend the editable content of the message with the
|
* @desc Extend the editable content of the message with the
|
||||||
* information parsed from the specified "mailto:" link.
|
* information parsed from the specified "mailto:" link.
|
||||||
*/
|
*/
|
||||||
Message.prototype.$parseMailto = function(mailto) {
|
Message.prototype.$parseMailto = function (mailto) {
|
||||||
var to, data = {}, match = /^mailto:([^\?]+)/.exec(mailto);
|
var to, data = {}, match = /^mailto:([^\?]+)/.exec(mailto);
|
||||||
if (match) {
|
if (match) {
|
||||||
// Recipients
|
// Recipients
|
||||||
to = _.map(decodeURIComponent(match[1]).split(','), function(email) {
|
to = _.map(decodeURIComponent(match[1]).split(','), function (email) {
|
||||||
return '<' + email.trim() + '>';
|
return '<' + email.trim() + '>';
|
||||||
});
|
});
|
||||||
data = { to: to };
|
data = { to: to };
|
||||||
}
|
}
|
||||||
// Subject & body
|
// Subject & body
|
||||||
_.forEach(['subject', 'body'], function(param) {
|
_.forEach(['subject', 'body'], function (param) {
|
||||||
var re = new RegExp(param + '=([^&]+)');
|
var re = new RegExp(param + '=([^&]+)');
|
||||||
param = (param == 'body')? 'text' : param;
|
param = (param == 'body') ? 'text' : param;
|
||||||
match = re.exec(mailto);
|
match = re.exec(mailto);
|
||||||
if (match)
|
if (match)
|
||||||
data[param] = decodeURIComponent(match[1]);
|
data[param] = decodeURIComponent(match[1]);
|
||||||
});
|
});
|
||||||
// Other Recipients
|
// Other Recipients
|
||||||
_.forEach(['cc', 'bcc'], function(param) {
|
_.forEach(['cc', 'bcc'], function (param) {
|
||||||
var re = new RegExp(param + '=([^&]+)');
|
var re = new RegExp(param + '=([^&]+)');
|
||||||
match = re.exec(mailto);
|
match = re.exec(mailto);
|
||||||
if (match)
|
if (match)
|
||||||
data[param] = _.map(decodeURIComponent(match[1]).split(','), function(email) {
|
data[param] = _.map(decodeURIComponent(match[1]).split(','), function (email) {
|
||||||
return '<' + email.trim() + '>';
|
return '<' + email.trim() + '>';
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -777,7 +779,7 @@
|
|||||||
* @desc Prepare a new Message object as a reply to the sender.
|
* @desc Prepare a new Message object as a reply to the sender.
|
||||||
* @returns a promise of the HTTP operations
|
* @returns a promise of the HTTP operations
|
||||||
*/
|
*/
|
||||||
Message.prototype.$reply = function() {
|
Message.prototype.$reply = function () {
|
||||||
return this.$newDraft('reply');
|
return this.$newDraft('reply');
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -787,7 +789,7 @@
|
|||||||
* @desc Prepare a new Message object as a reply to the sender and all recipients.
|
* @desc Prepare a new Message object as a reply to the sender and all recipients.
|
||||||
* @returns a promise of the HTTP operations
|
* @returns a promise of the HTTP operations
|
||||||
*/
|
*/
|
||||||
Message.prototype.$replyAll = function() {
|
Message.prototype.$replyAll = function () {
|
||||||
return this.$newDraft('replyall');
|
return this.$newDraft('replyall');
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -797,7 +799,7 @@
|
|||||||
* @desc Prepare a new Message object as a forward.
|
* @desc Prepare a new Message object as a forward.
|
||||||
* @returns a promise of the HTTP operations
|
* @returns a promise of the HTTP operations
|
||||||
*/
|
*/
|
||||||
Message.prototype.$forward = function() {
|
Message.prototype.$forward = function () {
|
||||||
return this.$newDraft('forward');
|
return this.$newDraft('forward');
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -807,7 +809,7 @@
|
|||||||
* @desc Prepare a new Message object as a new draft from a copy of this message.
|
* @desc Prepare a new Message object as a new draft from a copy of this message.
|
||||||
* @returns a promise of the HTTP operations
|
* @returns a promise of the HTTP operations
|
||||||
*/
|
*/
|
||||||
Message.prototype.$compose = function() {
|
Message.prototype.$compose = function () {
|
||||||
return this.$newDraft('compose');
|
return this.$newDraft('compose');
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -824,17 +826,17 @@
|
|||||||
* @param {string} action - the HTTP action to perform on the message
|
* @param {string} action - the HTTP action to perform on the message
|
||||||
* @returns a promise of the HTTP operations
|
* @returns a promise of the HTTP operations
|
||||||
*/
|
*/
|
||||||
Message.prototype.$newDraft = function(action) {
|
Message.prototype.$newDraft = function (action) {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
|
|
||||||
// Query server for draft folder and draft UID
|
// Query server for draft folder and draft UID
|
||||||
return Message.$$resource.fetch(this.$absolutePath(), action).then(function(data) {
|
return Message.$$resource.fetch(this.$absolutePath(), action).then(function (data) {
|
||||||
var mailbox, message;
|
var mailbox, message;
|
||||||
Message.$log.debug('New ' + action + ': ' + JSON.stringify(data, undefined, 2));
|
Message.$log.debug('New ' + action + ': ' + JSON.stringify(data, undefined, 2));
|
||||||
mailbox = _this.$mailbox.$account.$getMailboxByPath(data.mailboxPath);
|
mailbox = _this.$mailbox.$account.$getMailboxByPath(data.mailboxPath);
|
||||||
message = new Message(data.accountId, mailbox, data);
|
message = new Message(data.accountId, mailbox, data);
|
||||||
// Fetch draft initial data
|
// Fetch draft initial data
|
||||||
return Message.$$resource.fetch(message.$absolutePath({asDraft: true}), 'edit').then(function(data) {
|
return Message.$$resource.fetch(message.$absolutePath({ asDraft: true }), 'edit').then(function (data) {
|
||||||
Message.$log.debug('New ' + action + ': ' + JSON.stringify(data, undefined, 2) + ' original UID: ' + _this.uid);
|
Message.$log.debug('New ' + action + ': ' + JSON.stringify(data, undefined, 2) + ' original UID: ' + _this.uid);
|
||||||
var accountDefaults = Message.$Preferences.defaults.AuxiliaryMailAccounts[_this.$mailbox.$account.id];
|
var accountDefaults = Message.$Preferences.defaults.AuxiliaryMailAccounts[_this.$mailbox.$account.id];
|
||||||
if (accountDefaults.security) {
|
if (accountDefaults.security) {
|
||||||
@@ -858,7 +860,7 @@
|
|||||||
angular.extend(message.editable, data);
|
angular.extend(message.editable, data);
|
||||||
|
|
||||||
// We keep a reference to our original message in order to update the flags
|
// We keep a reference to our original message in order to update the flags
|
||||||
message.origin = {message: _this, action: action};
|
message.origin = { message: _this, action: action };
|
||||||
return message;
|
return message;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -870,13 +872,13 @@
|
|||||||
* @desc Save the message to the server.
|
* @desc Save the message to the server.
|
||||||
* @returns a promise of the HTTP operation
|
* @returns a promise of the HTTP operation
|
||||||
*/
|
*/
|
||||||
Message.prototype.$save = function() {
|
Message.prototype.$save = function () {
|
||||||
var _this = this,
|
var _this = this,
|
||||||
data = this.$omit();
|
data = this.$omit();
|
||||||
|
|
||||||
Message.$log.debug('save = ' + JSON.stringify(data, undefined, 2));
|
Message.$log.debug('save = ' + JSON.stringify(data, undefined, 2));
|
||||||
|
|
||||||
return Message.$$resource.save(this.$absolutePath({asDraft: true}), data).then(function(response) {
|
return Message.$$resource.save(this.$absolutePath({ asDraft: true }), data).then(function (response) {
|
||||||
Message.$log.debug('save = ' + JSON.stringify(response, undefined, 2));
|
Message.$log.debug('save = ' + JSON.stringify(response, undefined, 2));
|
||||||
_this.$setUID(response.uid);
|
_this.$setUID(response.uid);
|
||||||
_this.$reload(); // fetch a new viewable version of the message
|
_this.$reload(); // fetch a new viewable version of the message
|
||||||
@@ -890,7 +892,7 @@
|
|||||||
* @desc Encode an email address string
|
* @desc Encode an email address string
|
||||||
* @returns an RFC 3492 email encoded
|
* @returns an RFC 3492 email encoded
|
||||||
*/
|
*/
|
||||||
Message.prototype.punycode = function(element) {
|
Message.prototype.punycode = function (element) {
|
||||||
var re = /<(.*)>|^([\w\-\.@]+)$/gm;
|
var re = /<(.*)>|^([\w\-\.@]+)$/gm;
|
||||||
var r = re.exec(element);
|
var r = re.exec(element);
|
||||||
var puny = element;
|
var puny = element;
|
||||||
@@ -906,25 +908,31 @@
|
|||||||
* @desc Send the message.
|
* @desc Send the message.
|
||||||
* @returns a promise of the HTTP operation
|
* @returns a promise of the HTTP operation
|
||||||
*/
|
*/
|
||||||
Message.prototype.$send = function() {
|
Message.prototype.$send = function () {
|
||||||
var _this = this,
|
var _this = this,
|
||||||
data = this.$omit();
|
data = this.$omit();
|
||||||
|
|
||||||
Message.$log.debug('send = ' + JSON.stringify(data, undefined, 2));
|
Message.$log.debug('send = ' + JSON.stringify(data, undefined, 2));
|
||||||
|
|
||||||
// Punycode
|
// Punycode
|
||||||
data.to.forEach(function (element, i, arr) {
|
if (data.to && data.to.length > 0) {
|
||||||
arr[i] = _this.punycode(element);
|
data.to.forEach(function (element, i, arr) {
|
||||||
});
|
arr[i] = _this.punycode(element);
|
||||||
data.bcc.forEach(function (element, i, arr) {
|
});
|
||||||
arr[i] = _this.punycode(element);
|
}
|
||||||
});
|
if (data.bcc && data.bcc.length > 0) {
|
||||||
data.cc.forEach(function (element, i, arr) {
|
data.bcc.forEach(function (element, i, arr) {
|
||||||
arr[i] = _this.punycode(element);
|
arr[i] = _this.punycode(element);
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
if (data.cc && data.cc.length > 0) {
|
||||||
|
data.cc.forEach(function (element, i, arr) {
|
||||||
|
arr[i] = _this.punycode(element);
|
||||||
|
});
|
||||||
|
}
|
||||||
data.from = _this.punycode(data.from);
|
data.from = _this.punycode(data.from);
|
||||||
|
|
||||||
return Message.$$resource.post(this.$absolutePath({asDraft: true}), 'send', data).then(function(response) {
|
return Message.$$resource.post(this.$absolutePath({ asDraft: true }), 'send', data).then(function (response) {
|
||||||
if (response.status == 'success') {
|
if (response.status == 'success') {
|
||||||
if (angular.isDefined(_this.origin)) {
|
if (angular.isDefined(_this.origin)) {
|
||||||
if (_this.origin.action.startsWith('reply'))
|
if (_this.origin.action.startsWith('reply'))
|
||||||
@@ -946,24 +954,24 @@
|
|||||||
* @desc Unwrap a promise.
|
* @desc Unwrap a promise.
|
||||||
* @param {promise} futureMessageData - a promise of some of the Message's data
|
* @param {promise} futureMessageData - a promise of some of the Message's data
|
||||||
*/
|
*/
|
||||||
Message.prototype.$unwrap = function(futureMessageData) {
|
Message.prototype.$unwrap = function (futureMessageData) {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
|
|
||||||
// Message is not loaded yet
|
// Message is not loaded yet
|
||||||
this.$loaded = Message.STATUS.DELAYED_LOADING;
|
this.$loaded = Message.STATUS.DELAYED_LOADING;
|
||||||
Message.$timeout(function() {
|
Message.$timeout(function () {
|
||||||
if (_this.$loaded != Message.STATUS.LOADED)
|
if (_this.$loaded != Message.STATUS.LOADED)
|
||||||
_this.$loaded = Message.STATUS.LOADING;
|
_this.$loaded = Message.STATUS.LOADING;
|
||||||
}, Message.STATUS.DELAYED_MS);
|
}, Message.STATUS.DELAYED_MS);
|
||||||
|
|
||||||
// Resolve and expose the promise
|
// Resolve and expose the promise
|
||||||
this.$futureMessageData = futureMessageData.then(function(data) {
|
this.$futureMessageData = futureMessageData.then(function (data) {
|
||||||
// Calling $timeout will force Angular to refresh the view
|
// Calling $timeout will force Angular to refresh the view
|
||||||
if (!data.isRead) {
|
if (!data.isRead) {
|
||||||
if (Message.$Preferences.defaults.SOGoMailAutoMarkAsReadDelay > -1)
|
if (Message.$Preferences.defaults.SOGoMailAutoMarkAsReadDelay > -1)
|
||||||
// Automatically mark message as read
|
// Automatically mark message as read
|
||||||
_this.$markAsReadPromise = Message.$timeout(function() {
|
_this.$markAsReadPromise = Message.$timeout(function () {
|
||||||
Message.$$resource.fetch(_this.$absolutePath(), 'markMessageRead').then(function() {
|
Message.$$resource.fetch(_this.$absolutePath(), 'markMessageRead').then(function () {
|
||||||
_this.isread = true;
|
_this.isread = true;
|
||||||
_this.$mailbox.unseenCount--;
|
_this.$mailbox.unseenCount--;
|
||||||
});
|
});
|
||||||
@@ -974,7 +982,7 @@
|
|||||||
_this.isread = true;
|
_this.isread = true;
|
||||||
_this.$mailbox.unseenCount--;
|
_this.$mailbox.unseenCount--;
|
||||||
}
|
}
|
||||||
return Message.$timeout(function() {
|
return Message.$timeout(function () {
|
||||||
delete _this.$parts;
|
delete _this.$parts;
|
||||||
_this.$loaded = Message.STATUS.LOADED;
|
_this.$loaded = Message.STATUS.LOADED;
|
||||||
_this.init(data);
|
_this.init(data);
|
||||||
@@ -991,11 +999,11 @@
|
|||||||
* @desc Return a sanitized object used to send to the server.
|
* @desc Return a sanitized object used to send to the server.
|
||||||
* @return an object literal copy of the Message instance
|
* @return an object literal copy of the Message instance
|
||||||
*/
|
*/
|
||||||
Message.prototype.$omit = function(options) {
|
Message.prototype.$omit = function (options) {
|
||||||
var message = {},
|
var message = {},
|
||||||
privateAttributes = options && options.privateAttributes,
|
privateAttributes = options && options.privateAttributes,
|
||||||
source = privateAttributes ? this : this.editable;
|
source = privateAttributes ? this : this.editable;
|
||||||
angular.forEach(source, function(value, key) {
|
angular.forEach(source, function (value, key) {
|
||||||
if (_.includes(['to', 'cc', 'bcc'], key) && !privateAttributes) {
|
if (_.includes(['to', 'cc', 'bcc'], key) && !privateAttributes) {
|
||||||
message[key] = _.map(value, function (addr) {
|
message[key] = _.map(value, function (addr) {
|
||||||
return addr.toString();
|
return addr.toString();
|
||||||
@@ -1015,7 +1023,7 @@
|
|||||||
* @desc Download the current message as a zip archive
|
* @desc Download the current message as a zip archive
|
||||||
* @returns a promise of the HTTP operation
|
* @returns a promise of the HTTP operation
|
||||||
*/
|
*/
|
||||||
Message.prototype.downloadArchive = function() {
|
Message.prototype.downloadArchive = function () {
|
||||||
var data, options;
|
var data, options;
|
||||||
|
|
||||||
data = { uids: [this.uid] };
|
data = { uids: [this.uid] };
|
||||||
@@ -1030,7 +1038,7 @@
|
|||||||
* @desc Download the current message as a eml file
|
* @desc Download the current message as a eml file
|
||||||
* @returns a promise of the HTTP operation
|
* @returns a promise of the HTTP operation
|
||||||
*/
|
*/
|
||||||
Message.prototype.download = function() {
|
Message.prototype.download = function () {
|
||||||
var options;
|
var options;
|
||||||
|
|
||||||
options = { filename: this.subject + '.eml' };
|
options = { filename: this.subject + '.eml' };
|
||||||
@@ -1043,7 +1051,7 @@
|
|||||||
* @desc Download a zip archive of all attachments
|
* @desc Download a zip archive of all attachments
|
||||||
* @returns a promise of the HTTP operation
|
* @returns a promise of the HTTP operation
|
||||||
*/
|
*/
|
||||||
Message.prototype.downloadAttachmentsArchive = function() {
|
Message.prototype.downloadAttachmentsArchive = function () {
|
||||||
var options;
|
var options;
|
||||||
|
|
||||||
options = { filename: l('attachments') + "-" + this.uid + ".zip" };
|
options = { filename: l('attachments') + "-" + this.uid + ".zip" };
|
||||||
|
|||||||
Reference in new issue
Block a user